@@ -22,6 +22,7 @@ import (
22
22
const (
23
23
kexAlgoDH1SHA1 = "diffie-hellman-group1-sha1"
24
24
kexAlgoDH14SHA1 = "diffie-hellman-group14-sha1"
25
+ kexAlgoDH14SHA256 = "diffie-hellman-group14-sha256"
25
26
kexAlgoECDH256 = "ecdh-sha2-nistp256"
26
27
kexAlgoECDH384 = "ecdh-sha2-nistp384"
27
28
kexAlgoECDH521 = "ecdh-sha2-nistp521"
@@ -87,6 +88,7 @@ type kexAlgorithm interface {
87
88
// dhGroup is a multiplicative group suitable for implementing Diffie-Hellman key agreement.
88
89
type dhGroup struct {
89
90
g , p , pMinus1 * big.Int
91
+ hashFunc crypto.Hash
90
92
}
91
93
92
94
func (group * dhGroup ) diffieHellman (theirPublic , myPrivate * big.Int ) (* big.Int , error ) {
@@ -97,8 +99,6 @@ func (group *dhGroup) diffieHellman(theirPublic, myPrivate *big.Int) (*big.Int,
97
99
}
98
100
99
101
func (group * dhGroup ) Client (c packetConn , randSource io.Reader , magics * handshakeMagics ) (* kexResult , error ) {
100
- hashFunc := crypto .SHA1
101
-
102
102
var x * big.Int
103
103
for {
104
104
var err error
@@ -133,7 +133,7 @@ func (group *dhGroup) Client(c packetConn, randSource io.Reader, magics *handsha
133
133
return nil , err
134
134
}
135
135
136
- h := hashFunc .New ()
136
+ h := group . hashFunc .New ()
137
137
magics .write (h )
138
138
writeString (h , kexDHReply .HostKey )
139
139
writeInt (h , X )
@@ -147,12 +147,11 @@ func (group *dhGroup) Client(c packetConn, randSource io.Reader, magics *handsha
147
147
K : K ,
148
148
HostKey : kexDHReply .HostKey ,
149
149
Signature : kexDHReply .Signature ,
150
- Hash : crypto . SHA1 ,
150
+ Hash : group . hashFunc ,
151
151
}, nil
152
152
}
153
153
154
154
func (group * dhGroup ) Server (c packetConn , randSource io.Reader , magics * handshakeMagics , priv Signer ) (result * kexResult , err error ) {
155
- hashFunc := crypto .SHA1
156
155
packet , err := c .readPacket ()
157
156
if err != nil {
158
157
return
@@ -180,7 +179,7 @@ func (group *dhGroup) Server(c packetConn, randSource io.Reader, magics *handsha
180
179
181
180
hostKeyBytes := priv .PublicKey ().Marshal ()
182
181
183
- h := hashFunc .New ()
182
+ h := group . hashFunc .New ()
184
183
magics .write (h )
185
184
writeString (h , hostKeyBytes )
186
185
writeInt (h , kexDHInit .X )
@@ -212,7 +211,7 @@ func (group *dhGroup) Server(c packetConn, randSource io.Reader, magics *handsha
212
211
K : K ,
213
212
HostKey : hostKeyBytes ,
214
213
Signature : sig ,
215
- Hash : crypto . SHA1 ,
214
+ Hash : group . hashFunc ,
216
215
}, err
217
216
}
218
217
@@ -388,25 +387,35 @@ func (kex *ecdh) Server(c packetConn, rand io.Reader, magics *handshakeMagics, p
388
387
var kexAlgoMap = map [string ]kexAlgorithm {}
389
388
390
389
func init () {
391
- // This is the group called diffie-hellman-group1-sha1 in RFC
392
- // 4253 and Oakley Group 2 in RFC 2409.
390
+ // This is the group called diffie-hellman-group1-sha1 in
391
+ // RFC 4253 and Oakley Group 2 in RFC 2409.
393
392
p , _ := new (big.Int ).SetString ("FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF" , 16 )
394
393
kexAlgoMap [kexAlgoDH1SHA1 ] = & dhGroup {
395
- g : new (big.Int ).SetInt64 (2 ),
396
- p : p ,
397
- pMinus1 : new (big.Int ).Sub (p , bigOne ),
394
+ g : new (big.Int ).SetInt64 (2 ),
395
+ p : p ,
396
+ pMinus1 : new (big.Int ).Sub (p , bigOne ),
397
+ hashFunc : crypto .SHA1 ,
398
398
}
399
399
400
- // This is the group called diffie-hellman-group14-sha1 in RFC
401
- // 4253 and Oakley Group 14 in RFC 3526.
400
+ // This are the groups called diffie-hellman-group14-sha1 and
401
+ // diffie-hellman-group14-sha256 in RFC 4253 and RFC 8268,
402
+ // and Oakley Group 14 in RFC 3526.
402
403
p , _ = new (big.Int ).SetString ("FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF" , 16 )
403
-
404
- kexAlgoMap [kexAlgoDH14SHA1 ] = & dhGroup {
404
+ group14 := & dhGroup {
405
405
g : new (big.Int ).SetInt64 (2 ),
406
406
p : p ,
407
407
pMinus1 : new (big.Int ).Sub (p , bigOne ),
408
408
}
409
409
410
+ kexAlgoMap [kexAlgoDH14SHA1 ] = & dhGroup {
411
+ g : group14 .g , p : group14 .p , pMinus1 : group14 .pMinus1 ,
412
+ hashFunc : crypto .SHA1 ,
413
+ }
414
+ kexAlgoMap [kexAlgoDH14SHA256 ] = & dhGroup {
415
+ g : group14 .g , p : group14 .p , pMinus1 : group14 .pMinus1 ,
416
+ hashFunc : crypto .SHA256 ,
417
+ }
418
+
410
419
kexAlgoMap [kexAlgoECDH521 ] = & ecdh {elliptic .P521 ()}
411
420
kexAlgoMap [kexAlgoECDH384 ] = & ecdh {elliptic .P384 ()}
412
421
kexAlgoMap [kexAlgoECDH256 ] = & ecdh {elliptic .P256 ()}
0 commit comments