Add "diffie-hellman-group14-sha1" implementation

This commit is contained in:
olegkap_cp
2010-12-17 13:34:00 +00:00
parent cfcb5dc7cd
commit bf0998c8f6
6 changed files with 145 additions and 31 deletions
@@ -89,6 +89,8 @@
<Compile Include="Security\HMac.cs" />
<Compile Include="Security\HMacMD5.cs" />
<Compile Include="Security\HMacSha1.cs" />
<Compile Include="Security\KeyExchangeDiffieHellman.cs" />
<Compile Include="Security\KeyExchangeDiffieHellmanGroup14Sha1.cs" />
<Compile Include="SftpClient.cs" />
<Compile Include="Sftp\CreateDirectoryCommand.cs" />
<Compile Include="Sftp\DownloadFileCommand.cs" />
@@ -171,7 +173,7 @@
<Compile Include="Security\CryptoPublicKeyRsa.cs" />
<Compile Include="Security\KeyExchangeAlgorithm.cs" />
<Compile Include="Security\KeyExchangeCompletedEventArgs.cs" />
<Compile Include="Security\KeyExchangeDiffieHellman.cs" />
<Compile Include="Security\KeyExchangeDiffieHellmanGroup1Sha1.cs" />
<Compile Include="Security\KeyExchangeFailedEventArgs.cs" />
<Compile Include="Security\KeyExchangeSendMessageEventArgs.cs" />
<Compile Include="PrivateKeyFile.cs" />
@@ -13,11 +13,6 @@ namespace Renci.SshClient.Security
private ICryptoTransform _decryptor;
public override string Name
{
get { return "aes128-cbc"; }
}
public override int KeySize
{
get
@@ -109,6 +104,11 @@ namespace Renci.SshClient.Security
public class CipherAES128CBC : CipherAES
{
public override string Name
{
get { return "aes128-cbc"; }
}
public CipherAES128CBC()
: base(128)
{
@@ -118,6 +118,11 @@ namespace Renci.SshClient.Security
public class CipherAES192CBC : CipherAES
{
public override string Name
{
get { return "aes192-cbc"; }
}
public CipherAES192CBC()
: base(192)
{
@@ -127,6 +132,11 @@ namespace Renci.SshClient.Security
public class CipherAES256CBC : CipherAES
{
public override string Name
{
get { return "aes256-cbc"; }
}
public CipherAES256CBC()
: base(256)
{
@@ -9,29 +9,13 @@ using Renci.SshClient.Messages.Transport;
namespace Renci.SshClient.Security
{
internal class KeyExchangeDiffieHellman : KeyExchangeAlgorithm
internal abstract class KeyExchangeDiffieHellman : KeyExchangeAlgorithm
{
private static RNGCryptoServiceProvider _randomizer = new System.Security.Cryptography.RNGCryptoServiceProvider();
private static BigInteger _prime = new BigInteger(new byte[] { (byte)0x00,
(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,
(byte)0xC9,(byte)0x0F,(byte)0xDA,(byte)0xA2,(byte)0x21,(byte)0x68,(byte)0xC2,(byte)0x34,
(byte)0xC4,(byte)0xC6,(byte)0x62,(byte)0x8B,(byte)0x80,(byte)0xDC,(byte)0x1C,(byte)0xD1,
(byte)0x29,(byte)0x02,(byte)0x4E,(byte)0x08,(byte)0x8A,(byte)0x67,(byte)0xCC,(byte)0x74,
(byte)0x02,(byte)0x0B,(byte)0xBE,(byte)0xA6,(byte)0x3B,(byte)0x13,(byte)0x9B,(byte)0x22,
(byte)0x51,(byte)0x4A,(byte)0x08,(byte)0x79,(byte)0x8E,(byte)0x34,(byte)0x04,(byte)0xDD,
(byte)0xEF,(byte)0x95,(byte)0x19,(byte)0xB3,(byte)0xCD,(byte)0x3A,(byte)0x43,(byte)0x1B,
(byte)0x30,(byte)0x2B,(byte)0x0A,(byte)0x6D,(byte)0xF2,(byte)0x5F,(byte)0x14,(byte)0x37,
(byte)0x4F,(byte)0xE1,(byte)0x35,(byte)0x6D,(byte)0x6D,(byte)0x51,(byte)0xC2,(byte)0x45,
(byte)0xE4,(byte)0x85,(byte)0xB5,(byte)0x76,(byte)0x62,(byte)0x5E,(byte)0x7E,(byte)0xC6,
(byte)0xF4,(byte)0x4C,(byte)0x42,(byte)0xE9,(byte)0xA6,(byte)0x37,(byte)0xED,(byte)0x6B,
(byte)0x0B,(byte)0xFF,(byte)0x5C,(byte)0xB6,(byte)0xF4,(byte)0x06,(byte)0xB7,(byte)0xED,
(byte)0xEE,(byte)0x38,(byte)0x6B,(byte)0xFB,(byte)0x5A,(byte)0x89,(byte)0x9F,(byte)0xA5,
(byte)0xAE,(byte)0x9F,(byte)0x24,(byte)0x11,(byte)0x7C,(byte)0x4B,(byte)0x1F,(byte)0xE6,
(byte)0x49,(byte)0x28,(byte)0x66,(byte)0x51,(byte)0xEC,(byte)0xE6,(byte)0x53,(byte)0x81,
(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF}.Reverse().ToArray());
protected abstract BigInteger Prime { get; }
private static BigInteger _group = new BigInteger(new byte[] { 2 });
protected abstract BigInteger Group { get; }
private string _clientPayload;
@@ -53,7 +37,7 @@ namespace Renci.SshClient.Security
}
/// <summary>
/// Initializes a new instance of the <see cref="KeyExchangeDiffieHellman"/> class.
/// Initializes a new instance of the <see cref="KeyExchangeDiffieHellmanGroup1Sha1"/> class.
/// </summary>
/// <param name="sessionInfo">The session information.</param>
public KeyExchangeDiffieHellman()
@@ -101,9 +85,9 @@ namespace Renci.SshClient.Security
_randomizer.GetBytes(bytesArray);
bytesArray[bytesArray.Length - 1] = (byte)(bytesArray[bytesArray.Length - 1] & 0x7F); // Ensure not a negative value
this._randomValue = new BigInteger(bytesArray);
clientExchangeValue = System.Numerics.BigInteger.ModPow(KeyExchangeDiffieHellman._group, this._randomValue, KeyExchangeDiffieHellman._prime);
clientExchangeValue = System.Numerics.BigInteger.ModPow(this.Group, this._randomValue, this.Prime);
} while (clientExchangeValue < 1 || clientExchangeValue > ((KeyExchangeDiffieHellman._prime - 1)));
} while (clientExchangeValue < 1 || clientExchangeValue > ((this.Prime - 1)));
this._clientExchangeValue = clientExchangeValue;
@@ -123,7 +107,7 @@ namespace Renci.SshClient.Security
this._serverExchangeValue = message.F;
this._hostKey = message.HostKey;
this.SharedKey = System.Numerics.BigInteger.ModPow(message.F, this._randomValue, KeyExchangeDiffieHellman._prime);
this.SharedKey = System.Numerics.BigInteger.ModPow(message.F, this._randomValue, this.Prime);
this._signature = message.Signature;
}
@@ -0,0 +1,46 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using System.Security.Cryptography;
using Renci.SshClient.Common;
using Renci.SshClient.Messages;
using Renci.SshClient.Messages.Transport;
using System.Globalization;
namespace Renci.SshClient.Security
{
internal class KeyExchangeDiffieHellmanGroup14Sha1 : KeyExchangeDiffieHellman
{
private static object _lock = new object();
private static BigInteger _prime;
private static BigInteger _group = new BigInteger(new byte[] { 2 });
protected override BigInteger Prime
{
get
{
if (_prime.IsZero)
{
lock (_lock)
{
if (_prime.IsZero)
{
var secondOkleyGroup = "00FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF";
BigInteger.TryParse(secondOkleyGroup, System.Globalization.NumberStyles.AllowHexSpecifier, CultureInfo.CurrentCulture, out KeyExchangeDiffieHellmanGroup14Sha1._prime);
}
}
}
return KeyExchangeDiffieHellmanGroup14Sha1._prime;
}
}
protected override BigInteger Group
{
get { return KeyExchangeDiffieHellmanGroup14Sha1._group; }
}
}
}
@@ -0,0 +1,46 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using System.Security.Cryptography;
using Renci.SshClient.Common;
using Renci.SshClient.Messages;
using Renci.SshClient.Messages.Transport;
using System.Globalization;
namespace Renci.SshClient.Security
{
internal class KeyExchangeDiffieHellmanGroup1Sha1 : KeyExchangeDiffieHellman
{
private static object _lock = new object();
private static BigInteger _prime;
private static BigInteger _group = new BigInteger(new byte[] { 2 });
protected override BigInteger Prime
{
get
{
if (_prime.IsZero)
{
lock (_lock)
{
if (_prime.IsZero)
{
var secondOkleyGroup = @"00FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF";
BigInteger.TryParse(secondOkleyGroup, System.Globalization.NumberStyles.AllowHexSpecifier, CultureInfo.CurrentCulture, out KeyExchangeDiffieHellmanGroup1Sha1._prime);
}
}
}
return KeyExchangeDiffieHellmanGroup1Sha1._prime;
}
}
protected override BigInteger Group
{
get { return KeyExchangeDiffieHellmanGroup1Sha1._group; }
}
}
}
+28 -2
View File
@@ -390,8 +390,10 @@ namespace Renci.SshClient
this.KeyExchangeAlgorithms = new Dictionary<string, string>()
{
{"diffie-hellman-group1-sha1", typeof(KeyExchangeDiffieHellman).AssemblyQualifiedName},
{"diffie-hellman-group1-sha1", typeof(KeyExchangeDiffieHellmanGroup1Sha1).AssemblyQualifiedName},
{"diffie-hellman-group14-sha1", typeof(KeyExchangeDiffieHellmanGroup14Sha1).AssemblyQualifiedName},
//"diffie-hellman-group-exchange-sha1"
//diffie-hellman-group-exchange-sha256
};
this.Encryptions = new Dictionary<string, string>()
@@ -400,18 +402,41 @@ namespace Renci.SshClient
{"aes128-cbc", typeof(CipherAES128CBC).AssemblyQualifiedName},
{"aes192-cbc", typeof(CipherAES192CBC).AssemblyQualifiedName},
{"aes256-cbc", typeof(CipherAES256CBC).AssemblyQualifiedName},
//{"blowfish-cbc", typeof(...).AssemblyQualifiedName},
//{"twofish256-cbc", typeof(...).AssemblyQualifiedName},
//{"twofish-cbc", typeof(...).AssemblyQualifiedName},
//{"twofish192-cbc", typeof(...).AssemblyQualifiedName},
//{"twofish128-cbc", typeof(...).AssemblyQualifiedName},
//{"serpent256-cbc", typeof(...).AssemblyQualifiedName},
//{"serpent192-cbc", typeof(...).AssemblyQualifiedName},
//{"serpent128-cbc", typeof(...).AssemblyQualifiedName},
//{"arcfour128", typeof(...).AssemblyQualifiedName},
//{"arcfour256", typeof(...).AssemblyQualifiedName},
//{"arcfour", typeof(...).AssemblyQualifiedName},
//{"idea-cbc", typeof(...).AssemblyQualifiedName},
//{"cast128-cbc", typeof(...).AssemblyQualifiedName},
//{"rijndael-cbc@lysator.liu.se", typeof(...).AssemblyQualifiedName},
//{"aes128-ctr", typeof(...).AssemblyQualifiedName},
//{"aes192-ctr", typeof(...).AssemblyQualifiedName},
//{"aes256-ctr", typeof(...).AssemblyQualifiedName},
};
this.HmacAlgorithms = new Dictionary<string, string>()
{
{"hmac-md5", typeof(HMacMD5).AssemblyQualifiedName},
{"hmac-sha1", typeof(HMacSha1).AssemblyQualifiedName},
//{"umac-64@openssh.com", typeof(HMacSha1).AssemblyQualifiedName},
//{"hmac-ripemd160", typeof(HMacSha1).AssemblyQualifiedName},
//{"hmac-ripemd160@openssh.com", typeof(HMacSha1).AssemblyQualifiedName},
//{"hmac-md5-96", typeof(...).AssemblyQualifiedName},
//{"hmac-sha1-96", typeof(...).AssemblyQualifiedName},
//{"none", typeof(...).AssemblyQualifiedName},
};
this.HostKeyAlgorithms = new Dictionary<string, string>()
{
{"ssh-rsa", typeof(CryptoPublicKeyRsa).AssemblyQualifiedName},
{"ssh-dsa", typeof(CryptoPublicKeyDss).AssemblyQualifiedName}, // TODO: Need to be tested
//{"ssh-dss", typeof(CryptoPublicKeyDss).AssemblyQualifiedName},
};
this.SupportedAuthenticationMethods = new Dictionary<string, string>()
@@ -419,6 +444,7 @@ namespace Renci.SshClient
{"none", typeof(UserAuthenticationNone).AssemblyQualifiedName},
{"publickey", typeof(UserAuthenticationPublicKey).AssemblyQualifiedName},
{"password", typeof(UserAuthenticationPassword).AssemblyQualifiedName},
//{"hostbased", typeof(...).AssemblyQualifiedName},
};
this.CompressionAlgorithms = new Dictionary<string, string>()