internal static X509Certificate2 CopyWithPersistedCngKeyFixed(this X509Certificate2 publicCert, CngKey cngKey)
        {
            if (string.IsNullOrEmpty(cngKey.KeyName))
            {
                return(null);
            }
            X509Certificate2 x509Certificate = new X509Certificate2(publicCert.RawData);
            CngProvider      provider        = cngKey.Provider;
            string           keyName         = cngKey.KeyName;
            bool             isMachineKey    = IsMachineKey(cngKey);
            int dwKeySpec = CertificateExtensionsCommon.GuessKeySpec(provider, keyName, isMachineKey, cngKey.AlgorithmGroup);

            X509Native.CRYPT_KEY_PROV_INFO crypt_KEY_PROV_INFO = default(X509Native.CRYPT_KEY_PROV_INFO);
            crypt_KEY_PROV_INFO.pwszContainerName = cngKey.KeyName;
            crypt_KEY_PROV_INFO.pwszProvName      = cngKey.Provider.Provider;
            crypt_KEY_PROV_INFO.dwFlags           = (int)(isMachineKey ? CngKeyOpenOptions.MachineKey : CngKeyOpenOptions.None);
            crypt_KEY_PROV_INFO.dwKeySpec         = dwKeySpec;
            using (SafeCertContextHandle certificateContext = X509Native.GetCertificateContext(x509Certificate))
            {
                if (!X509Native.SetCertificateKeyProvInfo(certificateContext, ref crypt_KEY_PROV_INFO))
                {
                    int lastWin32Error = Marshal.GetLastWin32Error();
                    x509Certificate.Dispose();
                    throw new CryptographicException(lastWin32Error);
                }
            }
            return(x509Certificate);
        }
Exemple #2
0
 internal static bool SetCertificateKeyProvInfo(SafeCertContextHandle certificateContext, ref X509Native.CRYPT_KEY_PROV_INFO provInfo)
 {
     return(X509Native.UnsafeNativeMethods.CertSetCertificateContextProperty(certificateContext, X509Native.CertificateProperty.KeyProviderInfo, X509Native.CertSetPropertyFlags.None, ref provInfo));
 }
Exemple #3
0
 internal static extern bool CertSetCertificateContextProperty(SafeCertContextHandle pCertContext, X509Native.CertificateProperty dwPropId, X509Native.CertSetPropertyFlags dwFlags, [In] ref X509Native.CRYPT_KEY_PROV_INFO pvData);