github.com/zmap/zcrypto@v0.0.0-20240512203510-0fef58d9a9db/tls/key_agreement.go (about) 1 // Copyright 2010 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package tls 6 7 import ( 8 "crypto" 9 "crypto/ecdsa" 10 "crypto/elliptic" 11 "crypto/md5" 12 "crypto/rand" 13 "crypto/rsa" 14 "crypto/sha1" 15 "crypto/sha256" 16 "crypto/sha512" 17 "encoding/asn1" 18 "errors" 19 "io" 20 "math/big" 21 22 "github.com/zmap/zcrypto/dsa" 23 24 "github.com/zmap/zcrypto/x509" 25 ) 26 27 var errClientKeyExchange = errors.New("tls: invalid ClientKeyExchange message") 28 var errServerKeyExchange = errors.New("tls: invalid ServerKeyExchange message") 29 var errUnexpectedServerKeyExchange = errors.New("tls: unexpected ServerKeyExchange message") 30 31 // rsaKeyAgreement implements the standard TLS key agreement where the client 32 // encrypts the pre-master secret to the server's public key. 33 type rsaKeyAgreement struct { 34 auth keyAgreementAuthentication 35 version uint16 36 clientVersion uint16 37 ephemeral bool 38 privateKey *rsa.PrivateKey 39 publicKey *rsa.PublicKey 40 verifyError error 41 } 42 43 func (ka *rsaKeyAgreement) generateServerKeyExchange(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg) (*serverKeyExchangeMsg, error) { 44 // Only send a server key agreement when the cipher is an RSA export 45 // TODO: Make this a configuration parameter 46 ka.clientVersion = clientHello.vers 47 if !ka.ephemeral { 48 return nil, nil 49 } 50 51 // Generate an ephemeral RSA key or use the one in the config 52 if config.ExportRSAKey != nil { 53 ka.privateKey = config.ExportRSAKey 54 } else { 55 key, err := rsa.GenerateKey(config.rand(), 512) 56 if err != nil { 57 return nil, err 58 } 59 ka.privateKey = key 60 } 61 62 // Serialize the key parameters to a nice byte array. The byte array can be 63 // positioned later. 64 modulus := ka.privateKey.N.Bytes() 65 exponent := big.NewInt(int64(ka.privateKey.E)).Bytes() 66 serverRSAParams := make([]byte, 0, 2+len(modulus)+2+len(exponent)) 67 serverRSAParams = append(serverRSAParams, byte(len(modulus)>>8), byte(len(modulus))) 68 serverRSAParams = append(serverRSAParams, modulus...) 69 serverRSAParams = append(serverRSAParams, byte(len(exponent)>>8), byte(len(exponent))) 70 serverRSAParams = append(serverRSAParams, exponent...) 71 72 return ka.auth.signParameters(config, cert, clientHello, hello, serverRSAParams) 73 } 74 75 func (ka *rsaKeyAgreement) processClientKeyExchange(config *Config, cert *Certificate, ckx *clientKeyExchangeMsg) ([]byte, error) { 76 preMasterSecret := make([]byte, 48) 77 _, err := io.ReadFull(config.rand(), preMasterSecret[2:]) 78 if err != nil { 79 return nil, err 80 } 81 82 if len(ckx.ciphertext) < 2 { 83 return nil, errClientKeyExchange 84 } 85 86 ciphertext := ckx.ciphertext 87 if ka.version != VersionSSL30 { 88 ciphertextLen := int(ckx.ciphertext[0])<<8 | int(ckx.ciphertext[1]) 89 if ciphertextLen != len(ckx.ciphertext)-2 { 90 return nil, errClientKeyExchange 91 } 92 ciphertext = ckx.ciphertext[2:] 93 } 94 95 key := ka.privateKey 96 if key == nil { 97 key = cert.PrivateKey.(*rsa.PrivateKey) 98 } 99 100 err = rsa.DecryptPKCS1v15SessionKey(config.rand(), key, ciphertext, preMasterSecret) 101 if err != nil { 102 return nil, err 103 } 104 // We don't check the version number in the premaster secret. For one, 105 // by checking it, we would leak information about the validity of the 106 // encrypted pre-master secret. Secondly, it provides only a small 107 // benefit against a downgrade attack and some implementations send the 108 // wrong version anyway. See the discussion at the end of section 109 // 7.4.7.1 of RFC 4346. 110 return preMasterSecret, nil 111 } 112 113 func (ka *rsaKeyAgreement) processServerKeyExchange(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, skx *serverKeyExchangeMsg) error { 114 if !ka.ephemeral { 115 return nil 116 } 117 118 k := skx.key 119 // Read the modulus 120 if len(k) < 2 { 121 return errServerKeyExchange 122 } 123 modulusLen := (int(k[0]) << 8) | int(k[1]) 124 k = k[2:] 125 if len(k) < modulusLen { 126 return errServerKeyExchange 127 } 128 modulus := new(big.Int).SetBytes(k[:modulusLen]) 129 k = k[modulusLen:] 130 131 // Read the exponent 132 if len(k) < 2 { 133 return errServerKeyExchange 134 } 135 exponentLength := (int(k[0]) << 8) | int(k[1]) 136 k = k[2:] 137 if len(k) < exponentLength || exponentLength > 4 { 138 return errServerKeyExchange 139 } 140 rawExponent := k[0:exponentLength] 141 exponent := 0 142 for _, b := range rawExponent { 143 exponent <<= 8 144 exponent |= int(b) 145 } 146 ka.publicKey = new(rsa.PublicKey) 147 ka.publicKey.E = exponent 148 ka.publicKey.N = modulus 149 150 paramsLen := 2 + exponentLength + 2 + modulusLen 151 152 serverRSAParams := skx.key[:paramsLen] 153 sig := skx.key[paramsLen:] 154 155 skx.digest, ka.verifyError = ka.auth.verifyParameters(config, clientHello, serverHello, cert, serverRSAParams, sig) 156 if config.InsecureSkipVerify { 157 return nil 158 } 159 return ka.verifyError 160 } 161 162 func (ka *rsaKeyAgreement) generateClientKeyExchange(config *Config, clientHello *clientHelloMsg, cert *x509.Certificate) ([]byte, *clientKeyExchangeMsg, error) { 163 preMasterSecret := make([]byte, 48) 164 preMasterSecret[0] = byte(clientHello.vers >> 8) 165 preMasterSecret[1] = byte(clientHello.vers) 166 _, err := io.ReadFull(config.rand(), preMasterSecret[2:]) 167 if err != nil { 168 return nil, nil, err 169 } 170 var publicKey *rsa.PublicKey 171 if ka.publicKey != nil { 172 publicKey = ka.publicKey 173 } else { 174 var ok bool 175 publicKey, ok = cert.PublicKey.(*rsa.PublicKey) 176 if !ok { 177 return nil, nil, errClientKeyExchange 178 } 179 } 180 encrypted, err := rsa.EncryptPKCS1v15(config.rand(), publicKey, preMasterSecret) 181 if err != nil { 182 return nil, nil, err 183 } 184 ckx := new(clientKeyExchangeMsg) 185 var body []byte 186 if ka.version != VersionSSL30 { 187 ckx.ciphertext = make([]byte, len(encrypted)+2) 188 ckx.ciphertext[0] = byte(len(encrypted) >> 8) 189 ckx.ciphertext[1] = byte(len(encrypted)) 190 body = ckx.ciphertext[2:] 191 } else { 192 ckx.ciphertext = make([]byte, len(encrypted)) 193 body = ckx.ciphertext 194 } 195 copy(body, encrypted) 196 return preMasterSecret, ckx, nil 197 } 198 199 // sha1Hash calculates a SHA1 hash over the given byte slices. 200 func md5Hash(slices [][]byte) []byte { 201 h := md5.New() 202 for _, slice := range slices { 203 h.Write(slice) 204 } 205 return h.Sum(nil) 206 } 207 208 // sha1Hash calculates a SHA1 hash over the given byte slices. 209 func sha1Hash(slices [][]byte) []byte { 210 hsha1 := sha1.New() 211 for _, slice := range slices { 212 hsha1.Write(slice) 213 } 214 return hsha1.Sum(nil) 215 } 216 217 // md5SHA1Hash implements TLS 1.0's hybrid hash function which consists of the 218 // concatenation of an MD5 and SHA1 hash. 219 func md5SHA1Hash(slices [][]byte) []byte { 220 md5sha1 := make([]byte, md5.Size+sha1.Size) 221 hmd5 := md5.New() 222 for _, slice := range slices { 223 hmd5.Write(slice) 224 } 225 copy(md5sha1, hmd5.Sum(nil)) 226 copy(md5sha1[md5.Size:], sha1Hash(slices)) 227 return md5sha1 228 } 229 230 // sha224Hash implements TLS 1.2's hash function. 231 func sha224Hash(slices [][]byte) []byte { 232 h := crypto.SHA224.New() 233 for _, slice := range slices { 234 h.Write(slice) 235 } 236 return h.Sum(nil) 237 } 238 239 // sha256Hash implements TLS 1.2's hash function. 240 func sha256Hash(slices [][]byte) []byte { 241 h := sha256.New() 242 for _, slice := range slices { 243 h.Write(slice) 244 } 245 return h.Sum(nil) 246 } 247 248 // sha256Hash implements TLS 1.2's hash function. 249 func sha384Hash(slices [][]byte) []byte { 250 h := crypto.SHA384.New() 251 for _, slice := range slices { 252 h.Write(slice) 253 } 254 return h.Sum(nil) 255 } 256 257 // sha512Hash implements TLS 1.2's hash function. 258 func sha512Hash(slices [][]byte) []byte { 259 h := sha512.New() 260 for _, slice := range slices { 261 h.Write(slice) 262 } 263 return h.Sum(nil) 264 } 265 266 // hashForServerKeyExchange hashes the given slices and returns their digest 267 // and the identifier of the hash function used. The hashFunc argument is only 268 // used for >= TLS 1.2 and precisely identifies the hash function to use. 269 func hashForServerKeyExchange(sigType, hashFunc uint8, version uint16, slices ...[]byte) ([]byte, crypto.Hash, error) { 270 if version >= VersionTLS12 { 271 switch hashFunc { 272 case hashSHA512: 273 return sha512Hash(slices), crypto.SHA512, nil 274 case hashSHA384: 275 return sha384Hash(slices), crypto.SHA384, nil 276 case hashSHA256: 277 return sha256Hash(slices), crypto.SHA256, nil 278 case hashSHA224: 279 return sha224Hash(slices), crypto.SHA224, nil 280 case hashSHA1: 281 return sha1Hash(slices), crypto.SHA1, nil 282 case hashMD5: 283 return md5Hash(slices), crypto.MD5, nil 284 default: 285 return nil, crypto.Hash(0), errors.New("tls: unknown hash function used by peer") 286 } 287 } 288 if sigType == signatureECDSA || sigType == signatureDSA { 289 return sha1Hash(slices), crypto.SHA1, nil 290 } 291 return md5SHA1Hash(slices), crypto.MD5SHA1, nil 292 } 293 294 // pickTLS12HashForSignature returns a TLS 1.2 hash identifier for signing a 295 // ServerKeyExchange given the signature type being used and the client's 296 // advertised list of supported signature and hash combinations. 297 func pickTLS12HashForSignature(sigType uint8, clientList, serverList []SigAndHash) (uint8, error) { 298 if len(clientList) == 0 { 299 // If the client didn't specify any signature_algorithms 300 // extension then we can assume that it supports SHA1. See 301 // http://tools.ietf.org/html/rfc5246#section-7.4.1.4.1 302 return hashSHA1, nil 303 } 304 305 for _, sigAndHash := range clientList { 306 if sigAndHash.Signature != sigType { 307 continue 308 } 309 if isSupportedSignatureAndHash(sigAndHash, serverList) { 310 return sigAndHash.Hash, nil 311 } 312 } 313 314 return 0, errors.New("tls: client doesn't support any common hash functions") 315 } 316 317 func curveForCurveID(id CurveID) (elliptic.Curve, bool) { 318 switch id { 319 case CurveP256: 320 return elliptic.P256(), true 321 case CurveP384: 322 return elliptic.P384(), true 323 case CurveP521: 324 return elliptic.P521(), true 325 default: 326 return nil, false 327 } 328 } 329 330 // keyAgreementAuthentication is a helper interface that specifies how 331 // to authenticate the ServerKeyExchange parameters. 332 type keyAgreementAuthentication interface { 333 signParameters(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg, params []byte) (*serverKeyExchangeMsg, error) 334 verifyParameters(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, params []byte, sig []byte) ([]byte, error) 335 } 336 337 // nilKeyAgreementAuthentication does not authenticate the key 338 // agreement parameters. 339 type nilKeyAgreementAuthentication struct{} 340 341 func (ka *nilKeyAgreementAuthentication) signParameters(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg, params []byte) (*serverKeyExchangeMsg, error) { 342 skx := new(serverKeyExchangeMsg) 343 skx.key = params 344 return skx, nil 345 } 346 347 func (ka *nilKeyAgreementAuthentication) verifyParameters(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, params []byte, sig []byte) ([]byte, error) { 348 return nil, nil 349 } 350 351 // signedKeyAgreement signs the ServerKeyExchange parameters with the 352 // server's private key. 353 type signedKeyAgreement struct { 354 version uint16 355 sigType uint8 356 raw []byte 357 valid bool 358 sh SigAndHash 359 } 360 361 func (ka *signedKeyAgreement) signParameters(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg, params []byte) (*serverKeyExchangeMsg, error) { 362 var tls12HashId uint8 363 var err error 364 if ka.version >= VersionTLS12 { 365 if tls12HashId, err = pickTLS12HashForSignature(ka.sigType, clientHello.signatureAndHashes, config.signatureAndHashesForServer()); err != nil { 366 return nil, err 367 } 368 ka.sh.Hash = tls12HashId 369 } 370 ka.sh.Signature = ka.sigType 371 digest, hashFunc, err := hashForServerKeyExchange(ka.sigType, tls12HashId, ka.version, clientHello.random, hello.random, params) 372 if err != nil { 373 return nil, err 374 } 375 var sig []byte 376 switch ka.sigType { 377 case signatureECDSA: 378 privKey, ok := cert.PrivateKey.(*ecdsa.PrivateKey) 379 if !ok { 380 return nil, errors.New("ECDHE ECDSA requires an ECDSA server private key") 381 } 382 r, s, err := ecdsa.Sign(config.rand(), privKey, digest) 383 if err != nil { 384 return nil, errors.New("failed to sign ECDHE parameters: " + err.Error()) 385 } 386 sig, err = asn1.Marshal(ecdsaSignature{r, s}) 387 if err != nil { 388 return nil, errors.New("failed to marshal ECDSA signature: " + err.Error()) 389 } 390 case signatureRSA: 391 privKey, ok := cert.PrivateKey.(*rsa.PrivateKey) 392 if !ok { 393 return nil, errors.New("ECDHE RSA requires a RSA server private key") 394 } 395 sig, err = rsa.SignPKCS1v15(config.rand(), privKey, hashFunc, digest) 396 if err != nil { 397 return nil, errors.New("failed to sign ECDHE parameters: " + err.Error()) 398 } 399 default: 400 return nil, errors.New("unknown ECDHE signature algorithm") 401 } 402 403 skx := new(serverKeyExchangeMsg) 404 skx.digest = digest 405 sigAndHashLen := 0 406 if ka.version >= VersionTLS12 { 407 sigAndHashLen = 2 408 } 409 skx.key = make([]byte, len(params)+sigAndHashLen+2+len(sig)) 410 copy(skx.key, params) 411 k := skx.key[len(params):] 412 if ka.version >= VersionTLS12 { 413 k[0] = tls12HashId 414 k[1] = ka.sigType 415 k = k[2:] 416 } 417 k[0] = byte(len(sig) >> 8) 418 k[1] = byte(len(sig)) 419 copy(k[2:], sig) 420 ka.raw = sig 421 ka.valid = true // We (the server) signed 422 return skx, nil 423 } 424 425 func (ka *signedKeyAgreement) verifyParameters(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, params []byte, sig []byte) ([]byte, error) { 426 if len(sig) < 2 { 427 return nil, errServerKeyExchange 428 } 429 430 var tls12HashId uint8 431 if ka.version >= VersionTLS12 { 432 // handle SignatureAndHashAlgorithm 433 var sigAndHash []uint8 434 sigAndHash, sig = sig[:2], sig[2:] 435 tls12HashId = sigAndHash[0] 436 ka.sh.Hash = tls12HashId 437 ka.sh.Signature = sigAndHash[1] 438 if sigAndHash[1] != ka.sigType { 439 return nil, errServerKeyExchange 440 } 441 if len(sig) < 2 { 442 return nil, errServerKeyExchange 443 } 444 445 if !isSupportedSignatureAndHash(SigAndHash{ka.sigType, tls12HashId}, config.signatureAndHashesForClient()) { 446 return nil, errors.New("tls: unsupported hash function for ServerKeyExchange") 447 } 448 } 449 sigLen := int(sig[0])<<8 | int(sig[1]) 450 if sigLen+2 != len(sig) { 451 return nil, errServerKeyExchange 452 } 453 sig = sig[2:] 454 ka.raw = sig 455 456 digest, hashFunc, err := hashForServerKeyExchange(ka.sigType, tls12HashId, ka.version, clientHello.random, serverHello.random, params) 457 if err != nil { 458 return nil, err 459 } 460 switch ka.sigType { 461 case signatureECDSA: 462 augECDSA, ok := cert.PublicKey.(*x509.AugmentedECDSA) 463 if !ok { 464 return digest, errors.New("ECDHE ECDSA: could not covert cert.PublicKey to x509.AugmentedECDSA") 465 } 466 pubKey := augECDSA.Pub 467 ecdsaSig := new(ecdsaSignature) 468 if _, err := asn1.Unmarshal(sig, ecdsaSig); err != nil { 469 return digest, err 470 } 471 if ecdsaSig.R.Sign() <= 0 || ecdsaSig.S.Sign() <= 0 { 472 return digest, errors.New("ECDSA signature contained zero or negative values") 473 } 474 if !ecdsa.Verify(pubKey, digest, ecdsaSig.R, ecdsaSig.S) { 475 return digest, errors.New("ECDSA verification failure") 476 } 477 case signatureRSA: 478 pubKey, ok := cert.PublicKey.(*rsa.PublicKey) 479 if !ok { 480 return digest, errors.New("ECDHE RSA requires a RSA server public key") 481 } 482 if err := rsa.VerifyPKCS1v15(pubKey, hashFunc, digest, sig); err != nil { 483 return digest, err 484 } 485 case signatureDSA: 486 pubKey, ok := cert.PublicKey.(*dsa.PublicKey) 487 if !ok { 488 return digest, errors.New("DSS ciphers require a DSA server public key") 489 } 490 dsaSig := new(dsaSignature) 491 if _, err := asn1.Unmarshal(sig, dsaSig); err != nil { 492 return digest, err 493 } 494 if dsaSig.R.Sign() <= 0 || dsaSig.S.Sign() <= 0 { 495 return digest, errors.New("DSA signature contained zero or negative values") 496 } 497 if !dsa.Verify(pubKey, digest, dsaSig.R, dsaSig.S) { 498 return digest, errors.New("DSA verification failure") 499 } 500 default: 501 return digest, errors.New("unknown ECDHE signature algorithm") 502 } 503 ka.valid = true 504 return digest, nil 505 } 506 507 // ecdheRSAKeyAgreement implements a TLS key agreement where the server 508 // generates a ephemeral EC public/private key pair and signs it. The 509 // pre-master secret is then calculated using ECDH. The signature may 510 // either be ECDSA or RSA. 511 type ecdheKeyAgreement struct { 512 auth keyAgreementAuthentication 513 privateKey []byte 514 curve elliptic.Curve 515 x, y *big.Int 516 verifyError error 517 curveID uint16 518 clientPrivKey []byte 519 serverPrivKey []byte 520 clientX *big.Int 521 clientY *big.Int 522 } 523 524 func (ka *ecdheKeyAgreement) generateServerKeyExchange(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg) (*serverKeyExchangeMsg, error) { 525 var curveid CurveID 526 preferredCurves := config.curvePreferences() 527 528 NextCandidate: 529 for _, candidate := range preferredCurves { 530 for _, c := range clientHello.supportedCurves { 531 if candidate == c { 532 curveid = c 533 break NextCandidate 534 } 535 } 536 } 537 538 if curveid == 0 { 539 return nil, errors.New("tls: no supported elliptic curves offered") 540 } 541 ka.curveID = uint16(curveid) 542 543 var ok bool 544 if ka.curve, ok = curveForCurveID(curveid); !ok { 545 return nil, errors.New("tls: preferredCurves includes unsupported curve") 546 } 547 548 var err error 549 ka.privateKey, ka.x, ka.y, err = elliptic.GenerateKey(ka.curve, config.rand()) 550 if err != nil { 551 return nil, err 552 } 553 ecdhePublic := elliptic.Marshal(ka.curve, ka.x, ka.y) 554 555 ka.serverPrivKey = make([]byte, len(ka.privateKey)) 556 copy(ka.serverPrivKey, ka.privateKey) 557 558 // http://tools.ietf.org/html/rfc4492#section-5.4 559 serverECDHParams := make([]byte, 1+2+1+len(ecdhePublic)) 560 serverECDHParams[0] = 3 // named curve 561 serverECDHParams[1] = byte(curveid >> 8) 562 serverECDHParams[2] = byte(curveid) 563 serverECDHParams[3] = byte(len(ecdhePublic)) 564 copy(serverECDHParams[4:], ecdhePublic) 565 566 return ka.auth.signParameters(config, cert, clientHello, hello, serverECDHParams) 567 } 568 569 func (ka *ecdheKeyAgreement) processClientKeyExchange(config *Config, cert *Certificate, ckx *clientKeyExchangeMsg) ([]byte, error) { 570 if len(ckx.ciphertext) == 0 || int(ckx.ciphertext[0]) != len(ckx.ciphertext)-1 { 571 return nil, errClientKeyExchange 572 } 573 ka.clientX, ka.clientY = elliptic.Unmarshal(ka.curve, ckx.ciphertext[1:]) 574 if ka.clientX == nil { 575 return nil, errClientKeyExchange 576 } 577 578 sharedX, _ := ka.curve.ScalarMult(ka.clientX, ka.clientY, ka.privateKey) 579 preMasterSecret := make([]byte, (ka.curve.Params().BitSize+7)>>3) 580 xBytes := sharedX.Bytes() 581 copy(preMasterSecret[len(preMasterSecret)-len(xBytes):], xBytes) 582 583 return preMasterSecret, nil 584 } 585 586 func (ka *ecdheKeyAgreement) processServerKeyExchange(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, skx *serverKeyExchangeMsg) error { 587 if len(skx.key) < 4 { 588 return errServerKeyExchange 589 } 590 if skx.key[0] != 3 { // named curve 591 return errors.New("tls: server selected unsupported curve") 592 } 593 curveid := CurveID(skx.key[1])<<8 | CurveID(skx.key[2]) 594 ka.curveID = uint16(curveid) 595 596 var ok bool 597 if ka.curve, ok = curveForCurveID(curveid); !ok { 598 return errors.New("tls: server selected unsupported curve") 599 } 600 601 publicLen := int(skx.key[3]) 602 if publicLen+4 > len(skx.key) { 603 return errServerKeyExchange 604 } 605 ka.x, ka.y = elliptic.Unmarshal(ka.curve, skx.key[4:4+publicLen]) 606 if ka.x == nil { 607 return errServerKeyExchange 608 } 609 serverECDHParams := skx.key[:4+publicLen] 610 611 sig := skx.key[4+publicLen:] 612 skx.digest, ka.verifyError = ka.auth.verifyParameters(config, clientHello, serverHello, cert, serverECDHParams, sig) 613 if config.InsecureSkipVerify { 614 return nil 615 } 616 return ka.verifyError 617 } 618 619 func (ka *ecdheKeyAgreement) generateClientKeyExchange(config *Config, clientHello *clientHelloMsg, cert *x509.Certificate) ([]byte, *clientKeyExchangeMsg, error) { 620 if ka.curve == nil { 621 return nil, nil, errors.New("missing ServerKeyExchange message") 622 } 623 priv, mx, my, err := elliptic.GenerateKey(ka.curve, config.rand()) 624 if err != nil { 625 return nil, nil, err 626 } 627 628 ka.clientPrivKey = make([]byte, len(priv)) 629 copy(ka.clientPrivKey, priv) 630 ka.clientX = mx 631 ka.clientY = my 632 633 x, _ := ka.curve.ScalarMult(ka.x, ka.y, priv) 634 preMasterSecret := make([]byte, (ka.curve.Params().BitSize+7)>>3) 635 xBytes := x.Bytes() 636 copy(preMasterSecret[len(preMasterSecret)-len(xBytes):], xBytes) 637 638 serialized := elliptic.Marshal(ka.curve, mx, my) 639 640 ckx := new(clientKeyExchangeMsg) 641 var body []byte 642 ckx.ciphertext = make([]byte, 1+len(serialized)) 643 ckx.ciphertext[0] = byte(len(serialized)) 644 body = ckx.ciphertext[1:] 645 copy(body, serialized) 646 647 return preMasterSecret, ckx, nil 648 } 649 650 // dheRSAKeyAgreement implements a TLS key agreement where the server generates 651 // an ephemeral Diffie-Hellman public/private key pair and signs it. The 652 // pre-master secret is then calculated using Diffie-Hellman. 653 type dheKeyAgreement struct { 654 auth keyAgreementAuthentication 655 p, g *big.Int 656 yTheirs *big.Int 657 yOurs *big.Int 658 xOurs *big.Int 659 yServer *big.Int 660 yClient *big.Int 661 verifyError error 662 } 663 664 func (ka *dheKeyAgreement) generateServerKeyExchange(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg) (*serverKeyExchangeMsg, error) { 665 var q *big.Int 666 // 2048-bit MODP Group with 256-bit Prime Order Subgroup (RFC 667 // 5114, Section 2.3) 668 // TODO: Take a prime in the config 669 ka.p, _ = new(big.Int).SetString("87A8E61DB4B6663CFFBBD19C651959998CEEF608660DD0F25D2CEED4435E3B00E00DF8F1D61957D4FAF7DF4561B2AA3016C3D91134096FAA3BF4296D830E9A7C209E0C6497517ABD5A8A9D306BCF67ED91F9E6725B4758C022E0B1EF4275BF7B6C5BFC11D45F9088B941F54EB1E59BB8BC39A0BF12307F5C4FDB70C581B23F76B63ACAE1CAA6B7902D52526735488A0EF13C6D9A51BFA4AB3AD8347796524D8EF6A167B5A41825D967E144E5140564251CCACB83E6B486F6B3CA3F7971506026C0B857F689962856DED4010ABD0BE621C3A3960A54E710C375F26375D7014103A4B54330C198AF126116D2276E11715F693877FAD7EF09CADB094AE91E1A1597", 16) 670 ka.g, _ = new(big.Int).SetString("3FB32C9B73134D0B2E77506660EDBD484CA7B18F21EF205407F4793A1A0BA12510DBC15077BE463FFF4FED4AAC0BB555BE3A6C1B0C6B47B1BC3773BF7E8C6F62901228F8C28CBB18A55AE31341000A650196F931C77A57F2DDF463E5E9EC144B777DE62AAAB8A8628AC376D282D6ED3864E67982428EBC831D14348F6F2F9193B5045AF2767164E1DFC967C1FB3F2E55A4BD1BFFE83B9C80D052B985D182EA0ADB2A3B7313D3FE14C8484B1E052588B9B7D2BBD2DF016199ECD06E1557CD0915B3353BBB64E0EC377FD028370DF92B52C7891428CDC67EB6184B523D1DB246C32F63078490F00EF8D647D148D47954515E2327CFEF98C582664B4C0F6CC41659", 16) 671 q, _ = new(big.Int).SetString("8CF83642A709A097B447997640129DA299B1A47D1EB3750BA308B0FE64F5FBD3", 16) 672 673 var err error 674 ka.xOurs, err = rand.Int(config.rand(), q) 675 if err != nil { 676 return nil, err 677 } 678 yOurs := new(big.Int).Exp(ka.g, ka.xOurs, ka.p) 679 ka.yOurs = yOurs 680 ka.yServer = new(big.Int).Set(yOurs) 681 682 // http://tools.ietf.org/html/rfc5246#section-7.4.3 683 pBytes := ka.p.Bytes() 684 gBytes := ka.g.Bytes() 685 yBytes := yOurs.Bytes() 686 serverDHParams := make([]byte, 0, 2+len(pBytes)+2+len(gBytes)+2+len(yBytes)) 687 serverDHParams = append(serverDHParams, byte(len(pBytes)>>8), byte(len(pBytes))) 688 serverDHParams = append(serverDHParams, pBytes...) 689 serverDHParams = append(serverDHParams, byte(len(gBytes)>>8), byte(len(gBytes))) 690 serverDHParams = append(serverDHParams, gBytes...) 691 serverDHParams = append(serverDHParams, byte(len(yBytes)>>8), byte(len(yBytes))) 692 serverDHParams = append(serverDHParams, yBytes...) 693 694 return ka.auth.signParameters(config, cert, clientHello, hello, serverDHParams) 695 } 696 697 func (ka *dheKeyAgreement) processClientKeyExchange(config *Config, cert *Certificate, ckx *clientKeyExchangeMsg) ([]byte, error) { 698 if len(ckx.ciphertext) < 2 { 699 return nil, errClientKeyExchange 700 } 701 yLen := (int(ckx.ciphertext[0]) << 8) | int(ckx.ciphertext[1]) 702 if yLen != len(ckx.ciphertext)-2 { 703 return nil, errClientKeyExchange 704 } 705 yTheirs := new(big.Int).SetBytes(ckx.ciphertext[2:]) 706 ka.yClient = new(big.Int).Set(yTheirs) 707 if yTheirs.Sign() <= 0 || yTheirs.Cmp(ka.p) >= 0 { 708 return nil, errClientKeyExchange 709 } 710 return new(big.Int).Exp(yTheirs, ka.xOurs, ka.p).Bytes(), nil 711 } 712 713 func (ka *dheKeyAgreement) processServerKeyExchange(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, skx *serverKeyExchangeMsg) error { 714 // Read dh_p 715 k := skx.key 716 if len(k) < 2 { 717 return errServerKeyExchange 718 } 719 pLen := (int(k[0]) << 8) | int(k[1]) 720 k = k[2:] 721 if len(k) < pLen { 722 return errServerKeyExchange 723 } 724 ka.p = new(big.Int).SetBytes(k[:pLen]) 725 k = k[pLen:] 726 727 // Read dh_g 728 if len(k) < 2 { 729 return errServerKeyExchange 730 } 731 gLen := (int(k[0]) << 8) | int(k[1]) 732 k = k[2:] 733 if len(k) < gLen { 734 return errServerKeyExchange 735 } 736 ka.g = new(big.Int).SetBytes(k[:gLen]) 737 k = k[gLen:] 738 739 // Read dh_Ys 740 if len(k) < 2 { 741 return errServerKeyExchange 742 } 743 yLen := (int(k[0]) << 8) | int(k[1]) 744 k = k[2:] 745 if len(k) < yLen { 746 return errServerKeyExchange 747 } 748 ka.yTheirs = new(big.Int).SetBytes(k[:yLen]) 749 ka.yServer = new(big.Int).Set(ka.yTheirs) 750 k = k[yLen:] 751 if ka.yTheirs.Sign() <= 0 || ka.yTheirs.Cmp(ka.p) >= 0 { 752 return errServerKeyExchange 753 } 754 755 sig := k 756 serverDHParams := skx.key[:len(skx.key)-len(sig)] 757 skx.digest, ka.verifyError = ka.auth.verifyParameters(config, clientHello, serverHello, cert, serverDHParams, sig) 758 if config.InsecureSkipVerify { 759 return nil 760 } 761 return ka.verifyError 762 } 763 764 func (ka *dheKeyAgreement) generateClientKeyExchange(config *Config, clientHello *clientHelloMsg, cert *x509.Certificate) ([]byte, *clientKeyExchangeMsg, error) { 765 if ka.p == nil || ka.g == nil || ka.yTheirs == nil { 766 return nil, nil, errors.New("missing ServerKeyExchange message") 767 } 768 769 xOurs, err := rand.Int(config.rand(), ka.p) 770 if err != nil { 771 return nil, nil, err 772 } 773 preMasterSecret := new(big.Int).Exp(ka.yTheirs, xOurs, ka.p).Bytes() 774 775 yOurs := new(big.Int).Exp(ka.g, xOurs, ka.p) 776 ka.yOurs = yOurs 777 ka.xOurs = xOurs 778 ka.yClient = new(big.Int).Set(yOurs) 779 yBytes := yOurs.Bytes() 780 ckx := new(clientKeyExchangeMsg) 781 ckx.ciphertext = make([]byte, 2+len(yBytes)) 782 ckx.ciphertext[0] = byte(len(yBytes) >> 8) 783 ckx.ciphertext[1] = byte(len(yBytes)) 784 copy(ckx.ciphertext[2:], yBytes) 785 786 return preMasterSecret, ckx, nil 787 }