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

            var cspObject = new Asn1.Common.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);
        }
Пример #2
0
        private static Asn1.Common.GostKeyExchangeParameters DecodePublicBlob(byte[] encodedPublicBlob)
        {
            if (encodedPublicBlob == null)
            {
                throw ExceptionUtility.ArgumentNull("encodedPublicBlob");
            }

            if (encodedPublicBlob.Length < 80)
            {
                throw ExceptionUtility.CryptographicException(Constants.NTE_BAD_DATA);
            }

            var gostKeyMask = BitConverter.ToUInt32(encodedPublicBlob, 8);

            if (gostKeyMask != Constants.GR3410_1_MAGIC)
            {
                throw ExceptionUtility.CryptographicException(Constants.NTE_BAD_DATA);
            }

            var gostKeySize = BitConverter.ToUInt32(encodedPublicBlob, 12);

            if (gostKeySize != 512)
            {
                throw ExceptionUtility.CryptographicException(Constants.NTE_BAD_DATA);
            }

            var publicKeyParameters = new Asn1.Common.GostKeyExchangeParameters();

            var encodeKeyParameters = new byte[(encodedPublicBlob.Length - 16) - 64];

            Array.Copy(encodedPublicBlob, 16, encodeKeyParameters, 0, (encodedPublicBlob.Length - 16) - 64);
            publicKeyParameters.DecodeParameters(encodeKeyParameters);

            var publicKey = new byte[64];

            Array.Copy(encodedPublicBlob, encodedPublicBlob.Length - 64, publicKey, 0, 64);
            publicKeyParameters.PublicKey = publicKey;

            return(publicKeyParameters);
        }