|
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