internal static IntPtr CertEnumCertificatesInStore([In] System.Security.Cryptography.SafeCertStoreHandle hCertStore, [In] IntPtr pPrevCertContext)
        {
            if (hCertStore == null)
            {
                throw new ArgumentNullException("hCertStore");
            }
            if (hCertStore.IsInvalid)
            {
                throw new CryptographicException(SR.GetString("Cryptography_InvalidHandle"), "hCertStore");
            }
            if (pPrevCertContext == IntPtr.Zero)
            {
                new StorePermission(StorePermissionFlags.EnumerateCertificates).Demand();
            }
            IntPtr pCertContext = CAPIUnsafe.CertEnumCertificatesInStore(hCertStore, pPrevCertContext);

            if (pCertContext == IntPtr.Zero)
            {
                int hr = Marshal.GetLastWin32Error();
                if (hr != -2146885628)
                {
                    CAPISafe.CertFreeCertificateContext(pCertContext);
                    throw new CryptographicException(hr);
                }
            }
            return(pCertContext);
        }
 internal static System.Security.Cryptography.SafeCertContextHandle CertDuplicateCertificateContext([In] System.Security.Cryptography.SafeCertContextHandle pCertContext)
 {
     if ((pCertContext != null) && !pCertContext.IsInvalid)
     {
         return(CAPISafe.CertDuplicateCertificateContext(pCertContext));
     }
     return(System.Security.Cryptography.SafeCertContextHandle.InvalidHandle);
 }
 internal static System.Security.Cryptography.SafeCertContextHandle CertDuplicateCertificateContext([In] IntPtr pCertContext)
 {
     if (pCertContext == IntPtr.Zero)
     {
         return(System.Security.Cryptography.SafeCertContextHandle.InvalidHandle);
     }
     return(CAPISafe.CertDuplicateCertificateContext(pCertContext));
 }
        internal static SafeLocalAllocHandle LocalAlloc(uint uFlags, IntPtr sizetdwBytes)
        {
            SafeLocalAllocHandle handle = CAPISafe.LocalAlloc(uFlags, sizetdwBytes);

            if ((handle == null) || handle.IsInvalid)
            {
                throw new OutOfMemoryException();
            }
            return(handle);
        }
        internal static CAPIBase.CRYPT_OID_INFO CryptFindOIDInfo([In] uint dwKeyType, [In] IntPtr pvKey, [In] System.Security.Cryptography.OidGroup dwGroupId)
        {
            if (pvKey == IntPtr.Zero)
            {
                throw new ArgumentNullException("pvKey");
            }
            CAPIBase.CRYPT_OID_INFO crypt_oid_info = new CAPIBase.CRYPT_OID_INFO(Marshal.SizeOf(typeof(CAPIBase.CRYPT_OID_INFO)));
            IntPtr ptr = CAPISafe.CryptFindOIDInfo(dwKeyType, pvKey, dwGroupId);

            if (ptr != IntPtr.Zero)
            {
                crypt_oid_info = (CAPIBase.CRYPT_OID_INFO)Marshal.PtrToStructure(ptr, typeof(CAPIBase.CRYPT_OID_INFO));
            }
            return(crypt_oid_info);
        }
        internal static CAPIBase.CRYPT_OID_INFO CryptFindOIDInfo([In] uint dwKeyType, [In] SafeLocalAllocHandle pvKey, [In] System.Security.Cryptography.OidGroup dwGroupId)
        {
            if (pvKey == null)
            {
                throw new ArgumentNullException("pvKey");
            }
            if (pvKey.IsInvalid)
            {
                throw new CryptographicException(SR.GetString("Cryptography_InvalidHandle"), "pvKey");
            }
            CAPIBase.CRYPT_OID_INFO crypt_oid_info = new CAPIBase.CRYPT_OID_INFO(Marshal.SizeOf(typeof(CAPIBase.CRYPT_OID_INFO)));
            IntPtr ptr = CAPISafe.CryptFindOIDInfo(dwKeyType, pvKey, dwGroupId);

            if (ptr != IntPtr.Zero)
            {
                crypt_oid_info = (CAPIBase.CRYPT_OID_INFO)Marshal.PtrToStructure(ptr, typeof(CAPIBase.CRYPT_OID_INFO));
            }
            return(crypt_oid_info);
        }
        internal static unsafe bool EncodeObject(string lpszStructType, IntPtr pvStructInfo, out byte[] encodedData)
        {
            encodedData = new byte[0];
            uint num = 0;
            SafeLocalAllocHandle invalidHandle = SafeLocalAllocHandle.InvalidHandle;

            if (!CAPISafe.CryptEncodeObject(0x10001, lpszStructType, pvStructInfo, invalidHandle, new IntPtr((void *)&num)))
            {
                return(false);
            }
            invalidHandle = LocalAlloc(0, new IntPtr((long)num));
            if (!CAPISafe.CryptEncodeObject(0x10001, lpszStructType, pvStructInfo, invalidHandle, new IntPtr((void *)&num)))
            {
                return(false);
            }
            encodedData = new byte[num];
            Marshal.Copy(invalidHandle.DangerousGetHandle(), encodedData, 0, (int)num);
            invalidHandle.Dispose();
            return(true);
        }
        internal static unsafe bool DecodeObject(IntPtr pszStructType, IntPtr pbEncoded, uint cbEncoded, out SafeLocalAllocHandle decodedValue, out uint cbDecodedValue)
        {
            decodedValue   = SafeLocalAllocHandle.InvalidHandle;
            cbDecodedValue = 0;
            uint num = 0;
            SafeLocalAllocHandle invalidHandle = SafeLocalAllocHandle.InvalidHandle;

            if (!CAPISafe.CryptDecodeObject(0x10001, pszStructType, pbEncoded, cbEncoded, 0, invalidHandle, new IntPtr((void *)&num)))
            {
                return(false);
            }
            invalidHandle = LocalAlloc(0, new IntPtr((long)num));
            if (!CAPISafe.CryptDecodeObject(0x10001, pszStructType, pbEncoded, cbEncoded, 0, invalidHandle, new IntPtr((void *)&num)))
            {
                return(false);
            }
            decodedValue   = invalidHandle;
            cbDecodedValue = num;
            return(true);
        }
        internal static unsafe string CryptFormatObject([In] uint dwCertEncodingType, [In] uint dwFormatStrType, [In] string lpszStructType, [In] byte[] rawData)
        {
            if (rawData == null)
            {
                throw new ArgumentNullException("rawData");
            }
            uint num = 0;
            SafeLocalAllocHandle invalidHandle = SafeLocalAllocHandle.InvalidHandle;

            if (!CAPISafe.CryptFormatObject(dwCertEncodingType, 0, dwFormatStrType, IntPtr.Zero, lpszStructType, rawData, (uint)rawData.Length, invalidHandle, new IntPtr((void *)&num)))
            {
                return(System.Security.Cryptography.X509Certificates.X509Utils.EncodeHexString(rawData));
            }
            invalidHandle = LocalAlloc(0, new IntPtr((long)num));
            if (!CAPISafe.CryptFormatObject(dwCertEncodingType, 0, dwFormatStrType, IntPtr.Zero, lpszStructType, rawData, (uint)rawData.Length, invalidHandle, new IntPtr((void *)&num)))
            {
                return(System.Security.Cryptography.X509Certificates.X509Utils.EncodeHexString(rawData));
            }
            string str = Marshal.PtrToStringUni(invalidHandle.DangerousGetHandle());

            invalidHandle.Dispose();
            return(str);
        }
