Home | History | Annotate | Download | only in runner
      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 runner
      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/subtle"
     16 	"crypto/x509"
     17 	"encoding/asn1"
     18 	"errors"
     19 	"fmt"
     20 	"io"
     21 	"math/big"
     22 
     23 	"./curve25519"
     24 )
     25 
     26 var errClientKeyExchange = errors.New("tls: invalid ClientKeyExchange message")
     27 var errServerKeyExchange = errors.New("tls: invalid ServerKeyExchange message")
     28 
     29 // rsaKeyAgreement implements the standard TLS key agreement where the client
     30 // encrypts the pre-master secret to the server's public key.
     31 type rsaKeyAgreement struct {
     32 	version       uint16
     33 	clientVersion uint16
     34 	exportKey     *rsa.PrivateKey
     35 }
     36 
     37 func (ka *rsaKeyAgreement) generateServerKeyExchange(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg) (*serverKeyExchangeMsg, error) {
     38 	// Save the client version for comparison later.
     39 	ka.clientVersion = versionToWire(clientHello.vers, clientHello.isDTLS)
     40 
     41 	if !config.Bugs.RSAEphemeralKey {
     42 		return nil, nil
     43 	}
     44 
     45 	// Generate an ephemeral RSA key to use instead of the real
     46 	// one, as in RSA_EXPORT.
     47 	key, err := rsa.GenerateKey(config.rand(), 512)
     48 	if err != nil {
     49 		return nil, err
     50 	}
     51 	ka.exportKey = key
     52 
     53 	modulus := key.N.Bytes()
     54 	exponent := big.NewInt(int64(key.E)).Bytes()
     55 	serverRSAParams := make([]byte, 0, 2+len(modulus)+2+len(exponent))
     56 	serverRSAParams = append(serverRSAParams, byte(len(modulus)>>8), byte(len(modulus)))
     57 	serverRSAParams = append(serverRSAParams, modulus...)
     58 	serverRSAParams = append(serverRSAParams, byte(len(exponent)>>8), byte(len(exponent)))
     59 	serverRSAParams = append(serverRSAParams, exponent...)
     60 
     61 	var tls12HashId uint8
     62 	if ka.version >= VersionTLS12 {
     63 		if tls12HashId, err = pickTLS12HashForSignature(signatureRSA, clientHello.signatureAndHashes, config.signatureAndHashesForServer()); err != nil {
     64 			return nil, err
     65 		}
     66 	}
     67 
     68 	digest, hashFunc, err := hashForServerKeyExchange(signatureRSA, tls12HashId, ka.version, clientHello.random, hello.random, serverRSAParams)
     69 	if err != nil {
     70 		return nil, err
     71 	}
     72 	privKey, ok := cert.PrivateKey.(*rsa.PrivateKey)
     73 	if !ok {
     74 		return nil, errors.New("RSA ephemeral key requires an RSA server private key")
     75 	}
     76 	sig, err := rsa.SignPKCS1v15(config.rand(), privKey, hashFunc, digest)
     77 	if err != nil {
     78 		return nil, errors.New("failed to sign RSA parameters: " + err.Error())
     79 	}
     80 
     81 	skx := new(serverKeyExchangeMsg)
     82 	sigAndHashLen := 0
     83 	if ka.version >= VersionTLS12 {
     84 		sigAndHashLen = 2
     85 	}
     86 	skx.key = make([]byte, len(serverRSAParams)+sigAndHashLen+2+len(sig))
     87 	copy(skx.key, serverRSAParams)
     88 	k := skx.key[len(serverRSAParams):]
     89 	if ka.version >= VersionTLS12 {
     90 		k[0] = tls12HashId
     91 		k[1] = signatureRSA
     92 		k = k[2:]
     93 	}
     94 	k[0] = byte(len(sig) >> 8)
     95 	k[1] = byte(len(sig))
     96 	copy(k[2:], sig)
     97 
     98 	return skx, nil
     99 }
    100 
    101 func (ka *rsaKeyAgreement) processClientKeyExchange(config *Config, cert *Certificate, ckx *clientKeyExchangeMsg, version uint16) ([]byte, error) {
    102 	preMasterSecret := make([]byte, 48)
    103 	_, err := io.ReadFull(config.rand(), preMasterSecret[2:])
    104 	if err != nil {
    105 		return nil, err
    106 	}
    107 
    108 	if len(ckx.ciphertext) < 2 {
    109 		return nil, errClientKeyExchange
    110 	}
    111 
    112 	ciphertext := ckx.ciphertext
    113 	if version != VersionSSL30 {
    114 		ciphertextLen := int(ckx.ciphertext[0])<<8 | int(ckx.ciphertext[1])
    115 		if ciphertextLen != len(ckx.ciphertext)-2 {
    116 			return nil, errClientKeyExchange
    117 		}
    118 		ciphertext = ckx.ciphertext[2:]
    119 	}
    120 
    121 	key := cert.PrivateKey.(*rsa.PrivateKey)
    122 	if ka.exportKey != nil {
    123 		key = ka.exportKey
    124 	}
    125 	err = rsa.DecryptPKCS1v15SessionKey(config.rand(), key, ciphertext, preMasterSecret)
    126 	if err != nil {
    127 		return nil, err
    128 	}
    129 	// This check should be done in constant-time, but this is a testing
    130 	// implementation. See the discussion at the end of section 7.4.7.1 of
    131 	// RFC 4346.
    132 	vers := uint16(preMasterSecret[0])<<8 | uint16(preMasterSecret[1])
    133 	if ka.clientVersion != vers {
    134 		return nil, errors.New("tls: invalid version in RSA premaster")
    135 	}
    136 	return preMasterSecret, nil
    137 }
    138 
    139 func (ka *rsaKeyAgreement) processServerKeyExchange(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, skx *serverKeyExchangeMsg) error {
    140 	return errors.New("tls: unexpected ServerKeyExchange")
    141 }
    142 
    143 func (ka *rsaKeyAgreement) generateClientKeyExchange(config *Config, clientHello *clientHelloMsg, cert *x509.Certificate) ([]byte, *clientKeyExchangeMsg, error) {
    144 	bad := config.Bugs.BadRSAClientKeyExchange
    145 	preMasterSecret := make([]byte, 48)
    146 	vers := clientHello.vers
    147 	if bad == RSABadValueWrongVersion {
    148 		vers ^= 1
    149 	}
    150 	vers = versionToWire(vers, clientHello.isDTLS)
    151 	preMasterSecret[0] = byte(vers >> 8)
    152 	preMasterSecret[1] = byte(vers)
    153 	_, err := io.ReadFull(config.rand(), preMasterSecret[2:])
    154 	if err != nil {
    155 		return nil, nil, err
    156 	}
    157 
    158 	sentPreMasterSecret := preMasterSecret
    159 	if bad == RSABadValueTooLong {
    160 		sentPreMasterSecret = make([]byte, len(sentPreMasterSecret)+1)
    161 		copy(sentPreMasterSecret, preMasterSecret)
    162 	} else if bad == RSABadValueTooShort {
    163 		sentPreMasterSecret = sentPreMasterSecret[:len(sentPreMasterSecret)-1]
    164 	}
    165 
    166 	encrypted, err := rsa.EncryptPKCS1v15(config.rand(), cert.PublicKey.(*rsa.PublicKey), sentPreMasterSecret)
    167 	if err != nil {
    168 		return nil, nil, err
    169 	}
    170 	if bad == RSABadValueCorrupt {
    171 		encrypted[len(encrypted)-1] ^= 1
    172 		// Clear the high byte to ensure |encrypted| is still below the RSA modulus.
    173 		encrypted[0] = 0
    174 	}
    175 	ckx := new(clientKeyExchangeMsg)
    176 	if clientHello.vers != VersionSSL30 {
    177 		ckx.ciphertext = make([]byte, len(encrypted)+2)
    178 		ckx.ciphertext[0] = byte(len(encrypted) >> 8)
    179 		ckx.ciphertext[1] = byte(len(encrypted))
    180 		copy(ckx.ciphertext[2:], encrypted)
    181 	} else {
    182 		ckx.ciphertext = encrypted
    183 	}
    184 	return preMasterSecret, ckx, nil
    185 }
    186 
    187 // sha1Hash calculates a SHA1 hash over the given byte slices.
    188 func sha1Hash(slices [][]byte) []byte {
    189 	hsha1 := sha1.New()
    190 	for _, slice := range slices {
    191 		hsha1.Write(slice)
    192 	}
    193 	return hsha1.Sum(nil)
    194 }
    195 
    196 // md5SHA1Hash implements TLS 1.0's hybrid hash function which consists of the
    197 // concatenation of an MD5 and SHA1 hash.
    198 func md5SHA1Hash(slices [][]byte) []byte {
    199 	md5sha1 := make([]byte, md5.Size+sha1.Size)
    200 	hmd5 := md5.New()
    201 	for _, slice := range slices {
    202 		hmd5.Write(slice)
    203 	}
    204 	copy(md5sha1, hmd5.Sum(nil))
    205 	copy(md5sha1[md5.Size:], sha1Hash(slices))
    206 	return md5sha1
    207 }
    208 
    209 // hashForServerKeyExchange hashes the given slices and returns their digest
    210 // and the identifier of the hash function used. The hashFunc argument is only
    211 // used for >= TLS 1.2 and precisely identifies the hash function to use.
    212 func hashForServerKeyExchange(sigType, hashFunc uint8, version uint16, slices ...[]byte) ([]byte, crypto.Hash, error) {
    213 	if version >= VersionTLS12 {
    214 		hash, err := lookupTLSHash(hashFunc)
    215 		if err != nil {
    216 			return nil, 0, err
    217 		}
    218 		h := hash.New()
    219 		for _, slice := range slices {
    220 			h.Write(slice)
    221 		}
    222 		return h.Sum(nil), hash, nil
    223 	}
    224 	if sigType == signatureECDSA {
    225 		return sha1Hash(slices), crypto.SHA1, nil
    226 	}
    227 	return md5SHA1Hash(slices), crypto.MD5SHA1, nil
    228 }
    229 
    230 // pickTLS12HashForSignature returns a TLS 1.2 hash identifier for signing a
    231 // ServerKeyExchange given the signature type being used and the client's
    232 // advertized list of supported signature and hash combinations.
    233 func pickTLS12HashForSignature(sigType uint8, clientList, serverList []signatureAndHash) (uint8, error) {
    234 	if len(clientList) == 0 {
    235 		// If the client didn't specify any signature_algorithms
    236 		// extension then we can assume that it supports SHA1. See
    237 		// http://tools.ietf.org/html/rfc5246#section-7.4.1.4.1
    238 		return hashSHA1, nil
    239 	}
    240 
    241 	for _, sigAndHash := range clientList {
    242 		if sigAndHash.signature != sigType {
    243 			continue
    244 		}
    245 		if isSupportedSignatureAndHash(sigAndHash, serverList) {
    246 			return sigAndHash.hash, nil
    247 		}
    248 	}
    249 
    250 	return 0, errors.New("tls: client doesn't support any common hash functions")
    251 }
    252 
    253 // A ecdhCurve is an instance of ECDH-style key agreement for TLS.
    254 type ecdhCurve interface {
    255 	// generateKeypair generates a keypair using rand. It returns the
    256 	// encoded public key.
    257 	generateKeypair(rand io.Reader) (publicKey []byte, err error)
    258 
    259 	// computeSecret performs a key exchange against peerKey and returns
    260 	// the resulting shared secret.
    261 	computeSecret(peerKey []byte) (preMasterSecret []byte, err error)
    262 }
    263 
    264 // ellipticECDHCurve implements ecdhCurve with an elliptic.Curve.
    265 type ellipticECDHCurve struct {
    266 	curve      elliptic.Curve
    267 	privateKey []byte
    268 }
    269 
    270 func (e *ellipticECDHCurve) generateKeypair(rand io.Reader) (publicKey []byte, err error) {
    271 	var x, y *big.Int
    272 	e.privateKey, x, y, err = elliptic.GenerateKey(e.curve, rand)
    273 	if err != nil {
    274 		return nil, err
    275 	}
    276 	return elliptic.Marshal(e.curve, x, y), nil
    277 }
    278 
    279 func (e *ellipticECDHCurve) computeSecret(peerKey []byte) (preMasterSecret []byte, err error) {
    280 	x, y := elliptic.Unmarshal(e.curve, peerKey)
    281 	if x == nil {
    282 		return nil, errors.New("tls: invalid peer key")
    283 	}
    284 	x, _ = e.curve.ScalarMult(x, y, e.privateKey)
    285 	preMasterSecret = make([]byte, (e.curve.Params().BitSize+7)>>3)
    286 	xBytes := x.Bytes()
    287 	copy(preMasterSecret[len(preMasterSecret)-len(xBytes):], xBytes)
    288 
    289 	return preMasterSecret, nil
    290 }
    291 
    292 // x25519ECDHCurve implements ecdhCurve with X25519.
    293 type x25519ECDHCurve struct {
    294 	privateKey [32]byte
    295 }
    296 
    297 func (e *x25519ECDHCurve) generateKeypair(rand io.Reader) (publicKey []byte, err error) {
    298 	_, err = io.ReadFull(rand, e.privateKey[:])
    299 	if err != nil {
    300 		return
    301 	}
    302 	var out [32]byte
    303 	curve25519.ScalarBaseMult(&out, &e.privateKey)
    304 	return out[:], nil
    305 }
    306 
    307 func (e *x25519ECDHCurve) computeSecret(peerKey []byte) (preMasterSecret []byte, err error) {
    308 	if len(peerKey) != 32 {
    309 		return nil, errors.New("tls: invalid peer key")
    310 	}
    311 	var out, peerKeyCopy [32]byte
    312 	copy(peerKeyCopy[:], peerKey)
    313 	curve25519.ScalarMult(&out, &e.privateKey, &peerKeyCopy)
    314 
    315 	// Per draft-irtf-cfrg-curves-11, reject the all-zero value in constant
    316 	// time.
    317 	var zeros [32]byte
    318 	if subtle.ConstantTimeCompare(zeros[:], out[:]) == 1 {
    319 		return nil, errors.New("tls: X25519 value with wrong order")
    320 	}
    321 
    322 	return out[:], nil
    323 }
    324 
    325 func curveForCurveID(id CurveID) (ecdhCurve, bool) {
    326 	switch id {
    327 	case CurveP224:
    328 		return &ellipticECDHCurve{curve: elliptic.P224()}, true
    329 	case CurveP256:
    330 		return &ellipticECDHCurve{curve: elliptic.P256()}, true
    331 	case CurveP384:
    332 		return &ellipticECDHCurve{curve: elliptic.P384()}, true
    333 	case CurveP521:
    334 		return &ellipticECDHCurve{curve: elliptic.P521()}, true
    335 	case CurveX25519:
    336 		return &x25519ECDHCurve{}, true
    337 	default:
    338 		return nil, false
    339 	}
    340 
    341 }
    342 
    343 // keyAgreementAuthentication is a helper interface that specifies how
    344 // to authenticate the ServerKeyExchange parameters.
    345 type keyAgreementAuthentication interface {
    346 	signParameters(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg, params []byte) (*serverKeyExchangeMsg, error)
    347 	verifyParameters(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, params []byte, sig []byte) error
    348 }
    349 
    350 // nilKeyAgreementAuthentication does not authenticate the key
    351 // agreement parameters.
    352 type nilKeyAgreementAuthentication struct{}
    353 
    354 func (ka *nilKeyAgreementAuthentication) signParameters(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg, params []byte) (*serverKeyExchangeMsg, error) {
    355 	skx := new(serverKeyExchangeMsg)
    356 	skx.key = params
    357 	return skx, nil
    358 }
    359 
    360 func (ka *nilKeyAgreementAuthentication) verifyParameters(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, params []byte, sig []byte) error {
    361 	return nil
    362 }
    363 
    364 func maybeCorruptECDSAValue(n *big.Int, typeOfCorruption BadValue, limit *big.Int) *big.Int {
    365 	switch typeOfCorruption {
    366 	case BadValueNone:
    367 		return n
    368 	case BadValueNegative:
    369 		return new(big.Int).Neg(n)
    370 	case BadValueZero:
    371 		return big.NewInt(0)
    372 	case BadValueLimit:
    373 		return limit
    374 	case BadValueLarge:
    375 		bad := new(big.Int).Set(limit)
    376 		return bad.Lsh(bad, 20)
    377 	default:
    378 		panic("unknown BadValue type")
    379 	}
    380 }
    381 
    382 // signedKeyAgreement signs the ServerKeyExchange parameters with the
    383 // server's private key.
    384 type signedKeyAgreement struct {
    385 	version uint16
    386 	sigType uint8
    387 }
    388 
    389 func (ka *signedKeyAgreement) signParameters(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg, params []byte) (*serverKeyExchangeMsg, error) {
    390 	var tls12HashId uint8
    391 	var err error
    392 	if ka.version >= VersionTLS12 {
    393 		if tls12HashId, err = pickTLS12HashForSignature(ka.sigType, clientHello.signatureAndHashes, config.signatureAndHashesForServer()); err != nil {
    394 			return nil, err
    395 		}
    396 	}
    397 
    398 	digest, hashFunc, err := hashForServerKeyExchange(ka.sigType, tls12HashId, ka.version, clientHello.random, hello.random, params)
    399 	if err != nil {
    400 		return nil, err
    401 	}
    402 
    403 	if config.Bugs.InvalidSKXSignature {
    404 		digest[0] ^= 0x80
    405 	}
    406 
    407 	var sig []byte
    408 	switch ka.sigType {
    409 	case signatureECDSA:
    410 		privKey, ok := cert.PrivateKey.(*ecdsa.PrivateKey)
    411 		if !ok {
    412 			return nil, errors.New("ECDHE ECDSA requires an ECDSA server private key")
    413 		}
    414 		r, s, err := ecdsa.Sign(config.rand(), privKey, digest)
    415 		if err != nil {
    416 			return nil, errors.New("failed to sign ECDHE parameters: " + err.Error())
    417 		}
    418 		order := privKey.Curve.Params().N
    419 		r = maybeCorruptECDSAValue(r, config.Bugs.BadECDSAR, order)
    420 		s = maybeCorruptECDSAValue(s, config.Bugs.BadECDSAS, order)
    421 		sig, err = asn1.Marshal(ecdsaSignature{r, s})
    422 	case signatureRSA:
    423 		privKey, ok := cert.PrivateKey.(*rsa.PrivateKey)
    424 		if !ok {
    425 			return nil, errors.New("ECDHE RSA requires a RSA server private key")
    426 		}
    427 		sig, err = rsa.SignPKCS1v15(config.rand(), privKey, hashFunc, digest)
    428 		if err != nil {
    429 			return nil, errors.New("failed to sign ECDHE parameters: " + err.Error())
    430 		}
    431 	default:
    432 		return nil, errors.New("unknown ECDHE signature algorithm")
    433 	}
    434 
    435 	skx := new(serverKeyExchangeMsg)
    436 	if config.Bugs.UnauthenticatedECDH {
    437 		skx.key = params
    438 	} else {
    439 		sigAndHashLen := 0
    440 		if ka.version >= VersionTLS12 {
    441 			sigAndHashLen = 2
    442 		}
    443 		skx.key = make([]byte, len(params)+sigAndHashLen+2+len(sig))
    444 		copy(skx.key, params)
    445 		k := skx.key[len(params):]
    446 		if ka.version >= VersionTLS12 {
    447 			k[0] = tls12HashId
    448 			k[1] = ka.sigType
    449 			k = k[2:]
    450 		}
    451 		k[0] = byte(len(sig) >> 8)
    452 		k[1] = byte(len(sig))
    453 		copy(k[2:], sig)
    454 	}
    455 
    456 	return skx, nil
    457 }
    458 
    459 func (ka *signedKeyAgreement) verifyParameters(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, params []byte, sig []byte) error {
    460 	if len(sig) < 2 {
    461 		return errServerKeyExchange
    462 	}
    463 
    464 	var tls12HashId uint8
    465 	if ka.version >= VersionTLS12 {
    466 		// handle SignatureAndHashAlgorithm
    467 		var sigAndHash []uint8
    468 		sigAndHash, sig = sig[:2], sig[2:]
    469 		if sigAndHash[1] != ka.sigType {
    470 			return errServerKeyExchange
    471 		}
    472 		tls12HashId = sigAndHash[0]
    473 		if len(sig) < 2 {
    474 			return errServerKeyExchange
    475 		}
    476 
    477 		if !isSupportedSignatureAndHash(signatureAndHash{ka.sigType, tls12HashId}, config.signatureAndHashesForClient()) {
    478 			return errors.New("tls: unsupported hash function for ServerKeyExchange")
    479 		}
    480 	}
    481 	sigLen := int(sig[0])<<8 | int(sig[1])
    482 	if sigLen+2 != len(sig) {
    483 		return errServerKeyExchange
    484 	}
    485 	sig = sig[2:]
    486 
    487 	digest, hashFunc, err := hashForServerKeyExchange(ka.sigType, tls12HashId, ka.version, clientHello.random, serverHello.random, params)
    488 	if err != nil {
    489 		return err
    490 	}
    491 	switch ka.sigType {
    492 	case signatureECDSA:
    493 		pubKey, ok := cert.PublicKey.(*ecdsa.PublicKey)
    494 		if !ok {
    495 			return errors.New("ECDHE ECDSA requires a ECDSA server public key")
    496 		}
    497 		ecdsaSig := new(ecdsaSignature)
    498 		if _, err := asn1.Unmarshal(sig, ecdsaSig); err != nil {
    499 			return err
    500 		}
    501 		if ecdsaSig.R.Sign() <= 0 || ecdsaSig.S.Sign() <= 0 {
    502 			return errors.New("ECDSA signature contained zero or negative values")
    503 		}
    504 		if !ecdsa.Verify(pubKey, digest, ecdsaSig.R, ecdsaSig.S) {
    505 			return errors.New("ECDSA verification failure")
    506 		}
    507 	case signatureRSA:
    508 		pubKey, ok := cert.PublicKey.(*rsa.PublicKey)
    509 		if !ok {
    510 			return errors.New("ECDHE RSA requires a RSA server public key")
    511 		}
    512 		if err := rsa.VerifyPKCS1v15(pubKey, hashFunc, digest, sig); err != nil {
    513 			return err
    514 		}
    515 	default:
    516 		return errors.New("unknown ECDHE signature algorithm")
    517 	}
    518 
    519 	return nil
    520 }
    521 
    522 // ecdheRSAKeyAgreement implements a TLS key agreement where the server
    523 // generates a ephemeral EC public/private key pair and signs it. The
    524 // pre-master secret is then calculated using ECDH. The signature may
    525 // either be ECDSA or RSA.
    526 type ecdheKeyAgreement struct {
    527 	auth    keyAgreementAuthentication
    528 	curve   ecdhCurve
    529 	peerKey []byte
    530 }
    531 
    532 func (ka *ecdheKeyAgreement) generateServerKeyExchange(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg) (*serverKeyExchangeMsg, error) {
    533 	var curveid CurveID
    534 	preferredCurves := config.curvePreferences()
    535 
    536 NextCandidate:
    537 	for _, candidate := range preferredCurves {
    538 		for _, c := range clientHello.supportedCurves {
    539 			if candidate == c {
    540 				curveid = c
    541 				break NextCandidate
    542 			}
    543 		}
    544 	}
    545 
    546 	if curveid == 0 {
    547 		return nil, errors.New("tls: no supported elliptic curves offered")
    548 	}
    549 
    550 	var ok bool
    551 	if ka.curve, ok = curveForCurveID(curveid); !ok {
    552 		return nil, errors.New("tls: preferredCurves includes unsupported curve")
    553 	}
    554 
    555 	publicKey, err := ka.curve.generateKeypair(config.rand())
    556 	if err != nil {
    557 		return nil, err
    558 	}
    559 
    560 	// http://tools.ietf.org/html/rfc4492#section-5.4
    561 	serverECDHParams := make([]byte, 1+2+1+len(publicKey))
    562 	serverECDHParams[0] = 3 // named curve
    563 	serverECDHParams[1] = byte(curveid >> 8)
    564 	serverECDHParams[2] = byte(curveid)
    565 	if config.Bugs.InvalidSKXCurve {
    566 		serverECDHParams[2] ^= 0xff
    567 	}
    568 	serverECDHParams[3] = byte(len(publicKey))
    569 	copy(serverECDHParams[4:], publicKey)
    570 
    571 	return ka.auth.signParameters(config, cert, clientHello, hello, serverECDHParams)
    572 }
    573 
    574 func (ka *ecdheKeyAgreement) processClientKeyExchange(config *Config, cert *Certificate, ckx *clientKeyExchangeMsg, version uint16) ([]byte, error) {
    575 	if len(ckx.ciphertext) == 0 || int(ckx.ciphertext[0]) != len(ckx.ciphertext)-1 {
    576 		return nil, errClientKeyExchange
    577 	}
    578 	return ka.curve.computeSecret(ckx.ciphertext[1:])
    579 }
    580 
    581 func (ka *ecdheKeyAgreement) processServerKeyExchange(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, skx *serverKeyExchangeMsg) error {
    582 	if len(skx.key) < 4 {
    583 		return errServerKeyExchange
    584 	}
    585 	if skx.key[0] != 3 { // named curve
    586 		return errors.New("tls: server selected unsupported curve")
    587 	}
    588 	curveid := CurveID(skx.key[1])<<8 | CurveID(skx.key[2])
    589 
    590 	var ok bool
    591 	if ka.curve, ok = curveForCurveID(curveid); !ok {
    592 		return errors.New("tls: server selected unsupported curve")
    593 	}
    594 
    595 	publicLen := int(skx.key[3])
    596 	if publicLen+4 > len(skx.key) {
    597 		return errServerKeyExchange
    598 	}
    599 	// Save the peer key for later.
    600 	ka.peerKey = skx.key[4 : 4+publicLen]
    601 
    602 	// Check the signature.
    603 	serverECDHParams := skx.key[:4+publicLen]
    604 	sig := skx.key[4+publicLen:]
    605 	return ka.auth.verifyParameters(config, clientHello, serverHello, cert, serverECDHParams, sig)
    606 }
    607 
    608 func (ka *ecdheKeyAgreement) generateClientKeyExchange(config *Config, clientHello *clientHelloMsg, cert *x509.Certificate) ([]byte, *clientKeyExchangeMsg, error) {
    609 	if ka.curve == nil {
    610 		return nil, nil, errors.New("missing ServerKeyExchange message")
    611 	}
    612 
    613 	publicKey, err := ka.curve.generateKeypair(config.rand())
    614 	if err != nil {
    615 		return nil, nil, err
    616 	}
    617 	preMasterSecret, err := ka.curve.computeSecret(ka.peerKey)
    618 	if err != nil {
    619 		return nil, nil, err
    620 	}
    621 
    622 	ckx := new(clientKeyExchangeMsg)
    623 	ckx.ciphertext = make([]byte, 1+len(publicKey))
    624 	ckx.ciphertext[0] = byte(len(publicKey))
    625 	copy(ckx.ciphertext[1:], publicKey)
    626 
    627 	return preMasterSecret, ckx, nil
    628 }
    629 
    630 // dheRSAKeyAgreement implements a TLS key agreement where the server generates
    631 // an ephemeral Diffie-Hellman public/private key pair and signs it. The
    632 // pre-master secret is then calculated using Diffie-Hellman.
    633 type dheKeyAgreement struct {
    634 	auth    keyAgreementAuthentication
    635 	p, g    *big.Int
    636 	yTheirs *big.Int
    637 	xOurs   *big.Int
    638 }
    639 
    640 func (ka *dheKeyAgreement) generateServerKeyExchange(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg) (*serverKeyExchangeMsg, error) {
    641 	var q *big.Int
    642 	if p := config.Bugs.DHGroupPrime; p != nil {
    643 		ka.p = p
    644 		ka.g = big.NewInt(2)
    645 		q = p
    646 	} else {
    647 		// 2048-bit MODP Group with 256-bit Prime Order Subgroup (RFC
    648 		// 5114, Section 2.3)
    649 		ka.p, _ = new(big.Int).SetString("87A8E61DB4B6663CFFBBD19C651959998CEEF608660DD0F25D2CEED4435E3B00E00DF8F1D61957D4FAF7DF4561B2AA3016C3D91134096FAA3BF4296D830E9A7C209E0C6497517ABD5A8A9D306BCF67ED91F9E6725B4758C022E0B1EF4275BF7B6C5BFC11D45F9088B941F54EB1E59BB8BC39A0BF12307F5C4FDB70C581B23F76B63ACAE1CAA6B7902D52526735488A0EF13C6D9A51BFA4AB3AD8347796524D8EF6A167B5A41825D967E144E5140564251CCACB83E6B486F6B3CA3F7971506026C0B857F689962856DED4010ABD0BE621C3A3960A54E710C375F26375D7014103A4B54330C198AF126116D2276E11715F693877FAD7EF09CADB094AE91E1A1597", 16)
    650 		ka.g, _ = new(big.Int).SetString("3FB32C9B73134D0B2E77506660EDBD484CA7B18F21EF205407F4793A1A0BA12510DBC15077BE463FFF4FED4AAC0BB555BE3A6C1B0C6B47B1BC3773BF7E8C6F62901228F8C28CBB18A55AE31341000A650196F931C77A57F2DDF463E5E9EC144B777DE62AAAB8A8628AC376D282D6ED3864E67982428EBC831D14348F6F2F9193B5045AF2767164E1DFC967C1FB3F2E55A4BD1BFFE83B9C80D052B985D182EA0ADB2A3B7313D3FE14C8484B1E052588B9B7D2BBD2DF016199ECD06E1557CD0915B3353BBB64E0EC377FD028370DF92B52C7891428CDC67EB6184B523D1DB246C32F63078490F00EF8D647D148D47954515E2327CFEF98C582664B4C0F6CC41659", 16)
    651 		q, _ = new(big.Int).SetString("8CF83642A709A097B447997640129DA299B1A47D1EB3750BA308B0FE64F5FBD3", 16)
    652 	}
    653 
    654 	var err error
    655 	ka.xOurs, err = rand.Int(config.rand(), q)
    656 	if err != nil {
    657 		return nil, err
    658 	}
    659 	yOurs := new(big.Int).Exp(ka.g, ka.xOurs, ka.p)
    660 
    661 	// http://tools.ietf.org/html/rfc5246#section-7.4.3
    662 	pBytes := ka.p.Bytes()
    663 	gBytes := ka.g.Bytes()
    664 	yBytes := yOurs.Bytes()
    665 	serverDHParams := make([]byte, 0, 2+len(pBytes)+2+len(gBytes)+2+len(yBytes))
    666 	serverDHParams = append(serverDHParams, byte(len(pBytes)>>8), byte(len(pBytes)))
    667 	serverDHParams = append(serverDHParams, pBytes...)
    668 	serverDHParams = append(serverDHParams, byte(len(gBytes)>>8), byte(len(gBytes)))
    669 	serverDHParams = append(serverDHParams, gBytes...)
    670 	serverDHParams = append(serverDHParams, byte(len(yBytes)>>8), byte(len(yBytes)))
    671 	serverDHParams = append(serverDHParams, yBytes...)
    672 
    673 	return ka.auth.signParameters(config, cert, clientHello, hello, serverDHParams)
    674 }
    675 
    676 func (ka *dheKeyAgreement) processClientKeyExchange(config *Config, cert *Certificate, ckx *clientKeyExchangeMsg, version uint16) ([]byte, error) {
    677 	if len(ckx.ciphertext) < 2 {
    678 		return nil, errClientKeyExchange
    679 	}
    680 	yLen := (int(ckx.ciphertext[0]) << 8) | int(ckx.ciphertext[1])
    681 	if yLen != len(ckx.ciphertext)-2 {
    682 		return nil, errClientKeyExchange
    683 	}
    684 	yTheirs := new(big.Int).SetBytes(ckx.ciphertext[2:])
    685 	if yTheirs.Sign() <= 0 || yTheirs.Cmp(ka.p) >= 0 {
    686 		return nil, errClientKeyExchange
    687 	}
    688 	return new(big.Int).Exp(yTheirs, ka.xOurs, ka.p).Bytes(), nil
    689 }
    690 
    691 func (ka *dheKeyAgreement) processServerKeyExchange(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, skx *serverKeyExchangeMsg) error {
    692 	// Read dh_p
    693 	k := skx.key
    694 	if len(k) < 2 {
    695 		return errServerKeyExchange
    696 	}
    697 	pLen := (int(k[0]) << 8) | int(k[1])
    698 	k = k[2:]
    699 	if len(k) < pLen {
    700 		return errServerKeyExchange
    701 	}
    702 	ka.p = new(big.Int).SetBytes(k[:pLen])
    703 	k = k[pLen:]
    704 
    705 	// Read dh_g
    706 	if len(k) < 2 {
    707 		return errServerKeyExchange
    708 	}
    709 	gLen := (int(k[0]) << 8) | int(k[1])
    710 	k = k[2:]
    711 	if len(k) < gLen {
    712 		return errServerKeyExchange
    713 	}
    714 	ka.g = new(big.Int).SetBytes(k[:gLen])
    715 	k = k[gLen:]
    716 
    717 	// Read dh_Ys
    718 	if len(k) < 2 {
    719 		return errServerKeyExchange
    720 	}
    721 	yLen := (int(k[0]) << 8) | int(k[1])
    722 	k = k[2:]
    723 	if len(k) < yLen {
    724 		return errServerKeyExchange
    725 	}
    726 	ka.yTheirs = new(big.Int).SetBytes(k[:yLen])
    727 	k = k[yLen:]
    728 	if ka.yTheirs.Sign() <= 0 || ka.yTheirs.Cmp(ka.p) >= 0 {
    729 		return errServerKeyExchange
    730 	}
    731 
    732 	if l := config.Bugs.RequireDHPublicValueLen; l != 0 && l != yLen {
    733 		return fmt.Errorf("RequireDHPublicValueLen set to %d, but server's public value was %d bytes on the wire and %d bytes if minimal", l, yLen, (ka.yTheirs.BitLen()+7)/8)
    734 	}
    735 
    736 	sig := k
    737 	serverDHParams := skx.key[:len(skx.key)-len(sig)]
    738 
    739 	return ka.auth.verifyParameters(config, clientHello, serverHello, cert, serverDHParams, sig)
    740 }
    741 
    742 func (ka *dheKeyAgreement) generateClientKeyExchange(config *Config, clientHello *clientHelloMsg, cert *x509.Certificate) ([]byte, *clientKeyExchangeMsg, error) {
    743 	if ka.p == nil || ka.g == nil || ka.yTheirs == nil {
    744 		return nil, nil, errors.New("missing ServerKeyExchange message")
    745 	}
    746 
    747 	xOurs, err := rand.Int(config.rand(), ka.p)
    748 	if err != nil {
    749 		return nil, nil, err
    750 	}
    751 	preMasterSecret := new(big.Int).Exp(ka.yTheirs, xOurs, ka.p).Bytes()
    752 
    753 	yOurs := new(big.Int).Exp(ka.g, xOurs, ka.p)
    754 	yBytes := yOurs.Bytes()
    755 	ckx := new(clientKeyExchangeMsg)
    756 	ckx.ciphertext = make([]byte, 2+len(yBytes))
    757 	ckx.ciphertext[0] = byte(len(yBytes) >> 8)
    758 	ckx.ciphertext[1] = byte(len(yBytes))
    759 	copy(ckx.ciphertext[2:], yBytes)
    760 
    761 	return preMasterSecret, ckx, nil
    762 }
    763 
    764 // nilKeyAgreement is a fake key agreement used to implement the plain PSK key
    765 // exchange.
    766 type nilKeyAgreement struct{}
    767 
    768 func (ka *nilKeyAgreement) generateServerKeyExchange(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg) (*serverKeyExchangeMsg, error) {
    769 	return nil, nil
    770 }
    771 
    772 func (ka *nilKeyAgreement) processClientKeyExchange(config *Config, cert *Certificate, ckx *clientKeyExchangeMsg, version uint16) ([]byte, error) {
    773 	if len(ckx.ciphertext) != 0 {
    774 		return nil, errClientKeyExchange
    775 	}
    776 
    777 	// Although in plain PSK, otherSecret is all zeros, the base key
    778 	// agreement does not access to the length of the pre-shared
    779 	// key. pskKeyAgreement instead interprets nil to mean to use all zeros
    780 	// of the appropriate length.
    781 	return nil, nil
    782 }
    783 
    784 func (ka *nilKeyAgreement) processServerKeyExchange(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, skx *serverKeyExchangeMsg) error {
    785 	if len(skx.key) != 0 {
    786 		return errServerKeyExchange
    787 	}
    788 	return nil
    789 }
    790 
    791 func (ka *nilKeyAgreement) generateClientKeyExchange(config *Config, clientHello *clientHelloMsg, cert *x509.Certificate) ([]byte, *clientKeyExchangeMsg, error) {
    792 	// Although in plain PSK, otherSecret is all zeros, the base key
    793 	// agreement does not access to the length of the pre-shared
    794 	// key. pskKeyAgreement instead interprets nil to mean to use all zeros
    795 	// of the appropriate length.
    796 	return nil, &clientKeyExchangeMsg{}, nil
    797 }
    798 
    799 // makePSKPremaster formats a PSK pre-master secret based on otherSecret from
    800 // the base key exchange and psk.
    801 func makePSKPremaster(otherSecret, psk []byte) []byte {
    802 	out := make([]byte, 0, 2+len(otherSecret)+2+len(psk))
    803 	out = append(out, byte(len(otherSecret)>>8), byte(len(otherSecret)))
    804 	out = append(out, otherSecret...)
    805 	out = append(out, byte(len(psk)>>8), byte(len(psk)))
    806 	out = append(out, psk...)
    807 	return out
    808 }
    809 
    810 // pskKeyAgreement implements the PSK key agreement.
    811 type pskKeyAgreement struct {
    812 	base         keyAgreement
    813 	identityHint string
    814 }
    815 
    816 func (ka *pskKeyAgreement) generateServerKeyExchange(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg) (*serverKeyExchangeMsg, error) {
    817 	// Assemble the identity hint.
    818 	bytes := make([]byte, 2+len(config.PreSharedKeyIdentity))
    819 	bytes[0] = byte(len(config.PreSharedKeyIdentity) >> 8)
    820 	bytes[1] = byte(len(config.PreSharedKeyIdentity))
    821 	copy(bytes[2:], []byte(config.PreSharedKeyIdentity))
    822 
    823 	// If there is one, append the base key agreement's
    824 	// ServerKeyExchange.
    825 	baseSkx, err := ka.base.generateServerKeyExchange(config, cert, clientHello, hello)
    826 	if err != nil {
    827 		return nil, err
    828 	}
    829 
    830 	if baseSkx != nil {
    831 		bytes = append(bytes, baseSkx.key...)
    832 	} else if config.PreSharedKeyIdentity == "" {
    833 		// ServerKeyExchange is optional if the identity hint is empty
    834 		// and there would otherwise be no ServerKeyExchange.
    835 		return nil, nil
    836 	}
    837 
    838 	skx := new(serverKeyExchangeMsg)
    839 	skx.key = bytes
    840 	return skx, nil
    841 }
    842 
    843 func (ka *pskKeyAgreement) processClientKeyExchange(config *Config, cert *Certificate, ckx *clientKeyExchangeMsg, version uint16) ([]byte, error) {
    844 	// First, process the PSK identity.
    845 	if len(ckx.ciphertext) < 2 {
    846 		return nil, errClientKeyExchange
    847 	}
    848 	identityLen := (int(ckx.ciphertext[0]) << 8) | int(ckx.ciphertext[1])
    849 	if 2+identityLen > len(ckx.ciphertext) {
    850 		return nil, errClientKeyExchange
    851 	}
    852 	identity := string(ckx.ciphertext[2 : 2+identityLen])
    853 
    854 	if identity != config.PreSharedKeyIdentity {
    855 		return nil, errors.New("tls: unexpected identity")
    856 	}
    857 
    858 	if config.PreSharedKey == nil {
    859 		return nil, errors.New("tls: pre-shared key not configured")
    860 	}
    861 
    862 	// Process the remainder of the ClientKeyExchange to compute the base
    863 	// pre-master secret.
    864 	newCkx := new(clientKeyExchangeMsg)
    865 	newCkx.ciphertext = ckx.ciphertext[2+identityLen:]
    866 	otherSecret, err := ka.base.processClientKeyExchange(config, cert, newCkx, version)
    867 	if err != nil {
    868 		return nil, err
    869 	}
    870 
    871 	if otherSecret == nil {
    872 		// Special-case for the plain PSK key exchanges.
    873 		otherSecret = make([]byte, len(config.PreSharedKey))
    874 	}
    875 	return makePSKPremaster(otherSecret, config.PreSharedKey), nil
    876 }
    877 
    878 func (ka *pskKeyAgreement) processServerKeyExchange(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, skx *serverKeyExchangeMsg) error {
    879 	if len(skx.key) < 2 {
    880 		return errServerKeyExchange
    881 	}
    882 	identityLen := (int(skx.key[0]) << 8) | int(skx.key[1])
    883 	if 2+identityLen > len(skx.key) {
    884 		return errServerKeyExchange
    885 	}
    886 	ka.identityHint = string(skx.key[2 : 2+identityLen])
    887 
    888 	// Process the remainder of the ServerKeyExchange.
    889 	newSkx := new(serverKeyExchangeMsg)
    890 	newSkx.key = skx.key[2+identityLen:]
    891 	return ka.base.processServerKeyExchange(config, clientHello, serverHello, cert, newSkx)
    892 }
    893 
    894 func (ka *pskKeyAgreement) generateClientKeyExchange(config *Config, clientHello *clientHelloMsg, cert *x509.Certificate) ([]byte, *clientKeyExchangeMsg, error) {
    895 	// The server only sends an identity hint but, for purposes of
    896 	// test code, the server always sends the hint and it is
    897 	// required to match.
    898 	if ka.identityHint != config.PreSharedKeyIdentity {
    899 		return nil, nil, errors.New("tls: unexpected identity")
    900 	}
    901 
    902 	// Serialize the identity.
    903 	bytes := make([]byte, 2+len(config.PreSharedKeyIdentity))
    904 	bytes[0] = byte(len(config.PreSharedKeyIdentity) >> 8)
    905 	bytes[1] = byte(len(config.PreSharedKeyIdentity))
    906 	copy(bytes[2:], []byte(config.PreSharedKeyIdentity))
    907 
    908 	// Append the base key exchange's ClientKeyExchange.
    909 	otherSecret, baseCkx, err := ka.base.generateClientKeyExchange(config, clientHello, cert)
    910 	if err != nil {
    911 		return nil, nil, err
    912 	}
    913 	ckx := new(clientKeyExchangeMsg)
    914 	ckx.ciphertext = append(bytes, baseCkx.ciphertext...)
    915 
    916 	if config.PreSharedKey == nil {
    917 		return nil, nil, errors.New("tls: pre-shared key not configured")
    918 	}
    919 	if otherSecret == nil {
    920 		otherSecret = make([]byte, len(config.PreSharedKey))
    921 	}
    922 	return makePSKPremaster(otherSecret, config.PreSharedKey), ckx, nil
    923 }
    924