|
@@ -1,14 +1,18 @@
|
|
|
-using Renci.SshNet.Abstractions;
|
|
|
|
|
|
|
+using System;
|
|
|
|
|
+
|
|
|
|
|
+using Org.BouncyCastle.Crypto.Agreement;
|
|
|
|
|
+using Org.BouncyCastle.Crypto.Generators;
|
|
|
|
|
+using Org.BouncyCastle.Crypto.Parameters;
|
|
|
|
|
+
|
|
|
|
|
+using Renci.SshNet.Abstractions;
|
|
|
using Renci.SshNet.Common;
|
|
using Renci.SshNet.Common;
|
|
|
using Renci.SshNet.Messages.Transport;
|
|
using Renci.SshNet.Messages.Transport;
|
|
|
-using Renci.SshNet.Security.Chaos.NaCl;
|
|
|
|
|
-using Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10;
|
|
|
|
|
|
|
|
|
|
namespace Renci.SshNet.Security
|
|
namespace Renci.SshNet.Security
|
|
|
{
|
|
{
|
|
|
internal sealed class KeyExchangeECCurve25519 : KeyExchangeEC
|
|
internal sealed class KeyExchangeECCurve25519 : KeyExchangeEC
|
|
|
{
|
|
{
|
|
|
- private byte[] _privateKey;
|
|
|
|
|
|
|
+ private X25519Agreement _keyAgreement;
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// <summary>
|
|
|
/// Gets algorithm name.
|
|
/// Gets algorithm name.
|
|
@@ -38,13 +42,13 @@ namespace Renci.SshNet.Security
|
|
|
|
|
|
|
|
Session.KeyExchangeEcdhReplyMessageReceived += Session_KeyExchangeEcdhReplyMessageReceived;
|
|
Session.KeyExchangeEcdhReplyMessageReceived += Session_KeyExchangeEcdhReplyMessageReceived;
|
|
|
|
|
|
|
|
- var basepoint = new byte[MontgomeryCurve25519.PublicKeySizeInBytes];
|
|
|
|
|
- basepoint[0] = 9;
|
|
|
|
|
|
|
+ var g = new X25519KeyPairGenerator();
|
|
|
|
|
+ g.Init(new X25519KeyGenerationParameters(CryptoAbstraction.SecureRandom));
|
|
|
|
|
|
|
|
- _privateKey = CryptoAbstraction.GenerateRandom(MontgomeryCurve25519.PrivateKeySizeInBytes);
|
|
|
|
|
-
|
|
|
|
|
- _clientExchangeValue = new byte[MontgomeryCurve25519.PublicKeySizeInBytes];
|
|
|
|
|
- MontgomeryOperations.scalarmult(_clientExchangeValue, 0, _privateKey, 0, basepoint, 0);
|
|
|
|
|
|
|
+ var aKeyPair = g.GenerateKeyPair();
|
|
|
|
|
+ _keyAgreement = new X25519Agreement();
|
|
|
|
|
+ _keyAgreement.Init(aKeyPair.Private);
|
|
|
|
|
+ _clientExchangeValue = ((X25519PublicKeyParameters)aKeyPair.Public).GetEncoded();
|
|
|
|
|
|
|
|
SendMessage(new KeyExchangeEcdhInitMessage(_clientExchangeValue));
|
|
SendMessage(new KeyExchangeEcdhInitMessage(_clientExchangeValue));
|
|
|
}
|
|
}
|
|
@@ -96,9 +100,11 @@ namespace Renci.SshNet.Security
|
|
|
_hostKey = hostKey;
|
|
_hostKey = hostKey;
|
|
|
_signature = signature;
|
|
_signature = signature;
|
|
|
|
|
|
|
|
- var sharedKey = new byte[MontgomeryCurve25519.PublicKeySizeInBytes];
|
|
|
|
|
- MontgomeryOperations.scalarmult(sharedKey, 0, _privateKey, 0, serverExchangeValue, 0);
|
|
|
|
|
- SharedKey = sharedKey.ToBigInteger2().ToByteArray().Reverse();
|
|
|
|
|
|
|
+ var publicKey = new X25519PublicKeyParameters(serverExchangeValue);
|
|
|
|
|
+
|
|
|
|
|
+ var k1 = new byte[_keyAgreement.AgreementSize];
|
|
|
|
|
+ _keyAgreement.CalculateAgreement(publicKey, k1, 0);
|
|
|
|
|
+ SharedKey = k1.ToBigInteger2().ToByteArray().Reverse();
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|