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