Ejemplo n.º 1
0
        public byte[] Encode()
        {
            var asnEncoder = new Asn1BerEncodeBuffer();
            var keyTransport = new GostR3410KeyTransport();

            try
            {
                keyTransport.SessionEncryptedKey = new Gost2814789EncryptedKey
                                                   {
                                                       EncryptedKey = new Gost2814789Key(SessionEncryptedKey.EncryptedKey),
                                                       MacKey = new Gost2814789Mac(SessionEncryptedKey.Mac)
                                                   };

                keyTransport.TransportParameters = new GostR3410TransportParameters
                                                   {
                                                       Ukm = new Asn1OctetString(SessionEncryptedKey.Ukm),
                                                       EncryptionParamSet = CreateEncryptionParamSet(SessionEncryptedKey.EncryptionParamSet),
                                                       EphemeralPublicKey = EncodePublicKey(TransportParameters)
                                                   };

                keyTransport.Encode(asnEncoder);
            }
            catch (Exception exception)
            {
                throw ExceptionUtility.CryptographicException(exception, Resources.Asn1EncodeError, typeof(GostR3410KeyTransport).FullName);
            }

            return asnEncoder.MsgCopy;
        }
Ejemplo n.º 2
0
        public void Decode(byte[] data)
        {
            if (data == null)
            {
                throw ExceptionUtility.ArgumentNull("data");
            }

            try
            {
                var asnDecoder = new Asn1BerDecodeBuffer(data);
                var keyTransport = new GostR3410KeyTransport();
                keyTransport.Decode(asnDecoder);

                SessionEncryptedKey = DecodeSessionKey(keyTransport);
                TransportParameters = DecodePublicKey(keyTransport);
            }
            catch (Exception exception)
            {
                throw ExceptionUtility.CryptographicException(exception, Resources.Asn1DecodeError, typeof(GostR3410KeyTransport).FullName);
            }
        }
Ejemplo n.º 3
0
        private static GostKeyExchangeParameters DecodePublicKey(GostR3410KeyTransport keyTransport)
        {
            var publicKeyInfo = keyTransport.TransportParameters.EphemeralPublicKey;
            var publicKeyAlgOid = Asn1ObjectIdentifier.ToOidString(publicKeyInfo.Algorithm.Algorithm);

            if (!publicKeyAlgOid.Equals(GostR34102001Constants.IdGostR34102001String))
            {
                throw ExceptionUtility.CryptographicException(Resources.Asn1DecodeAlg, publicKeyAlgOid);
            }

            var choice = publicKeyInfo.Algorithm.Parameters as Asn1Choice;

            if (choice == null)
            {
                throw ExceptionUtility.CryptographicException(Resources.Asn1DecodeAlgorithmParameters);
            }

            var publicKeyParams = choice.GetElement() as GostR34102001PublicKeyParameters;

            if (publicKeyParams == null)
            {
                throw ExceptionUtility.CryptographicException(Resources.Asn1DecodeAlgorithmParameters);
            }

            var asnDecoder = new Asn1BerDecodeBuffer(publicKeyInfo.SubjectPublicKey.Value);
            var publicKey = new Asn1OctetString();
            publicKey.Decode(asnDecoder);

            return new GostKeyExchangeParameters
                   {
                       DigestParamSet = Asn1ObjectIdentifier.ToOidString(publicKeyParams.DigestParamSet),
                       PublicKeyParamSet = Asn1ObjectIdentifier.ToOidString(publicKeyParams.PublicKeyParamSet),
                       EncryptionParamSet = Asn1ObjectIdentifier.ToOidString(publicKeyParams.EncryptionParamSet),
                       PublicKey = publicKey.Value,
                       PrivateKey = null
                   };
        }
Ejemplo n.º 4
0
 private static GostKeyExchangeInfo DecodeSessionKey(GostR3410KeyTransport keyTransport)
 {
     return new GostKeyExchangeInfo
            {
                EncryptionParamSet = Asn1ObjectIdentifier.ToOidString(keyTransport.TransportParameters.EncryptionParamSet),
                EncryptedKey = keyTransport.SessionEncryptedKey.EncryptedKey.Value,
                Mac = keyTransport.SessionEncryptedKey.MacKey.Value,
                Ukm = keyTransport.TransportParameters.Ukm.Value,
            };
 }