コード例 #1
0
        private static void FindByCert(System.Security.Cryptography.SafeCertStoreHandle safeSourceStoreHandle, uint dwFindType, IntPtr pvFindPara, bool validOnly, FindProcDelegate pfnCertCallback1, FindProcDelegate pfnCertCallback2, object pvCallbackData1, object pvCallbackData2, System.Security.Cryptography.SafeCertStoreHandle safeTargetStoreHandle)
        {
            int hr = 0;

            System.Security.Cryptography.SafeCertContextHandle invalidHandle = System.Security.Cryptography.SafeCertContextHandle.InvalidHandle;
            invalidHandle = CAPI.CertFindCertificateInStore(safeSourceStoreHandle, 0x10001, 0, dwFindType, pvFindPara, invalidHandle);
            while ((invalidHandle != null) && !invalidHandle.IsInvalid)
            {
                if (pfnCertCallback1 != null)
                {
                    hr = pfnCertCallback1(invalidHandle, pvCallbackData1);
                    if (hr == 1)
                    {
                        if (pfnCertCallback2 != null)
                        {
                            hr = pfnCertCallback2(invalidHandle, pvCallbackData2);
                        }
                        if (hr == 1)
                        {
                            goto Label_008D;
                        }
                    }
                    if (hr != 0)
                    {
                        break;
                    }
                }
                if (validOnly)
                {
                    hr = System.Security.Cryptography.X509Certificates.X509Utils.VerifyCertificate(invalidHandle, null, null, X509RevocationMode.NoCheck, X509RevocationFlag.ExcludeRoot, DateTime.Now, new TimeSpan(0, 0, 0), null, new IntPtr(1L), IntPtr.Zero);
                    if (hr == 1)
                    {
                        goto Label_008D;
                    }
                    if (hr != 0)
                    {
                        break;
                    }
                }
                if (!CAPI.CertAddCertificateLinkToStore(safeTargetStoreHandle, invalidHandle, 4, System.Security.Cryptography.SafeCertContextHandle.InvalidHandle))
                {
                    hr = Marshal.GetHRForLastWin32Error();
                    break;
                }
Label_008D:
                GC.SuppressFinalize(invalidHandle);
                invalidHandle = CAPI.CertFindCertificateInStore(safeSourceStoreHandle, 0x10001, 0, dwFindType, pvFindPara, invalidHandle);
            }
            if ((invalidHandle != null) && !invalidHandle.IsInvalid)
            {
                invalidHandle.Dispose();
            }
            if ((hr != 1) && (hr != 0))
            {
                throw new CryptographicException(hr);
            }
        }
コード例 #2
0
 private static void RemoveCertificateFromStore(System.Security.Cryptography.SafeCertStoreHandle safeCertStoreHandle, System.Security.Cryptography.SafeCertContextHandle safeCertContext)
 {
     if ((safeCertContext != null) && !safeCertContext.IsInvalid)
     {
         if (((safeCertStoreHandle == null) || safeCertStoreHandle.IsInvalid) || safeCertStoreHandle.IsClosed)
         {
             throw new CryptographicException(SR.GetString("Cryptography_X509_StoreNotOpen"));
         }
         System.Security.Cryptography.SafeCertContextHandle handle = CAPI.CertFindCertificateInStore(safeCertStoreHandle, 0x10001, 0, 0xd0000, safeCertContext.DangerousGetHandle(), System.Security.Cryptography.SafeCertContextHandle.InvalidHandle);
         if ((handle != null) && !handle.IsInvalid)
         {
             GC.SuppressFinalize(handle);
             if (!CAPI.CertDeleteCertificateFromStore(handle))
             {
                 throw new CryptographicException(Marshal.GetLastWin32Error());
             }
         }
     }
 }