示例#10
0
        internal static unsafe string GetCertNameInfo([In] System.Security.Cryptography.SafeCertContextHandle safeCertContext, [In] uint dwFlags, [In] uint dwDisplayType)
        {
            if (safeCertContext == null)
            {
                throw new ArgumentNullException("pCertContext");
            }
            if (safeCertContext.IsInvalid)
            {
                throw new CryptographicException(SR.GetString("Cryptography_InvalidHandle"), "safeCertContext");
            }
            uint num = 0x2000003;
            SafeLocalAllocHandle invalidHandle = SafeLocalAllocHandle.InvalidHandle;

            if (dwDisplayType == 3)
            {
                invalidHandle = System.Security.Cryptography.X509Certificates.X509Utils.StringToAnsiPtr("2.5.4.3");
            }
            uint cchNameString = 0;
            SafeLocalAllocHandle pszNameString = SafeLocalAllocHandle.InvalidHandle;

            cchNameString = CAPISafe.CertGetNameStringW(safeCertContext, dwDisplayType, dwFlags, (dwDisplayType == 3) ? invalidHandle.DangerousGetHandle() : new IntPtr((void *)&num), pszNameString, 0);
            if (cchNameString == 0)
            {
                throw new CryptographicException(Marshal.GetLastWin32Error());
            }
            pszNameString = LocalAlloc(0, new IntPtr((long)(2 * cchNameString)));
            if (CAPISafe.CertGetNameStringW(safeCertContext, dwDisplayType, dwFlags, (dwDisplayType == 3) ? invalidHandle.DangerousGetHandle() : new IntPtr((void *)&num), pszNameString, cchNameString) == 0)
            {
                throw new CryptographicException(Marshal.GetLastWin32Error());
            }
            string str = Marshal.PtrToStringUni(pszNameString.DangerousGetHandle());

            pszNameString.Dispose();
            invalidHandle.Dispose();
            return(str);
        }