KeyExchangeECDH.BouncyCastleImpl.cs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. using Org.BouncyCastle.Asn1.X9;
  2. using Org.BouncyCastle.Crypto.Agreement;
  3. using Org.BouncyCastle.Crypto.Generators;
  4. using Org.BouncyCastle.Crypto.Parameters;
  5. using Renci.SshNet.Abstractions;
  6. namespace Renci.SshNet.Security
  7. {
  8. internal abstract partial class KeyExchangeECDH
  9. {
  10. private sealed class BouncyCastleImpl : Impl
  11. {
  12. private readonly ECDomainParameters _domainParameters;
  13. private readonly ECDHCBasicAgreement _keyAgreement;
  14. public BouncyCastleImpl(X9ECParameters curveParameters)
  15. {
  16. _domainParameters = new ECDomainParameters(curveParameters);
  17. _keyAgreement = new ECDHCBasicAgreement();
  18. }
  19. public override byte[] GenerateClientECPoint()
  20. {
  21. var g = new ECKeyPairGenerator();
  22. g.Init(new ECKeyGenerationParameters(_domainParameters, CryptoAbstraction.SecureRandom));
  23. var aKeyPair = g.GenerateKeyPair();
  24. _keyAgreement.Init(aKeyPair.Private);
  25. return ((ECPublicKeyParameters)aKeyPair.Public).Q.GetEncoded();
  26. }
  27. public override byte[] CalculateAgreement(byte[] serverECPoint)
  28. {
  29. var c = _domainParameters.Curve;
  30. var q = c.DecodePoint(serverECPoint);
  31. var publicKey = new ECPublicKeyParameters("ECDH", q, _domainParameters);
  32. return _keyAgreement.CalculateAgreement(publicKey).ToByteArray();
  33. }
  34. }
  35. }
  36. }