public static AsymmetricAlgorithm GetPublicKeyAlgorithm(this X509Certificate2 certificate)
        {
            if (certificate == null)
            {
                throw ExceptionUtility.ArgumentNull("certificate");
            }

            var cspObject = new GostKeyExchangeParameters();

            cspObject.DecodeParameters(certificate.PublicKey.EncodedParameters.RawData);
            cspObject.DecodePublicKey(certificate.PublicKey.EncodedKeyValue.RawData);

            var cspBlobData = CryptoApiHelper.EncodePublicBlob(cspObject);

            var publicKey = new Gost3410AsymmetricAlgorithm();

            publicKey.ImportCspBlob(cspBlobData);

            return(publicKey);
        }
Exemple #2
0
        public AsymmetricAlgorithm DecodePublicKey(Oid oid, byte[] encodedKeyValue, byte[] encodedParameters, ICertificatePal certificatePal)
        {
            if (oid.Value == Oids.EcPublicKey && certificatePal != null)
            {
                return(DecodeECDsaPublicKey((CertificatePal)certificatePal));
            }

            int algId = Interop.Crypt32.FindOidInfo(CryptOidInfoKeyType.CRYPT_OID_INFO_OID_KEY, oid.Value, OidGroup.PublicKeyAlgorithm, fallBackToAllGroups: true).AlgId;

            switch (algId)
            {
            case AlgId.CALG_RSA_KEYX:
            case AlgId.CALG_RSA_SIGN:
            {
                byte[] keyBlob = DecodeKeyBlob(CryptDecodeObjectStructType.CNG_RSA_PUBLIC_KEY_BLOB, encodedKeyValue);
                CngKey cngKey  = CngKey.Import(keyBlob, CngKeyBlobFormat.GenericPublicBlob);
                return(new RSACng(cngKey));
            }

            //begin: gost
            case AlgId.CALG_GOST3410:
            {
                var cspObject = new GostKeyExchangeParameters();
                cspObject.DecodeParameters(encodedParameters);
                cspObject.DecodePublicKey(encodedKeyValue, algId);
                var cspBlobData = GostKeyExchangeParameters.EncodePublicBlob(cspObject, algId);

                Gost3410CryptoServiceProvider gost_sp = new Gost3410CryptoServiceProvider();
                gost_sp.ImportCspBlob(cspBlobData);
                return(gost_sp);
            }

            case AlgId.CALG_GOST3410_2012_256:
            {
                var cspObject = new GostKeyExchangeParameters();
                cspObject.DecodeParameters(encodedParameters);
                cspObject.DecodePublicKey(encodedKeyValue, algId);
                var cspBlobData = GostKeyExchangeParameters.EncodePublicBlob(cspObject, algId);

                Gost3410_2012_256CryptoServiceProvider gost_sp = new Gost3410_2012_256CryptoServiceProvider();
                gost_sp.ImportCspBlob(cspBlobData);
                return(gost_sp);
            }

            case AlgId.CALG_GOST3410_2012_512:
            {
                var cspObject = new GostKeyExchangeParameters();
                cspObject.DecodeParameters(encodedParameters);
                cspObject.DecodePublicKey(encodedKeyValue, algId);
                var cspBlobData = GostKeyExchangeParameters.EncodePublicBlob(cspObject, algId);

                Gost3410_2012_512CryptoServiceProvider gost_sp = new Gost3410_2012_512CryptoServiceProvider();
                gost_sp.ImportCspBlob(cspBlobData);
                return(gost_sp);
            }

            //end: gost
            case AlgId.CALG_DSS_SIGN:
            {
                byte[] keyBlob = ConstructDSSPublicKeyCspBlob(encodedKeyValue, encodedParameters);
                DSACryptoServiceProvider dsa = new DSACryptoServiceProvider();
                dsa.ImportCspBlob(keyBlob);
                return(dsa);
            }

            default:
                throw new NotSupportedException(SR.NotSupported_KeyAlgorithm);
            }
        }