|
1 | | -using Org.BouncyCastle.Crypto.Agreement; |
2 | | -using Org.BouncyCastle.Crypto.Generators; |
3 | | -using Org.BouncyCastle.Crypto.Parameters; |
4 | | - |
5 | | -using Renci.SshNet.Abstractions; |
| 1 | +using Renci.SshNet.Abstractions; |
6 | 2 | using Renci.SshNet.Common; |
7 | 3 | using Renci.SshNet.Messages.Transport; |
8 | 4 |
|
9 | 5 | namespace Renci.SshNet.Security |
10 | 6 | { |
11 | | - internal sealed class KeyExchangeECCurve25519 : KeyExchangeEC |
| 7 | + internal sealed partial class KeyExchangeECCurve25519 : KeyExchangeEC |
12 | 8 | { |
13 | | - private X25519Agreement _keyAgreement; |
| 9 | +#if NET |
| 10 | + private Impl _impl; |
| 11 | +#else |
| 12 | + private BouncyCastleImpl _impl; |
| 13 | +#endif |
14 | 14 |
|
15 | 15 | /// <summary> |
16 | 16 | /// Gets algorithm name. |
@@ -40,13 +40,19 @@ public override void Start(Session session, KeyExchangeInitMessage message, bool |
40 | 40 |
|
41 | 41 | Session.KeyExchangeEcdhReplyMessageReceived += Session_KeyExchangeEcdhReplyMessageReceived; |
42 | 42 |
|
43 | | - var g = new X25519KeyPairGenerator(); |
44 | | - g.Init(new X25519KeyGenerationParameters(CryptoAbstraction.SecureRandom)); |
| 43 | +#if NET |
| 44 | + if (System.OperatingSystem.IsWindowsVersionAtLeast(10)) |
| 45 | + { |
| 46 | + var curve = System.Security.Cryptography.ECCurve.CreateFromFriendlyName("Curve25519"); |
| 47 | + _impl = new BclImpl(curve); |
| 48 | + } |
| 49 | + else |
| 50 | +#endif |
| 51 | + { |
| 52 | + _impl = new BouncyCastleImpl(); |
| 53 | + } |
45 | 54 |
|
46 | | - var aKeyPair = g.GenerateKeyPair(); |
47 | | - _keyAgreement = new X25519Agreement(); |
48 | | - _keyAgreement.Init(aKeyPair.Private); |
49 | | - _clientExchangeValue = ((X25519PublicKeyParameters)aKeyPair.Public).GetEncoded(); |
| 55 | + _clientExchangeValue = _impl.GenerateClientECPoint(); |
50 | 56 |
|
51 | 57 | SendMessage(new KeyExchangeEcdhInitMessage(_clientExchangeValue)); |
52 | 58 | } |
@@ -98,11 +104,19 @@ private void HandleServerEcdhReply(byte[] hostKey, byte[] serverExchangeValue, b |
98 | 104 | _hostKey = hostKey; |
99 | 105 | _signature = signature; |
100 | 106 |
|
101 | | - var publicKey = new X25519PublicKeyParameters(serverExchangeValue); |
102 | | - |
103 | | - var k1 = new byte[_keyAgreement.AgreementSize]; |
104 | | - _keyAgreement.CalculateAgreement(publicKey, k1, 0); |
| 107 | + var k1 = _impl.CalculateAgreement(serverExchangeValue); |
105 | 108 | SharedKey = k1.ToBigInteger2().ToByteArray(isBigEndian: true); |
106 | 109 | } |
| 110 | + |
| 111 | + /// <inheritdoc/> |
| 112 | + protected override void Dispose(bool disposing) |
| 113 | + { |
| 114 | + base.Dispose(disposing); |
| 115 | + |
| 116 | + if (disposing) |
| 117 | + { |
| 118 | + _impl?.Dispose(); |
| 119 | + } |
| 120 | + } |
107 | 121 | } |
108 | 122 | } |
0 commit comments