private byte[] PropagateKeyAlgorithmParametersFromChain() { unsafe { SafeX509ChainHandle certChainContext = null; try { int cbData = 0; if (!Interop.crypt32.CertGetCertificateContextProperty(_certContext, CertContextPropId.CERT_PUBKEY_ALG_PARA_PROP_ID, null, ref cbData)) { CERT_CHAIN_PARA chainPara = new CERT_CHAIN_PARA(); chainPara.cbSize = sizeof(CERT_CHAIN_PARA); if (!Interop.crypt32.CertGetCertificateChain(ChainEngine.HCCE_CURRENT_USER, _certContext, (FILETIME *)null, SafeCertStoreHandle.InvalidHandle, ref chainPara, CertChainFlags.None, IntPtr.Zero, out certChainContext)) { throw Marshal.GetHRForLastWin32Error().ToCryptographicException(); } ; if (!Interop.crypt32.CertGetCertificateContextProperty(_certContext, CertContextPropId.CERT_PUBKEY_ALG_PARA_PROP_ID, null, ref cbData)) { throw Marshal.GetHRForLastWin32Error().ToCryptographicException(); } ; } byte[] keyAlgorithmParameters = new byte[cbData]; if (!Interop.crypt32.CertGetCertificateContextProperty(_certContext, CertContextPropId.CERT_PUBKEY_ALG_PARA_PROP_ID, keyAlgorithmParameters, ref cbData)) { throw Marshal.GetHRForLastWin32Error().ToCryptographicException(); } ; return(keyAlgorithmParameters); } finally { if (certChainContext != null) { certChainContext.Dispose(); } } } }