• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
5package runner
6
7import (
8	"bytes"
9	"crypto"
10	"crypto/ecdsa"
11	"crypto/ed25519"
12	"crypto/elliptic"
13	"crypto/rsa"
14	"crypto/subtle"
15	"crypto/x509"
16	"errors"
17	"fmt"
18	"io"
19	"math/big"
20	"time"
21
22	"boringssl.googlesource.com/boringssl/ssl/test/runner/hpke"
23)
24
25// serverHandshakeState contains details of a server handshake in progress.
26// It's discarded once the handshake has completed.
27type serverHandshakeState struct {
28	c               *Conn
29	clientHello     *clientHelloMsg
30	hello           *serverHelloMsg
31	suite           *cipherSuite
32	ellipticOk      bool
33	ecdsaOk         bool
34	sessionState    *sessionState
35	finishedHash    finishedHash
36	masterSecret    []byte
37	certsFromClient [][]byte
38	cert            *Certificate
39	finishedBytes   []byte
40	echHPKEContext  *hpke.Context
41	echConfigID     uint8
42}
43
44// serverHandshake performs a TLS handshake as a server.
45func (c *Conn) serverHandshake() error {
46	config := c.config
47
48	// If this is the first server handshake, we generate a random key to
49	// encrypt the tickets with.
50	config.serverInitOnce.Do(config.serverInit)
51
52	c.sendHandshakeSeq = 0
53	c.recvHandshakeSeq = 0
54
55	hs := serverHandshakeState{
56		c: c,
57	}
58	if err := hs.readClientHello(); err != nil {
59		return err
60	}
61
62	if c.vers >= VersionTLS13 {
63		if err := hs.doTLS13Handshake(); err != nil {
64			return err
65		}
66	} else {
67		isResume, err := hs.processClientHello()
68		if err != nil {
69			return err
70		}
71
72		// We only implement enough of SSL 3.0 to test that the client doesn't:
73		// if negotiated (possibly with the NegotiateVersion bug), we send a
74		// ServerHello and look for the resulting client protocol_version alert.
75		if c.vers == VersionSSL30 {
76			c.writeRecord(recordTypeHandshake, hs.hello.marshal())
77			c.flushHandshake()
78			if _, err := c.readHandshake(); err != nil {
79				return err
80			}
81			return errors.New("tls: client did not reject an SSL 3.0 ServerHello")
82		}
83
84		// For an overview of TLS handshaking, see https://tools.ietf.org/html/rfc5246#section-7.3
85		if isResume {
86			// The client has included a session ticket and so we do an abbreviated handshake.
87			if err := hs.doResumeHandshake(); err != nil {
88				return err
89			}
90			if err := hs.establishKeys(); err != nil {
91				return err
92			}
93			if c.config.Bugs.RenewTicketOnResume {
94				if err := hs.sendSessionTicket(); err != nil {
95					return err
96				}
97			}
98			if err := hs.sendFinished(c.firstFinished[:], isResume); err != nil {
99				return err
100			}
101			// Most retransmits are triggered by a timeout, but the final
102			// leg of the handshake is retransmited upon re-receiving a
103			// Finished.
104			if err := c.simulatePacketLoss(func() {
105				c.sendHandshakeSeq--
106				c.writeRecord(recordTypeHandshake, hs.finishedBytes)
107				c.flushHandshake()
108			}); err != nil {
109				return err
110			}
111			if err := hs.readFinished(nil, isResume); err != nil {
112				return err
113			}
114			c.didResume = true
115		} else {
116			// The client didn't include a session ticket, or it wasn't
117			// valid so we do a full handshake.
118			if err := hs.doFullHandshake(); err != nil {
119				return err
120			}
121			if err := hs.establishKeys(); err != nil {
122				return err
123			}
124			if err := hs.readFinished(c.firstFinished[:], isResume); err != nil {
125				return err
126			}
127			if c.config.Bugs.AlertBeforeFalseStartTest != 0 {
128				c.sendAlert(c.config.Bugs.AlertBeforeFalseStartTest)
129			}
130			if c.config.Bugs.ExpectFalseStart {
131				if err := c.readRecord(recordTypeApplicationData); err != nil {
132					return fmt.Errorf("tls: peer did not false start: %s", err)
133				}
134			}
135			if err := hs.sendSessionTicket(); err != nil {
136				return err
137			}
138			if err := hs.sendFinished(nil, isResume); err != nil {
139				return err
140			}
141		}
142
143		c.exporterSecret = hs.masterSecret
144	}
145	c.handshakeComplete = true
146	copy(c.clientRandom[:], hs.clientHello.random)
147	copy(c.serverRandom[:], hs.hello.random)
148
149	return nil
150}
151
152// readClientHello reads a ClientHello message from the client and determines
153// the protocol version.
154func (hs *serverHandshakeState) readClientHello() error {
155	config := hs.c.config
156	c := hs.c
157
158	if err := c.simulatePacketLoss(nil); err != nil {
159		return err
160	}
161	msg, err := c.readHandshake()
162	if err != nil {
163		return err
164	}
165	var ok bool
166	hs.clientHello, ok = msg.(*clientHelloMsg)
167	if !ok {
168		c.sendAlert(alertUnexpectedMessage)
169		return unexpectedMessageError(hs.clientHello, msg)
170	}
171	if size := config.Bugs.RequireClientHelloSize; size != 0 && len(hs.clientHello.raw) != size {
172		return fmt.Errorf("tls: ClientHello record size is %d, but expected %d", len(hs.clientHello.raw), size)
173	}
174	if isAllZero(hs.clientHello.random) {
175		// If the client forgets to fill in the client random, it will likely be
176		// all zero.
177		return errors.New("tls: ClientHello random was all zero")
178	}
179
180	if expected := config.Bugs.ExpectOuterServerName; len(expected) != 0 && expected != hs.clientHello.serverName {
181		return fmt.Errorf("tls: unexpected ClientHelloOuter server name: wanted %q, got %q", expected, hs.clientHello.serverName)
182	}
183
184	// We check this both before and after decrypting ECH.
185	if !hs.clientHello.hasGREASEExtension && config.Bugs.ExpectGREASE {
186		return errors.New("tls: no GREASE extension found")
187	}
188
189	if config.Bugs.ExpectClientECH && hs.clientHello.echOuter == nil {
190		return errors.New("tls: expected client to offer ECH")
191	}
192	if config.Bugs.ExpectNoClientECH && hs.clientHello.echOuter != nil {
193		return errors.New("tls: expected client not to offer ECH")
194	}
195
196	if echOuter := hs.clientHello.echOuter; echOuter != nil {
197		for _, candidate := range config.ServerECHConfigs {
198			if candidate.ECHConfig.ConfigID != echOuter.configID {
199				continue
200			}
201			var found bool
202			for _, suite := range candidate.ECHConfig.CipherSuites {
203				if echOuter.kdfID == suite.KDF && echOuter.aeadID == suite.AEAD {
204					found = true
205					break
206				}
207			}
208			if !found {
209				continue
210			}
211			info := []byte("tls ech\x00")
212			info = append(info, candidate.ECHConfig.Raw...)
213			hs.echHPKEContext, err = hpke.SetupBaseReceiverX25519(echOuter.kdfID, echOuter.aeadID, echOuter.enc, candidate.Key, info)
214			if err != nil {
215				continue
216			}
217			clientHelloInner, err := hs.decryptClientHello(hs.clientHello)
218			if err != nil {
219				if _, ok := err.(*echDecryptError); ok {
220					continue
221				}
222				c.sendAlert(alertDecryptError)
223				return fmt.Errorf("tls: error decrypting ClientHello: %s", err)
224			}
225			if config.Bugs.UseInnerSessionWithClientHelloOuter {
226				hs.clientHello.pskIdentities = clientHelloInner.pskIdentities
227			} else {
228				c.echAccepted = true
229				hs.clientHello = clientHelloInner
230				hs.echConfigID = echOuter.configID
231			}
232		}
233	}
234
235	if c.isDTLS && !config.Bugs.SkipHelloVerifyRequest {
236		// Per RFC 6347, the version field in HelloVerifyRequest SHOULD
237		// be always DTLS 1.0
238		helloVerifyRequest := &helloVerifyRequestMsg{
239			vers:   VersionDTLS10,
240			cookie: make([]byte, 32),
241		}
242		if _, err := io.ReadFull(c.config.rand(), helloVerifyRequest.cookie); err != nil {
243			c.sendAlert(alertInternalError)
244			return errors.New("dtls: short read from Rand: " + err.Error())
245		}
246		c.writeRecord(recordTypeHandshake, helloVerifyRequest.marshal())
247		c.flushHandshake()
248
249		if err := c.simulatePacketLoss(nil); err != nil {
250			return err
251		}
252		msg, err := c.readHandshake()
253		if err != nil {
254			return err
255		}
256		newClientHello, ok := msg.(*clientHelloMsg)
257		if !ok {
258			c.sendAlert(alertUnexpectedMessage)
259			return unexpectedMessageError(hs.clientHello, msg)
260		}
261		if !bytes.Equal(newClientHello.cookie, helloVerifyRequest.cookie) {
262			return errors.New("dtls: invalid cookie")
263		}
264		if err := checkClientHellosEqual(hs.clientHello.raw, newClientHello.raw, c.isDTLS, nil); err != nil {
265			return err
266		}
267		hs.clientHello = newClientHello
268	}
269
270	if config.Bugs.RequireSameRenegoClientVersion && c.clientVersion != 0 {
271		if c.clientVersion != hs.clientHello.vers {
272			return fmt.Errorf("tls: client offered different version on renego")
273		}
274	}
275
276	if config.Bugs.FailIfCECPQ2Offered {
277		for _, offeredCurve := range hs.clientHello.supportedCurves {
278			if isPqGroup(offeredCurve) {
279				return errors.New("tls: CECPQ2 was offered")
280			}
281		}
282	}
283
284	if expected := config.Bugs.ExpectedKeyShares; expected != nil {
285		if len(expected) != len(hs.clientHello.keyShares) {
286			return fmt.Errorf("tls: expected %d key shares, but found %d", len(expected), len(hs.clientHello.keyShares))
287		}
288
289		for i, group := range expected {
290			if found := hs.clientHello.keyShares[i].group; found != group {
291				return fmt.Errorf("tls: key share #%d is for group %d, not %d", i, found, group)
292			}
293		}
294	}
295
296	c.clientVersion = hs.clientHello.vers
297
298	// Use the versions extension if supplied, otherwise use the legacy ClientHello version.
299	if len(hs.clientHello.supportedVersions) == 0 {
300		if c.isDTLS {
301			if hs.clientHello.vers <= VersionDTLS12 {
302				hs.clientHello.supportedVersions = append(hs.clientHello.supportedVersions, VersionDTLS12)
303			}
304			if hs.clientHello.vers <= VersionDTLS10 {
305				hs.clientHello.supportedVersions = append(hs.clientHello.supportedVersions, VersionDTLS10)
306			}
307		} else {
308			if hs.clientHello.vers >= VersionTLS12 {
309				hs.clientHello.supportedVersions = append(hs.clientHello.supportedVersions, VersionTLS12)
310			}
311			if hs.clientHello.vers >= VersionTLS11 {
312				hs.clientHello.supportedVersions = append(hs.clientHello.supportedVersions, VersionTLS11)
313			}
314			if hs.clientHello.vers >= VersionTLS10 {
315				hs.clientHello.supportedVersions = append(hs.clientHello.supportedVersions, VersionTLS10)
316			}
317			if hs.clientHello.vers >= VersionSSL30 {
318				hs.clientHello.supportedVersions = append(hs.clientHello.supportedVersions, VersionSSL30)
319			}
320		}
321	} else if config.Bugs.ExpectGREASE && !containsGREASE(hs.clientHello.supportedVersions) {
322		return errors.New("tls: no GREASE version value found")
323	}
324
325	if !c.haveVers {
326		if config.Bugs.NegotiateVersion != 0 {
327			c.wireVersion = config.Bugs.NegotiateVersion
328		} else {
329			var found bool
330			for _, vers := range hs.clientHello.supportedVersions {
331				if _, ok := config.isSupportedVersion(vers, c.isDTLS); ok {
332					c.wireVersion = vers
333					found = true
334					break
335				}
336			}
337			if !found {
338				c.sendAlert(alertProtocolVersion)
339				return errors.New("tls: client did not offer any supported protocol versions")
340			}
341		}
342	} else if config.Bugs.NegotiateVersionOnRenego != 0 {
343		c.wireVersion = config.Bugs.NegotiateVersionOnRenego
344	}
345
346	c.vers, ok = wireToVersion(c.wireVersion, c.isDTLS)
347	if !ok {
348		panic("Could not map wire version")
349	}
350	c.haveVers = true
351
352	clientProtocol, ok := wireToVersion(c.clientVersion, c.isDTLS)
353
354	// Reject < 1.2 ClientHellos with signature_algorithms.
355	if ok && clientProtocol < VersionTLS12 && len(hs.clientHello.signatureAlgorithms) > 0 {
356		return fmt.Errorf("tls: client included signature_algorithms before TLS 1.2")
357	}
358
359	// Check the client cipher list is consistent with the version.
360	if ok && clientProtocol < VersionTLS12 {
361		for _, id := range hs.clientHello.cipherSuites {
362			if isTLS12Cipher(id) {
363				return fmt.Errorf("tls: client offered TLS 1.2 cipher before TLS 1.2")
364			}
365		}
366	}
367
368	if config.Bugs.MockQUICTransport != nil && len(hs.clientHello.sessionID) > 0 {
369		return fmt.Errorf("tls: QUIC client did not disable compatibility mode")
370	}
371	if config.Bugs.ExpectNoSessionID && len(hs.clientHello.sessionID) > 0 {
372		return fmt.Errorf("tls: client offered an unexpected session ID")
373	}
374	if config.Bugs.ExpectNoTLS12Session {
375		if len(hs.clientHello.sessionID) > 0 {
376			if _, ok := config.ServerSessionCache.Get(string(hs.clientHello.sessionID)); ok {
377				return fmt.Errorf("tls: client offered an unexpected TLS 1.2 session")
378			}
379		}
380		if len(hs.clientHello.sessionTicket) > 0 {
381			return fmt.Errorf("tls: client offered an unexpected session ticket")
382		}
383	}
384
385	if config.Bugs.ExpectNoTLS13PSK && len(hs.clientHello.pskIdentities) > 0 {
386		return fmt.Errorf("tls: client offered unexpected PSK identities")
387	}
388
389	var scsvFound bool
390	for _, cipherSuite := range hs.clientHello.cipherSuites {
391		if cipherSuite == fallbackSCSV {
392			scsvFound = true
393			break
394		}
395	}
396
397	if !scsvFound && config.Bugs.FailIfNotFallbackSCSV {
398		return errors.New("tls: no fallback SCSV found when expected")
399	} else if scsvFound && !config.Bugs.FailIfNotFallbackSCSV {
400		return errors.New("tls: fallback SCSV found when not expected")
401	}
402
403	if config.Bugs.ExpectGREASE && !containsGREASE(hs.clientHello.cipherSuites) {
404		return errors.New("tls: no GREASE cipher suite value found")
405	}
406
407	var greaseFound bool
408	for _, curve := range hs.clientHello.supportedCurves {
409		if isGREASEValue(uint16(curve)) {
410			greaseFound = true
411			break
412		}
413	}
414
415	if !greaseFound && config.Bugs.ExpectGREASE {
416		return errors.New("tls: no GREASE curve value found")
417	}
418
419	if len(hs.clientHello.keyShares) > 0 {
420		greaseFound = false
421		for _, keyShare := range hs.clientHello.keyShares {
422			if isGREASEValue(uint16(keyShare.group)) {
423				greaseFound = true
424				break
425			}
426		}
427
428		if !greaseFound && config.Bugs.ExpectGREASE {
429			return errors.New("tls: no GREASE curve value found")
430		}
431	}
432
433	if len(hs.clientHello.sessionID) == 0 && c.config.Bugs.ExpectClientHelloSessionID {
434		return errors.New("tls: expected non-empty session ID from client")
435	}
436
437	applyBugsToClientHello(hs.clientHello, config)
438
439	return nil
440}
441
442func applyBugsToClientHello(clientHello *clientHelloMsg, config *Config) {
443	if config.Bugs.IgnorePeerSignatureAlgorithmPreferences {
444		clientHello.signatureAlgorithms = config.signSignatureAlgorithms()
445	}
446	if config.Bugs.IgnorePeerCurvePreferences {
447		clientHello.supportedCurves = config.curvePreferences()
448	}
449	if config.Bugs.IgnorePeerCipherPreferences {
450		clientHello.cipherSuites = config.cipherSuites()
451	}
452}
453
454type echDecryptError struct {
455	error
456}
457
458func (hs *serverHandshakeState) decryptClientHello(helloOuter *clientHelloMsg) (helloInner *clientHelloMsg, err error) {
459	// ClientHelloOuterAAD is ClientHelloOuter with the payload replaced by
460	// zeros. See draft-ietf-tls-esni-13, section 5.2.
461	aad := make([]byte, len(helloOuter.raw)-4)
462	copy(aad, helloOuter.raw[4:helloOuter.echPayloadStart])
463	copy(aad[helloOuter.echPayloadEnd-4:], helloOuter.raw[helloOuter.echPayloadEnd:])
464
465	// In fuzzer mode, the payload is cleartext.
466	encoded := helloOuter.echOuter.payload
467	if !hs.c.config.Bugs.NullAllCiphers {
468		var err error
469		encoded, err = hs.echHPKEContext.Open(helloOuter.echOuter.payload, aad)
470		if err != nil {
471			// Wrap |err| so the caller can implement trial decryption.
472			return nil, &echDecryptError{err}
473		}
474	}
475
476	helloInner, err = decodeClientHelloInner(hs.c.config, encoded, helloOuter)
477	if err != nil {
478		return nil, err
479	}
480
481	if isAllZero(helloInner.random) {
482		// If the client forgets to fill in the client random, it will likely be
483		// all zero.
484		return nil, errors.New("tls: ClientHelloInner random was all zero")
485	}
486	if bytes.Equal(helloInner.random, helloOuter.random) {
487		return nil, errors.New("tls: ClientHelloOuter and ClientHelloInner have the same random values")
488	}
489	// ClientHelloInner should not offer TLS 1.2 and below.
490	if len(helloInner.supportedVersions) == 0 {
491		return nil, errors.New("tls: ClientHelloInner did not offer supported_versions")
492	}
493	for _, vers := range helloInner.supportedVersions {
494		switch vers {
495		case VersionSSL30, VersionTLS10, VersionTLS11, VersionTLS12, VersionDTLS10, VersionDTLS12:
496			return nil, fmt.Errorf("tls: ClientHelloInner offered invalid version: %04x", vers)
497		}
498	}
499	// ClientHelloInner should omit TLS-1.2-only extensions.
500	if helloInner.nextProtoNeg || len(helloInner.supportedPoints) != 0 || helloInner.ticketSupported || helloInner.secureRenegotiation != nil || helloInner.extendedMasterSecret {
501		return nil, errors.New("tls: ClientHelloInner included a TLS-1.2-only extension")
502	}
503	if !helloInner.echInner {
504		return nil, errors.New("tls: ClientHelloInner missing inner encrypted_client_hello extension")
505	}
506
507	return helloInner, nil
508}
509
510func (hs *serverHandshakeState) doTLS13Handshake() error {
511	c := hs.c
512	config := c.config
513
514	// We've read the ClientHello, so the next record must be preceded with ChangeCipherSpec.
515	c.expectTLS13ChangeCipherSpec = true
516
517	hs.hello = &serverHelloMsg{
518		isDTLS:                c.isDTLS,
519		vers:                  c.wireVersion,
520		sessionID:             hs.clientHello.sessionID,
521		compressionMethod:     config.Bugs.SendCompressionMethod,
522		versOverride:          config.Bugs.SendServerHelloVersion,
523		supportedVersOverride: config.Bugs.SendServerSupportedVersionExtension,
524		omitSupportedVers:     config.Bugs.OmitServerSupportedVersionExtension,
525		customExtension:       config.Bugs.CustomUnencryptedExtension,
526		unencryptedALPN:       config.Bugs.SendUnencryptedALPN,
527	}
528
529	hs.hello.random = make([]byte, 32)
530	if _, err := io.ReadFull(config.rand(), hs.hello.random); err != nil {
531		c.sendAlert(alertInternalError)
532		return err
533	}
534
535	// TLS 1.3 forbids clients from advertising any non-null compression.
536	if len(hs.clientHello.compressionMethods) != 1 || hs.clientHello.compressionMethods[0] != compressionNone {
537		return errors.New("tls: client sent compression method other than null for TLS 1.3")
538	}
539
540	// Prepare an EncryptedExtensions message, but do not send it yet.
541	encryptedExtensions := new(encryptedExtensionsMsg)
542	encryptedExtensions.empty = config.Bugs.EmptyEncryptedExtensions
543	if err := hs.processClientExtensions(&encryptedExtensions.extensions); err != nil {
544		return err
545	}
546
547	// Select the cipher suite.
548	var preferenceList, supportedList []uint16
549	if config.PreferServerCipherSuites {
550		preferenceList = config.cipherSuites()
551		supportedList = hs.clientHello.cipherSuites
552	} else {
553		preferenceList = hs.clientHello.cipherSuites
554		supportedList = config.cipherSuites()
555	}
556
557	for _, id := range preferenceList {
558		if hs.suite = c.tryCipherSuite(id, supportedList, c.vers, true, true); hs.suite != nil {
559			break
560		}
561	}
562
563	if hs.suite == nil {
564		c.sendAlert(alertHandshakeFailure)
565		return errors.New("tls: no cipher suite supported by both client and server")
566	}
567
568	hs.hello.cipherSuite = hs.suite.id
569	if c.config.Bugs.SendCipherSuite != 0 {
570		hs.hello.cipherSuite = c.config.Bugs.SendCipherSuite
571	}
572
573	hs.finishedHash = newFinishedHash(c.wireVersion, c.isDTLS, hs.suite)
574	hs.finishedHash.discardHandshakeBuffer()
575	hs.writeClientHash(hs.clientHello.marshal())
576
577	supportedCurve := false
578	var selectedCurve CurveID
579	preferredCurves := config.curvePreferences()
580Curves:
581	for _, curve := range hs.clientHello.supportedCurves {
582		for _, supported := range preferredCurves {
583			if supported == curve {
584				supportedCurve = true
585				selectedCurve = curve
586				break Curves
587			}
588		}
589	}
590
591	if !supportedCurve {
592		c.sendAlert(alertHandshakeFailure)
593		return errors.New("tls: no curve supported by both client and server")
594	}
595
596	pskIdentities := hs.clientHello.pskIdentities
597	pskKEModes := hs.clientHello.pskKEModes
598
599	var replacedPSKIdentities bool
600	if len(pskIdentities) == 0 && len(hs.clientHello.sessionTicket) > 0 && c.config.Bugs.AcceptAnySession {
601		// Pick up the ticket from the TLS 1.2 extension, to test the
602		// client does not get in a mixed up state.
603		psk := pskIdentity{
604			ticket: hs.clientHello.sessionTicket,
605		}
606		pskIdentities = []pskIdentity{psk}
607		pskKEModes = []byte{pskDHEKEMode}
608		replacedPSKIdentities = true
609	}
610	if config.Bugs.UseInnerSessionWithClientHelloOuter {
611		replacedPSKIdentities = true
612	}
613
614	var pskIndex int
615	foundKEMode := bytes.IndexByte(pskKEModes, pskDHEKEMode) >= 0
616	if foundKEMode && !config.SessionTicketsDisabled {
617		for i, pskIdentity := range pskIdentities {
618			// TODO(svaldez): Check the obfuscatedTicketAge before accepting 0-RTT.
619			sessionState, ok := c.decryptTicket(pskIdentity.ticket)
620			if !ok {
621				continue
622			}
623
624			if !config.Bugs.AcceptAnySession {
625				if sessionState.vers != c.vers {
626					continue
627				}
628				if sessionState.ticketExpiration.Before(c.config.time()) {
629					continue
630				}
631				sessionCipher := cipherSuiteFromID(sessionState.cipherSuite)
632				if sessionCipher == nil || sessionCipher.hash() != hs.suite.hash() {
633					continue
634				}
635			}
636
637			clientTicketAge := time.Duration(uint32(pskIdentity.obfuscatedTicketAge-sessionState.ticketAgeAdd)) * time.Millisecond
638			if config.Bugs.ExpectTicketAge != 0 && clientTicketAge != config.Bugs.ExpectTicketAge {
639				c.sendAlert(alertHandshakeFailure)
640				return errors.New("tls: invalid ticket age")
641			}
642
643			if !replacedPSKIdentities {
644				binderToVerify := hs.clientHello.pskBinders[i]
645				if err := verifyPSKBinder(c.wireVersion, hs.clientHello, sessionState, binderToVerify, []byte{}, []byte{}); err != nil {
646					return err
647				}
648			}
649
650			hs.sessionState = sessionState
651			hs.hello.hasPSKIdentity = true
652			hs.hello.pskIdentity = uint16(i)
653			pskIndex = i
654			if config.Bugs.SelectPSKIdentityOnResume != 0 {
655				hs.hello.pskIdentity = config.Bugs.SelectPSKIdentityOnResume
656			}
657			c.didResume = true
658			break
659		}
660	}
661
662	if config.Bugs.AlwaysSelectPSKIdentity {
663		hs.hello.hasPSKIdentity = true
664		hs.hello.pskIdentity = 0
665	}
666
667	// Resolve PSK and compute the early secret.
668	if hs.sessionState != nil {
669		hs.finishedHash.addEntropy(hs.sessionState.secret)
670	} else {
671		hs.finishedHash.addEntropy(hs.finishedHash.zeroSecret())
672	}
673
674	hs.hello.hasKeyShare = true
675	if hs.sessionState != nil && config.Bugs.NegotiatePSKResumption {
676		hs.hello.hasKeyShare = false
677	}
678	if config.Bugs.MissingKeyShare {
679		hs.hello.hasKeyShare = false
680	}
681
682	firstHelloRetryRequest := true
683
684ResendHelloRetryRequest:
685	var sendHelloRetryRequest bool
686	cipherSuite := hs.suite.id
687	if config.Bugs.SendHelloRetryRequestCipherSuite != 0 {
688		cipherSuite = config.Bugs.SendHelloRetryRequestCipherSuite
689	}
690	helloRetryRequest := &helloRetryRequestMsg{
691		vers:                c.wireVersion,
692		sessionID:           hs.clientHello.sessionID,
693		cipherSuite:         cipherSuite,
694		compressionMethod:   config.Bugs.SendCompressionMethod,
695		duplicateExtensions: config.Bugs.DuplicateHelloRetryRequestExtensions,
696	}
697
698	if config.Bugs.AlwaysSendHelloRetryRequest {
699		sendHelloRetryRequest = true
700	}
701
702	if config.Bugs.SendHelloRetryRequestCookie != nil {
703		sendHelloRetryRequest = true
704		helloRetryRequest.cookie = config.Bugs.SendHelloRetryRequestCookie
705	}
706
707	if len(config.Bugs.CustomHelloRetryRequestExtension) > 0 {
708		sendHelloRetryRequest = true
709		helloRetryRequest.customExtension = config.Bugs.CustomHelloRetryRequestExtension
710	}
711
712	var selectedKeyShare *keyShareEntry
713	if hs.hello.hasKeyShare {
714		// Look for the key share corresponding to our selected curve.
715		for i := range hs.clientHello.keyShares {
716			if hs.clientHello.keyShares[i].group == selectedCurve {
717				selectedKeyShare = &hs.clientHello.keyShares[i]
718				break
719			}
720		}
721
722		if config.Bugs.ExpectMissingKeyShare && selectedKeyShare != nil {
723			return errors.New("tls: expected missing key share")
724		}
725
726		if selectedKeyShare == nil {
727			helloRetryRequest.hasSelectedGroup = true
728			helloRetryRequest.selectedGroup = selectedCurve
729			sendHelloRetryRequest = true
730		}
731	}
732
733	if config.Bugs.SendHelloRetryRequestCurve != 0 {
734		helloRetryRequest.hasSelectedGroup = true
735		helloRetryRequest.selectedGroup = config.Bugs.SendHelloRetryRequestCurve
736		sendHelloRetryRequest = true
737	}
738
739	if config.Bugs.SkipHelloRetryRequest {
740		sendHelloRetryRequest = false
741	}
742
743	if sendHelloRetryRequest {
744		hs.finishedHash.UpdateForHelloRetryRequest()
745
746		// Emit the ECH confirmation signal when requested.
747		if hs.clientHello.echInner {
748			helloRetryRequest.echConfirmation = make([]byte, 8)
749			helloRetryRequest.echConfirmation = hs.finishedHash.echAcceptConfirmation(hs.clientHello.random, echAcceptConfirmationHRRLabel, helloRetryRequest.marshal())
750			helloRetryRequest.raw = nil
751		} else if config.Bugs.AlwaysSendECHHelloRetryRequest {
752			// When solicited, a random ECH confirmation string should be ignored.
753			helloRetryRequest.echConfirmation = make([]byte, 8)
754			if _, err := io.ReadFull(config.rand(), helloRetryRequest.echConfirmation); err != nil {
755				c.sendAlert(alertInternalError)
756				return fmt.Errorf("tls: short read from Rand: %s", err)
757			}
758		}
759
760		hs.writeServerHash(helloRetryRequest.marshal())
761		if c.config.Bugs.PartialServerHelloWithHelloRetryRequest {
762			data := helloRetryRequest.marshal()
763			c.writeRecord(recordTypeHandshake, append(data[:len(data):len(data)], typeServerHello))
764		} else {
765			c.writeRecord(recordTypeHandshake, helloRetryRequest.marshal())
766		}
767		c.flushHandshake()
768
769		if !c.config.Bugs.SkipChangeCipherSpec {
770			c.writeRecord(recordTypeChangeCipherSpec, []byte{1})
771		}
772
773		if hs.clientHello.hasEarlyData {
774			c.setSkipEarlyData()
775		}
776
777		// Read new ClientHello.
778		newMsg, err := c.readHandshake()
779		if err != nil {
780			return err
781		}
782		newClientHello, ok := newMsg.(*clientHelloMsg)
783		if !ok {
784			c.sendAlert(alertUnexpectedMessage)
785			return unexpectedMessageError(newClientHello, newMsg)
786		}
787
788		if expected := config.Bugs.ExpectOuterServerName; len(expected) != 0 && expected != newClientHello.serverName {
789			return fmt.Errorf("tls: unexpected ClientHelloOuter server name: wanted %q, got %q", expected, newClientHello.serverName)
790		}
791
792		if c.echAccepted {
793			if newClientHello.echOuter == nil {
794				c.sendAlert(alertMissingExtension)
795				return errors.New("tls: second ClientHelloOuter had no encrypted_client_hello extension")
796			}
797			if newClientHello.echOuter.configID != hs.echConfigID ||
798				newClientHello.echOuter.kdfID != hs.echHPKEContext.KDF() ||
799				newClientHello.echOuter.aeadID != hs.echHPKEContext.AEAD() {
800				c.sendAlert(alertIllegalParameter)
801				return errors.New("tls: ECH parameters changed in second ClientHelloOuter")
802			}
803			if len(newClientHello.echOuter.enc) != 0 {
804				c.sendAlert(alertIllegalParameter)
805				return errors.New("tls: second ClientHelloOuter had non-empty ECH enc")
806			}
807			newClientHello, err = hs.decryptClientHello(newClientHello)
808			if err != nil {
809				c.sendAlert(alertDecryptError)
810				return fmt.Errorf("tls: error decrypting ClientHello: %s", err)
811			}
812		}
813
814		hs.writeClientHash(newClientHello.marshal())
815
816		if config.Bugs.ExpectNoTLS13PSKAfterHRR && len(newClientHello.pskIdentities) > 0 {
817			return fmt.Errorf("tls: client offered unexpected PSK identities after HelloRetryRequest")
818		}
819
820		applyBugsToClientHello(newClientHello, config)
821
822		// Check that the new ClientHello matches the old ClientHello,
823		// except for relevant modifications. See RFC 8446, section 4.1.2.
824		ignoreExtensions := []uint16{extensionPadding}
825
826		if helloRetryRequest.hasSelectedGroup {
827			newKeyShares := newClientHello.keyShares
828			if len(newKeyShares) != 1 || newKeyShares[0].group != helloRetryRequest.selectedGroup {
829				return errors.New("tls: KeyShare from HelloRetryRequest not in new ClientHello")
830			}
831			selectedKeyShare = &newKeyShares[0]
832			ignoreExtensions = append(ignoreExtensions, extensionKeyShare)
833		}
834
835		if len(helloRetryRequest.cookie) > 0 {
836			if !bytes.Equal(newClientHello.tls13Cookie, helloRetryRequest.cookie) {
837				return errors.New("tls: cookie from HelloRetryRequest not present in new ClientHello")
838			}
839			ignoreExtensions = append(ignoreExtensions, extensionCookie)
840		}
841
842		// The second ClientHello refreshes binders, and may drop PSK identities
843		// that are no longer consistent with the cipher suite.
844		oldPSKIdentities := hs.clientHello.pskIdentities
845		for _, identity := range newClientHello.pskIdentities {
846			// Skip to the matching PSK identity in oldPSKIdentities.
847			for len(oldPSKIdentities) > 0 && !bytes.Equal(oldPSKIdentities[0].ticket, identity.ticket) {
848				oldPSKIdentities = oldPSKIdentities[1:]
849			}
850			// The identity now either matches, or oldPSKIdentities is empty.
851			if len(oldPSKIdentities) == 0 {
852				return errors.New("tls: unexpected PSK identity in second ClientHello")
853			}
854			oldPSKIdentities = oldPSKIdentities[1:]
855		}
856		ignoreExtensions = append(ignoreExtensions, extensionPreSharedKey)
857
858		// Update the index for the identity we resumed. The client may have
859		// dropped some entries.
860		if hs.sessionState != nil {
861			var found bool
862			ticket := hs.clientHello.pskIdentities[pskIndex].ticket
863			for i, identity := range newClientHello.pskIdentities {
864				if bytes.Equal(identity.ticket, ticket) {
865					found = true
866					pskIndex = i
867					break
868				}
869			}
870			if found {
871				binderToVerify := newClientHello.pskBinders[pskIndex]
872				if err := verifyPSKBinder(c.wireVersion, newClientHello, hs.sessionState, binderToVerify, hs.clientHello.marshal(), helloRetryRequest.marshal()); err != nil {
873					return err
874				}
875			} else if !config.Bugs.AcceptAnySession {
876				// If AcceptAnySession is set, the client may have already noticed
877				// the selected session is incompatible with the HelloRetryRequest
878				// and correctly dropped the PSK identity. We may also have
879				// attempted to resume a session from the TLS 1.2 extension.
880				return errors.New("tls: second ClientHello is missing selected session")
881			}
882		}
883
884		// The second ClientHello must stop offering early data.
885		if newClientHello.hasEarlyData {
886			return errors.New("tls: EarlyData sent in new ClientHello")
887		}
888		ignoreExtensions = append(ignoreExtensions, extensionEarlyData)
889
890		if err := checkClientHellosEqual(hs.clientHello.raw, newClientHello.raw, c.isDTLS, ignoreExtensions); err != nil {
891			return err
892		}
893
894		if firstHelloRetryRequest && config.Bugs.SecondHelloRetryRequest {
895			firstHelloRetryRequest = false
896			goto ResendHelloRetryRequest
897		}
898	}
899
900	// Decide whether or not to accept early data.
901	if !sendHelloRetryRequest && hs.clientHello.hasEarlyData {
902		if !config.Bugs.AlwaysRejectEarlyData && hs.sessionState != nil {
903			if hs.sessionState.cipherSuite == hs.suite.id &&
904				c.clientProtocol == string(hs.sessionState.earlyALPN) &&
905				c.hasApplicationSettings == hs.sessionState.hasApplicationSettings &&
906				bytes.Equal(c.localApplicationSettings, hs.sessionState.localApplicationSettings) {
907				encryptedExtensions.extensions.hasEarlyData = true
908			}
909			if config.Bugs.AlwaysAcceptEarlyData {
910				encryptedExtensions.extensions.hasEarlyData = true
911			}
912		}
913		if encryptedExtensions.extensions.hasEarlyData {
914			earlyTrafficSecret := hs.finishedHash.deriveSecret(earlyTrafficLabel)
915			c.earlyExporterSecret = hs.finishedHash.deriveSecret(earlyExporterLabel)
916
917			// Applications are implicit with early data.
918			if !config.Bugs.SendApplicationSettingsWithEarlyData {
919				encryptedExtensions.extensions.hasApplicationSettings = false
920				encryptedExtensions.extensions.applicationSettings = nil
921			}
922
923			sessionCipher := cipherSuiteFromID(hs.sessionState.cipherSuite)
924			if err := c.useInTrafficSecret(encryptionEarlyData, c.wireVersion, sessionCipher, earlyTrafficSecret); err != nil {
925				return err
926			}
927
928			for _, expectedMsg := range config.Bugs.ExpectEarlyData {
929				if err := c.readRecord(recordTypeApplicationData); err != nil {
930					return err
931				}
932				msg := c.input.data[c.input.off:]
933				if !bytes.Equal(msg, expectedMsg) {
934					return fmt.Errorf("tls: got early data record %x, wanted %x", msg, expectedMsg)
935				}
936				c.in.freeBlock(c.input)
937				c.input = nil
938			}
939		} else {
940			c.setSkipEarlyData()
941		}
942	}
943
944	if config.Bugs.SendEarlyDataExtension {
945		encryptedExtensions.extensions.hasEarlyData = true
946	}
947
948	// Resolve ECDHE and compute the handshake secret.
949	if hs.hello.hasKeyShare {
950		// Once a curve has been selected and a key share identified,
951		// the server needs to generate a public value and send it in
952		// the ServerHello.
953		curve, ok := curveForCurveID(selectedCurve, config)
954		if !ok {
955			panic("tls: server failed to look up curve ID")
956		}
957		c.curveID = selectedCurve
958
959		var peerKey []byte
960		if config.Bugs.SkipHelloRetryRequest {
961			// If skipping HelloRetryRequest, use a random key to
962			// avoid crashing.
963			curve2, _ := curveForCurveID(selectedCurve, config)
964			var err error
965			peerKey, err = curve2.offer(config.rand())
966			if err != nil {
967				return err
968			}
969		} else {
970			peerKey = selectedKeyShare.keyExchange
971		}
972
973		publicKey, ecdheSecret, err := curve.accept(config.rand(), peerKey)
974		if err != nil {
975			c.sendAlert(alertHandshakeFailure)
976			return err
977		}
978		hs.finishedHash.nextSecret()
979		hs.finishedHash.addEntropy(ecdheSecret)
980		hs.hello.hasKeyShare = true
981
982		curveID := selectedCurve
983		if c.config.Bugs.SendCurve != 0 {
984			curveID = config.Bugs.SendCurve
985		}
986		if c.config.Bugs.InvalidECDHPoint {
987			publicKey[0] ^= 0xff
988		}
989
990		hs.hello.keyShare = keyShareEntry{
991			group:       curveID,
992			keyExchange: publicKey,
993		}
994
995		if config.Bugs.EncryptedExtensionsWithKeyShare {
996			encryptedExtensions.extensions.hasKeyShare = true
997			encryptedExtensions.extensions.keyShare = keyShareEntry{
998				group:       curveID,
999				keyExchange: publicKey,
1000			}
1001		}
1002	} else {
1003		hs.finishedHash.nextSecret()
1004		hs.finishedHash.addEntropy(hs.finishedHash.zeroSecret())
1005	}
1006
1007	// Emit the ECH confirmation signal when requested.
1008	if hs.clientHello.echInner && !config.Bugs.OmitServerHelloECHConfirmation {
1009		randomSuffix := hs.hello.random[len(hs.hello.random)-echAcceptConfirmationLength:]
1010		for i := range randomSuffix {
1011			randomSuffix[i] = 0
1012		}
1013		copy(randomSuffix, hs.finishedHash.echAcceptConfirmation(hs.clientHello.random, echAcceptConfirmationLabel, hs.hello.marshal()))
1014		hs.hello.raw = nil
1015	}
1016
1017	// Send unencrypted ServerHello.
1018	helloBytes := hs.hello.marshal()
1019	hs.writeServerHash(helloBytes)
1020	if config.Bugs.PartialServerHelloWithHelloRetryRequest {
1021		// The first byte has already been written.
1022		helloBytes = helloBytes[1:]
1023	}
1024	if config.Bugs.PartialEncryptedExtensionsWithServerHello {
1025		c.writeRecord(recordTypeHandshake, append(helloBytes[:len(helloBytes):len(helloBytes)], typeEncryptedExtensions))
1026	} else {
1027		c.writeRecord(recordTypeHandshake, helloBytes)
1028	}
1029	c.flushHandshake()
1030
1031	if !c.config.Bugs.SkipChangeCipherSpec && !sendHelloRetryRequest {
1032		c.writeRecord(recordTypeChangeCipherSpec, []byte{1})
1033	}
1034
1035	for i := 0; i < c.config.Bugs.SendExtraChangeCipherSpec; i++ {
1036		c.writeRecord(recordTypeChangeCipherSpec, []byte{1})
1037	}
1038
1039	// Switch to handshake traffic keys.
1040	serverHandshakeTrafficSecret := hs.finishedHash.deriveSecret(serverHandshakeTrafficLabel)
1041	c.useOutTrafficSecret(encryptionHandshake, c.wireVersion, hs.suite, serverHandshakeTrafficSecret)
1042	// Derive handshake traffic read key, but don't switch yet.
1043	clientHandshakeTrafficSecret := hs.finishedHash.deriveSecret(clientHandshakeTrafficLabel)
1044
1045	// Send EncryptedExtensions.
1046	hs.writeServerHash(encryptedExtensions.marshal())
1047	if config.Bugs.PartialEncryptedExtensionsWithServerHello {
1048		// The first byte has already been sent.
1049		c.writeRecord(recordTypeHandshake, encryptedExtensions.marshal()[1:])
1050	} else {
1051		c.writeRecord(recordTypeHandshake, encryptedExtensions.marshal())
1052	}
1053
1054	if hs.sessionState == nil {
1055		if config.ClientAuth >= RequestClientCert {
1056			// Request a client certificate
1057			certReq := &certificateRequestMsg{
1058				vers:                  c.wireVersion,
1059				hasSignatureAlgorithm: !config.Bugs.OmitCertificateRequestAlgorithms,
1060				hasRequestContext:     true,
1061				requestContext:        config.Bugs.SendRequestContext,
1062				customExtension:       config.Bugs.SendCustomCertificateRequest,
1063			}
1064			if !config.Bugs.NoSignatureAlgorithms {
1065				certReq.signatureAlgorithms = config.verifySignatureAlgorithms()
1066			}
1067
1068			// An empty list of certificateAuthorities signals to
1069			// the client that it may send any certificate in response
1070			// to our request. When we know the CAs we trust, then
1071			// we can send them down, so that the client can choose
1072			// an appropriate certificate to give to us.
1073			if config.ClientCAs != nil {
1074				certReq.certificateAuthorities = config.ClientCAs.Subjects()
1075			}
1076			hs.writeServerHash(certReq.marshal())
1077			c.writeRecord(recordTypeHandshake, certReq.marshal())
1078		}
1079
1080		certMsg := &certificateMsg{
1081			hasRequestContext: true,
1082		}
1083		if !config.Bugs.EmptyCertificateList {
1084			for i, certData := range hs.cert.Certificate {
1085				cert := certificateEntry{
1086					data: certData,
1087				}
1088				if i == 0 {
1089					if hs.clientHello.ocspStapling && !c.config.Bugs.NoOCSPStapling {
1090						cert.ocspResponse = hs.cert.OCSPStaple
1091					}
1092					if hs.clientHello.sctListSupported && !c.config.Bugs.NoSignedCertificateTimestamps {
1093						cert.sctList = hs.cert.SignedCertificateTimestampList
1094					}
1095					cert.duplicateExtensions = config.Bugs.SendDuplicateCertExtensions
1096					cert.extraExtension = config.Bugs.SendExtensionOnCertificate
1097				} else {
1098					if config.Bugs.SendOCSPOnIntermediates != nil {
1099						cert.ocspResponse = config.Bugs.SendOCSPOnIntermediates
1100					}
1101					if config.Bugs.SendSCTOnIntermediates != nil {
1102						cert.sctList = config.Bugs.SendSCTOnIntermediates
1103					}
1104				}
1105				certMsg.certificates = append(certMsg.certificates, cert)
1106			}
1107		}
1108		certMsgBytes := certMsg.marshal()
1109		sentCompressedCertMsg := false
1110
1111	FindCertCompressionAlg:
1112		for candidate, alg := range c.config.CertCompressionAlgs {
1113			for _, id := range hs.clientHello.compressedCertAlgs {
1114				if id == candidate {
1115					if expected := config.Bugs.ExpectedCompressedCert; expected != 0 && expected != id {
1116						return fmt.Errorf("tls: expected to send compressed cert with alg %d, but picked %d", expected, id)
1117					}
1118					if config.Bugs.ExpectUncompressedCert {
1119						return errors.New("tls: expected to send uncompressed cert")
1120					}
1121
1122					if override := config.Bugs.SendCertCompressionAlgID; override != 0 {
1123						id = override
1124					}
1125
1126					uncompressed := certMsgBytes[4:]
1127					uncompressedLen := uint32(len(uncompressed))
1128					if override := config.Bugs.SendCertUncompressedLength; override != 0 {
1129						uncompressedLen = override
1130					}
1131
1132					compressedCertMsgBytes := (&compressedCertificateMsg{
1133						algID:              id,
1134						uncompressedLength: uncompressedLen,
1135						compressed:         alg.Compress(uncompressed),
1136					}).marshal()
1137
1138					hs.writeServerHash(compressedCertMsgBytes)
1139					c.writeRecord(recordTypeHandshake, compressedCertMsgBytes)
1140					sentCompressedCertMsg = true
1141					break FindCertCompressionAlg
1142				}
1143			}
1144		}
1145
1146		if !sentCompressedCertMsg {
1147			if config.Bugs.ExpectedCompressedCert != 0 {
1148				return errors.New("tls: unexpectedly sent uncompressed certificate")
1149			}
1150			hs.writeServerHash(certMsgBytes)
1151			c.writeRecord(recordTypeHandshake, certMsgBytes)
1152		}
1153
1154		certVerify := &certificateVerifyMsg{
1155			hasSignatureAlgorithm: true,
1156		}
1157
1158		// Determine the hash to sign.
1159		privKey := hs.cert.PrivateKey
1160
1161		var err error
1162		certVerify.signatureAlgorithm, err = selectSignatureAlgorithm(c.vers, privKey, config, hs.clientHello.signatureAlgorithms)
1163		if err != nil {
1164			c.sendAlert(alertInternalError)
1165			return err
1166		}
1167
1168		input := hs.finishedHash.certificateVerifyInput(serverCertificateVerifyContextTLS13)
1169		certVerify.signature, err = signMessage(c.vers, privKey, c.config, certVerify.signatureAlgorithm, input)
1170		if err != nil {
1171			c.sendAlert(alertInternalError)
1172			return err
1173		}
1174
1175		if config.Bugs.SendSignatureAlgorithm != 0 {
1176			certVerify.signatureAlgorithm = config.Bugs.SendSignatureAlgorithm
1177		}
1178
1179		if !config.Bugs.SkipCertificateVerify {
1180			hs.writeServerHash(certVerify.marshal())
1181			c.writeRecord(recordTypeHandshake, certVerify.marshal())
1182		}
1183	} else if hs.sessionState != nil {
1184		// Pick up certificates from the session instead.
1185		if len(hs.sessionState.certificates) > 0 {
1186			if _, err := hs.processCertsFromClient(hs.sessionState.certificates); err != nil {
1187				return err
1188			}
1189		}
1190	}
1191
1192	finished := new(finishedMsg)
1193	finished.verifyData = hs.finishedHash.serverSum(serverHandshakeTrafficSecret)
1194	if config.Bugs.BadFinished {
1195		finished.verifyData[0]++
1196	}
1197	hs.writeServerHash(finished.marshal())
1198	c.writeRecord(recordTypeHandshake, finished.marshal())
1199	if c.config.Bugs.SendExtraFinished {
1200		c.writeRecord(recordTypeHandshake, finished.marshal())
1201	}
1202	c.flushHandshake()
1203
1204	if encryptedExtensions.extensions.hasEarlyData && !c.shouldSkipEarlyData() {
1205		for _, expectedMsg := range config.Bugs.ExpectLateEarlyData {
1206			if err := c.readRecord(recordTypeApplicationData); err != nil {
1207				return err
1208			}
1209			if !bytes.Equal(c.input.data[c.input.off:], expectedMsg) {
1210				return errors.New("ExpectLateEarlyData: did not get expected message")
1211			}
1212			c.in.freeBlock(c.input)
1213			c.input = nil
1214		}
1215	}
1216
1217	// The various secrets do not incorporate the client's final leg, so
1218	// derive them now before updating the handshake context.
1219	hs.finishedHash.nextSecret()
1220	hs.finishedHash.addEntropy(hs.finishedHash.zeroSecret())
1221
1222	clientTrafficSecret := hs.finishedHash.deriveSecret(clientApplicationTrafficLabel)
1223	serverTrafficSecret := hs.finishedHash.deriveSecret(serverApplicationTrafficLabel)
1224	c.exporterSecret = hs.finishedHash.deriveSecret(exporterLabel)
1225
1226	// Switch to application data keys on write. In particular, any alerts
1227	// from the client certificate are sent over these keys.
1228	c.useOutTrafficSecret(encryptionApplication, c.wireVersion, hs.suite, serverTrafficSecret)
1229
1230	// Send 0.5-RTT messages.
1231	for _, halfRTTMsg := range config.Bugs.SendHalfRTTData {
1232		if _, err := c.writeRecord(recordTypeApplicationData, halfRTTMsg); err != nil {
1233			return err
1234		}
1235	}
1236
1237	// Read end_of_early_data.
1238	if encryptedExtensions.extensions.hasEarlyData && config.Bugs.MockQUICTransport == nil {
1239		msg, err := c.readHandshake()
1240		if err != nil {
1241			return err
1242		}
1243
1244		endOfEarlyData, ok := msg.(*endOfEarlyDataMsg)
1245		if !ok {
1246			c.sendAlert(alertUnexpectedMessage)
1247			return unexpectedMessageError(endOfEarlyData, msg)
1248		}
1249		hs.writeClientHash(endOfEarlyData.marshal())
1250	}
1251
1252	// Switch input stream to handshake traffic keys.
1253	if err := c.useInTrafficSecret(encryptionHandshake, c.wireVersion, hs.suite, clientHandshakeTrafficSecret); err != nil {
1254		return err
1255	}
1256
1257	// If we sent an ALPS extension, the client must respond with one.
1258	if encryptedExtensions.extensions.hasApplicationSettings {
1259		msg, err := c.readHandshake()
1260		if err != nil {
1261			return err
1262		}
1263		clientEncryptedExtensions, ok := msg.(*clientEncryptedExtensionsMsg)
1264		if !ok {
1265			c.sendAlert(alertUnexpectedMessage)
1266			return unexpectedMessageError(clientEncryptedExtensions, msg)
1267		}
1268		hs.writeClientHash(clientEncryptedExtensions.marshal())
1269
1270		if !clientEncryptedExtensions.hasApplicationSettings {
1271			c.sendAlert(alertMissingExtension)
1272			return errors.New("tls: client didn't provide application settings")
1273		}
1274		c.peerApplicationSettings = clientEncryptedExtensions.applicationSettings
1275	} else if encryptedExtensions.extensions.hasEarlyData {
1276		// 0-RTT sessions carry application settings over.
1277		c.peerApplicationSettings = hs.sessionState.peerApplicationSettings
1278	}
1279
1280	// If we requested a client certificate, then the client must send a
1281	// certificate message, even if it's empty.
1282	if config.ClientAuth >= RequestClientCert {
1283		msg, err := c.readHandshake()
1284		if err != nil {
1285			return err
1286		}
1287
1288		certMsg, ok := msg.(*certificateMsg)
1289		if !ok {
1290			c.sendAlert(alertUnexpectedMessage)
1291			return unexpectedMessageError(certMsg, msg)
1292		}
1293		hs.writeClientHash(certMsg.marshal())
1294
1295		if len(certMsg.certificates) == 0 {
1296			// The client didn't actually send a certificate
1297			switch config.ClientAuth {
1298			case RequireAnyClientCert, RequireAndVerifyClientCert:
1299				c.sendAlert(alertCertificateRequired)
1300				return errors.New("tls: client didn't provide a certificate")
1301			}
1302		}
1303
1304		var certs [][]byte
1305		for _, cert := range certMsg.certificates {
1306			certs = append(certs, cert.data)
1307			// OCSP responses and SCT lists are not negotiated in
1308			// client certificates.
1309			if cert.ocspResponse != nil || cert.sctList != nil {
1310				c.sendAlert(alertUnsupportedExtension)
1311				return errors.New("tls: unexpected extensions in the client certificate")
1312			}
1313		}
1314		pub, err := hs.processCertsFromClient(certs)
1315		if err != nil {
1316			return err
1317		}
1318
1319		if len(c.peerCertificates) > 0 {
1320			msg, err = c.readHandshake()
1321			if err != nil {
1322				return err
1323			}
1324
1325			certVerify, ok := msg.(*certificateVerifyMsg)
1326			if !ok {
1327				c.sendAlert(alertUnexpectedMessage)
1328				return unexpectedMessageError(certVerify, msg)
1329			}
1330
1331			c.peerSignatureAlgorithm = certVerify.signatureAlgorithm
1332			input := hs.finishedHash.certificateVerifyInput(clientCertificateVerifyContextTLS13)
1333			if err := verifyMessage(c.vers, pub, config, certVerify.signatureAlgorithm, input, certVerify.signature); err != nil {
1334				c.sendAlert(alertBadCertificate)
1335				return err
1336			}
1337			hs.writeClientHash(certVerify.marshal())
1338		}
1339	}
1340
1341	if encryptedExtensions.extensions.channelIDRequested {
1342		msg, err := c.readHandshake()
1343		if err != nil {
1344			return err
1345		}
1346		channelIDMsg, ok := msg.(*channelIDMsg)
1347		if !ok {
1348			c.sendAlert(alertUnexpectedMessage)
1349			return unexpectedMessageError(channelIDMsg, msg)
1350		}
1351		channelIDHash := crypto.SHA256.New()
1352		channelIDHash.Write(hs.finishedHash.certificateVerifyInput(channelIDContextTLS13))
1353		channelID, err := verifyChannelIDMessage(channelIDMsg, channelIDHash.Sum(nil))
1354		if err != nil {
1355			return err
1356		}
1357		c.channelID = channelID
1358
1359		hs.writeClientHash(channelIDMsg.marshal())
1360	}
1361
1362	// Read the client Finished message.
1363	msg, err := c.readHandshake()
1364	if err != nil {
1365		return err
1366	}
1367	clientFinished, ok := msg.(*finishedMsg)
1368	if !ok {
1369		c.sendAlert(alertUnexpectedMessage)
1370		return unexpectedMessageError(clientFinished, msg)
1371	}
1372
1373	verify := hs.finishedHash.clientSum(clientHandshakeTrafficSecret)
1374	if len(verify) != len(clientFinished.verifyData) ||
1375		subtle.ConstantTimeCompare(verify, clientFinished.verifyData) != 1 {
1376		c.sendAlert(alertHandshakeFailure)
1377		return errors.New("tls: client's Finished message was incorrect")
1378	}
1379	hs.writeClientHash(clientFinished.marshal())
1380
1381	// Switch to application data keys on read.
1382	if err := c.useInTrafficSecret(encryptionApplication, c.wireVersion, hs.suite, clientTrafficSecret); err != nil {
1383		return err
1384	}
1385
1386	c.cipherSuite = hs.suite
1387	c.resumptionSecret = hs.finishedHash.deriveSecret(resumptionLabel)
1388
1389	// TODO(davidben): Allow configuring the number of tickets sent for
1390	// testing.
1391	if !c.config.SessionTicketsDisabled && foundKEMode {
1392		ticketCount := 2
1393		for i := 0; i < ticketCount; i++ {
1394			c.SendNewSessionTicket([]byte{byte(i)})
1395		}
1396	}
1397	return nil
1398}
1399
1400// processClientHello processes the ClientHello message from the client and
1401// decides whether we will perform session resumption.
1402func (hs *serverHandshakeState) processClientHello() (isResume bool, err error) {
1403	config := hs.c.config
1404	c := hs.c
1405
1406	hs.hello = &serverHelloMsg{
1407		isDTLS:            c.isDTLS,
1408		vers:              c.wireVersion,
1409		versOverride:      config.Bugs.SendServerHelloVersion,
1410		compressionMethod: config.Bugs.SendCompressionMethod,
1411		extensions: serverExtensions{
1412			supportedVersion: config.Bugs.SendServerSupportedVersionExtension,
1413		},
1414		omitExtensions:  config.Bugs.OmitExtensions,
1415		emptyExtensions: config.Bugs.EmptyExtensions,
1416	}
1417
1418	hs.hello.random = make([]byte, 32)
1419	_, err = io.ReadFull(config.rand(), hs.hello.random)
1420	if err != nil {
1421		c.sendAlert(alertInternalError)
1422		return false, err
1423	}
1424
1425	_, supportsTLS13 := c.config.isSupportedVersion(VersionTLS13, false)
1426
1427	// Signal downgrades in the server random, per RFC 8446, section 4.1.3.
1428	if supportsTLS13 || config.Bugs.SendTLS13DowngradeRandom {
1429		if c.vers <= VersionTLS12 && config.maxVersion(c.isDTLS) >= VersionTLS13 {
1430			copy(hs.hello.random[len(hs.hello.random)-8:], downgradeTLS13)
1431		}
1432		if c.vers <= VersionTLS11 && config.maxVersion(c.isDTLS) == VersionTLS12 {
1433			copy(hs.hello.random[len(hs.hello.random)-8:], downgradeTLS12)
1434		}
1435	}
1436	if config.Bugs.SendJDK11DowngradeRandom {
1437		copy(hs.hello.random[len(hs.hello.random)-8:], downgradeJDK11)
1438	}
1439
1440	foundCompression := false
1441	// We only support null compression, so check that the client offered it.
1442	for _, compression := range hs.clientHello.compressionMethods {
1443		if compression == compressionNone {
1444			foundCompression = true
1445			break
1446		}
1447	}
1448
1449	if !foundCompression {
1450		c.sendAlert(alertHandshakeFailure)
1451		return false, errors.New("tls: client does not support uncompressed connections")
1452	}
1453
1454	if err := hs.processClientExtensions(&hs.hello.extensions); err != nil {
1455		return false, err
1456	}
1457
1458	supportedCurve := false
1459	preferredCurves := config.curvePreferences()
1460Curves:
1461	for _, curve := range hs.clientHello.supportedCurves {
1462		if isPqGroup(curve) && c.vers < VersionTLS13 {
1463			// CECPQ2 is TLS 1.3-only.
1464			continue
1465		}
1466
1467		for _, supported := range preferredCurves {
1468			if supported == curve {
1469				supportedCurve = true
1470				break Curves
1471			}
1472		}
1473	}
1474
1475	supportedPointFormat := false
1476	for _, pointFormat := range hs.clientHello.supportedPoints {
1477		if pointFormat == pointFormatUncompressed {
1478			supportedPointFormat = true
1479			break
1480		}
1481	}
1482	hs.ellipticOk = supportedCurve && supportedPointFormat
1483
1484	_, hs.ecdsaOk = hs.cert.PrivateKey.(*ecdsa.PrivateKey)
1485	// Ed25519 also uses ECDSA certificates.
1486	_, ed25519Ok := hs.cert.PrivateKey.(ed25519.PrivateKey)
1487	hs.ecdsaOk = hs.ecdsaOk || ed25519Ok
1488
1489	// For test purposes, check that the peer never offers a session when
1490	// renegotiating.
1491	if c.cipherSuite != nil && len(hs.clientHello.sessionID) > 0 && c.config.Bugs.FailIfResumeOnRenego {
1492		return false, errors.New("tls: offered resumption on renegotiation")
1493	}
1494
1495	if hs.checkForResumption() {
1496		return true, nil
1497	}
1498
1499	var preferenceList, supportedList []uint16
1500	if c.config.PreferServerCipherSuites {
1501		preferenceList = c.config.cipherSuites()
1502		supportedList = hs.clientHello.cipherSuites
1503	} else {
1504		preferenceList = hs.clientHello.cipherSuites
1505		supportedList = c.config.cipherSuites()
1506	}
1507
1508	for _, id := range preferenceList {
1509		if hs.suite = c.tryCipherSuite(id, supportedList, c.vers, hs.ellipticOk, hs.ecdsaOk); hs.suite != nil {
1510			break
1511		}
1512	}
1513
1514	if hs.suite == nil {
1515		c.sendAlert(alertHandshakeFailure)
1516		return false, errors.New("tls: no cipher suite supported by both client and server")
1517	}
1518
1519	return false, nil
1520}
1521
1522// processClientExtensions processes all ClientHello extensions not directly
1523// related to cipher suite negotiation and writes responses in serverExtensions.
1524func (hs *serverHandshakeState) processClientExtensions(serverExtensions *serverExtensions) error {
1525	config := hs.c.config
1526	c := hs.c
1527
1528	if c.vers < VersionTLS13 || config.Bugs.NegotiateRenegotiationInfoAtAllVersions {
1529		if !bytes.Equal(c.clientVerify, hs.clientHello.secureRenegotiation) {
1530			c.sendAlert(alertHandshakeFailure)
1531			return errors.New("tls: renegotiation mismatch")
1532		}
1533
1534		if len(c.clientVerify) > 0 && !c.config.Bugs.EmptyRenegotiationInfo {
1535			serverExtensions.secureRenegotiation = append(serverExtensions.secureRenegotiation, c.clientVerify...)
1536			serverExtensions.secureRenegotiation = append(serverExtensions.secureRenegotiation, c.serverVerify...)
1537			if c.config.Bugs.BadRenegotiationInfo {
1538				serverExtensions.secureRenegotiation[0] ^= 0x80
1539			}
1540			if c.config.Bugs.BadRenegotiationInfoEnd {
1541				serverExtensions.secureRenegotiation[len(serverExtensions.secureRenegotiation)-1] ^= 0x80
1542			}
1543		} else {
1544			serverExtensions.secureRenegotiation = hs.clientHello.secureRenegotiation
1545		}
1546
1547		if c.noRenegotiationInfo() {
1548			serverExtensions.secureRenegotiation = nil
1549		}
1550	}
1551
1552	serverExtensions.duplicateExtension = c.config.Bugs.DuplicateExtension
1553
1554	if len(hs.clientHello.serverName) > 0 {
1555		c.serverName = hs.clientHello.serverName
1556	}
1557	if len(config.Certificates) == 0 {
1558		c.sendAlert(alertInternalError)
1559		return errors.New("tls: no certificates configured")
1560	}
1561	hs.cert = &config.Certificates[0]
1562	if len(hs.clientHello.serverName) > 0 {
1563		hs.cert = config.getCertificateForName(hs.clientHello.serverName)
1564	}
1565	if expected := c.config.Bugs.ExpectServerName; expected != "" && expected != hs.clientHello.serverName {
1566		return fmt.Errorf("tls: unexpected server name: wanted %q, got %q", expected, hs.clientHello.serverName)
1567	}
1568
1569	if cert := config.Bugs.RenegotiationCertificate; c.cipherSuite != nil && cert != nil {
1570		hs.cert = cert
1571	}
1572
1573	if len(hs.clientHello.alpnProtocols) > 0 {
1574		// We will never offer ALPN as a client on renegotiation
1575		// handshakes.
1576		if len(c.clientVerify) > 0 {
1577			return errors.New("tls: offered ALPN on renegotiation")
1578		}
1579		if proto := c.config.Bugs.ALPNProtocol; proto != nil {
1580			serverExtensions.alpnProtocol = *proto
1581			serverExtensions.alpnProtocolEmpty = len(*proto) == 0
1582			c.clientProtocol = *proto
1583			c.usedALPN = true
1584		} else if selectedProto, fallback := mutualProtocol(hs.clientHello.alpnProtocols, c.config.NextProtos); !fallback {
1585			serverExtensions.alpnProtocol = selectedProto
1586			c.clientProtocol = selectedProto
1587			c.usedALPN = true
1588		}
1589
1590		var alpsAllowed bool
1591		if c.vers >= VersionTLS13 {
1592			for _, proto := range hs.clientHello.alpsProtocols {
1593				if proto == c.clientProtocol {
1594					alpsAllowed = true
1595					break
1596				}
1597			}
1598		}
1599		if c.config.Bugs.AlwaysNegotiateApplicationSettings {
1600			alpsAllowed = true
1601		}
1602		if settings, ok := c.config.ApplicationSettings[c.clientProtocol]; ok && alpsAllowed {
1603			c.hasApplicationSettings = true
1604			c.localApplicationSettings = settings
1605			// Note these fields may later be cleared we accept 0-RTT.
1606			serverExtensions.hasApplicationSettings = true
1607			serverExtensions.applicationSettings = settings
1608		}
1609	}
1610
1611	if len(c.config.Bugs.SendALPN) > 0 {
1612		serverExtensions.alpnProtocol = c.config.Bugs.SendALPN
1613	}
1614
1615	if c.vers < VersionTLS13 || config.Bugs.NegotiateNPNAtAllVersions {
1616		if len(hs.clientHello.alpnProtocols) == 0 || c.config.Bugs.NegotiateALPNAndNPN {
1617			// Although sending an empty NPN extension is reasonable, Firefox has
1618			// had a bug around this. Best to send nothing at all if
1619			// config.NextProtos is empty. See
1620			// https://code.google.com/p/go/issues/detail?id=5445.
1621			if hs.clientHello.nextProtoNeg && len(config.NextProtos) > 0 {
1622				serverExtensions.nextProtoNeg = true
1623				serverExtensions.nextProtos = config.NextProtos
1624				serverExtensions.npnAfterAlpn = config.Bugs.SwapNPNAndALPN
1625			}
1626		}
1627	}
1628
1629	if len(hs.clientHello.quicTransportParams) > 0 {
1630		c.quicTransportParams = hs.clientHello.quicTransportParams
1631	}
1632	if c.config.QUICTransportParamsUseLegacyCodepoint.IncludeStandard() {
1633		serverExtensions.quicTransportParams = c.config.QUICTransportParams
1634	}
1635
1636	if len(hs.clientHello.quicTransportParamsLegacy) > 0 {
1637		c.quicTransportParamsLegacy = hs.clientHello.quicTransportParamsLegacy
1638	}
1639	if c.config.QUICTransportParamsUseLegacyCodepoint.IncludeLegacy() {
1640		serverExtensions.quicTransportParamsLegacy = c.config.QUICTransportParams
1641	}
1642
1643	if c.vers < VersionTLS13 || config.Bugs.NegotiateEMSAtAllVersions {
1644		disableEMS := config.Bugs.NoExtendedMasterSecret
1645		if c.cipherSuite != nil {
1646			disableEMS = config.Bugs.NoExtendedMasterSecretOnRenegotiation
1647		}
1648		serverExtensions.extendedMasterSecret = hs.clientHello.extendedMasterSecret && !disableEMS
1649	}
1650
1651	if config.Bugs.AlwaysNegotiateChannelID || (hs.clientHello.channelIDSupported && config.RequestChannelID) {
1652		serverExtensions.channelIDRequested = true
1653	}
1654
1655	if hs.clientHello.srtpProtectionProfiles != nil {
1656	SRTPLoop:
1657		for _, p1 := range c.config.SRTPProtectionProfiles {
1658			for _, p2 := range hs.clientHello.srtpProtectionProfiles {
1659				if p1 == p2 {
1660					serverExtensions.srtpProtectionProfile = p1
1661					c.srtpProtectionProfile = p1
1662					break SRTPLoop
1663				}
1664			}
1665		}
1666	}
1667
1668	if c.config.Bugs.SendSRTPProtectionProfile != 0 {
1669		serverExtensions.srtpProtectionProfile = c.config.Bugs.SendSRTPProtectionProfile
1670	}
1671
1672	if expected := c.config.Bugs.ExpectedCustomExtension; expected != nil {
1673		if hs.clientHello.customExtension != *expected {
1674			return fmt.Errorf("tls: bad custom extension contents %q", hs.clientHello.customExtension)
1675		}
1676	}
1677	serverExtensions.customExtension = config.Bugs.CustomExtension
1678
1679	if c.config.Bugs.AdvertiseTicketExtension {
1680		serverExtensions.ticketSupported = true
1681	}
1682
1683	if c.config.Bugs.SendSupportedPointFormats != nil {
1684		serverExtensions.supportedPoints = c.config.Bugs.SendSupportedPointFormats
1685	}
1686
1687	if c.config.Bugs.SendServerSupportedCurves {
1688		serverExtensions.supportedCurves = c.config.curvePreferences()
1689	}
1690
1691	if !hs.clientHello.hasGREASEExtension && config.Bugs.ExpectGREASE {
1692		return errors.New("tls: no GREASE extension found")
1693	}
1694
1695	serverExtensions.serverNameAck = c.config.Bugs.SendServerNameAck
1696
1697	if (c.vers >= VersionTLS13 && hs.clientHello.echOuter != nil) || c.config.Bugs.AlwaysSendECHRetryConfigs {
1698		if len(config.Bugs.SendECHRetryConfigs) > 0 {
1699			serverExtensions.echRetryConfigs = config.Bugs.SendECHRetryConfigs
1700		} else if len(config.ServerECHConfigs) > 0 {
1701			echConfigs := make([][]byte, len(config.ServerECHConfigs))
1702			for i, echConfig := range config.ServerECHConfigs {
1703				echConfigs[i] = echConfig.ECHConfig.Raw
1704			}
1705			serverExtensions.echRetryConfigs = CreateECHConfigList(echConfigs...)
1706		}
1707	}
1708
1709	return nil
1710}
1711
1712// checkForResumption returns true if we should perform resumption on this connection.
1713func (hs *serverHandshakeState) checkForResumption() bool {
1714	c := hs.c
1715
1716	ticket := hs.clientHello.sessionTicket
1717	if len(ticket) == 0 && len(hs.clientHello.pskIdentities) > 0 && c.config.Bugs.AcceptAnySession {
1718		ticket = hs.clientHello.pskIdentities[0].ticket
1719	}
1720	if len(ticket) > 0 {
1721		if c.config.SessionTicketsDisabled {
1722			return false
1723		}
1724
1725		var ok bool
1726		if hs.sessionState, ok = c.decryptTicket(ticket); !ok {
1727			return false
1728		}
1729	} else {
1730		if c.config.ServerSessionCache == nil {
1731			return false
1732		}
1733
1734		var ok bool
1735		sessionID := string(hs.clientHello.sessionID)
1736		if hs.sessionState, ok = c.config.ServerSessionCache.Get(sessionID); !ok {
1737			return false
1738		}
1739	}
1740
1741	if c.config.Bugs.AcceptAnySession {
1742		// Replace the cipher suite with one known to work, to test
1743		// cross-version resumption attempts.
1744		hs.sessionState.cipherSuite = TLS_RSA_WITH_AES_128_CBC_SHA
1745	} else {
1746		// Never resume a session for a different SSL version.
1747		if c.vers != hs.sessionState.vers {
1748			return false
1749		}
1750
1751		cipherSuiteOk := false
1752		// Check that the client is still offering the ciphersuite in the session.
1753		for _, id := range hs.clientHello.cipherSuites {
1754			if id == hs.sessionState.cipherSuite {
1755				cipherSuiteOk = true
1756				break
1757			}
1758		}
1759		if !cipherSuiteOk {
1760			return false
1761		}
1762	}
1763
1764	// Check that we also support the ciphersuite from the session.
1765	hs.suite = c.tryCipherSuite(hs.sessionState.cipherSuite, c.config.cipherSuites(), c.vers, hs.ellipticOk, hs.ecdsaOk)
1766
1767	if hs.suite == nil {
1768		return false
1769	}
1770
1771	sessionHasClientCerts := len(hs.sessionState.certificates) != 0
1772	needClientCerts := c.config.ClientAuth == RequireAnyClientCert || c.config.ClientAuth == RequireAndVerifyClientCert
1773	if needClientCerts && !sessionHasClientCerts {
1774		return false
1775	}
1776	if sessionHasClientCerts && c.config.ClientAuth == NoClientCert {
1777		return false
1778	}
1779
1780	return true
1781}
1782
1783func (hs *serverHandshakeState) doResumeHandshake() error {
1784	c := hs.c
1785
1786	hs.hello.cipherSuite = hs.suite.id
1787	if c.config.Bugs.SendCipherSuite != 0 {
1788		hs.hello.cipherSuite = c.config.Bugs.SendCipherSuite
1789	}
1790	// We echo the client's session ID in the ServerHello to let it know
1791	// that we're doing a resumption.
1792	hs.hello.sessionID = hs.clientHello.sessionID
1793	hs.hello.extensions.ticketSupported = c.config.Bugs.RenewTicketOnResume
1794
1795	if c.config.Bugs.SendSCTListOnResume != nil {
1796		hs.hello.extensions.sctList = c.config.Bugs.SendSCTListOnResume
1797	}
1798
1799	if c.config.Bugs.SendOCSPResponseOnResume != nil {
1800		// There is no way, syntactically, to send an OCSP response on a
1801		// resumption handshake.
1802		hs.hello.extensions.ocspStapling = true
1803	}
1804
1805	hs.finishedHash = newFinishedHash(c.wireVersion, c.isDTLS, hs.suite)
1806	hs.finishedHash.discardHandshakeBuffer()
1807	hs.writeClientHash(hs.clientHello.marshal())
1808	hs.writeServerHash(hs.hello.marshal())
1809
1810	c.writeRecord(recordTypeHandshake, hs.hello.marshal())
1811
1812	if len(hs.sessionState.certificates) > 0 {
1813		if _, err := hs.processCertsFromClient(hs.sessionState.certificates); err != nil {
1814			return err
1815		}
1816	}
1817
1818	hs.masterSecret = hs.sessionState.secret
1819	c.extendedMasterSecret = hs.sessionState.extendedMasterSecret
1820
1821	return nil
1822}
1823
1824func (hs *serverHandshakeState) doFullHandshake() error {
1825	config := hs.c.config
1826	c := hs.c
1827
1828	isPSK := hs.suite.flags&suitePSK != 0
1829	if !isPSK && hs.clientHello.ocspStapling && len(hs.cert.OCSPStaple) > 0 && !c.config.Bugs.NoOCSPStapling {
1830		hs.hello.extensions.ocspStapling = true
1831	}
1832
1833	if hs.clientHello.sctListSupported && len(hs.cert.SignedCertificateTimestampList) > 0 && !c.config.Bugs.NoSignedCertificateTimestamps {
1834		hs.hello.extensions.sctList = hs.cert.SignedCertificateTimestampList
1835	}
1836
1837	if len(c.clientVerify) > 0 && config.Bugs.SendSCTListOnRenegotiation != nil {
1838		hs.hello.extensions.sctList = config.Bugs.SendSCTListOnRenegotiation
1839	}
1840
1841	hs.hello.extensions.ticketSupported = hs.clientHello.ticketSupported && !config.SessionTicketsDisabled
1842	hs.hello.cipherSuite = hs.suite.id
1843	if config.Bugs.SendCipherSuite != 0 {
1844		hs.hello.cipherSuite = config.Bugs.SendCipherSuite
1845	}
1846	c.extendedMasterSecret = hs.hello.extensions.extendedMasterSecret
1847
1848	// Generate a session ID if we're to save the session.
1849	if !hs.hello.extensions.ticketSupported && config.ServerSessionCache != nil {
1850		l := config.Bugs.NewSessionIDLength
1851		if l == 0 {
1852			l = 32
1853		}
1854		hs.hello.sessionID = make([]byte, l)
1855		if _, err := io.ReadFull(config.rand(), hs.hello.sessionID); err != nil {
1856			c.sendAlert(alertInternalError)
1857			return errors.New("tls: short read from Rand: " + err.Error())
1858		}
1859	}
1860	if config.Bugs.EchoSessionIDInFullHandshake {
1861		hs.hello.sessionID = hs.clientHello.sessionID
1862	}
1863
1864	hs.finishedHash = newFinishedHash(c.wireVersion, c.isDTLS, hs.suite)
1865	hs.writeClientHash(hs.clientHello.marshal())
1866	hs.writeServerHash(hs.hello.marshal())
1867
1868	if config.Bugs.SendSNIWarningAlert {
1869		c.SendAlert(alertLevelWarning, alertUnrecognizedName)
1870	}
1871
1872	c.writeRecord(recordTypeHandshake, hs.hello.marshal())
1873
1874	if !isPSK {
1875		certMsg := new(certificateMsg)
1876		if !config.Bugs.EmptyCertificateList {
1877			for _, certData := range hs.cert.Certificate {
1878				certMsg.certificates = append(certMsg.certificates, certificateEntry{
1879					data: certData,
1880				})
1881			}
1882		}
1883		if !config.Bugs.UnauthenticatedECDH {
1884			certMsgBytes := certMsg.marshal()
1885			hs.writeServerHash(certMsgBytes)
1886			c.writeRecord(recordTypeHandshake, certMsgBytes)
1887		}
1888	}
1889
1890	if hs.hello.extensions.ocspStapling && !c.config.Bugs.SkipCertificateStatus {
1891		certStatus := new(certificateStatusMsg)
1892		certStatus.statusType = statusTypeOCSP
1893		certStatus.response = hs.cert.OCSPStaple
1894		if len(c.clientVerify) > 0 && config.Bugs.SendOCSPResponseOnRenegotiation != nil {
1895			certStatus.response = config.Bugs.SendOCSPResponseOnRenegotiation
1896		}
1897		hs.writeServerHash(certStatus.marshal())
1898		c.writeRecord(recordTypeHandshake, certStatus.marshal())
1899	}
1900
1901	keyAgreement := hs.suite.ka(c.vers)
1902	skx, err := keyAgreement.generateServerKeyExchange(config, hs.cert, hs.clientHello, hs.hello, c.vers)
1903	if err != nil {
1904		c.sendAlert(alertHandshakeFailure)
1905		return err
1906	}
1907	if ecdhe, ok := keyAgreement.(*ecdheKeyAgreement); ok {
1908		c.curveID = ecdhe.curveID
1909	}
1910	if skx != nil && !config.Bugs.SkipServerKeyExchange {
1911		hs.writeServerHash(skx.marshal())
1912		c.writeRecord(recordTypeHandshake, skx.marshal())
1913	}
1914
1915	if config.ClientAuth >= RequestClientCert {
1916		// Request a client certificate
1917		certReq := &certificateRequestMsg{
1918			vers:             c.wireVersion,
1919			certificateTypes: config.ClientCertificateTypes,
1920		}
1921		if certReq.certificateTypes == nil {
1922			certReq.certificateTypes = []byte{
1923				byte(CertTypeRSASign),
1924				byte(CertTypeECDSASign),
1925			}
1926		}
1927		if c.vers >= VersionTLS12 {
1928			certReq.hasSignatureAlgorithm = true
1929			if !config.Bugs.NoSignatureAlgorithms {
1930				certReq.signatureAlgorithms = config.verifySignatureAlgorithms()
1931			}
1932		}
1933
1934		// An empty list of certificateAuthorities signals to
1935		// the client that it may send any certificate in response
1936		// to our request. When we know the CAs we trust, then
1937		// we can send them down, so that the client can choose
1938		// an appropriate certificate to give to us.
1939		if config.ClientCAs != nil {
1940			certReq.certificateAuthorities = config.ClientCAs.Subjects()
1941		}
1942		hs.writeServerHash(certReq.marshal())
1943		c.writeRecord(recordTypeHandshake, certReq.marshal())
1944	}
1945
1946	helloDone := new(serverHelloDoneMsg)
1947	helloDoneBytes := helloDone.marshal()
1948	hs.writeServerHash(helloDoneBytes)
1949	var toAppend byte
1950	if config.Bugs.PartialNewSessionTicketWithServerHelloDone {
1951		toAppend = typeNewSessionTicket
1952	} else if config.Bugs.PartialFinishedWithServerHelloDone {
1953		toAppend = typeFinished
1954	}
1955	if toAppend != 0 {
1956		c.writeRecord(recordTypeHandshake, append(helloDoneBytes[:len(helloDoneBytes):len(helloDoneBytes)], toAppend))
1957	} else {
1958		c.writeRecord(recordTypeHandshake, helloDoneBytes)
1959	}
1960	c.flushHandshake()
1961
1962	var pub crypto.PublicKey // public key for client auth, if any
1963
1964	if err := c.simulatePacketLoss(nil); err != nil {
1965		return err
1966	}
1967	msg, err := c.readHandshake()
1968	if err != nil {
1969		return err
1970	}
1971
1972	// If we requested a client certificate, then the client must send a
1973	// certificate message, even if it's empty.
1974	if config.ClientAuth >= RequestClientCert {
1975		certMsg, ok := msg.(*certificateMsg)
1976		if !ok {
1977			c.sendAlert(alertUnexpectedMessage)
1978			return unexpectedMessageError(certMsg, msg)
1979		}
1980		hs.writeClientHash(certMsg.marshal())
1981
1982		if len(certMsg.certificates) == 0 {
1983			// The client didn't actually send a certificate
1984			switch config.ClientAuth {
1985			case RequireAnyClientCert, RequireAndVerifyClientCert:
1986				c.sendAlert(alertBadCertificate)
1987				return errors.New("tls: client didn't provide a certificate")
1988			}
1989		}
1990
1991		var certificates [][]byte
1992		for _, cert := range certMsg.certificates {
1993			certificates = append(certificates, cert.data)
1994		}
1995
1996		pub, err = hs.processCertsFromClient(certificates)
1997		if err != nil {
1998			return err
1999		}
2000
2001		msg, err = c.readHandshake()
2002		if err != nil {
2003			return err
2004		}
2005	}
2006
2007	// Get client key exchange
2008	ckx, ok := msg.(*clientKeyExchangeMsg)
2009	if !ok {
2010		c.sendAlert(alertUnexpectedMessage)
2011		return unexpectedMessageError(ckx, msg)
2012	}
2013	hs.writeClientHash(ckx.marshal())
2014
2015	preMasterSecret, err := keyAgreement.processClientKeyExchange(config, hs.cert, ckx, c.vers)
2016	if err != nil {
2017		c.sendAlert(alertHandshakeFailure)
2018		return err
2019	}
2020	if c.extendedMasterSecret {
2021		hs.masterSecret = extendedMasterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret, hs.finishedHash)
2022	} else {
2023		if c.config.Bugs.RequireExtendedMasterSecret {
2024			return errors.New("tls: extended master secret required but not supported by peer")
2025		}
2026		hs.masterSecret = masterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret, hs.clientHello.random, hs.hello.random)
2027	}
2028
2029	// If we received a client cert in response to our certificate request message,
2030	// the client will send us a certificateVerifyMsg immediately after the
2031	// clientKeyExchangeMsg.  This message is a digest of all preceding
2032	// handshake-layer messages that is signed using the private key corresponding
2033	// to the client's certificate. This allows us to verify that the client is in
2034	// possession of the private key of the certificate.
2035	if len(c.peerCertificates) > 0 {
2036		msg, err = c.readHandshake()
2037		if err != nil {
2038			return err
2039		}
2040		certVerify, ok := msg.(*certificateVerifyMsg)
2041		if !ok {
2042			c.sendAlert(alertUnexpectedMessage)
2043			return unexpectedMessageError(certVerify, msg)
2044		}
2045
2046		// Determine the signature type.
2047		var sigAlg signatureAlgorithm
2048		if certVerify.hasSignatureAlgorithm {
2049			sigAlg = certVerify.signatureAlgorithm
2050			c.peerSignatureAlgorithm = sigAlg
2051		}
2052
2053		if err := verifyMessage(c.vers, pub, c.config, sigAlg, hs.finishedHash.buffer, certVerify.signature); err != nil {
2054			c.sendAlert(alertBadCertificate)
2055			return errors.New("could not validate signature of connection nonces: " + err.Error())
2056		}
2057
2058		hs.writeClientHash(certVerify.marshal())
2059	}
2060
2061	hs.finishedHash.discardHandshakeBuffer()
2062
2063	return nil
2064}
2065
2066func (hs *serverHandshakeState) establishKeys() error {
2067	c := hs.c
2068
2069	clientMAC, serverMAC, clientKey, serverKey, clientIV, serverIV :=
2070		keysFromMasterSecret(c.vers, hs.suite, hs.masterSecret, hs.clientHello.random, hs.hello.random, hs.suite.macLen, hs.suite.keyLen, hs.suite.ivLen(c.vers))
2071
2072	var clientCipher, serverCipher interface{}
2073	var clientHash, serverHash macFunction
2074
2075	if hs.suite.aead == nil {
2076		clientCipher = hs.suite.cipher(clientKey, clientIV, true /* for reading */)
2077		clientHash = hs.suite.mac(c.vers, clientMAC)
2078		serverCipher = hs.suite.cipher(serverKey, serverIV, false /* not for reading */)
2079		serverHash = hs.suite.mac(c.vers, serverMAC)
2080	} else {
2081		clientCipher = hs.suite.aead(c.vers, clientKey, clientIV)
2082		serverCipher = hs.suite.aead(c.vers, serverKey, serverIV)
2083	}
2084
2085	c.in.prepareCipherSpec(c.wireVersion, clientCipher, clientHash)
2086	c.out.prepareCipherSpec(c.wireVersion, serverCipher, serverHash)
2087
2088	return nil
2089}
2090
2091func (hs *serverHandshakeState) readFinished(out []byte, isResume bool) error {
2092	c := hs.c
2093
2094	c.readRecord(recordTypeChangeCipherSpec)
2095	if err := c.in.error(); err != nil {
2096		return err
2097	}
2098
2099	if hs.hello.extensions.nextProtoNeg {
2100		msg, err := c.readHandshake()
2101		if err != nil {
2102			return err
2103		}
2104		nextProto, ok := msg.(*nextProtoMsg)
2105		if !ok {
2106			c.sendAlert(alertUnexpectedMessage)
2107			return unexpectedMessageError(nextProto, msg)
2108		}
2109		hs.writeClientHash(nextProto.marshal())
2110		c.clientProtocol = nextProto.proto
2111	}
2112
2113	if hs.hello.extensions.channelIDRequested {
2114		msg, err := c.readHandshake()
2115		if err != nil {
2116			return err
2117		}
2118		channelIDMsg, ok := msg.(*channelIDMsg)
2119		if !ok {
2120			c.sendAlert(alertUnexpectedMessage)
2121			return unexpectedMessageError(channelIDMsg, msg)
2122		}
2123		var resumeHash []byte
2124		if isResume {
2125			resumeHash = hs.sessionState.handshakeHash
2126		}
2127		channelID, err := verifyChannelIDMessage(channelIDMsg, hs.finishedHash.hashForChannelID(resumeHash))
2128		if err != nil {
2129			return err
2130		}
2131		c.channelID = channelID
2132
2133		hs.writeClientHash(channelIDMsg.marshal())
2134	}
2135
2136	msg, err := c.readHandshake()
2137	if err != nil {
2138		return err
2139	}
2140	clientFinished, ok := msg.(*finishedMsg)
2141	if !ok {
2142		c.sendAlert(alertUnexpectedMessage)
2143		return unexpectedMessageError(clientFinished, msg)
2144	}
2145
2146	verify := hs.finishedHash.clientSum(hs.masterSecret)
2147	if len(verify) != len(clientFinished.verifyData) ||
2148		subtle.ConstantTimeCompare(verify, clientFinished.verifyData) != 1 {
2149		c.sendAlert(alertHandshakeFailure)
2150		return errors.New("tls: client's Finished message is incorrect")
2151	}
2152	c.clientVerify = append(c.clientVerify[:0], clientFinished.verifyData...)
2153	copy(out, clientFinished.verifyData)
2154
2155	hs.writeClientHash(clientFinished.marshal())
2156	return nil
2157}
2158
2159func (hs *serverHandshakeState) sendSessionTicket() error {
2160	c := hs.c
2161	state := sessionState{
2162		vers:          c.vers,
2163		cipherSuite:   hs.suite.id,
2164		secret:        hs.masterSecret,
2165		certificates:  hs.certsFromClient,
2166		handshakeHash: hs.finishedHash.Sum(),
2167	}
2168
2169	if !hs.hello.extensions.ticketSupported || hs.c.config.Bugs.SkipNewSessionTicket {
2170		if c.config.ServerSessionCache != nil && len(hs.hello.sessionID) != 0 {
2171			c.config.ServerSessionCache.Put(string(hs.hello.sessionID), &state)
2172		}
2173		return nil
2174	}
2175
2176	m := new(newSessionTicketMsg)
2177	m.vers = c.wireVersion
2178	m.isDTLS = c.isDTLS
2179	if c.config.Bugs.SendTicketLifetime != 0 {
2180		m.ticketLifetime = uint32(c.config.Bugs.SendTicketLifetime / time.Second)
2181	}
2182
2183	if !c.config.Bugs.SendEmptySessionTicket {
2184		var err error
2185		m.ticket, err = c.encryptTicket(&state)
2186		if err != nil {
2187			return err
2188		}
2189	}
2190
2191	hs.writeServerHash(m.marshal())
2192	if c.config.Bugs.PartialNewSessionTicketWithServerHelloDone {
2193		// The first byte was already sent.
2194		c.writeRecord(recordTypeHandshake, m.marshal()[1:])
2195	} else {
2196		c.writeRecord(recordTypeHandshake, m.marshal())
2197	}
2198
2199	return nil
2200}
2201
2202func (hs *serverHandshakeState) sendFinished(out []byte, isResume bool) error {
2203	c := hs.c
2204
2205	finished := new(finishedMsg)
2206	finished.verifyData = hs.finishedHash.serverSum(hs.masterSecret)
2207	copy(out, finished.verifyData)
2208	if c.config.Bugs.BadFinished {
2209		finished.verifyData[0]++
2210	}
2211	c.serverVerify = append(c.serverVerify[:0], finished.verifyData...)
2212	hs.finishedBytes = finished.marshal()
2213	hs.writeServerHash(hs.finishedBytes)
2214	postCCSBytes := hs.finishedBytes
2215	if c.config.Bugs.PartialFinishedWithServerHelloDone {
2216		// The first byte has already been sent.
2217		postCCSBytes = postCCSBytes[1:]
2218	}
2219
2220	if c.config.Bugs.FragmentAcrossChangeCipherSpec {
2221		c.writeRecord(recordTypeHandshake, postCCSBytes[:5])
2222		postCCSBytes = postCCSBytes[5:]
2223	} else if c.config.Bugs.SendUnencryptedFinished {
2224		c.writeRecord(recordTypeHandshake, postCCSBytes)
2225		postCCSBytes = nil
2226	}
2227
2228	if !c.config.Bugs.SkipChangeCipherSpec {
2229		ccs := []byte{1}
2230		if c.config.Bugs.BadChangeCipherSpec != nil {
2231			ccs = c.config.Bugs.BadChangeCipherSpec
2232		}
2233		c.writeRecord(recordTypeChangeCipherSpec, ccs)
2234	}
2235
2236	if c.config.Bugs.AppDataAfterChangeCipherSpec != nil {
2237		c.writeRecord(recordTypeApplicationData, c.config.Bugs.AppDataAfterChangeCipherSpec)
2238	}
2239	if c.config.Bugs.AlertAfterChangeCipherSpec != 0 {
2240		c.sendAlert(c.config.Bugs.AlertAfterChangeCipherSpec)
2241		return errors.New("tls: simulating post-CCS alert")
2242	}
2243
2244	if !c.config.Bugs.SkipFinished && len(postCCSBytes) > 0 {
2245		c.writeRecord(recordTypeHandshake, postCCSBytes)
2246		if c.config.Bugs.SendExtraFinished {
2247			c.writeRecord(recordTypeHandshake, finished.marshal())
2248		}
2249	}
2250
2251	if isResume || (!c.config.Bugs.PackHelloRequestWithFinished && !c.config.Bugs.PackAppDataWithHandshake) {
2252		// Defer flushing until Renegotiate() or Write().
2253		c.flushHandshake()
2254	}
2255
2256	c.cipherSuite = hs.suite
2257
2258	return nil
2259}
2260
2261// processCertsFromClient takes a chain of client certificates either from a
2262// Certificates message or from a sessionState and verifies them. It returns
2263// the public key of the leaf certificate.
2264func (hs *serverHandshakeState) processCertsFromClient(certificates [][]byte) (crypto.PublicKey, error) {
2265	c := hs.c
2266
2267	hs.certsFromClient = certificates
2268	certs := make([]*x509.Certificate, len(certificates))
2269	var err error
2270	for i, asn1Data := range certificates {
2271		if certs[i], err = x509.ParseCertificate(asn1Data); err != nil {
2272			c.sendAlert(alertBadCertificate)
2273			return nil, errors.New("tls: failed to parse client certificate: " + err.Error())
2274		}
2275	}
2276
2277	if c.config.ClientAuth >= VerifyClientCertIfGiven && len(certs) > 0 {
2278		opts := x509.VerifyOptions{
2279			Roots:         c.config.ClientCAs,
2280			CurrentTime:   c.config.time(),
2281			Intermediates: x509.NewCertPool(),
2282			KeyUsages:     []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth},
2283		}
2284
2285		for _, cert := range certs[1:] {
2286			opts.Intermediates.AddCert(cert)
2287		}
2288
2289		chains, err := certs[0].Verify(opts)
2290		if err != nil {
2291			c.sendAlert(alertBadCertificate)
2292			return nil, errors.New("tls: failed to verify client's certificate: " + err.Error())
2293		}
2294
2295		ok := false
2296		for _, ku := range certs[0].ExtKeyUsage {
2297			if ku == x509.ExtKeyUsageClientAuth {
2298				ok = true
2299				break
2300			}
2301		}
2302		if !ok {
2303			c.sendAlert(alertHandshakeFailure)
2304			return nil, errors.New("tls: client's certificate's extended key usage doesn't permit it to be used for client authentication")
2305		}
2306
2307		c.verifiedChains = chains
2308	}
2309
2310	if len(certs) > 0 {
2311		pub := certs[0].PublicKey
2312		switch pub.(type) {
2313		case *ecdsa.PublicKey, *rsa.PublicKey, ed25519.PublicKey:
2314			break
2315		default:
2316			c.sendAlert(alertUnsupportedCertificate)
2317			return nil, fmt.Errorf("tls: client's certificate contains an unsupported public key of type %T", pub)
2318		}
2319		c.peerCertificates = certs
2320		return pub, nil
2321	}
2322
2323	return nil, nil
2324}
2325
2326func verifyChannelIDMessage(channelIDMsg *channelIDMsg, channelIDHash []byte) (*ecdsa.PublicKey, error) {
2327	x := new(big.Int).SetBytes(channelIDMsg.channelID[0:32])
2328	y := new(big.Int).SetBytes(channelIDMsg.channelID[32:64])
2329	r := new(big.Int).SetBytes(channelIDMsg.channelID[64:96])
2330	s := new(big.Int).SetBytes(channelIDMsg.channelID[96:128])
2331	if !elliptic.P256().IsOnCurve(x, y) {
2332		return nil, errors.New("tls: invalid channel ID public key")
2333	}
2334	channelID := &ecdsa.PublicKey{Curve: elliptic.P256(), X: x, Y: y}
2335	if !ecdsa.Verify(channelID, channelIDHash, r, s) {
2336		return nil, errors.New("tls: invalid channel ID signature")
2337	}
2338	return channelID, nil
2339}
2340
2341func (hs *serverHandshakeState) writeServerHash(msg []byte) {
2342	// writeServerHash is called before writeRecord.
2343	hs.finishedHash.WriteHandshake(msg, hs.c.sendHandshakeSeq)
2344}
2345
2346func (hs *serverHandshakeState) writeClientHash(msg []byte) {
2347	// writeClientHash is called after readHandshake.
2348	hs.finishedHash.WriteHandshake(msg, hs.c.recvHandshakeSeq-1)
2349}
2350
2351// tryCipherSuite returns a cipherSuite with the given id if that cipher suite
2352// is acceptable to use.
2353func (c *Conn) tryCipherSuite(id uint16, supportedCipherSuites []uint16, version uint16, ellipticOk, ecdsaOk bool) *cipherSuite {
2354	for _, supported := range supportedCipherSuites {
2355		if id == supported {
2356			var candidate *cipherSuite
2357
2358			for _, s := range cipherSuites {
2359				if s.id == id {
2360					candidate = s
2361					break
2362				}
2363			}
2364			if candidate == nil {
2365				continue
2366			}
2367
2368			// Don't select a ciphersuite which we can't
2369			// support for this client.
2370			if version >= VersionTLS13 || candidate.flags&suiteTLS13 != 0 {
2371				if version < VersionTLS13 || candidate.flags&suiteTLS13 == 0 {
2372					continue
2373				}
2374				return candidate
2375			}
2376			if (candidate.flags&suiteECDHE != 0) && !ellipticOk {
2377				continue
2378			}
2379			if (candidate.flags&suiteECDSA != 0) != ecdsaOk {
2380				continue
2381			}
2382			if version < VersionTLS12 && candidate.flags&suiteTLS12 != 0 {
2383				continue
2384			}
2385			return candidate
2386		}
2387	}
2388
2389	return nil
2390}
2391
2392func isTLS12Cipher(id uint16) bool {
2393	for _, cipher := range cipherSuites {
2394		if cipher.id != id {
2395			continue
2396		}
2397		return cipher.flags&suiteTLS12 != 0
2398	}
2399	// Unknown cipher.
2400	return false
2401}
2402
2403func isGREASEValue(val uint16) bool {
2404	return val&0x0f0f == 0x0a0a && val&0xff == val>>8
2405}
2406
2407func verifyPSKBinder(version uint16, clientHello *clientHelloMsg, sessionState *sessionState, binderToVerify, firstClientHello, helloRetryRequest []byte) error {
2408	binderLen := 2
2409	for _, binder := range clientHello.pskBinders {
2410		binderLen += 1 + len(binder)
2411	}
2412
2413	truncatedHello := clientHello.marshal()
2414	truncatedHello = truncatedHello[:len(truncatedHello)-binderLen]
2415	pskCipherSuite := cipherSuiteFromID(sessionState.cipherSuite)
2416	if pskCipherSuite == nil {
2417		return errors.New("tls: Unknown cipher suite for PSK in session")
2418	}
2419
2420	binder := computePSKBinder(sessionState.secret, version, resumptionPSKBinderLabel, pskCipherSuite, firstClientHello, helloRetryRequest, truncatedHello)
2421	if !bytes.Equal(binder, binderToVerify) {
2422		return errors.New("tls: PSK binder does not verify")
2423	}
2424
2425	return nil
2426}
2427
2428// checkClientHellosEqual checks whether a and b are equal ClientHello
2429// messages. If isDTLS is true, the ClientHellos are parsed as DTLS and any
2430// differences in the cookie field are ignored. Extensions listed in
2431// ignoreExtensions may change or be removed between the two ClientHellos.
2432func checkClientHellosEqual(a, b []byte, isDTLS bool, ignoreExtensions []uint16) error {
2433	ignoreExtensionsSet := make(map[uint16]struct{})
2434	for _, ext := range ignoreExtensions {
2435		ignoreExtensionsSet[ext] = struct{}{}
2436	}
2437
2438	// Skip the handshake message header.
2439	aReader := byteReader(a[4:])
2440	bReader := byteReader(b[4:])
2441
2442	var aVers, bVers uint16
2443	var aRandom, bRandom []byte
2444	var aSessionID, bSessionID []byte
2445	if !aReader.readU16(&aVers) ||
2446		!bReader.readU16(&bVers) ||
2447		!aReader.readBytes(&aRandom, 32) ||
2448		!bReader.readBytes(&bRandom, 32) ||
2449		!aReader.readU8LengthPrefixedBytes(&aSessionID) ||
2450		!bReader.readU8LengthPrefixedBytes(&bSessionID) {
2451		return errors.New("tls: could not parse ClientHello")
2452	}
2453
2454	if aVers != bVers {
2455		return errors.New("tls: second ClientHello version did not match")
2456	}
2457	if !bytes.Equal(aRandom, bRandom) {
2458		return errors.New("tls: second ClientHello random did not match")
2459	}
2460	if !bytes.Equal(aSessionID, bSessionID) {
2461		return errors.New("tls: second ClientHello session ID did not match")
2462	}
2463
2464	if isDTLS {
2465		// DTLS 1.2 checks two ClientHellos match after a HelloVerifyRequest,
2466		// where we expect the cookies to change. DTLS 1.3 forbids the legacy
2467		// cookie altogether. If we implement DTLS 1.3, we'll need to ensure
2468		// that parsing logic above this function rejects this cookie.
2469		var aCookie, bCookie []byte
2470		if !aReader.readU8LengthPrefixedBytes(&aCookie) ||
2471			!bReader.readU8LengthPrefixedBytes(&bCookie) {
2472			return errors.New("tls: could not parse ClientHello")
2473		}
2474	}
2475
2476	var aCipherSuites, bCipherSuites, aCompressionMethods, bCompressionMethods []byte
2477	if !aReader.readU16LengthPrefixedBytes(&aCipherSuites) ||
2478		!bReader.readU16LengthPrefixedBytes(&bCipherSuites) ||
2479		!aReader.readU8LengthPrefixedBytes(&aCompressionMethods) ||
2480		!bReader.readU8LengthPrefixedBytes(&bCompressionMethods) {
2481		return errors.New("tls: could not parse ClientHello")
2482	}
2483	if !bytes.Equal(aCipherSuites, bCipherSuites) {
2484		return errors.New("tls: second ClientHello cipher suites did not match")
2485	}
2486	if !bytes.Equal(aCompressionMethods, bCompressionMethods) {
2487		return errors.New("tls: second ClientHello compression methods did not match")
2488	}
2489
2490	if len(aReader) == 0 && len(bReader) == 0 {
2491		// Both ClientHellos omit the extensions block.
2492		return nil
2493	}
2494
2495	var aExtensions, bExtensions byteReader
2496	if !aReader.readU16LengthPrefixed(&aExtensions) ||
2497		!bReader.readU16LengthPrefixed(&bExtensions) ||
2498		len(aReader) != 0 ||
2499		len(bReader) != 0 {
2500		return errors.New("tls: could not parse ClientHello")
2501	}
2502
2503	for len(aExtensions) != 0 {
2504		var aID uint16
2505		var aBody []byte
2506		if !aExtensions.readU16(&aID) ||
2507			!aExtensions.readU16LengthPrefixedBytes(&aBody) {
2508			return errors.New("tls: could not parse ClientHello")
2509		}
2510		if _, ok := ignoreExtensionsSet[aID]; ok {
2511			continue
2512		}
2513
2514		for {
2515			if len(bExtensions) == 0 {
2516				return fmt.Errorf("tls: second ClientHello missing extension %d", aID)
2517			}
2518			var bID uint16
2519			var bBody []byte
2520			if !bExtensions.readU16(&bID) ||
2521				!bExtensions.readU16LengthPrefixedBytes(&bBody) {
2522				return errors.New("tls: could not parse ClientHello")
2523			}
2524			if _, ok := ignoreExtensionsSet[bID]; ok {
2525				continue
2526			}
2527			if aID != bID {
2528				return fmt.Errorf("tls: unexpected extension %d in second ClientHello (wanted %d)", bID, aID)
2529			}
2530			if !bytes.Equal(aBody, bBody) {
2531				return fmt.Errorf("tls: extension %d in second ClientHello unexpectedly changed", aID)
2532			}
2533			break
2534		}
2535	}
2536
2537	// Any remaining extensions in the second ClientHello must be in the
2538	// ignored set.
2539	for len(bExtensions) != 0 {
2540		var id uint16
2541		var body []byte
2542		if !bExtensions.readU16(&id) ||
2543			!bExtensions.readU16LengthPrefixedBytes(&body) {
2544			return errors.New("tls: could not parse ClientHello")
2545		}
2546		if _, ok := ignoreExtensionsSet[id]; !ok {
2547			return fmt.Errorf("tls: unexpected extension %d in second ClientHello", id)
2548		}
2549	}
2550
2551	return nil
2552}
2553