Home | History | Annotate | Download | only in runner
      1 // Copyright 2009 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 	"bytes"
      9 	"crypto"
     10 	"crypto/ecdsa"
     11 	"crypto/elliptic"
     12 	"crypto/rsa"
     13 	"crypto/subtle"
     14 	"crypto/x509"
     15 	"errors"
     16 	"fmt"
     17 	"io"
     18 	"math/big"
     19 	"net"
     20 	"strconv"
     21 	"time"
     22 )
     23 
     24 type clientHandshakeState struct {
     25 	c             *Conn
     26 	serverHello   *serverHelloMsg
     27 	hello         *clientHelloMsg
     28 	suite         *cipherSuite
     29 	finishedHash  finishedHash
     30 	keyShares     map[CurveID]ecdhCurve
     31 	masterSecret  []byte
     32 	session       *ClientSessionState
     33 	finishedBytes []byte
     34 }
     35 
     36 func (c *Conn) clientHandshake() error {
     37 	if c.config == nil {
     38 		c.config = defaultConfig()
     39 	}
     40 
     41 	if len(c.config.ServerName) == 0 && !c.config.InsecureSkipVerify {
     42 		return errors.New("tls: either ServerName or InsecureSkipVerify must be specified in the tls.Config")
     43 	}
     44 
     45 	c.sendHandshakeSeq = 0
     46 	c.recvHandshakeSeq = 0
     47 
     48 	nextProtosLength := 0
     49 	for _, proto := range c.config.NextProtos {
     50 		if l := len(proto); l > 255 {
     51 			return errors.New("tls: invalid NextProtos value")
     52 		} else {
     53 			nextProtosLength += 1 + l
     54 		}
     55 	}
     56 	if nextProtosLength > 0xffff {
     57 		return errors.New("tls: NextProtos values too large")
     58 	}
     59 
     60 	minVersion := c.config.minVersion(c.isDTLS)
     61 	maxVersion := c.config.maxVersion(c.isDTLS)
     62 	hello := &clientHelloMsg{
     63 		isDTLS:                  c.isDTLS,
     64 		vers:                    versionToWire(maxVersion, c.isDTLS),
     65 		compressionMethods:      []uint8{compressionNone},
     66 		random:                  make([]byte, 32),
     67 		ocspStapling:            !c.config.Bugs.NoOCSPStapling,
     68 		sctListSupported:        !c.config.Bugs.NoSignedCertificateTimestamps,
     69 		serverName:              c.config.ServerName,
     70 		supportedCurves:         c.config.curvePreferences(),
     71 		pskKEModes:              []byte{pskDHEKEMode},
     72 		supportedPoints:         []uint8{pointFormatUncompressed},
     73 		nextProtoNeg:            len(c.config.NextProtos) > 0,
     74 		secureRenegotiation:     []byte{},
     75 		alpnProtocols:           c.config.NextProtos,
     76 		duplicateExtension:      c.config.Bugs.DuplicateExtension,
     77 		channelIDSupported:      c.config.ChannelID != nil,
     78 		npnAfterAlpn:            c.config.Bugs.SwapNPNAndALPN,
     79 		extendedMasterSecret:    maxVersion >= VersionTLS10,
     80 		srtpProtectionProfiles:  c.config.SRTPProtectionProfiles,
     81 		srtpMasterKeyIdentifier: c.config.Bugs.SRTPMasterKeyIdentifer,
     82 		customExtension:         c.config.Bugs.CustomExtension,
     83 		pskBinderFirst:          c.config.Bugs.PSKBinderFirst,
     84 	}
     85 
     86 	disableEMS := c.config.Bugs.NoExtendedMasterSecret
     87 	if c.cipherSuite != nil {
     88 		disableEMS = c.config.Bugs.NoExtendedMasterSecretOnRenegotiation
     89 	}
     90 
     91 	if disableEMS {
     92 		hello.extendedMasterSecret = false
     93 	}
     94 
     95 	if c.config.Bugs.NoSupportedCurves {
     96 		hello.supportedCurves = nil
     97 	}
     98 
     99 	if len(c.config.Bugs.SendPSKKeyExchangeModes) != 0 {
    100 		hello.pskKEModes = c.config.Bugs.SendPSKKeyExchangeModes
    101 	}
    102 
    103 	if c.config.Bugs.SendCompressionMethods != nil {
    104 		hello.compressionMethods = c.config.Bugs.SendCompressionMethods
    105 	}
    106 
    107 	if c.config.Bugs.SendSupportedPointFormats != nil {
    108 		hello.supportedPoints = c.config.Bugs.SendSupportedPointFormats
    109 	}
    110 
    111 	if len(c.clientVerify) > 0 && !c.config.Bugs.EmptyRenegotiationInfo {
    112 		if c.config.Bugs.BadRenegotiationInfo {
    113 			hello.secureRenegotiation = append(hello.secureRenegotiation, c.clientVerify...)
    114 			hello.secureRenegotiation[0] ^= 0x80
    115 		} else {
    116 			hello.secureRenegotiation = c.clientVerify
    117 		}
    118 	}
    119 
    120 	if c.noRenegotiationInfo() {
    121 		hello.secureRenegotiation = nil
    122 	}
    123 
    124 	var keyShares map[CurveID]ecdhCurve
    125 	if maxVersion >= VersionTLS13 {
    126 		keyShares = make(map[CurveID]ecdhCurve)
    127 		hello.hasKeyShares = true
    128 		hello.trailingKeyShareData = c.config.Bugs.TrailingKeyShareData
    129 		curvesToSend := c.config.defaultCurves()
    130 		for _, curveID := range hello.supportedCurves {
    131 			if !curvesToSend[curveID] {
    132 				continue
    133 			}
    134 			curve, ok := curveForCurveID(curveID)
    135 			if !ok {
    136 				continue
    137 			}
    138 			publicKey, err := curve.offer(c.config.rand())
    139 			if err != nil {
    140 				return err
    141 			}
    142 
    143 			if c.config.Bugs.SendCurve != 0 {
    144 				curveID = c.config.Bugs.SendCurve
    145 			}
    146 			if c.config.Bugs.InvalidECDHPoint {
    147 				publicKey[0] ^= 0xff
    148 			}
    149 
    150 			hello.keyShares = append(hello.keyShares, keyShareEntry{
    151 				group:       curveID,
    152 				keyExchange: publicKey,
    153 			})
    154 			keyShares[curveID] = curve
    155 
    156 			if c.config.Bugs.DuplicateKeyShares {
    157 				hello.keyShares = append(hello.keyShares, hello.keyShares[len(hello.keyShares)-1])
    158 			}
    159 		}
    160 
    161 		if c.config.Bugs.MissingKeyShare {
    162 			hello.hasKeyShares = false
    163 		}
    164 	}
    165 
    166 	possibleCipherSuites := c.config.cipherSuites()
    167 	hello.cipherSuites = make([]uint16, 0, len(possibleCipherSuites))
    168 
    169 NextCipherSuite:
    170 	for _, suiteId := range possibleCipherSuites {
    171 		for _, suite := range cipherSuites {
    172 			if suite.id != suiteId {
    173 				continue
    174 			}
    175 			// Don't advertise TLS 1.2-only cipher suites unless
    176 			// we're attempting TLS 1.2.
    177 			if maxVersion < VersionTLS12 && suite.flags&suiteTLS12 != 0 {
    178 				continue
    179 			}
    180 			// Don't advertise non-DTLS cipher suites in DTLS.
    181 			if c.isDTLS && suite.flags&suiteNoDTLS != 0 {
    182 				continue
    183 			}
    184 			hello.cipherSuites = append(hello.cipherSuites, suiteId)
    185 			continue NextCipherSuite
    186 		}
    187 	}
    188 
    189 	if c.config.Bugs.AdvertiseAllConfiguredCiphers {
    190 		hello.cipherSuites = possibleCipherSuites
    191 	}
    192 
    193 	if c.config.Bugs.SendRenegotiationSCSV {
    194 		hello.cipherSuites = append(hello.cipherSuites, renegotiationSCSV)
    195 	}
    196 
    197 	if c.config.Bugs.SendFallbackSCSV {
    198 		hello.cipherSuites = append(hello.cipherSuites, fallbackSCSV)
    199 	}
    200 
    201 	_, err := io.ReadFull(c.config.rand(), hello.random)
    202 	if err != nil {
    203 		c.sendAlert(alertInternalError)
    204 		return errors.New("tls: short read from Rand: " + err.Error())
    205 	}
    206 
    207 	if maxVersion >= VersionTLS12 && !c.config.Bugs.NoSignatureAlgorithms {
    208 		hello.signatureAlgorithms = c.config.verifySignatureAlgorithms()
    209 	}
    210 
    211 	var session *ClientSessionState
    212 	var cacheKey string
    213 	sessionCache := c.config.ClientSessionCache
    214 
    215 	if sessionCache != nil {
    216 		hello.ticketSupported = !c.config.SessionTicketsDisabled
    217 
    218 		// Try to resume a previously negotiated TLS session, if
    219 		// available.
    220 		cacheKey = clientSessionCacheKey(c.conn.RemoteAddr(), c.config)
    221 		// TODO(nharper): Support storing more than one session
    222 		// ticket for TLS 1.3.
    223 		candidateSession, ok := sessionCache.Get(cacheKey)
    224 		if ok {
    225 			ticketOk := !c.config.SessionTicketsDisabled || candidateSession.sessionTicket == nil
    226 
    227 			// Check that the ciphersuite/version used for the
    228 			// previous session are still valid.
    229 			cipherSuiteOk := false
    230 			if candidateSession.vers <= VersionTLS12 {
    231 				for _, id := range hello.cipherSuites {
    232 					if id == candidateSession.cipherSuite {
    233 						cipherSuiteOk = true
    234 						break
    235 					}
    236 				}
    237 			} else {
    238 				// TLS 1.3 allows the cipher to change on
    239 				// resumption.
    240 				cipherSuiteOk = true
    241 			}
    242 
    243 			versOk := candidateSession.vers >= minVersion &&
    244 				candidateSession.vers <= maxVersion
    245 			if ticketOk && versOk && cipherSuiteOk {
    246 				session = candidateSession
    247 			}
    248 		}
    249 	}
    250 
    251 	var pskCipherSuite *cipherSuite
    252 	if session != nil && c.config.time().Before(session.ticketExpiration) {
    253 		ticket := session.sessionTicket
    254 		if c.config.Bugs.FilterTicket != nil && len(ticket) > 0 {
    255 			// Copy the ticket so FilterTicket may act in-place.
    256 			ticket = make([]byte, len(session.sessionTicket))
    257 			copy(ticket, session.sessionTicket)
    258 
    259 			ticket, err = c.config.Bugs.FilterTicket(ticket)
    260 			if err != nil {
    261 				return err
    262 			}
    263 		}
    264 
    265 		if session.vers >= VersionTLS13 || c.config.Bugs.SendBothTickets {
    266 			pskCipherSuite = cipherSuiteFromID(session.cipherSuite)
    267 			if pskCipherSuite == nil {
    268 				return errors.New("tls: client session cache has invalid cipher suite")
    269 			}
    270 			// TODO(nharper): Support sending more
    271 			// than one PSK identity.
    272 			ticketAge := uint32(c.config.time().Sub(session.ticketCreationTime) / time.Millisecond)
    273 			if c.config.Bugs.SendTicketAge != 0 {
    274 				ticketAge = uint32(c.config.Bugs.SendTicketAge / time.Millisecond)
    275 			}
    276 			psk := pskIdentity{
    277 				ticket:              ticket,
    278 				obfuscatedTicketAge: session.ticketAgeAdd + ticketAge,
    279 			}
    280 			hello.pskIdentities = []pskIdentity{psk}
    281 
    282 			if c.config.Bugs.ExtraPSKIdentity {
    283 				hello.pskIdentities = append(hello.pskIdentities, psk)
    284 			}
    285 		}
    286 
    287 		if session.vers < VersionTLS13 || c.config.Bugs.SendBothTickets {
    288 			if ticket != nil {
    289 				hello.sessionTicket = ticket
    290 				// A random session ID is used to detect when the
    291 				// server accepted the ticket and is resuming a session
    292 				// (see RFC 5077).
    293 				sessionIdLen := 16
    294 				if c.config.Bugs.TicketSessionIDLength != 0 {
    295 					sessionIdLen = c.config.Bugs.TicketSessionIDLength
    296 				}
    297 				if c.config.Bugs.EmptyTicketSessionID {
    298 					sessionIdLen = 0
    299 				}
    300 				hello.sessionId = make([]byte, sessionIdLen)
    301 				if _, err := io.ReadFull(c.config.rand(), hello.sessionId); err != nil {
    302 					c.sendAlert(alertInternalError)
    303 					return errors.New("tls: short read from Rand: " + err.Error())
    304 				}
    305 			} else {
    306 				hello.sessionId = session.sessionId
    307 			}
    308 		}
    309 	}
    310 
    311 	if maxVersion == VersionTLS13 && !c.config.Bugs.OmitSupportedVersions {
    312 		if hello.vers >= VersionTLS13 {
    313 			hello.vers = VersionTLS12
    314 		}
    315 		for version := maxVersion; version >= minVersion; version-- {
    316 			hello.supportedVersions = append(hello.supportedVersions, versionToWire(version, c.isDTLS))
    317 		}
    318 	}
    319 
    320 	if len(c.config.Bugs.SendSupportedVersions) > 0 {
    321 		hello.supportedVersions = c.config.Bugs.SendSupportedVersions
    322 	}
    323 
    324 	if c.config.Bugs.SendClientVersion != 0 {
    325 		hello.vers = c.config.Bugs.SendClientVersion
    326 	}
    327 
    328 	if c.config.Bugs.SendCipherSuites != nil {
    329 		hello.cipherSuites = c.config.Bugs.SendCipherSuites
    330 	}
    331 
    332 	var sendEarlyData bool
    333 	if len(hello.pskIdentities) > 0 && c.config.Bugs.SendEarlyData != nil {
    334 		hello.hasEarlyData = true
    335 		sendEarlyData = true
    336 	}
    337 	if c.config.Bugs.SendFakeEarlyDataLength > 0 {
    338 		hello.hasEarlyData = true
    339 	}
    340 	if c.config.Bugs.OmitEarlyDataExtension {
    341 		hello.hasEarlyData = false
    342 	}
    343 
    344 	var helloBytes []byte
    345 	if c.config.Bugs.SendV2ClientHello {
    346 		// Test that the peer left-pads random.
    347 		hello.random[0] = 0
    348 		v2Hello := &v2ClientHelloMsg{
    349 			vers:         hello.vers,
    350 			cipherSuites: hello.cipherSuites,
    351 			// No session resumption for V2ClientHello.
    352 			sessionId: nil,
    353 			challenge: hello.random[1:],
    354 		}
    355 		helloBytes = v2Hello.marshal()
    356 		c.writeV2Record(helloBytes)
    357 	} else {
    358 		if len(hello.pskIdentities) > 0 {
    359 			generatePSKBinders(hello, pskCipherSuite, session.masterSecret, []byte{}, c.config)
    360 		}
    361 		helloBytes = hello.marshal()
    362 
    363 		if c.config.Bugs.PartialClientFinishedWithClientHello {
    364 			// Include one byte of Finished. We can compute it
    365 			// without completing the handshake. This assumes we
    366 			// negotiate TLS 1.3 with no HelloRetryRequest or
    367 			// CertificateRequest.
    368 			toWrite := make([]byte, 0, len(helloBytes)+1)
    369 			toWrite = append(toWrite, helloBytes...)
    370 			toWrite = append(toWrite, typeFinished)
    371 			c.writeRecord(recordTypeHandshake, toWrite)
    372 		} else {
    373 			c.writeRecord(recordTypeHandshake, helloBytes)
    374 		}
    375 	}
    376 	c.flushHandshake()
    377 
    378 	if err := c.simulatePacketLoss(nil); err != nil {
    379 		return err
    380 	}
    381 	if c.config.Bugs.SendEarlyAlert {
    382 		c.sendAlert(alertHandshakeFailure)
    383 	}
    384 	if c.config.Bugs.SendFakeEarlyDataLength > 0 {
    385 		c.sendFakeEarlyData(c.config.Bugs.SendFakeEarlyDataLength)
    386 	}
    387 
    388 	// Derive early write keys and set Conn state to allow early writes.
    389 	if sendEarlyData {
    390 		finishedHash := newFinishedHash(session.vers, pskCipherSuite)
    391 		finishedHash.addEntropy(session.masterSecret)
    392 		finishedHash.Write(helloBytes)
    393 		earlyTrafficSecret := finishedHash.deriveSecret(earlyTrafficLabel)
    394 		c.out.useTrafficSecret(session.vers, pskCipherSuite, earlyTrafficSecret, clientWrite)
    395 		for _, earlyData := range c.config.Bugs.SendEarlyData {
    396 			if _, err := c.writeRecord(recordTypeApplicationData, earlyData); err != nil {
    397 				return err
    398 			}
    399 		}
    400 	}
    401 
    402 	msg, err := c.readHandshake()
    403 	if err != nil {
    404 		return err
    405 	}
    406 
    407 	if c.isDTLS {
    408 		helloVerifyRequest, ok := msg.(*helloVerifyRequestMsg)
    409 		if ok {
    410 			if helloVerifyRequest.vers != versionToWire(VersionTLS10, c.isDTLS) {
    411 				// Per RFC 6347, the version field in
    412 				// HelloVerifyRequest SHOULD be always DTLS
    413 				// 1.0. Enforce this for testing purposes.
    414 				return errors.New("dtls: bad HelloVerifyRequest version")
    415 			}
    416 
    417 			hello.raw = nil
    418 			hello.cookie = helloVerifyRequest.cookie
    419 			helloBytes = hello.marshal()
    420 			c.writeRecord(recordTypeHandshake, helloBytes)
    421 			c.flushHandshake()
    422 
    423 			if err := c.simulatePacketLoss(nil); err != nil {
    424 				return err
    425 			}
    426 			msg, err = c.readHandshake()
    427 			if err != nil {
    428 				return err
    429 			}
    430 		}
    431 	}
    432 
    433 	var serverWireVersion uint16
    434 	switch m := msg.(type) {
    435 	case *helloRetryRequestMsg:
    436 		serverWireVersion = m.vers
    437 	case *serverHelloMsg:
    438 		serverWireVersion = m.vers
    439 	default:
    440 		c.sendAlert(alertUnexpectedMessage)
    441 		return fmt.Errorf("tls: received unexpected message of type %T when waiting for HelloRetryRequest or ServerHello", msg)
    442 	}
    443 
    444 	serverVersion, ok := wireToVersion(serverWireVersion, c.isDTLS)
    445 	if ok {
    446 		ok = c.config.isSupportedVersion(serverVersion, c.isDTLS)
    447 	}
    448 	if !ok {
    449 		c.sendAlert(alertProtocolVersion)
    450 		return fmt.Errorf("tls: server selected unsupported protocol version %x", c.vers)
    451 	}
    452 	c.vers = serverVersion
    453 	c.haveVers = true
    454 
    455 	helloRetryRequest, haveHelloRetryRequest := msg.(*helloRetryRequestMsg)
    456 	var secondHelloBytes []byte
    457 	if haveHelloRetryRequest {
    458 		c.out.resetCipher()
    459 		if len(helloRetryRequest.cookie) > 0 {
    460 			hello.tls13Cookie = helloRetryRequest.cookie
    461 		}
    462 
    463 		if c.config.Bugs.MisinterpretHelloRetryRequestCurve != 0 {
    464 			helloRetryRequest.hasSelectedGroup = true
    465 			helloRetryRequest.selectedGroup = c.config.Bugs.MisinterpretHelloRetryRequestCurve
    466 		}
    467 		if helloRetryRequest.hasSelectedGroup {
    468 			var hrrCurveFound bool
    469 			group := helloRetryRequest.selectedGroup
    470 			for _, curveID := range hello.supportedCurves {
    471 				if group == curveID {
    472 					hrrCurveFound = true
    473 					break
    474 				}
    475 			}
    476 			if !hrrCurveFound || keyShares[group] != nil {
    477 				c.sendAlert(alertHandshakeFailure)
    478 				return errors.New("tls: received invalid HelloRetryRequest")
    479 			}
    480 			curve, ok := curveForCurveID(group)
    481 			if !ok {
    482 				return errors.New("tls: Unable to get curve requested in HelloRetryRequest")
    483 			}
    484 			publicKey, err := curve.offer(c.config.rand())
    485 			if err != nil {
    486 				return err
    487 			}
    488 			keyShares[group] = curve
    489 			hello.keyShares = []keyShareEntry{{
    490 				group:       group,
    491 				keyExchange: publicKey,
    492 			}}
    493 		}
    494 
    495 		if c.config.Bugs.SecondClientHelloMissingKeyShare {
    496 			hello.hasKeyShares = false
    497 		}
    498 
    499 		hello.hasEarlyData = c.config.Bugs.SendEarlyDataOnSecondClientHello
    500 		hello.raw = nil
    501 
    502 		if len(hello.pskIdentities) > 0 {
    503 			generatePSKBinders(hello, pskCipherSuite, session.masterSecret, append(helloBytes, helloRetryRequest.marshal()...), c.config)
    504 		}
    505 		secondHelloBytes = hello.marshal()
    506 
    507 		if c.config.Bugs.InterleaveEarlyData {
    508 			c.sendFakeEarlyData(4)
    509 			c.writeRecord(recordTypeHandshake, secondHelloBytes[:16])
    510 			c.sendFakeEarlyData(4)
    511 			c.writeRecord(recordTypeHandshake, secondHelloBytes[16:])
    512 		} else {
    513 			c.writeRecord(recordTypeHandshake, secondHelloBytes)
    514 		}
    515 		c.flushHandshake()
    516 
    517 		if c.config.Bugs.SendEarlyDataOnSecondClientHello {
    518 			c.sendFakeEarlyData(4)
    519 		}
    520 
    521 		msg, err = c.readHandshake()
    522 		if err != nil {
    523 			return err
    524 		}
    525 	}
    526 
    527 	serverHello, ok := msg.(*serverHelloMsg)
    528 	if !ok {
    529 		c.sendAlert(alertUnexpectedMessage)
    530 		return unexpectedMessageError(serverHello, msg)
    531 	}
    532 
    533 	if serverWireVersion != serverHello.vers {
    534 		c.sendAlert(alertProtocolVersion)
    535 		return fmt.Errorf("tls: server sent non-matching version %x vs %x", serverWireVersion, serverHello.vers)
    536 	}
    537 
    538 	// Check for downgrade signals in the server random, per
    539 	// draft-ietf-tls-tls13-16, section 4.1.3.
    540 	if c.vers <= VersionTLS12 && c.config.maxVersion(c.isDTLS) >= VersionTLS13 {
    541 		if bytes.Equal(serverHello.random[len(serverHello.random)-8:], downgradeTLS13) {
    542 			c.sendAlert(alertProtocolVersion)
    543 			return errors.New("tls: downgrade from TLS 1.3 detected")
    544 		}
    545 	}
    546 	if c.vers <= VersionTLS11 && c.config.maxVersion(c.isDTLS) >= VersionTLS12 {
    547 		if bytes.Equal(serverHello.random[len(serverHello.random)-8:], downgradeTLS12) {
    548 			c.sendAlert(alertProtocolVersion)
    549 			return errors.New("tls: downgrade from TLS 1.2 detected")
    550 		}
    551 	}
    552 
    553 	suite := mutualCipherSuite(hello.cipherSuites, serverHello.cipherSuite)
    554 	if suite == nil {
    555 		c.sendAlert(alertHandshakeFailure)
    556 		return fmt.Errorf("tls: server selected an unsupported cipher suite")
    557 	}
    558 
    559 	if haveHelloRetryRequest && helloRetryRequest.hasSelectedGroup && helloRetryRequest.selectedGroup != serverHello.keyShare.group {
    560 		c.sendAlert(alertHandshakeFailure)
    561 		return errors.New("tls: ServerHello parameters did not match HelloRetryRequest")
    562 	}
    563 
    564 	hs := &clientHandshakeState{
    565 		c:            c,
    566 		serverHello:  serverHello,
    567 		hello:        hello,
    568 		suite:        suite,
    569 		finishedHash: newFinishedHash(c.vers, suite),
    570 		keyShares:    keyShares,
    571 		session:      session,
    572 	}
    573 
    574 	hs.writeHash(helloBytes, hs.c.sendHandshakeSeq-1)
    575 	if haveHelloRetryRequest {
    576 		hs.writeServerHash(helloRetryRequest.marshal())
    577 		hs.writeClientHash(secondHelloBytes)
    578 	}
    579 	hs.writeServerHash(hs.serverHello.marshal())
    580 
    581 	if c.vers >= VersionTLS13 {
    582 		if err := hs.doTLS13Handshake(); err != nil {
    583 			return err
    584 		}
    585 	} else {
    586 		if c.config.Bugs.EarlyChangeCipherSpec > 0 {
    587 			hs.establishKeys()
    588 			c.writeRecord(recordTypeChangeCipherSpec, []byte{1})
    589 		}
    590 
    591 		if hs.serverHello.compressionMethod != compressionNone {
    592 			c.sendAlert(alertUnexpectedMessage)
    593 			return errors.New("tls: server selected unsupported compression format")
    594 		}
    595 
    596 		err = hs.processServerExtensions(&serverHello.extensions)
    597 		if err != nil {
    598 			return err
    599 		}
    600 
    601 		isResume, err := hs.processServerHello()
    602 		if err != nil {
    603 			return err
    604 		}
    605 
    606 		if isResume {
    607 			if c.config.Bugs.EarlyChangeCipherSpec == 0 {
    608 				if err := hs.establishKeys(); err != nil {
    609 					return err
    610 				}
    611 			}
    612 			if err := hs.readSessionTicket(); err != nil {
    613 				return err
    614 			}
    615 			if err := hs.readFinished(c.firstFinished[:]); err != nil {
    616 				return err
    617 			}
    618 			if err := hs.sendFinished(nil, isResume); err != nil {
    619 				return err
    620 			}
    621 		} else {
    622 			if err := hs.doFullHandshake(); err != nil {
    623 				return err
    624 			}
    625 			if err := hs.establishKeys(); err != nil {
    626 				return err
    627 			}
    628 			if err := hs.sendFinished(c.firstFinished[:], isResume); err != nil {
    629 				return err
    630 			}
    631 			// Most retransmits are triggered by a timeout, but the final
    632 			// leg of the handshake is retransmited upon re-receiving a
    633 			// Finished.
    634 			if err := c.simulatePacketLoss(func() {
    635 				c.sendHandshakeSeq--
    636 				c.writeRecord(recordTypeHandshake, hs.finishedBytes)
    637 				c.flushHandshake()
    638 			}); err != nil {
    639 				return err
    640 			}
    641 			if err := hs.readSessionTicket(); err != nil {
    642 				return err
    643 			}
    644 			if err := hs.readFinished(nil); err != nil {
    645 				return err
    646 			}
    647 		}
    648 
    649 		if sessionCache != nil && hs.session != nil && session != hs.session {
    650 			if c.config.Bugs.RequireSessionTickets && len(hs.session.sessionTicket) == 0 {
    651 				return errors.New("tls: new session used session IDs instead of tickets")
    652 			}
    653 			sessionCache.Put(cacheKey, hs.session)
    654 		}
    655 
    656 		c.didResume = isResume
    657 		c.exporterSecret = hs.masterSecret
    658 	}
    659 
    660 	c.handshakeComplete = true
    661 	c.cipherSuite = suite
    662 	copy(c.clientRandom[:], hs.hello.random)
    663 	copy(c.serverRandom[:], hs.serverHello.random)
    664 
    665 	return nil
    666 }
    667 
    668 func (hs *clientHandshakeState) doTLS13Handshake() error {
    669 	c := hs.c
    670 
    671 	// Once the PRF hash is known, TLS 1.3 does not require a handshake
    672 	// buffer.
    673 	hs.finishedHash.discardHandshakeBuffer()
    674 
    675 	zeroSecret := hs.finishedHash.zeroSecret()
    676 
    677 	// Resolve PSK and compute the early secret.
    678 	//
    679 	// TODO(davidben): This will need to be handled slightly earlier once
    680 	// 0-RTT is implemented.
    681 	if hs.serverHello.hasPSKIdentity {
    682 		// We send at most one PSK identity.
    683 		if hs.session == nil || hs.serverHello.pskIdentity != 0 {
    684 			c.sendAlert(alertUnknownPSKIdentity)
    685 			return errors.New("tls: server sent unknown PSK identity")
    686 		}
    687 		sessionCipher := cipherSuiteFromID(hs.session.cipherSuite)
    688 		if sessionCipher == nil || sessionCipher.hash() != hs.suite.hash() {
    689 			c.sendAlert(alertHandshakeFailure)
    690 			return errors.New("tls: server resumed an invalid session for the cipher suite")
    691 		}
    692 		hs.finishedHash.addEntropy(hs.session.masterSecret)
    693 		c.didResume = true
    694 	} else {
    695 		hs.finishedHash.addEntropy(zeroSecret)
    696 	}
    697 
    698 	if !hs.serverHello.hasKeyShare {
    699 		c.sendAlert(alertUnsupportedExtension)
    700 		return errors.New("tls: server omitted KeyShare on resumption.")
    701 	}
    702 
    703 	// Resolve ECDHE and compute the handshake secret.
    704 	if !c.config.Bugs.MissingKeyShare && !c.config.Bugs.SecondClientHelloMissingKeyShare {
    705 		curve, ok := hs.keyShares[hs.serverHello.keyShare.group]
    706 		if !ok {
    707 			c.sendAlert(alertHandshakeFailure)
    708 			return errors.New("tls: server selected an unsupported group")
    709 		}
    710 		c.curveID = hs.serverHello.keyShare.group
    711 
    712 		ecdheSecret, err := curve.finish(hs.serverHello.keyShare.keyExchange)
    713 		if err != nil {
    714 			return err
    715 		}
    716 		hs.finishedHash.addEntropy(ecdheSecret)
    717 	} else {
    718 		hs.finishedHash.addEntropy(zeroSecret)
    719 	}
    720 
    721 	// Derive handshake traffic keys and switch read key to handshake
    722 	// traffic key.
    723 	clientHandshakeTrafficSecret := hs.finishedHash.deriveSecret(clientHandshakeTrafficLabel)
    724 	serverHandshakeTrafficSecret := hs.finishedHash.deriveSecret(serverHandshakeTrafficLabel)
    725 	c.in.useTrafficSecret(c.vers, hs.suite, serverHandshakeTrafficSecret, serverWrite)
    726 
    727 	msg, err := c.readHandshake()
    728 	if err != nil {
    729 		return err
    730 	}
    731 
    732 	encryptedExtensions, ok := msg.(*encryptedExtensionsMsg)
    733 	if !ok {
    734 		c.sendAlert(alertUnexpectedMessage)
    735 		return unexpectedMessageError(encryptedExtensions, msg)
    736 	}
    737 	hs.writeServerHash(encryptedExtensions.marshal())
    738 
    739 	err = hs.processServerExtensions(&encryptedExtensions.extensions)
    740 	if err != nil {
    741 		return err
    742 	}
    743 
    744 	var chainToSend *Certificate
    745 	var certReq *certificateRequestMsg
    746 	if c.didResume {
    747 		// Copy over authentication from the session.
    748 		c.peerCertificates = hs.session.serverCertificates
    749 		c.sctList = hs.session.sctList
    750 		c.ocspResponse = hs.session.ocspResponse
    751 	} else {
    752 		msg, err := c.readHandshake()
    753 		if err != nil {
    754 			return err
    755 		}
    756 
    757 		var ok bool
    758 		certReq, ok = msg.(*certificateRequestMsg)
    759 		if ok {
    760 			if len(certReq.requestContext) != 0 {
    761 				return errors.New("tls: non-empty certificate request context sent in handshake")
    762 			}
    763 
    764 			if c.config.Bugs.IgnorePeerSignatureAlgorithmPreferences {
    765 				certReq.signatureAlgorithms = c.config.signSignatureAlgorithms()
    766 			}
    767 
    768 			hs.writeServerHash(certReq.marshal())
    769 
    770 			chainToSend, err = selectClientCertificate(c, certReq)
    771 			if err != nil {
    772 				return err
    773 			}
    774 
    775 			msg, err = c.readHandshake()
    776 			if err != nil {
    777 				return err
    778 			}
    779 		}
    780 
    781 		certMsg, ok := msg.(*certificateMsg)
    782 		if !ok {
    783 			c.sendAlert(alertUnexpectedMessage)
    784 			return unexpectedMessageError(certMsg, msg)
    785 		}
    786 		hs.writeServerHash(certMsg.marshal())
    787 
    788 		// Check for unsolicited extensions.
    789 		for i, cert := range certMsg.certificates {
    790 			if c.config.Bugs.NoOCSPStapling && cert.ocspResponse != nil {
    791 				c.sendAlert(alertUnsupportedExtension)
    792 				return errors.New("tls: unexpected OCSP response in the server certificate")
    793 			}
    794 			if c.config.Bugs.NoSignedCertificateTimestamps && cert.sctList != nil {
    795 				c.sendAlert(alertUnsupportedExtension)
    796 				return errors.New("tls: unexpected SCT list in the server certificate")
    797 			}
    798 			if i > 0 && c.config.Bugs.ExpectNoExtensionsOnIntermediate && (cert.ocspResponse != nil || cert.sctList != nil) {
    799 				c.sendAlert(alertUnsupportedExtension)
    800 				return errors.New("tls: unexpected extensions in the server certificate")
    801 			}
    802 		}
    803 
    804 		if err := hs.verifyCertificates(certMsg); err != nil {
    805 			return err
    806 		}
    807 		leaf := c.peerCertificates[0]
    808 		c.ocspResponse = certMsg.certificates[0].ocspResponse
    809 		c.sctList = certMsg.certificates[0].sctList
    810 
    811 		msg, err = c.readHandshake()
    812 		if err != nil {
    813 			return err
    814 		}
    815 		certVerifyMsg, ok := msg.(*certificateVerifyMsg)
    816 		if !ok {
    817 			c.sendAlert(alertUnexpectedMessage)
    818 			return unexpectedMessageError(certVerifyMsg, msg)
    819 		}
    820 
    821 		c.peerSignatureAlgorithm = certVerifyMsg.signatureAlgorithm
    822 		input := hs.finishedHash.certificateVerifyInput(serverCertificateVerifyContextTLS13)
    823 		err = verifyMessage(c.vers, leaf.PublicKey, c.config, certVerifyMsg.signatureAlgorithm, input, certVerifyMsg.signature)
    824 		if err != nil {
    825 			return err
    826 		}
    827 
    828 		hs.writeServerHash(certVerifyMsg.marshal())
    829 	}
    830 
    831 	msg, err = c.readHandshake()
    832 	if err != nil {
    833 		return err
    834 	}
    835 	serverFinished, ok := msg.(*finishedMsg)
    836 	if !ok {
    837 		c.sendAlert(alertUnexpectedMessage)
    838 		return unexpectedMessageError(serverFinished, msg)
    839 	}
    840 
    841 	verify := hs.finishedHash.serverSum(serverHandshakeTrafficSecret)
    842 	if len(verify) != len(serverFinished.verifyData) ||
    843 		subtle.ConstantTimeCompare(verify, serverFinished.verifyData) != 1 {
    844 		c.sendAlert(alertHandshakeFailure)
    845 		return errors.New("tls: server's Finished message was incorrect")
    846 	}
    847 
    848 	hs.writeServerHash(serverFinished.marshal())
    849 
    850 	// The various secrets do not incorporate the client's final leg, so
    851 	// derive them now before updating the handshake context.
    852 	hs.finishedHash.addEntropy(zeroSecret)
    853 	clientTrafficSecret := hs.finishedHash.deriveSecret(clientApplicationTrafficLabel)
    854 	serverTrafficSecret := hs.finishedHash.deriveSecret(serverApplicationTrafficLabel)
    855 	c.exporterSecret = hs.finishedHash.deriveSecret(exporterLabel)
    856 
    857 	// Switch to application data keys on read. In particular, any alerts
    858 	// from the client certificate are read over these keys.
    859 	c.in.useTrafficSecret(c.vers, hs.suite, serverTrafficSecret, serverWrite)
    860 
    861 	// If we're expecting 0.5-RTT messages from the server, read them
    862 	// now.
    863 	if encryptedExtensions.extensions.hasEarlyData {
    864 		// BoringSSL will always send two tickets half-RTT when
    865 		// negotiating 0-RTT.
    866 		for i := 0; i < shimConfig.HalfRTTTickets; i++ {
    867 			msg, err := c.readHandshake()
    868 			if err != nil {
    869 				return fmt.Errorf("tls: error reading half-RTT ticket: %s", err)
    870 			}
    871 			newSessionTicket, ok := msg.(*newSessionTicketMsg)
    872 			if !ok {
    873 				return errors.New("tls: expected half-RTT ticket")
    874 			}
    875 			if err := c.processTLS13NewSessionTicket(newSessionTicket, hs.suite); err != nil {
    876 				return err
    877 			}
    878 		}
    879 		for _, expectedMsg := range c.config.Bugs.ExpectHalfRTTData {
    880 			if err := c.readRecord(recordTypeApplicationData); err != nil {
    881 				return err
    882 			}
    883 			if !bytes.Equal(c.input.data[c.input.off:], expectedMsg) {
    884 				return errors.New("ExpectHalfRTTData: did not get expected message")
    885 			}
    886 			c.in.freeBlock(c.input)
    887 			c.input = nil
    888 		}
    889 	}
    890 
    891 	// Send EndOfEarlyData and then switch write key to handshake
    892 	// traffic key.
    893 	if c.out.cipher != nil && !c.config.Bugs.SkipEndOfEarlyData {
    894 		if c.config.Bugs.SendStrayEarlyHandshake {
    895 			helloRequest := new(helloRequestMsg)
    896 			c.writeRecord(recordTypeHandshake, helloRequest.marshal())
    897 		}
    898 		c.sendAlert(alertEndOfEarlyData)
    899 	}
    900 	c.out.useTrafficSecret(c.vers, hs.suite, clientHandshakeTrafficSecret, clientWrite)
    901 
    902 	if certReq != nil && !c.config.Bugs.SkipClientCertificate {
    903 		certMsg := &certificateMsg{
    904 			hasRequestContext: true,
    905 			requestContext:    certReq.requestContext,
    906 		}
    907 		if chainToSend != nil {
    908 			for _, certData := range chainToSend.Certificate {
    909 				certMsg.certificates = append(certMsg.certificates, certificateEntry{
    910 					data:           certData,
    911 					extraExtension: c.config.Bugs.SendExtensionOnCertificate,
    912 				})
    913 			}
    914 		}
    915 		hs.writeClientHash(certMsg.marshal())
    916 		c.writeRecord(recordTypeHandshake, certMsg.marshal())
    917 
    918 		if chainToSend != nil {
    919 			certVerify := &certificateVerifyMsg{
    920 				hasSignatureAlgorithm: true,
    921 			}
    922 
    923 			// Determine the hash to sign.
    924 			privKey := chainToSend.PrivateKey
    925 
    926 			var err error
    927 			certVerify.signatureAlgorithm, err = selectSignatureAlgorithm(c.vers, privKey, c.config, certReq.signatureAlgorithms)
    928 			if err != nil {
    929 				c.sendAlert(alertInternalError)
    930 				return err
    931 			}
    932 
    933 			input := hs.finishedHash.certificateVerifyInput(clientCertificateVerifyContextTLS13)
    934 			certVerify.signature, err = signMessage(c.vers, privKey, c.config, certVerify.signatureAlgorithm, input)
    935 			if err != nil {
    936 				c.sendAlert(alertInternalError)
    937 				return err
    938 			}
    939 			if c.config.Bugs.SendSignatureAlgorithm != 0 {
    940 				certVerify.signatureAlgorithm = c.config.Bugs.SendSignatureAlgorithm
    941 			}
    942 
    943 			hs.writeClientHash(certVerify.marshal())
    944 			c.writeRecord(recordTypeHandshake, certVerify.marshal())
    945 		}
    946 	}
    947 
    948 	if encryptedExtensions.extensions.channelIDRequested {
    949 		channelIDHash := crypto.SHA256.New()
    950 		channelIDHash.Write(hs.finishedHash.certificateVerifyInput(channelIDContextTLS13))
    951 		channelIDMsgBytes, err := hs.writeChannelIDMessage(channelIDHash.Sum(nil))
    952 		if err != nil {
    953 			return err
    954 		}
    955 		hs.writeClientHash(channelIDMsgBytes)
    956 		c.writeRecord(recordTypeHandshake, channelIDMsgBytes)
    957 	}
    958 
    959 	// Send a client Finished message.
    960 	finished := new(finishedMsg)
    961 	finished.verifyData = hs.finishedHash.clientSum(clientHandshakeTrafficSecret)
    962 	if c.config.Bugs.BadFinished {
    963 		finished.verifyData[0]++
    964 	}
    965 	hs.writeClientHash(finished.marshal())
    966 	if c.config.Bugs.PartialClientFinishedWithClientHello {
    967 		// The first byte has already been sent.
    968 		c.writeRecord(recordTypeHandshake, finished.marshal()[1:])
    969 	} else if c.config.Bugs.InterleaveEarlyData {
    970 		finishedBytes := finished.marshal()
    971 		c.sendFakeEarlyData(4)
    972 		c.writeRecord(recordTypeHandshake, finishedBytes[:1])
    973 		c.sendFakeEarlyData(4)
    974 		c.writeRecord(recordTypeHandshake, finishedBytes[1:])
    975 	} else {
    976 		c.writeRecord(recordTypeHandshake, finished.marshal())
    977 	}
    978 	if c.config.Bugs.SendExtraFinished {
    979 		c.writeRecord(recordTypeHandshake, finished.marshal())
    980 	}
    981 	c.flushHandshake()
    982 
    983 	// Switch to application data keys.
    984 	c.out.useTrafficSecret(c.vers, hs.suite, clientTrafficSecret, clientWrite)
    985 
    986 	c.resumptionSecret = hs.finishedHash.deriveSecret(resumptionLabel)
    987 	return nil
    988 }
    989 
    990 func (hs *clientHandshakeState) doFullHandshake() error {
    991 	c := hs.c
    992 
    993 	var leaf *x509.Certificate
    994 	if hs.suite.flags&suitePSK == 0 {
    995 		msg, err := c.readHandshake()
    996 		if err != nil {
    997 			return err
    998 		}
    999 
   1000 		certMsg, ok := msg.(*certificateMsg)
   1001 		if !ok {
   1002 			c.sendAlert(alertUnexpectedMessage)
   1003 			return unexpectedMessageError(certMsg, msg)
   1004 		}
   1005 		hs.writeServerHash(certMsg.marshal())
   1006 
   1007 		if err := hs.verifyCertificates(certMsg); err != nil {
   1008 			return err
   1009 		}
   1010 		leaf = c.peerCertificates[0]
   1011 	}
   1012 
   1013 	if hs.serverHello.extensions.ocspStapling {
   1014 		msg, err := c.readHandshake()
   1015 		if err != nil {
   1016 			return err
   1017 		}
   1018 		cs, ok := msg.(*certificateStatusMsg)
   1019 		if !ok {
   1020 			c.sendAlert(alertUnexpectedMessage)
   1021 			return unexpectedMessageError(cs, msg)
   1022 		}
   1023 		hs.writeServerHash(cs.marshal())
   1024 
   1025 		if cs.statusType == statusTypeOCSP {
   1026 			c.ocspResponse = cs.response
   1027 		}
   1028 	}
   1029 
   1030 	msg, err := c.readHandshake()
   1031 	if err != nil {
   1032 		return err
   1033 	}
   1034 
   1035 	keyAgreement := hs.suite.ka(c.vers)
   1036 
   1037 	skx, ok := msg.(*serverKeyExchangeMsg)
   1038 	if ok {
   1039 		hs.writeServerHash(skx.marshal())
   1040 		err = keyAgreement.processServerKeyExchange(c.config, hs.hello, hs.serverHello, leaf, skx)
   1041 		if err != nil {
   1042 			c.sendAlert(alertUnexpectedMessage)
   1043 			return err
   1044 		}
   1045 		if ecdhe, ok := keyAgreement.(*ecdheKeyAgreement); ok {
   1046 			c.curveID = ecdhe.curveID
   1047 		}
   1048 
   1049 		c.peerSignatureAlgorithm = keyAgreement.peerSignatureAlgorithm()
   1050 
   1051 		msg, err = c.readHandshake()
   1052 		if err != nil {
   1053 			return err
   1054 		}
   1055 	}
   1056 
   1057 	var chainToSend *Certificate
   1058 	var certRequested bool
   1059 	certReq, ok := msg.(*certificateRequestMsg)
   1060 	if ok {
   1061 		certRequested = true
   1062 		if c.config.Bugs.IgnorePeerSignatureAlgorithmPreferences {
   1063 			certReq.signatureAlgorithms = c.config.signSignatureAlgorithms()
   1064 		}
   1065 
   1066 		hs.writeServerHash(certReq.marshal())
   1067 
   1068 		chainToSend, err = selectClientCertificate(c, certReq)
   1069 		if err != nil {
   1070 			return err
   1071 		}
   1072 
   1073 		msg, err = c.readHandshake()
   1074 		if err != nil {
   1075 			return err
   1076 		}
   1077 	}
   1078 
   1079 	shd, ok := msg.(*serverHelloDoneMsg)
   1080 	if !ok {
   1081 		c.sendAlert(alertUnexpectedMessage)
   1082 		return unexpectedMessageError(shd, msg)
   1083 	}
   1084 	hs.writeServerHash(shd.marshal())
   1085 
   1086 	// If the server requested a certificate then we have to send a
   1087 	// Certificate message in TLS, even if it's empty because we don't have
   1088 	// a certificate to send. In SSL 3.0, skip the message and send a
   1089 	// no_certificate warning alert.
   1090 	if certRequested {
   1091 		if c.vers == VersionSSL30 && chainToSend == nil {
   1092 			c.sendAlert(alertNoCertificate)
   1093 		} else if !c.config.Bugs.SkipClientCertificate {
   1094 			certMsg := new(certificateMsg)
   1095 			if chainToSend != nil {
   1096 				for _, certData := range chainToSend.Certificate {
   1097 					certMsg.certificates = append(certMsg.certificates, certificateEntry{
   1098 						data: certData,
   1099 					})
   1100 				}
   1101 			}
   1102 			hs.writeClientHash(certMsg.marshal())
   1103 			c.writeRecord(recordTypeHandshake, certMsg.marshal())
   1104 		}
   1105 	}
   1106 
   1107 	preMasterSecret, ckx, err := keyAgreement.generateClientKeyExchange(c.config, hs.hello, leaf)
   1108 	if err != nil {
   1109 		c.sendAlert(alertInternalError)
   1110 		return err
   1111 	}
   1112 	if ckx != nil {
   1113 		if c.config.Bugs.EarlyChangeCipherSpec < 2 {
   1114 			hs.writeClientHash(ckx.marshal())
   1115 		}
   1116 		c.writeRecord(recordTypeHandshake, ckx.marshal())
   1117 	}
   1118 
   1119 	if hs.serverHello.extensions.extendedMasterSecret && c.vers >= VersionTLS10 {
   1120 		hs.masterSecret = extendedMasterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret, hs.finishedHash)
   1121 		c.extendedMasterSecret = true
   1122 	} else {
   1123 		if c.config.Bugs.RequireExtendedMasterSecret {
   1124 			return errors.New("tls: extended master secret required but not supported by peer")
   1125 		}
   1126 		hs.masterSecret = masterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret, hs.hello.random, hs.serverHello.random)
   1127 	}
   1128 
   1129 	if chainToSend != nil {
   1130 		certVerify := &certificateVerifyMsg{
   1131 			hasSignatureAlgorithm: c.vers >= VersionTLS12,
   1132 		}
   1133 
   1134 		// Determine the hash to sign.
   1135 		privKey := c.config.Certificates[0].PrivateKey
   1136 
   1137 		if certVerify.hasSignatureAlgorithm {
   1138 			certVerify.signatureAlgorithm, err = selectSignatureAlgorithm(c.vers, privKey, c.config, certReq.signatureAlgorithms)
   1139 			if err != nil {
   1140 				c.sendAlert(alertInternalError)
   1141 				return err
   1142 			}
   1143 		}
   1144 
   1145 		if c.vers > VersionSSL30 {
   1146 			certVerify.signature, err = signMessage(c.vers, privKey, c.config, certVerify.signatureAlgorithm, hs.finishedHash.buffer)
   1147 			if err == nil && c.config.Bugs.SendSignatureAlgorithm != 0 {
   1148 				certVerify.signatureAlgorithm = c.config.Bugs.SendSignatureAlgorithm
   1149 			}
   1150 		} else {
   1151 			// SSL 3.0's client certificate construction is
   1152 			// incompatible with signatureAlgorithm.
   1153 			rsaKey, ok := privKey.(*rsa.PrivateKey)
   1154 			if !ok {
   1155 				err = errors.New("unsupported signature type for client certificate")
   1156 			} else {
   1157 				digest := hs.finishedHash.hashForClientCertificateSSL3(hs.masterSecret)
   1158 				if c.config.Bugs.InvalidSignature {
   1159 					digest[0] ^= 0x80
   1160 				}
   1161 				certVerify.signature, err = rsa.SignPKCS1v15(c.config.rand(), rsaKey, crypto.MD5SHA1, digest)
   1162 			}
   1163 		}
   1164 		if err != nil {
   1165 			c.sendAlert(alertInternalError)
   1166 			return errors.New("tls: failed to sign handshake with client certificate: " + err.Error())
   1167 		}
   1168 
   1169 		hs.writeClientHash(certVerify.marshal())
   1170 		c.writeRecord(recordTypeHandshake, certVerify.marshal())
   1171 	}
   1172 	// flushHandshake will be called in sendFinished.
   1173 
   1174 	hs.finishedHash.discardHandshakeBuffer()
   1175 
   1176 	return nil
   1177 }
   1178 
   1179 func (hs *clientHandshakeState) verifyCertificates(certMsg *certificateMsg) error {
   1180 	c := hs.c
   1181 
   1182 	if len(certMsg.certificates) == 0 {
   1183 		c.sendAlert(alertIllegalParameter)
   1184 		return errors.New("tls: no certificates sent")
   1185 	}
   1186 
   1187 	certs := make([]*x509.Certificate, len(certMsg.certificates))
   1188 	for i, certEntry := range certMsg.certificates {
   1189 		cert, err := x509.ParseCertificate(certEntry.data)
   1190 		if err != nil {
   1191 			c.sendAlert(alertBadCertificate)
   1192 			return errors.New("tls: failed to parse certificate from server: " + err.Error())
   1193 		}
   1194 		certs[i] = cert
   1195 	}
   1196 
   1197 	if !c.config.InsecureSkipVerify {
   1198 		opts := x509.VerifyOptions{
   1199 			Roots:         c.config.RootCAs,
   1200 			CurrentTime:   c.config.time(),
   1201 			DNSName:       c.config.ServerName,
   1202 			Intermediates: x509.NewCertPool(),
   1203 		}
   1204 
   1205 		for i, cert := range certs {
   1206 			if i == 0 {
   1207 				continue
   1208 			}
   1209 			opts.Intermediates.AddCert(cert)
   1210 		}
   1211 		var err error
   1212 		c.verifiedChains, err = certs[0].Verify(opts)
   1213 		if err != nil {
   1214 			c.sendAlert(alertBadCertificate)
   1215 			return err
   1216 		}
   1217 	}
   1218 
   1219 	switch certs[0].PublicKey.(type) {
   1220 	case *rsa.PublicKey, *ecdsa.PublicKey:
   1221 		break
   1222 	default:
   1223 		c.sendAlert(alertUnsupportedCertificate)
   1224 		return fmt.Errorf("tls: server's certificate contains an unsupported type of public key: %T", certs[0].PublicKey)
   1225 	}
   1226 
   1227 	c.peerCertificates = certs
   1228 	return nil
   1229 }
   1230 
   1231 func (hs *clientHandshakeState) establishKeys() error {
   1232 	c := hs.c
   1233 
   1234 	clientMAC, serverMAC, clientKey, serverKey, clientIV, serverIV :=
   1235 		keysFromMasterSecret(c.vers, hs.suite, hs.masterSecret, hs.hello.random, hs.serverHello.random, hs.suite.macLen, hs.suite.keyLen, hs.suite.ivLen(c.vers))
   1236 	var clientCipher, serverCipher interface{}
   1237 	var clientHash, serverHash macFunction
   1238 	if hs.suite.cipher != nil {
   1239 		clientCipher = hs.suite.cipher(clientKey, clientIV, false /* not for reading */)
   1240 		clientHash = hs.suite.mac(c.vers, clientMAC)
   1241 		serverCipher = hs.suite.cipher(serverKey, serverIV, true /* for reading */)
   1242 		serverHash = hs.suite.mac(c.vers, serverMAC)
   1243 	} else {
   1244 		clientCipher = hs.suite.aead(c.vers, clientKey, clientIV)
   1245 		serverCipher = hs.suite.aead(c.vers, serverKey, serverIV)
   1246 	}
   1247 
   1248 	c.in.prepareCipherSpec(c.vers, serverCipher, serverHash)
   1249 	c.out.prepareCipherSpec(c.vers, clientCipher, clientHash)
   1250 	return nil
   1251 }
   1252 
   1253 func (hs *clientHandshakeState) processServerExtensions(serverExtensions *serverExtensions) error {
   1254 	c := hs.c
   1255 
   1256 	if c.vers < VersionTLS13 {
   1257 		if c.config.Bugs.RequireRenegotiationInfo && serverExtensions.secureRenegotiation == nil {
   1258 			return errors.New("tls: renegotiation extension missing")
   1259 		}
   1260 
   1261 		if len(c.clientVerify) > 0 && !c.noRenegotiationInfo() {
   1262 			var expectedRenegInfo []byte
   1263 			expectedRenegInfo = append(expectedRenegInfo, c.clientVerify...)
   1264 			expectedRenegInfo = append(expectedRenegInfo, c.serverVerify...)
   1265 			if !bytes.Equal(serverExtensions.secureRenegotiation, expectedRenegInfo) {
   1266 				c.sendAlert(alertHandshakeFailure)
   1267 				return fmt.Errorf("tls: renegotiation mismatch")
   1268 			}
   1269 		}
   1270 	} else if serverExtensions.secureRenegotiation != nil {
   1271 		return errors.New("tls: renegotiation info sent in TLS 1.3")
   1272 	}
   1273 
   1274 	if expected := c.config.Bugs.ExpectedCustomExtension; expected != nil {
   1275 		if serverExtensions.customExtension != *expected {
   1276 			return fmt.Errorf("tls: bad custom extension contents %q", serverExtensions.customExtension)
   1277 		}
   1278 	}
   1279 
   1280 	clientDidNPN := hs.hello.nextProtoNeg
   1281 	clientDidALPN := len(hs.hello.alpnProtocols) > 0
   1282 	serverHasNPN := serverExtensions.nextProtoNeg
   1283 	serverHasALPN := len(serverExtensions.alpnProtocol) > 0
   1284 
   1285 	if !clientDidNPN && serverHasNPN {
   1286 		c.sendAlert(alertHandshakeFailure)
   1287 		return errors.New("server advertised unrequested NPN extension")
   1288 	}
   1289 
   1290 	if !clientDidALPN && serverHasALPN {
   1291 		c.sendAlert(alertHandshakeFailure)
   1292 		return errors.New("server advertised unrequested ALPN extension")
   1293 	}
   1294 
   1295 	if serverHasNPN && serverHasALPN {
   1296 		c.sendAlert(alertHandshakeFailure)
   1297 		return errors.New("server advertised both NPN and ALPN extensions")
   1298 	}
   1299 
   1300 	if serverHasALPN {
   1301 		c.clientProtocol = serverExtensions.alpnProtocol
   1302 		c.clientProtocolFallback = false
   1303 		c.usedALPN = true
   1304 	}
   1305 
   1306 	if serverHasNPN && c.vers >= VersionTLS13 {
   1307 		c.sendAlert(alertHandshakeFailure)
   1308 		return errors.New("server advertised NPN over TLS 1.3")
   1309 	}
   1310 
   1311 	if !hs.hello.channelIDSupported && serverExtensions.channelIDRequested {
   1312 		c.sendAlert(alertHandshakeFailure)
   1313 		return errors.New("server advertised unrequested Channel ID extension")
   1314 	}
   1315 
   1316 	if serverExtensions.extendedMasterSecret && c.vers >= VersionTLS13 {
   1317 		return errors.New("tls: server advertised extended master secret over TLS 1.3")
   1318 	}
   1319 
   1320 	if serverExtensions.ticketSupported && c.vers >= VersionTLS13 {
   1321 		return errors.New("tls: server advertised ticket extension over TLS 1.3")
   1322 	}
   1323 
   1324 	if serverExtensions.ocspStapling && c.vers >= VersionTLS13 {
   1325 		return errors.New("tls: server advertised OCSP in ServerHello over TLS 1.3")
   1326 	}
   1327 
   1328 	if serverExtensions.ocspStapling && c.config.Bugs.NoOCSPStapling {
   1329 		return errors.New("tls: server advertised unrequested OCSP extension")
   1330 	}
   1331 
   1332 	if len(serverExtensions.sctList) > 0 && c.vers >= VersionTLS13 {
   1333 		return errors.New("tls: server advertised SCTs in ServerHello over TLS 1.3")
   1334 	}
   1335 
   1336 	if len(serverExtensions.sctList) > 0 && c.config.Bugs.NoSignedCertificateTimestamps {
   1337 		return errors.New("tls: server advertised unrequested SCTs")
   1338 	}
   1339 
   1340 	if serverExtensions.srtpProtectionProfile != 0 {
   1341 		if serverExtensions.srtpMasterKeyIdentifier != "" {
   1342 			return errors.New("tls: server selected SRTP MKI value")
   1343 		}
   1344 
   1345 		found := false
   1346 		for _, p := range c.config.SRTPProtectionProfiles {
   1347 			if p == serverExtensions.srtpProtectionProfile {
   1348 				found = true
   1349 				break
   1350 			}
   1351 		}
   1352 		if !found {
   1353 			return errors.New("tls: server advertised unsupported SRTP profile")
   1354 		}
   1355 
   1356 		c.srtpProtectionProfile = serverExtensions.srtpProtectionProfile
   1357 	}
   1358 
   1359 	if c.vers >= VersionTLS13 && c.didResume {
   1360 		if c.config.Bugs.ExpectEarlyDataAccepted && !serverExtensions.hasEarlyData {
   1361 			c.sendAlert(alertHandshakeFailure)
   1362 			return errors.New("tls: server did not accept early data when expected")
   1363 		}
   1364 
   1365 		if !c.config.Bugs.ExpectEarlyDataAccepted && serverExtensions.hasEarlyData {
   1366 			c.sendAlert(alertHandshakeFailure)
   1367 			return errors.New("tls: server accepted early data when not expected")
   1368 		}
   1369 	}
   1370 
   1371 	return nil
   1372 }
   1373 
   1374 func (hs *clientHandshakeState) serverResumedSession() bool {
   1375 	// If the server responded with the same sessionId then it means the
   1376 	// sessionTicket is being used to resume a TLS session.
   1377 	//
   1378 	// Note that, if hs.hello.sessionId is a non-nil empty array, this will
   1379 	// accept an empty session ID from the server as resumption. See
   1380 	// EmptyTicketSessionID.
   1381 	return hs.session != nil && hs.hello.sessionId != nil &&
   1382 		bytes.Equal(hs.serverHello.sessionId, hs.hello.sessionId)
   1383 }
   1384 
   1385 func (hs *clientHandshakeState) processServerHello() (bool, error) {
   1386 	c := hs.c
   1387 
   1388 	if hs.serverResumedSession() {
   1389 		// For test purposes, assert that the server never accepts the
   1390 		// resumption offer on renegotiation.
   1391 		if c.cipherSuite != nil && c.config.Bugs.FailIfResumeOnRenego {
   1392 			return false, errors.New("tls: server resumed session on renegotiation")
   1393 		}
   1394 
   1395 		if hs.serverHello.extensions.sctList != nil {
   1396 			return false, errors.New("tls: server sent SCT extension on session resumption")
   1397 		}
   1398 
   1399 		if hs.serverHello.extensions.ocspStapling {
   1400 			return false, errors.New("tls: server sent OCSP extension on session resumption")
   1401 		}
   1402 
   1403 		// Restore masterSecret and peerCerts from previous state
   1404 		hs.masterSecret = hs.session.masterSecret
   1405 		c.peerCertificates = hs.session.serverCertificates
   1406 		c.extendedMasterSecret = hs.session.extendedMasterSecret
   1407 		c.sctList = hs.session.sctList
   1408 		c.ocspResponse = hs.session.ocspResponse
   1409 		hs.finishedHash.discardHandshakeBuffer()
   1410 		return true, nil
   1411 	}
   1412 
   1413 	if hs.serverHello.extensions.sctList != nil {
   1414 		c.sctList = hs.serverHello.extensions.sctList
   1415 	}
   1416 
   1417 	return false, nil
   1418 }
   1419 
   1420 func (hs *clientHandshakeState) readFinished(out []byte) error {
   1421 	c := hs.c
   1422 
   1423 	c.readRecord(recordTypeChangeCipherSpec)
   1424 	if err := c.in.error(); err != nil {
   1425 		return err
   1426 	}
   1427 
   1428 	msg, err := c.readHandshake()
   1429 	if err != nil {
   1430 		return err
   1431 	}
   1432 	serverFinished, ok := msg.(*finishedMsg)
   1433 	if !ok {
   1434 		c.sendAlert(alertUnexpectedMessage)
   1435 		return unexpectedMessageError(serverFinished, msg)
   1436 	}
   1437 
   1438 	if c.config.Bugs.EarlyChangeCipherSpec == 0 {
   1439 		verify := hs.finishedHash.serverSum(hs.masterSecret)
   1440 		if len(verify) != len(serverFinished.verifyData) ||
   1441 			subtle.ConstantTimeCompare(verify, serverFinished.verifyData) != 1 {
   1442 			c.sendAlert(alertHandshakeFailure)
   1443 			return errors.New("tls: server's Finished message was incorrect")
   1444 		}
   1445 	}
   1446 	c.serverVerify = append(c.serverVerify[:0], serverFinished.verifyData...)
   1447 	copy(out, serverFinished.verifyData)
   1448 	hs.writeServerHash(serverFinished.marshal())
   1449 	return nil
   1450 }
   1451 
   1452 func (hs *clientHandshakeState) readSessionTicket() error {
   1453 	c := hs.c
   1454 
   1455 	// Create a session with no server identifier. Either a
   1456 	// session ID or session ticket will be attached.
   1457 	session := &ClientSessionState{
   1458 		vers:               c.vers,
   1459 		cipherSuite:        hs.suite.id,
   1460 		masterSecret:       hs.masterSecret,
   1461 		handshakeHash:      hs.finishedHash.Sum(),
   1462 		serverCertificates: c.peerCertificates,
   1463 		sctList:            c.sctList,
   1464 		ocspResponse:       c.ocspResponse,
   1465 		ticketExpiration:   c.config.time().Add(time.Duration(7 * 24 * time.Hour)),
   1466 	}
   1467 
   1468 	if !hs.serverHello.extensions.ticketSupported {
   1469 		if c.config.Bugs.ExpectNewTicket {
   1470 			return errors.New("tls: expected new ticket")
   1471 		}
   1472 		if hs.session == nil && len(hs.serverHello.sessionId) > 0 {
   1473 			session.sessionId = hs.serverHello.sessionId
   1474 			hs.session = session
   1475 		}
   1476 		return nil
   1477 	}
   1478 
   1479 	if c.vers == VersionSSL30 {
   1480 		return errors.New("tls: negotiated session tickets in SSL 3.0")
   1481 	}
   1482 
   1483 	msg, err := c.readHandshake()
   1484 	if err != nil {
   1485 		return err
   1486 	}
   1487 	sessionTicketMsg, ok := msg.(*newSessionTicketMsg)
   1488 	if !ok {
   1489 		c.sendAlert(alertUnexpectedMessage)
   1490 		return unexpectedMessageError(sessionTicketMsg, msg)
   1491 	}
   1492 
   1493 	session.sessionTicket = sessionTicketMsg.ticket
   1494 	hs.session = session
   1495 
   1496 	hs.writeServerHash(sessionTicketMsg.marshal())
   1497 
   1498 	return nil
   1499 }
   1500 
   1501 func (hs *clientHandshakeState) sendFinished(out []byte, isResume bool) error {
   1502 	c := hs.c
   1503 
   1504 	var postCCSMsgs [][]byte
   1505 	seqno := hs.c.sendHandshakeSeq
   1506 	if hs.serverHello.extensions.nextProtoNeg {
   1507 		nextProto := new(nextProtoMsg)
   1508 		proto, fallback := mutualProtocol(c.config.NextProtos, hs.serverHello.extensions.nextProtos)
   1509 		nextProto.proto = proto
   1510 		c.clientProtocol = proto
   1511 		c.clientProtocolFallback = fallback
   1512 
   1513 		nextProtoBytes := nextProto.marshal()
   1514 		hs.writeHash(nextProtoBytes, seqno)
   1515 		seqno++
   1516 		postCCSMsgs = append(postCCSMsgs, nextProtoBytes)
   1517 	}
   1518 
   1519 	if hs.serverHello.extensions.channelIDRequested {
   1520 		var resumeHash []byte
   1521 		if isResume {
   1522 			resumeHash = hs.session.handshakeHash
   1523 		}
   1524 		channelIDMsgBytes, err := hs.writeChannelIDMessage(hs.finishedHash.hashForChannelID(resumeHash))
   1525 		if err != nil {
   1526 			return err
   1527 		}
   1528 		hs.writeHash(channelIDMsgBytes, seqno)
   1529 		seqno++
   1530 		postCCSMsgs = append(postCCSMsgs, channelIDMsgBytes)
   1531 	}
   1532 
   1533 	finished := new(finishedMsg)
   1534 	if c.config.Bugs.EarlyChangeCipherSpec == 2 {
   1535 		finished.verifyData = hs.finishedHash.clientSum(nil)
   1536 	} else {
   1537 		finished.verifyData = hs.finishedHash.clientSum(hs.masterSecret)
   1538 	}
   1539 	copy(out, finished.verifyData)
   1540 	if c.config.Bugs.BadFinished {
   1541 		finished.verifyData[0]++
   1542 	}
   1543 	c.clientVerify = append(c.clientVerify[:0], finished.verifyData...)
   1544 	hs.finishedBytes = finished.marshal()
   1545 	hs.writeHash(hs.finishedBytes, seqno)
   1546 	postCCSMsgs = append(postCCSMsgs, hs.finishedBytes)
   1547 
   1548 	if c.config.Bugs.FragmentAcrossChangeCipherSpec {
   1549 		c.writeRecord(recordTypeHandshake, postCCSMsgs[0][:5])
   1550 		postCCSMsgs[0] = postCCSMsgs[0][5:]
   1551 	} else if c.config.Bugs.SendUnencryptedFinished {
   1552 		c.writeRecord(recordTypeHandshake, postCCSMsgs[0])
   1553 		postCCSMsgs = postCCSMsgs[1:]
   1554 	}
   1555 	c.flushHandshake()
   1556 
   1557 	if !c.config.Bugs.SkipChangeCipherSpec &&
   1558 		c.config.Bugs.EarlyChangeCipherSpec == 0 {
   1559 		ccs := []byte{1}
   1560 		if c.config.Bugs.BadChangeCipherSpec != nil {
   1561 			ccs = c.config.Bugs.BadChangeCipherSpec
   1562 		}
   1563 		c.writeRecord(recordTypeChangeCipherSpec, ccs)
   1564 	}
   1565 
   1566 	if c.config.Bugs.AppDataAfterChangeCipherSpec != nil {
   1567 		c.writeRecord(recordTypeApplicationData, c.config.Bugs.AppDataAfterChangeCipherSpec)
   1568 	}
   1569 	if c.config.Bugs.AlertAfterChangeCipherSpec != 0 {
   1570 		c.sendAlert(c.config.Bugs.AlertAfterChangeCipherSpec)
   1571 		return errors.New("tls: simulating post-CCS alert")
   1572 	}
   1573 
   1574 	if !c.config.Bugs.SkipFinished {
   1575 		for _, msg := range postCCSMsgs {
   1576 			c.writeRecord(recordTypeHandshake, msg)
   1577 		}
   1578 
   1579 		if c.config.Bugs.SendExtraFinished {
   1580 			c.writeRecord(recordTypeHandshake, finished.marshal())
   1581 		}
   1582 
   1583 		c.flushHandshake()
   1584 	}
   1585 	return nil
   1586 }
   1587 
   1588 func (hs *clientHandshakeState) writeChannelIDMessage(channelIDHash []byte) ([]byte, error) {
   1589 	c := hs.c
   1590 	channelIDMsg := new(channelIDMsg)
   1591 	if c.config.ChannelID.Curve != elliptic.P256() {
   1592 		return nil, fmt.Errorf("tls: Channel ID is not on P-256.")
   1593 	}
   1594 	r, s, err := ecdsa.Sign(c.config.rand(), c.config.ChannelID, channelIDHash)
   1595 	if err != nil {
   1596 		return nil, err
   1597 	}
   1598 	channelID := make([]byte, 128)
   1599 	writeIntPadded(channelID[0:32], c.config.ChannelID.X)
   1600 	writeIntPadded(channelID[32:64], c.config.ChannelID.Y)
   1601 	writeIntPadded(channelID[64:96], r)
   1602 	writeIntPadded(channelID[96:128], s)
   1603 	if c.config.Bugs.InvalidChannelIDSignature {
   1604 		channelID[64] ^= 1
   1605 	}
   1606 	channelIDMsg.channelID = channelID
   1607 
   1608 	c.channelID = &c.config.ChannelID.PublicKey
   1609 
   1610 	return channelIDMsg.marshal(), nil
   1611 }
   1612 
   1613 func (hs *clientHandshakeState) writeClientHash(msg []byte) {
   1614 	// writeClientHash is called before writeRecord.
   1615 	hs.writeHash(msg, hs.c.sendHandshakeSeq)
   1616 }
   1617 
   1618 func (hs *clientHandshakeState) writeServerHash(msg []byte) {
   1619 	// writeServerHash is called after readHandshake.
   1620 	hs.writeHash(msg, hs.c.recvHandshakeSeq-1)
   1621 }
   1622 
   1623 func (hs *clientHandshakeState) writeHash(msg []byte, seqno uint16) {
   1624 	if hs.c.isDTLS {
   1625 		// This is somewhat hacky. DTLS hashes a slightly different format.
   1626 		// First, the TLS header.
   1627 		hs.finishedHash.Write(msg[:4])
   1628 		// Then the sequence number and reassembled fragment offset (always 0).
   1629 		hs.finishedHash.Write([]byte{byte(seqno >> 8), byte(seqno), 0, 0, 0})
   1630 		// Then the reassembled fragment (always equal to the message length).
   1631 		hs.finishedHash.Write(msg[1:4])
   1632 		// And then the message body.
   1633 		hs.finishedHash.Write(msg[4:])
   1634 	} else {
   1635 		hs.finishedHash.Write(msg)
   1636 	}
   1637 }
   1638 
   1639 // selectClientCertificate selects a certificate for use with the given
   1640 // certificate, or none if none match. It may return a particular certificate or
   1641 // nil on success, or an error on internal error.
   1642 func selectClientCertificate(c *Conn, certReq *certificateRequestMsg) (*Certificate, error) {
   1643 	// RFC 4346 on the certificateAuthorities field:
   1644 	// A list of the distinguished names of acceptable certificate
   1645 	// authorities. These distinguished names may specify a desired
   1646 	// distinguished name for a root CA or for a subordinate CA; thus, this
   1647 	// message can be used to describe both known roots and a desired
   1648 	// authorization space. If the certificate_authorities list is empty
   1649 	// then the client MAY send any certificate of the appropriate
   1650 	// ClientCertificateType, unless there is some external arrangement to
   1651 	// the contrary.
   1652 
   1653 	var rsaAvail, ecdsaAvail bool
   1654 	if !certReq.hasRequestContext {
   1655 		for _, certType := range certReq.certificateTypes {
   1656 			switch certType {
   1657 			case CertTypeRSASign:
   1658 				rsaAvail = true
   1659 			case CertTypeECDSASign:
   1660 				ecdsaAvail = true
   1661 			}
   1662 		}
   1663 	}
   1664 
   1665 	// We need to search our list of client certs for one
   1666 	// where SignatureAlgorithm is RSA and the Issuer is in
   1667 	// certReq.certificateAuthorities
   1668 findCert:
   1669 	for i, chain := range c.config.Certificates {
   1670 		if !certReq.hasRequestContext && !rsaAvail && !ecdsaAvail {
   1671 			continue
   1672 		}
   1673 
   1674 		// Ensure the private key supports one of the advertised
   1675 		// signature algorithms.
   1676 		if certReq.hasSignatureAlgorithm {
   1677 			if _, err := selectSignatureAlgorithm(c.vers, chain.PrivateKey, c.config, certReq.signatureAlgorithms); err != nil {
   1678 				continue
   1679 			}
   1680 		}
   1681 
   1682 		for j, cert := range chain.Certificate {
   1683 			x509Cert := chain.Leaf
   1684 			// parse the certificate if this isn't the leaf
   1685 			// node, or if chain.Leaf was nil
   1686 			if j != 0 || x509Cert == nil {
   1687 				var err error
   1688 				if x509Cert, err = x509.ParseCertificate(cert); err != nil {
   1689 					c.sendAlert(alertInternalError)
   1690 					return nil, errors.New("tls: failed to parse client certificate #" + strconv.Itoa(i) + ": " + err.Error())
   1691 				}
   1692 			}
   1693 
   1694 			if !certReq.hasRequestContext {
   1695 				switch {
   1696 				case rsaAvail && x509Cert.PublicKeyAlgorithm == x509.RSA:
   1697 				case ecdsaAvail && x509Cert.PublicKeyAlgorithm == x509.ECDSA:
   1698 				default:
   1699 					continue findCert
   1700 				}
   1701 			}
   1702 
   1703 			if expected := c.config.Bugs.ExpectCertificateReqNames; expected != nil {
   1704 				if !eqByteSlices(expected, certReq.certificateAuthorities) {
   1705 					return nil, fmt.Errorf("tls: CertificateRequest names differed, got %#v but expected %#v", certReq.certificateAuthorities, expected)
   1706 				}
   1707 			}
   1708 
   1709 			return &chain, nil
   1710 		}
   1711 	}
   1712 
   1713 	return nil, nil
   1714 }
   1715 
   1716 // clientSessionCacheKey returns a key used to cache sessionTickets that could
   1717 // be used to resume previously negotiated TLS sessions with a server.
   1718 func clientSessionCacheKey(serverAddr net.Addr, config *Config) string {
   1719 	if len(config.ServerName) > 0 {
   1720 		return config.ServerName
   1721 	}
   1722 	return serverAddr.String()
   1723 }
   1724 
   1725 // mutualProtocol finds the mutual Next Protocol Negotiation or ALPN protocol
   1726 // given list of possible protocols and a list of the preference order. The
   1727 // first list must not be empty. It returns the resulting protocol and flag
   1728 // indicating if the fallback case was reached.
   1729 func mutualProtocol(protos, preferenceProtos []string) (string, bool) {
   1730 	for _, s := range preferenceProtos {
   1731 		for _, c := range protos {
   1732 			if s == c {
   1733 				return s, false
   1734 			}
   1735 		}
   1736 	}
   1737 
   1738 	return protos[0], true
   1739 }
   1740 
   1741 // writeIntPadded writes x into b, padded up with leading zeros as
   1742 // needed.
   1743 func writeIntPadded(b []byte, x *big.Int) {
   1744 	for i := range b {
   1745 		b[i] = 0
   1746 	}
   1747 	xb := x.Bytes()
   1748 	copy(b[len(b)-len(xb):], xb)
   1749 }
   1750 
   1751 func generatePSKBinders(hello *clientHelloMsg, pskCipherSuite *cipherSuite, psk, transcript []byte, config *Config) {
   1752 	if config.Bugs.SendNoPSKBinder {
   1753 		return
   1754 	}
   1755 
   1756 	binderLen := pskCipherSuite.hash().Size()
   1757 	if config.Bugs.SendShortPSKBinder {
   1758 		binderLen--
   1759 	}
   1760 
   1761 	numBinders := 1
   1762 	if config.Bugs.SendExtraPSKBinder {
   1763 		numBinders++
   1764 	}
   1765 
   1766 	// Fill hello.pskBinders with appropriate length arrays of zeros so the
   1767 	// length prefixes are correct when computing the binder over the truncated
   1768 	// ClientHello message.
   1769 	hello.pskBinders = make([][]byte, numBinders)
   1770 	for i := range hello.pskBinders {
   1771 		hello.pskBinders[i] = make([]byte, binderLen)
   1772 	}
   1773 
   1774 	helloBytes := hello.marshal()
   1775 	binderSize := len(hello.pskBinders)*(binderLen+1) + 2
   1776 	truncatedHello := helloBytes[:len(helloBytes)-binderSize]
   1777 	binder := computePSKBinder(psk, resumptionPSKBinderLabel, pskCipherSuite, transcript, truncatedHello)
   1778 	if config.Bugs.SendShortPSKBinder {
   1779 		binder = binder[:binderLen]
   1780 	}
   1781 	if config.Bugs.SendInvalidPSKBinder {
   1782 		binder[0] ^= 1
   1783 	}
   1784 
   1785 	for i := range hello.pskBinders {
   1786 		hello.pskBinders[i] = binder
   1787 	}
   1788 
   1789 	hello.raw = nil
   1790 }
   1791