private static SafeBCryptKeyHandle ImportPublicKeyInfo(SafeCertContextHandle certContext) { IntPtr certHandle = certContext.DangerousGetHandle(); //Read the public key blob from the certificate X509Native.CERT_CONTEXT pCertContext = (X509Native.CERT_CONTEXT)Marshal.PtrToStructure(certHandle, typeof(X509Native.CERT_CONTEXT)); IntPtr pSubjectPublicKeyInfo = new IntPtr((long)pCertContext.pCertInfo + (long)Marshal.OffsetOf(typeof(X509Native.CERT_INFO), "SubjectPublicKeyInfo")); X509Native.CERT_PUBLIC_KEY_INFO certPublicKeyInfo = (X509Native.CERT_PUBLIC_KEY_INFO)Marshal.PtrToStructure(pSubjectPublicKeyInfo, typeof(X509Native.CERT_PUBLIC_KEY_INFO)); SafeBCryptKeyHandle publicKeyInfo = BCryptNative.ImportAsymmetricPublicKey(certPublicKeyInfo, 0); // certContext needs to be valid through the call to BCryptNative.ImportAsymmetricPublicKey // because certPublicKeyInfo structure contains pointers. GC.KeepAlive(certContext); return(publicKeyInfo); }
private static ECDsa LegacyGetECDsaPublicKey(X509Certificate2 certificate) { if (certificate == null) { throw new ArgumentNullException("certificate"); } if (!IsECDsa(certificate)) { return(null); } SafeCertContextHandle safeCertContext = X509Native.GetCertificateContext(certificate); IntPtr certHandle = safeCertContext.DangerousGetHandle(); //Read the public key blob from the certificate X509Native.CERT_CONTEXT pCertContext = (X509Native.CERT_CONTEXT)Marshal.PtrToStructure(certHandle, typeof(X509Native.CERT_CONTEXT)); IntPtr pSubjectPublicKeyInfo = new IntPtr((long)pCertContext.pCertInfo + (long)Marshal.OffsetOf(typeof(X509Native.CERT_INFO), "SubjectPublicKeyInfo")); X509Native.CERT_PUBLIC_KEY_INFO certPublicKeyInfo = (X509Native.CERT_PUBLIC_KEY_INFO)Marshal.PtrToStructure(pSubjectPublicKeyInfo, typeof(X509Native.CERT_PUBLIC_KEY_INFO)); CngKey key; //Import the public key blob to BCRYPT_KEY_HANDLE using (SafeBCryptKeyHandle bcryptKeyHandle = BCryptNative.ImportAsymmetricPublicKey(certPublicKeyInfo, 0)) { if (bcryptKeyHandle.IsInvalid) { throw new CryptographicException("SR.GetString(SR.Cryptography_OpenInvalidHandle)"); } key = LegacyBCryptHandleToNCryptHandle(bcryptKeyHandle); } GC.KeepAlive(safeCertContext); return(new ECDsaCng(key)); }