예제 #1
0
 public void Open()
 {
     ThrowIfDisposed();
     if (!Win32Native.CryptAcquireContext(out handle, ContainerName, ProviderName, ProviderType, Flags))
     {
         Win32ErrorHelper.ThrowExceptionIfGetLastErrorIsNotZero();
     }
 }
예제 #2
0
 internal void DestroyKey(CryptKey key)
 {
     ThrowIfDisposedOrNotOpen();
     if (!Win32Native.CryptDestroyKey(key.Handle))
     {
         Win32ErrorHelper.ThrowExceptionIfGetLastErrorIsNotZero();
     }
 }
예제 #3
0
        private Win32Native.SystemTime ToSystemTime(DateTime dateTime)
        {
            long fileTime   = dateTime.ToFileTime();
            var  systemTime = new Win32Native.SystemTime();

            if (!Win32Native.FileTimeToSystemTime(ref fileTime, systemTime))
            {
                Win32ErrorHelper.ThrowExceptionIfGetLastErrorIsNotZero();
            }
            return(systemTime);
        }
예제 #4
0
 protected override void CleanUp(bool viaDispose)
 {
     if (handle != IntPtr.Zero)
     {
         if (!Win32Native.CryptReleaseContext(handle, 0))
         {
             if (viaDispose)
             {
                 Win32ErrorHelper.ThrowExceptionIfGetLastErrorIsNotZero();
             }
         }
     }
 }
예제 #5
0
        public KeyExchangeKey GenerateKeyExchangeKey(bool exportable, int keyBitLength)
        {
            ThrowIfDisposedOrNotOpen();

            uint flags = (exportable ? 1U : 0U) | ((uint)keyBitLength) << 16;

            IntPtr keyHandle;
            bool   result = Win32Native.CryptGenKey(handle, (int)KeyType.Exchange, flags, out keyHandle);

            if (!result)
            {
                Win32ErrorHelper.ThrowExceptionIfGetLastErrorIsNotZero();
            }

            return(new KeyExchangeKey(this, keyHandle));
        }
예제 #6
0
        public X509Certificate2 CreateSelfSignedCertificate(SelfSignedCertProperties properties)
        {
            ThrowIfDisposedOrNotOpen();

            GenerateKeyExchangeKey(properties.IsPrivateKeyExportable, properties.KeyBitLength);
            //GenerateSignatureKey(properties.IsPrivateKeyExportable, properties.KeyBitLength);

            byte[]   asnName       = properties.Name.RawData;
            GCHandle asnNameHandle = GCHandle.Alloc(asnName, GCHandleType.Pinned);

            var kpi = new Win32Native.CryptKeyProviderInformation
            {
                ContainerName = this.ContainerName,
                KeySpec       = (int)KeyType.Exchange,
                ProviderType  = 1, // default RSA provider
            };

            IntPtr certContext = Win32Native.CertCreateSelfSignCertificate(
                handle,
                new Win32Native.CryptoApiBlob(asnName.Length, asnNameHandle.AddrOfPinnedObject()),
                0, kpi, IntPtr.Zero,
                ToSystemTime(properties.ValidFrom),
                ToSystemTime(properties.ValidTo),
                IntPtr.Zero);

            asnNameHandle.Free();

            if (IntPtr.Zero == certContext)
            {
                Win32ErrorHelper.ThrowExceptionIfGetLastErrorIsNotZero();
            }

            X509Certificate2 cert = new X509Certificate2(certContext); // dups the context (increasing it's refcount)

            if (!Win32Native.CertFreeCertificateContext(certContext))
            {
                Win32ErrorHelper.ThrowExceptionIfGetLastErrorIsNotZero();
            }

            return(cert);
        }