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);
        }
 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,
     });
 }
        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);
            }
        }
        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
            });
        }