Skip to content

Commit 32667df

Browse files
jvanbruntEugeny
andauthored
Updating support for additional diffie-helman. (#486)
Summary: Adding additional support for other common SSH algorithms --- - Added support for `diffie-hellman-group15-sha512` https://www.ietf.org/rfc/rfc3526.txt - Added support for `diffie-hellman-group17-sha512` https://www.ietf.org/rfc/rfc3526.txt - Added support for `diffie-hellman-group18-sha512` https://www.ietf.org/rfc/rfc3526.txt Tests --- - All current test pass --------- Co-authored-by: Eugene <[email protected]>
1 parent 450b4b6 commit 32667df

File tree

6 files changed

+173
-4
lines changed

6 files changed

+173
-4
lines changed

.vscode/settings.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
{
2+
"rust-analyzer.check.command": "check"
23
}

russh/src/client/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -874,10 +874,10 @@ where
874874
let (kex_done_signal, kex_done_signal_rx) = oneshot::channel();
875875
let join = russh_util::runtime::spawn(session.run(stream, handler, Some(kex_done_signal)));
876876

877-
if kex_done_signal_rx.await.is_err() {
877+
if let Err(err) = kex_done_signal_rx.await {
878878
// kex_done_signal Sender is dropped when the session
879879
// fails before a succesful key exchange
880-
debug!("kex_done_signal sender was dropped");
880+
debug!("kex_done_signal sender was dropped {err:?}");
881881
join.await.map_err(crate::Error::Join)??;
882882
return Err(H::Error::from(crate::Error::Disconnect));
883883
}

russh/src/kex/dh/groups.rs

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,34 @@ pub const DH_GROUP14: DhGroup = DhGroup {
103103
// exp_size: 256,
104104
};
105105

106+
/// https://www.ietf.org/rfc/rfc3526.txt
107+
pub const DH_GROUP15: DhGroup = DhGroup {
108+
prime: DhGroupUInt::new(
109+
hex!(
110+
"
111+
FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1
112+
29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD
113+
EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245
114+
E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED
115+
EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D
116+
C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F
117+
83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D
118+
670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B
119+
E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9
120+
DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510
121+
15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64
122+
ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7
123+
ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B
124+
F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C
125+
BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31
126+
43DB5BFC E0FD108E 4B82D120 A93AD2CA FFFFFFFF FFFFFFFF
127+
"
128+
)
129+
.as_slice(),
130+
),
131+
generator: DhGroupUInt::new(&[2]),
132+
};
133+
106134
pub const DH_GROUP16: DhGroup = DhGroup {
107135
prime: DhGroupUInt::new(
108136
hex!(
@@ -137,6 +165,101 @@ pub const DH_GROUP16: DhGroup = DhGroup {
137165
// exp_size: 512,
138166
};
139167

168+
/// https://www.ietf.org/rfc/rfc3526.txt
169+
pub const DH_GROUP17: DhGroup = DhGroup {
170+
prime: DhGroupUInt::new(
171+
hex!(
172+
"
173+
FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 29024E08
174+
8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD EF9519B3 CD3A431B
175+
302B0A6D F25F1437 4FE1356D 6D51C245 E485B576 625E7EC6 F44C42E9
176+
A637ED6B 0BFF5CB6 F406B7ED EE386BFB 5A899FA5 AE9F2411 7C4B1FE6
177+
49286651 ECE45B3D C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8
178+
FD24CF5F 83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D
179+
670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B E39E772C
180+
180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9 DE2BCBF6 95581718
181+
3995497C EA956AE5 15D22618 98FA0510 15728E5A 8AAAC42D AD33170D
182+
04507A33 A85521AB DF1CBA64 ECFB8504 58DBEF0A 8AEA7157 5D060C7D
183+
B3970F85 A6E1E4C7 ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226
184+
1AD2EE6B F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C
185+
BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31 43DB5BFC
186+
E0FD108E 4B82D120 A9210801 1A723C12 A787E6D7 88719A10 BDBA5B26
187+
99C32718 6AF4E23C 1A946834 B6150BDA 2583E9CA 2AD44CE8 DBBBC2DB
188+
04DE8EF9 2E8EFC14 1FBECAA6 287C5947 4E6BC05D 99B2964F A090C3A2
189+
233BA186 515BE7ED 1F612970 CEE2D7AF B81BDD76 2170481C D0069127
190+
D5B05AA9 93B4EA98 8D8FDDC1 86FFB7DC 90A6C08F 4DF435C9 34028492
191+
36C3FAB4 D27C7026 C1D4DCB2 602646DE C9751E76 3DBA37BD F8FF9406
192+
AD9E530E E5DB382F 413001AE B06A53ED 9027D831 179727B0 865A8918
193+
DA3EDBEB CF9B14ED 44CE6CBA CED4BB1B DB7F1447 E6CC254B 33205151
194+
2BD7AF42 6FB8F401 378CD2BF 5983CA01 C64B92EC F032EA15 D1721D03
195+
F482D7CE 6E74FEF6 D55E702F 46980C82 B5A84031 900B1C9E 59E7C97F
196+
BEC7E8F3 23A97A7E 36CC88BE 0F1D45B7 FF585AC5 4BD407B2 2B4154AA
197+
CC8F6D7E BF48E1D8 14CC5ED2 0F8037E0 A79715EE F29BE328 06A1D58B
198+
B7C5DA76 F550AA3D 8A1FBFF0 EB19CCB1 A313D55C DA56C9EC 2EF29632
199+
387FE8D7 6E3C0468 043E8F66 3F4860EE 12BF2D5B 0B7474D6 E694F91E
200+
6DCC4024 FFFFFFFF FFFFFFFF
201+
"
202+
)
203+
.as_slice(),
204+
),
205+
generator: DhGroupUInt::new(&[2]),
206+
};
207+
208+
/// https://www.ietf.org/rfc/rfc3526.txt
209+
pub const DH_GROUP18: DhGroup = DhGroup {
210+
prime: DhGroupUInt::new(
211+
hex!(
212+
"
213+
FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1
214+
29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD
215+
EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245
216+
E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED
217+
EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D
218+
C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F
219+
83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D
220+
670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B
221+
E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9
222+
DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510
223+
15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64
224+
ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7
225+
ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B
226+
F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C
227+
BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31
228+
43DB5BFC E0FD108E 4B82D120 A9210801 1A723C12 A787E6D7
229+
88719A10 BDBA5B26 99C32718 6AF4E23C 1A946834 B6150BDA
230+
2583E9CA 2AD44CE8 DBBBC2DB 04DE8EF9 2E8EFC14 1FBECAA6
231+
287C5947 4E6BC05D 99B2964F A090C3A2 233BA186 515BE7ED
232+
1F612970 CEE2D7AF B81BDD76 2170481C D0069127 D5B05AA9
233+
93B4EA98 8D8FDDC1 86FFB7DC 90A6C08F 4DF435C9 34028492
234+
36C3FAB4 D27C7026 C1D4DCB2 602646DE C9751E76 3DBA37BD
235+
F8FF9406 AD9E530E E5DB382F 413001AE B06A53ED 9027D831
236+
179727B0 865A8918 DA3EDBEB CF9B14ED 44CE6CBA CED4BB1B
237+
DB7F1447 E6CC254B 33205151 2BD7AF42 6FB8F401 378CD2BF
238+
5983CA01 C64B92EC F032EA15 D1721D03 F482D7CE 6E74FEF6
239+
D55E702F 46980C82 B5A84031 900B1C9E 59E7C97F BEC7E8F3
240+
23A97A7E 36CC88BE 0F1D45B7 FF585AC5 4BD407B2 2B4154AA
241+
CC8F6D7E BF48E1D8 14CC5ED2 0F8037E0 A79715EE F29BE328
242+
06A1D58B B7C5DA76 F550AA3D 8A1FBFF0 EB19CCB1 A313D55C
243+
DA56C9EC 2EF29632 387FE8D7 6E3C0468 043E8F66 3F4860EE
244+
12BF2D5B 0B7474D6 E694F91E 6DBE1159 74A3926F 12FEE5E4
245+
38777CB6 A932DF8C D8BEC4D0 73B931BA 3BC832B6 8D9DD300
246+
741FA7BF 8AFC47ED 2576F693 6BA42466 3AAB639C 5AE4F568
247+
3423B474 2BF1C978 238F16CB E39D652D E3FDB8BE FC848AD9
248+
22222E04 A4037C07 13EB57A8 1A23F0C7 3473FC64 6CEA306B
249+
4BCBC886 2F8385DD FA9D4B7F A2C087E8 79683303 ED5BDD3A
250+
062B3CF5 B3A278A6 6D2A13F8 3F44F82D DF310EE0 74AB6A36
251+
4597E899 A0255DC1 64F31CC5 0846851D F9AB4819 5DED7EA1
252+
B1D510BD 7EE74D73 FAF36BC3 1ECFA268 359046F4 EB879F92
253+
4009438B 481C6CD7 889A002E D5EE382B C9190DA6 FC026E47
254+
9558E447 5677E9AA 9E3050E2 765694DF C81F56E8 80B96E71
255+
60C980DD 98EDD3DF FFFFFFFF FFFFFFFF
256+
"
257+
)
258+
.as_slice(),
259+
),
260+
generator: DhGroupUInt::new(&[2]),
261+
};
262+
140263
#[derive(Debug, PartialEq, Eq, Clone)]
141264
pub(crate) struct DH {
142265
prime_num: BigUint,

russh/src/kex/dh/mod.rs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,38 @@ use sha1::Sha1;
1010
use sha2::{Sha256, Sha512};
1111
use ssh_encoding::{Decode, Encode, Reader, Writer};
1212

13-
use self::groups::{DhGroup, DH_GROUP1, DH_GROUP14, DH_GROUP16};
13+
use self::groups::{
14+
DhGroup, DH_GROUP1, DH_GROUP14, DH_GROUP15, DH_GROUP16, DH_GROUP17, DH_GROUP18,
15+
};
1416
use super::{compute_keys, KexAlgorithm, KexAlgorithmImplementor, KexType};
1517
use crate::client::GexParams;
1618
use crate::session::Exchange;
1719
use crate::{cipher, mac, msg, CryptoVec, Error};
1820

21+
pub(crate) struct DhGroup15Sha512KexType {}
22+
23+
impl KexType for DhGroup15Sha512KexType {
24+
fn make(&self) -> KexAlgorithm {
25+
DhGroupKex::<Sha512>::new(Some(&DH_GROUP15)).into()
26+
}
27+
}
28+
29+
pub(crate) struct DhGroup17Sha512KexType {}
30+
31+
impl KexType for DhGroup17Sha512KexType {
32+
fn make(&self) -> KexAlgorithm {
33+
DhGroupKex::<Sha512>::new(Some(&DH_GROUP17)).into()
34+
}
35+
}
36+
37+
pub(crate) struct DhGroup18Sha512KexType {}
38+
39+
impl KexType for DhGroup18Sha512KexType {
40+
fn make(&self) -> KexAlgorithm {
41+
DhGroupKex::<Sha512>::new(Some(&DH_GROUP18)).into()
42+
}
43+
}
44+
1945
pub(crate) struct DhGexSha1KexType {}
2046

2147
impl KexType for DhGexSha1KexType {

russh/src/kex/mod.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ use delegate::delegate;
3030
use dh::groups::DhGroup;
3131
use dh::{
3232
DhGexSha1KexType, DhGexSha256KexType, DhGroup14Sha1KexType, DhGroup14Sha256KexType,
33-
DhGroup16Sha512KexType, DhGroup1Sha1KexType,
33+
DhGroup15Sha512KexType, DhGroup16Sha512KexType, DhGroup17Sha512KexType, DhGroup18Sha512KexType,
34+
DhGroup1Sha1KexType,
3435
};
3536
use digest::Digest;
3637
use ecdh_nistp::{EcdhNistP256KexType, EcdhNistP384KexType, EcdhNistP521KexType};
@@ -232,8 +233,14 @@ pub const DH_G1_SHA1: Name = Name("diffie-hellman-group1-sha1");
232233
pub const DH_G14_SHA1: Name = Name("diffie-hellman-group14-sha1");
233234
/// `diffie-hellman-group14-sha256`
234235
pub const DH_G14_SHA256: Name = Name("diffie-hellman-group14-sha256");
236+
/// `diffie-hellman-group15-sha512`
237+
pub const DH_G15_SHA512: Name = Name("diffie-hellman-group15-sha512");
235238
/// `diffie-hellman-group16-sha512`
236239
pub const DH_G16_SHA512: Name = Name("diffie-hellman-group16-sha512");
240+
/// `diffie-hellman-group17-sha512`
241+
pub const DH_G17_SHA512: Name = Name("diffie-hellman-group17-sha512");
242+
/// `diffie-hellman-group18-sha512`
243+
pub const DH_G18_SHA512: Name = Name("diffie-hellman-group18-sha512");
237244
/// `ecdh-sha2-nistp256`
238245
pub const ECDH_SHA2_NISTP256: Name = Name("ecdh-sha2-nistp256");
239246
/// `ecdh-sha2-nistp384`
@@ -257,7 +264,10 @@ const _DH_GEX_SHA256: DhGexSha256KexType = DhGexSha256KexType {};
257264
const _DH_G1_SHA1: DhGroup1Sha1KexType = DhGroup1Sha1KexType {};
258265
const _DH_G14_SHA1: DhGroup14Sha1KexType = DhGroup14Sha1KexType {};
259266
const _DH_G14_SHA256: DhGroup14Sha256KexType = DhGroup14Sha256KexType {};
267+
const _DH_G15_SHA512: DhGroup15Sha512KexType = DhGroup15Sha512KexType {};
260268
const _DH_G16_SHA512: DhGroup16Sha512KexType = DhGroup16Sha512KexType {};
269+
const _DH_G17_SHA512: DhGroup17Sha512KexType = DhGroup17Sha512KexType {};
270+
const _DH_G18_SHA512: DhGroup18Sha512KexType = DhGroup18Sha512KexType {};
261271
const _ECDH_SHA2_NISTP256: EcdhNistP256KexType = EcdhNistP256KexType {};
262272
const _ECDH_SHA2_NISTP384: EcdhNistP384KexType = EcdhNistP384KexType {};
263273
const _ECDH_SHA2_NISTP521: EcdhNistP521KexType = EcdhNistP521KexType {};
@@ -271,7 +281,10 @@ pub const ALL_KEX_ALGORITHMS: &[&Name] = &[
271281
&DH_G1_SHA1,
272282
&DH_G14_SHA1,
273283
&DH_G14_SHA256,
284+
&DH_G15_SHA512,
274285
&DH_G16_SHA512,
286+
&DH_G17_SHA512,
287+
&DH_G18_SHA512,
275288
&ECDH_SHA2_NISTP256,
276289
&ECDH_SHA2_NISTP384,
277290
&ECDH_SHA2_NISTP521,
@@ -285,7 +298,10 @@ pub(crate) static KEXES: Lazy<HashMap<&'static Name, &(dyn KexType + Send + Sync
285298
h.insert(&CURVE25519_PRE_RFC_8731, &_CURVE25519);
286299
h.insert(&DH_GEX_SHA1, &_DH_GEX_SHA1);
287300
h.insert(&DH_GEX_SHA256, &_DH_GEX_SHA256);
301+
h.insert(&DH_G18_SHA512, &_DH_G18_SHA512);
302+
h.insert(&DH_G17_SHA512, &_DH_G17_SHA512);
288303
h.insert(&DH_G16_SHA512, &_DH_G16_SHA512);
304+
h.insert(&DH_G15_SHA512, &_DH_G15_SHA512);
289305
h.insert(&DH_G14_SHA256, &_DH_G14_SHA256);
290306
h.insert(&DH_G14_SHA1, &_DH_G14_SHA1);
291307
h.insert(&DH_G1_SHA1, &_DH_G1_SHA1);

russh/src/negotiation.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,10 @@ const SAFE_KEX_ORDER: &[kex::Name] = &[
9292
kex::CURVE25519,
9393
kex::CURVE25519_PRE_RFC_8731,
9494
kex::DH_GEX_SHA256,
95+
kex::DH_G18_SHA512,
96+
kex::DH_G17_SHA512,
9597
kex::DH_G16_SHA512,
98+
kex::DH_G15_SHA512,
9699
kex::DH_G14_SHA256,
97100
kex::EXTENSION_SUPPORT_AS_CLIENT,
98101
kex::EXTENSION_SUPPORT_AS_SERVER,

0 commit comments

Comments
 (0)