3
3
*/
4
4
package com .trilead .ssh2 .crypto .dh ;
5
5
6
- import java .io .IOException ;
7
- import java .math .BigInteger ;
8
- import java .security .InvalidAlgorithmParameterException ;
9
- import java .security .InvalidKeyException ;
10
- import java .security .KeyFactory ;
11
- import java .security .KeyPair ;
12
- import java .security .KeyPairGenerator ;
13
- import java .security .NoSuchAlgorithmException ;
14
- import java .security .spec .InvalidKeySpecException ;
15
-
16
6
import javax .crypto .KeyAgreement ;
17
7
import javax .crypto .interfaces .DHPrivateKey ;
18
8
import javax .crypto .interfaces .DHPublicKey ;
19
9
import javax .crypto .spec .DHParameterSpec ;
20
10
import javax .crypto .spec .DHPublicKeySpec ;
11
+ import java .io .IOException ;
12
+ import java .math .BigInteger ;
13
+ import java .security .*;
14
+ import java .security .spec .InvalidKeySpecException ;
21
15
22
16
/**
23
17
* @author kenny
@@ -28,28 +22,100 @@ public class DhExchange extends GenericDhExchange {
28
22
/* Given by the standard */
29
23
30
24
private static final BigInteger P1 = new BigInteger (
31
- "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
32
- + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD"
33
- + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
34
- + "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"
35
- + "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381"
36
- + "FFFFFFFFFFFFFFFF" , 16 );
25
+ "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" +
26
+ "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" +
27
+ "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" +
28
+ "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" +
29
+ "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381" +
30
+ "FFFFFFFFFFFFFFFF" ,16 );
37
31
38
32
private static final BigInteger P14 = new BigInteger (
39
- "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
40
- + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD"
41
- + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
42
- + "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"
43
- + "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D"
44
- + "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F"
45
- + "83655D23DCA3AD961C62F356208552BB9ED529077096966D"
46
- + "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B"
47
- + "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9"
48
- + "DE2BCBF6955817183995497CEA956AE515D2261898FA0510"
49
- + "15728E5A8AACAA68FFFFFFFFFFFFFFFF" , 16 );
33
+ "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" +
34
+ "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" +
35
+ "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" +
36
+ "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" +
37
+ "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" +
38
+ "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" +
39
+ "83655D23DCA3AD961C62F356208552BB9ED529077096966D" +
40
+ "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" +
41
+ "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" +
42
+ "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" +
43
+ "15728E5A8AACAA68FFFFFFFFFFFFFFFF" , 16 );
44
+
45
+ private static final BigInteger P16 = new BigInteger (
46
+ "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" +
47
+ "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" +
48
+ "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" +
49
+ "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" +
50
+ "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" +
51
+ "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" +
52
+ "83655D23DCA3AD961C62F356208552BB9ED529077096966D" +
53
+ "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" +
54
+ "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" +
55
+ "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" +
56
+ "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64" +
57
+ "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7" +
58
+ "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B" +
59
+ "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C" +
60
+ "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31" +
61
+ "43DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7" +
62
+ "88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA" +
63
+ "2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6" +
64
+ "287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED" +
65
+ "1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9" +
66
+ "93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199" +
67
+ "FFFFFFFFFFFFFFFF" , 16 );
68
+
69
+ private static final BigInteger P18 = new BigInteger (
70
+ "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" +
71
+ "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" +
72
+ "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" +
73
+ "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" +
74
+ "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" +
75
+ "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" +
76
+ "83655D23DCA3AD961C62F356208552BB9ED529077096966D" +
77
+ "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" +
78
+ "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" +
79
+ "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" +
80
+ "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64" +
81
+ "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7" +
82
+ "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B" +
83
+ "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C" +
84
+ "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31" +
85
+ "43DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7" +
86
+ "88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA" +
87
+ "2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6" +
88
+ "287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED" +
89
+ "1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9" +
90
+ "93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934028492" +
91
+ "36C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BD" +
92
+ "F8FF9406AD9E530EE5DB382F413001AEB06A53ED9027D831" +
93
+ "179727B0865A8918DA3EDBEBCF9B14ED44CE6CBACED4BB1B" +
94
+ "DB7F1447E6CC254B332051512BD7AF426FB8F401378CD2BF" +
95
+ "5983CA01C64B92ECF032EA15D1721D03F482D7CE6E74FEF6" +
96
+ "D55E702F46980C82B5A84031900B1C9E59E7C97FBEC7E8F3" +
97
+ "23A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA" +
98
+ "CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE328" +
99
+ "06A1D58BB7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55C" +
100
+ "DA56C9EC2EF29632387FE8D76E3C0468043E8F663F4860EE" +
101
+ "12BF2D5B0B7474D6E694F91E6DBE115974A3926F12FEE5E4" +
102
+ "38777CB6A932DF8CD8BEC4D073B931BA3BC832B68D9DD300" +
103
+ "741FA7BF8AFC47ED2576F6936BA424663AAB639C5AE4F568" +
104
+ "3423B4742BF1C978238F16CBE39D652DE3FDB8BEFC848AD9" +
105
+ "22222E04A4037C0713EB57A81A23F0C73473FC646CEA306B" +
106
+ "4BCBC8862F8385DDFA9D4B7FA2C087E879683303ED5BDD3A" +
107
+ "062B3CF5B3A278A66D2A13F83F44F82DDF310EE074AB6A36" +
108
+ "4597E899A0255DC164F31CC50846851DF9AB48195DED7EA1" +
109
+ "B1D510BD7EE74D73FAF36BC31ECFA268359046F4EB879F92" +
110
+ "4009438B481C6CD7889A002ED5EE382BC9190DA6FC026E47" +
111
+ "9558E4475677E9AA9E3050E2765694DFC81F56E880B96E71" +
112
+ "60C980DD98EDD3DFFFFFFFFFFFFFFFFF" , 16 );
50
113
51
114
private static final BigInteger G = BigInteger .valueOf (2 );
52
115
116
+ /* Hash algorithm to use */
117
+ private String hashAlgo ;
118
+
53
119
/* Client public and private */
54
120
55
121
private DHPrivateKey clientPrivate ;
@@ -62,10 +128,21 @@ public class DhExchange extends GenericDhExchange {
62
128
@ Override
63
129
public void init (String name ) throws IOException {
64
130
final DHParameterSpec spec ;
65
- if ("diffie-hellman-group1-sha1" .equals (name )) {
66
- spec = new DHParameterSpec (P1 , G );
131
+ if ("diffie-hellman-group18-sha512" .equals (name )) {
132
+ spec = new DHParameterSpec (P18 , G );
133
+ hashAlgo = "SHA-512" ;
134
+ } else if ("diffie-hellman-group16-sha512" .equals (name )) {
135
+ spec = new DHParameterSpec (P16 , G );
136
+ hashAlgo = "SHA-512" ;
137
+ } else if ("diffie-hellman-group14-sha256" .equals (name )) {
138
+ spec = new DHParameterSpec (P14 , G );
139
+ hashAlgo = "SHA-256" ;
67
140
} else if ("diffie-hellman-group14-sha1" .equals (name )) {
68
141
spec = new DHParameterSpec (P14 , G );
142
+ hashAlgo = "SHA-1" ;
143
+ } else if ("diffie-hellman-group1-sha1" .equals (name )) {
144
+ spec = new DHParameterSpec (P1 , G );
145
+ hashAlgo = "SHA-1" ;
69
146
} else {
70
147
throw new IllegalArgumentException ("Unknown DH group " + name );
71
148
}
@@ -116,9 +193,7 @@ public void setF(byte[] f) throws IOException {
116
193
ka .doPhase (serverPublic , true );
117
194
} catch (NoSuchAlgorithmException e ) {
118
195
throw new IOException ("No DH key agreement method" , e );
119
- } catch (InvalidKeyException e ) {
120
- throw new IOException ("Invalid DH key" , e );
121
- } catch (InvalidKeySpecException e ) {
196
+ } catch (InvalidKeyException | InvalidKeySpecException e ) {
122
197
throw new IOException ("Invalid DH key" , e );
123
198
}
124
199
@@ -127,6 +202,6 @@ public void setF(byte[] f) throws IOException {
127
202
128
203
@ Override
129
204
public String getHashAlgo () {
130
- return "SHA1" ;
205
+ return hashAlgo ;
131
206
}
132
207
}
0 commit comments