|
1 | | -using Renci.SshNet.Abstractions; |
| 1 | +using System; |
| 2 | + |
| 3 | +using Org.BouncyCastle.Crypto.Agreement; |
| 4 | +using Org.BouncyCastle.Crypto.Generators; |
| 5 | +using Org.BouncyCastle.Crypto.Parameters; |
| 6 | + |
| 7 | +using Renci.SshNet.Abstractions; |
2 | 8 | using Renci.SshNet.Common; |
3 | 9 | using Renci.SshNet.Messages.Transport; |
4 | | -using Renci.SshNet.Security.Chaos.NaCl; |
5 | | -using Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10; |
6 | 10 |
|
7 | 11 | namespace Renci.SshNet.Security |
8 | 12 | { |
9 | 13 | internal sealed class KeyExchangeECCurve25519 : KeyExchangeEC |
10 | 14 | { |
11 | | - private byte[] _privateKey; |
| 15 | + private X25519Agreement _keyAgreement; |
12 | 16 |
|
13 | 17 | /// <summary> |
14 | 18 | /// Gets algorithm name. |
@@ -38,13 +42,13 @@ public override void Start(Session session, KeyExchangeInitMessage message, bool |
38 | 42 |
|
39 | 43 | Session.KeyExchangeEcdhReplyMessageReceived += Session_KeyExchangeEcdhReplyMessageReceived; |
40 | 44 |
|
41 | | - var basepoint = new byte[MontgomeryCurve25519.PublicKeySizeInBytes]; |
42 | | - basepoint[0] = 9; |
| 45 | + var g = new X25519KeyPairGenerator(); |
| 46 | + g.Init(new X25519KeyGenerationParameters(CryptoAbstraction.SecureRandom)); |
43 | 47 |
|
44 | | - _privateKey = CryptoAbstraction.GenerateRandom(MontgomeryCurve25519.PrivateKeySizeInBytes); |
45 | | - |
46 | | - _clientExchangeValue = new byte[MontgomeryCurve25519.PublicKeySizeInBytes]; |
47 | | - MontgomeryOperations.scalarmult(_clientExchangeValue, 0, _privateKey, 0, basepoint, 0); |
| 48 | + var aKeyPair = g.GenerateKeyPair(); |
| 49 | + _keyAgreement = new X25519Agreement(); |
| 50 | + _keyAgreement.Init(aKeyPair.Private); |
| 51 | + _clientExchangeValue = ((X25519PublicKeyParameters)aKeyPair.Public).GetEncoded(); |
48 | 52 |
|
49 | 53 | SendMessage(new KeyExchangeEcdhInitMessage(_clientExchangeValue)); |
50 | 54 | } |
@@ -96,9 +100,11 @@ private void HandleServerEcdhReply(byte[] hostKey, byte[] serverExchangeValue, b |
96 | 100 | _hostKey = hostKey; |
97 | 101 | _signature = signature; |
98 | 102 |
|
99 | | - var sharedKey = new byte[MontgomeryCurve25519.PublicKeySizeInBytes]; |
100 | | - MontgomeryOperations.scalarmult(sharedKey, 0, _privateKey, 0, serverExchangeValue, 0); |
101 | | - SharedKey = sharedKey.ToBigInteger2().ToByteArray().Reverse(); |
| 103 | + var publicKey = new X25519PublicKeyParameters(serverExchangeValue); |
| 104 | + |
| 105 | + var k1 = new byte[_keyAgreement.AgreementSize]; |
| 106 | + _keyAgreement.CalculateAgreement(publicKey, k1, 0); |
| 107 | + SharedKey = k1.ToBigInteger2().ToByteArray().Reverse(); |
102 | 108 | } |
103 | 109 | } |
104 | 110 | } |
0 commit comments