コード例 #3
0
        private static void RemoveCertificateFromStore(Cryptography.SafeCertStoreHandle safeCertStoreHandle, Cryptography.SafeCertContextHandle safeCertContext)
        {
            if (safeCertContext == null || safeCertContext.IsInvalid)
            {
                return;
            }

            if (safeCertStoreHandle == null || safeCertStoreHandle.IsInvalid || safeCertStoreHandle.IsClosed)
            {
                throw new CryptographicException(SR.GetString(SR.Cryptography_X509_StoreNotOpen));
            }

            // Find the certificate in the store.
            Cryptography.SafeCertContextHandle safeCertContext2 = CAPI.CertFindCertificateInStore(safeCertStoreHandle,
                                                                                                  CAPI.X509_ASN_ENCODING | CAPI.PKCS_7_ASN_ENCODING,
                                                                                                  0,
                                                                                                  CAPI.CERT_FIND_EXISTING,
                                                                                                  safeCertContext.DangerousGetHandle(),
                                                                                                  Cryptography.SafeCertContextHandle.InvalidHandle);

            // The certificate is not present in the store, simply return.
            if (safeCertContext2 == null || safeCertContext2.IsInvalid)
            {
                return;
            }

            // CertDeleteCertificateFromStore always releases the context regardless of success
            // or failure so we don't need to manually release it
            GC.SuppressFinalize(safeCertContext2);

            // Remove from the store.
            if (!CAPI.CertDeleteCertificateFromStore(safeCertContext2))
            {
                throw new CryptographicException(Marshal.GetLastWin32Error());
            }
        }
コード例 #4
0
        public X509Certificate2Collection Find(X509FindType findType, object findValue, bool validOnly)
        {
            DiagnosticUtility.DebugAssert(!this.certStoreHandle.IsInvalid, "");

            uint dwFindType;
            SafeHGlobalHandle          pvFindPara   = SafeHGlobalHandle.InvalidHandle;
            SafeCertContextHandle      pCertContext = SafeCertContextHandle.InvalidHandle;
            X509Certificate2Collection result       = new X509Certificate2Collection();
            SafeHGlobalHandle          pvTemp       = SafeHGlobalHandle.InvalidHandle;
            string strFindValue;

            byte[] bytes;

            try
            {
                switch (findType)
                {
                case X509FindType.FindBySubjectName:
                    strFindValue = findValue as string;
                    if (strFindValue == null)
                    {
                        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.X509FindValueMismatch, findType, typeof(string), findValue.GetType())));
                    }

                    dwFindType = CAPI.CERT_FIND_SUBJECT_STR;
                    pvFindPara = SafeHGlobalHandle.AllocHGlobal(strFindValue);
                    break;

                case X509FindType.FindByThumbprint:
                    bytes = findValue as byte[];
                    if (bytes == null)
                    {
                        strFindValue = findValue as string;
                        if (strFindValue == null)
                        {
                            throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.X509FindValueMismatchMulti, findType, typeof(string), typeof(byte[]), findValue.GetType())));
                        }

                        bytes = SecurityUtils.DecodeHexString(strFindValue);
                    }

                    CAPI.CRYPTOAPI_BLOB blob = new CAPI.CRYPTOAPI_BLOB();
                    pvTemp      = SafeHGlobalHandle.AllocHGlobal(bytes);
                    blob.pbData = pvTemp.DangerousGetHandle();
                    blob.cbData = (uint)bytes.Length;
                    dwFindType  = CAPI.CERT_FIND_HASH;
                    pvFindPara  = SafeHGlobalHandle.AllocHGlobal(CAPI.CRYPTOAPI_BLOB.Size);
                    Marshal.StructureToPtr(blob, pvFindPara.DangerousGetHandle(), false);
                    break;

                case X509FindType.FindBySubjectDistinguishedName:
                    if (!(findValue is string))
                    {
                        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.X509FindValueMismatch, findType, typeof(string), findValue.GetType())));
                    }

                    dwFindType = CAPI.CERT_FIND_ANY;
                    break;

                case X509FindType.FindByIssuerName:
                    strFindValue = findValue as string;
                    if (strFindValue == null)
                    {
                        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.X509FindValueMismatch, findType, typeof(string), findValue.GetType())));
                    }

                    dwFindType = CAPI.CERT_FIND_ISSUER_STR;
                    pvFindPara = SafeHGlobalHandle.AllocHGlobal(strFindValue);
                    break;

                case X509FindType.FindByIssuerDistinguishedName:
                    if (!(findValue is string))
                    {
                        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.X509FindValueMismatch, findType, typeof(string), findValue.GetType())));
                    }

                    dwFindType = CAPI.CERT_FIND_ANY;
                    break;

                case X509FindType.FindBySerialNumber:
                    bytes = findValue as byte[];
                    if (bytes == null)
                    {
                        strFindValue = findValue as string;
                        if (strFindValue == null)
                        {
                            throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.X509FindValueMismatchMulti, findType, typeof(string), typeof(byte[]), findValue.GetType())));
                        }

                        bytes = SecurityUtils.DecodeHexString(strFindValue);

                        // reverse bits
                        int len = bytes.Length;
                        for (int i = 0, j = len - 1; i < bytes.Length / 2; ++i, --j)
                        {
                            byte tmp = bytes[i];
                            bytes[i] = bytes[j];
                            bytes[j] = tmp;
                        }
                    }
                    findValue  = bytes;
                    dwFindType = CAPI.CERT_FIND_ANY;
                    break;

                case X509FindType.FindBySubjectKeyIdentifier:
                    bytes = findValue as byte[];
                    if (bytes == null)
                    {
                        strFindValue = findValue as string;
                        if (strFindValue == null)
                        {
                            throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.X509FindValueMismatchMulti, findType, typeof(string), typeof(byte[]), findValue.GetType())));
                        }

                        bytes = SecurityUtils.DecodeHexString(strFindValue);
                    }
                    findValue  = bytes;
                    dwFindType = CAPI.CERT_FIND_ANY;
                    break;

                default:
                    // Fallback to CLR implementation
                    X509Store store = new X509Store(this.certStoreHandle.DangerousGetHandle());
                    try
                    {
                        return(store.Certificates.Find(findType, findValue, validOnly));
                    }
                    finally
                    {
                        store.Close();
                    }
                }

#pragma warning suppress 56523 // We are not interested in CRYPT_E_NOT_FOUND error, it return null anyway.
                pCertContext = CAPI.CertFindCertificateInStore(this.certStoreHandle,
                                                               CAPI.X509_ASN_ENCODING | CAPI.PKCS_7_ASN_ENCODING,
                                                               0,
                                                               dwFindType,
                                                               pvFindPara,
                                                               pCertContext);

                while (pCertContext != null && !pCertContext.IsInvalid)
                {
                    X509Certificate2 cert;
                    if (TryGetMatchingX509Certificate(pCertContext.DangerousGetHandle(), findType,
                                                      dwFindType, findValue, validOnly, out cert))
                    {
                        result.Add(cert);
                    }

                    // CER
                    RuntimeHelpers.PrepareConstrainedRegions();
                    try { }
                    finally
                    {
                        // Suppress the finalizer
#pragma warning suppress 56508 // CertFindCertificateInStore will release the prev one.
                        GC.SuppressFinalize(pCertContext);
#pragma warning suppress 56523 // We are not interested in CRYPT_E_NOT_FOUND error, it return null anyway.
                        pCertContext = CAPI.CertFindCertificateInStore(this.certStoreHandle,
                                                                       CAPI.X509_ASN_ENCODING | CAPI.PKCS_7_ASN_ENCODING,
                                                                       0,
                                                                       dwFindType,
                                                                       pvFindPara,
                                                                       pCertContext);
                    }
                }
            }
            finally
            {
                if (pCertContext != null)
                {
                    pCertContext.Close();
                }
                pvFindPara.Close();
                pvTemp.Close();
            }
            return(result);
        }