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 tls
6
7import (
8	"context"
9	"crypto"
10	"crypto/ecdsa"
11	"crypto/ed25519"
12	"crypto/rsa"
13	"crypto/subtle"
14	"crypto/x509"
15	"errors"
16	"fmt"
17	"hash"
18	"internal/byteorder"
19	"io"
20	"time"
21)
22
23// serverHandshakeState contains details of a server handshake in progress.
24// It's discarded once the handshake has completed.
25type serverHandshakeState struct {
26	c            *Conn
27	ctx          context.Context
28	clientHello  *clientHelloMsg
29	hello        *serverHelloMsg
30	suite        *cipherSuite
31	ecdheOk      bool
32	ecSignOk     bool
33	rsaDecryptOk bool
34	rsaSignOk    bool
35	sessionState *SessionState
36	finishedHash finishedHash
37	masterSecret []byte
38	cert         *Certificate
39}
40
41// serverHandshake performs a TLS handshake as a server.
42func (c *Conn) serverHandshake(ctx context.Context) error {
43	clientHello, err := c.readClientHello(ctx)
44	if err != nil {
45		return err
46	}
47
48	if c.vers == VersionTLS13 {
49		hs := serverHandshakeStateTLS13{
50			c:           c,
51			ctx:         ctx,
52			clientHello: clientHello,
53		}
54		return hs.handshake()
55	}
56
57	hs := serverHandshakeState{
58		c:           c,
59		ctx:         ctx,
60		clientHello: clientHello,
61	}
62	return hs.handshake()
63}
64
65func (hs *serverHandshakeState) handshake() error {
66	c := hs.c
67
68	if err := hs.processClientHello(); err != nil {
69		return err
70	}
71
72	// For an overview of TLS handshaking, see RFC 5246, Section 7.3.
73	c.buffering = true
74	if err := hs.checkForResumption(); err != nil {
75		return err
76	}
77	if hs.sessionState != nil {
78		// The client has included a session ticket and so we do an abbreviated handshake.
79		if err := hs.doResumeHandshake(); err != nil {
80			return err
81		}
82		if err := hs.establishKeys(); err != nil {
83			return err
84		}
85		if err := hs.sendSessionTicket(); err != nil {
86			return err
87		}
88		if err := hs.sendFinished(c.serverFinished[:]); err != nil {
89			return err
90		}
91		if _, err := c.flush(); err != nil {
92			return err
93		}
94		c.clientFinishedIsFirst = false
95		if err := hs.readFinished(nil); err != nil {
96			return err
97		}
98	} else {
99		// The client didn't include a session ticket, or it wasn't
100		// valid so we do a full handshake.
101		if err := hs.pickCipherSuite(); err != nil {
102			return err
103		}
104		if err := hs.doFullHandshake(); err != nil {
105			return err
106		}
107		if err := hs.establishKeys(); err != nil {
108			return err
109		}
110		if err := hs.readFinished(c.clientFinished[:]); err != nil {
111			return err
112		}
113		c.clientFinishedIsFirst = true
114		c.buffering = true
115		if err := hs.sendSessionTicket(); err != nil {
116			return err
117		}
118		if err := hs.sendFinished(nil); err != nil {
119			return err
120		}
121		if _, err := c.flush(); err != nil {
122			return err
123		}
124	}
125
126	c.ekm = ekmFromMasterSecret(c.vers, hs.suite, hs.masterSecret, hs.clientHello.random, hs.hello.random)
127	c.isHandshakeComplete.Store(true)
128
129	return nil
130}
131
132// readClientHello reads a ClientHello message and selects the protocol version.
133func (c *Conn) readClientHello(ctx context.Context) (*clientHelloMsg, error) {
134	// clientHelloMsg is included in the transcript, but we haven't initialized
135	// it yet. The respective handshake functions will record it themselves.
136	msg, err := c.readHandshake(nil)
137	if err != nil {
138		return nil, err
139	}
140	clientHello, ok := msg.(*clientHelloMsg)
141	if !ok {
142		c.sendAlert(alertUnexpectedMessage)
143		return nil, unexpectedMessageError(clientHello, msg)
144	}
145
146	var configForClient *Config
147	originalConfig := c.config
148	if c.config.GetConfigForClient != nil {
149		chi := clientHelloInfo(ctx, c, clientHello)
150		if configForClient, err = c.config.GetConfigForClient(chi); err != nil {
151			c.sendAlert(alertInternalError)
152			return nil, err
153		} else if configForClient != nil {
154			c.config = configForClient
155		}
156	}
157	c.ticketKeys = originalConfig.ticketKeys(configForClient)
158
159	clientVersions := clientHello.supportedVersions
160	if len(clientHello.supportedVersions) == 0 {
161		clientVersions = supportedVersionsFromMax(clientHello.vers)
162	}
163	c.vers, ok = c.config.mutualVersion(roleServer, clientVersions)
164	if !ok {
165		c.sendAlert(alertProtocolVersion)
166		return nil, fmt.Errorf("tls: client offered only unsupported versions: %x", clientVersions)
167	}
168	c.haveVers = true
169	c.in.version = c.vers
170	c.out.version = c.vers
171
172	if c.config.MinVersion == 0 && c.vers < VersionTLS12 {
173		tls10server.Value() // ensure godebug is initialized
174		tls10server.IncNonDefault()
175	}
176
177	return clientHello, nil
178}
179
180func (hs *serverHandshakeState) processClientHello() error {
181	c := hs.c
182
183	hs.hello = new(serverHelloMsg)
184	hs.hello.vers = c.vers
185
186	foundCompression := false
187	// We only support null compression, so check that the client offered it.
188	for _, compression := range hs.clientHello.compressionMethods {
189		if compression == compressionNone {
190			foundCompression = true
191			break
192		}
193	}
194
195	if !foundCompression {
196		c.sendAlert(alertHandshakeFailure)
197		return errors.New("tls: client does not support uncompressed connections")
198	}
199
200	hs.hello.random = make([]byte, 32)
201	serverRandom := hs.hello.random
202	// Downgrade protection canaries. See RFC 8446, Section 4.1.3.
203	maxVers := c.config.maxSupportedVersion(roleServer)
204	if maxVers >= VersionTLS12 && c.vers < maxVers || testingOnlyForceDowngradeCanary {
205		if c.vers == VersionTLS12 {
206			copy(serverRandom[24:], downgradeCanaryTLS12)
207		} else {
208			copy(serverRandom[24:], downgradeCanaryTLS11)
209		}
210		serverRandom = serverRandom[:24]
211	}
212	_, err := io.ReadFull(c.config.rand(), serverRandom)
213	if err != nil {
214		c.sendAlert(alertInternalError)
215		return err
216	}
217
218	if len(hs.clientHello.secureRenegotiation) != 0 {
219		c.sendAlert(alertHandshakeFailure)
220		return errors.New("tls: initial handshake had non-empty renegotiation extension")
221	}
222
223	hs.hello.extendedMasterSecret = hs.clientHello.extendedMasterSecret
224	hs.hello.secureRenegotiationSupported = hs.clientHello.secureRenegotiationSupported
225	hs.hello.compressionMethod = compressionNone
226	if len(hs.clientHello.serverName) > 0 {
227		c.serverName = hs.clientHello.serverName
228	}
229
230	selectedProto, err := negotiateALPN(c.config.NextProtos, hs.clientHello.alpnProtocols, false)
231	if err != nil {
232		c.sendAlert(alertNoApplicationProtocol)
233		return err
234	}
235	hs.hello.alpnProtocol = selectedProto
236	c.clientProtocol = selectedProto
237
238	hs.cert, err = c.config.getCertificate(clientHelloInfo(hs.ctx, c, hs.clientHello))
239	if err != nil {
240		if err == errNoCertificates {
241			c.sendAlert(alertUnrecognizedName)
242		} else {
243			c.sendAlert(alertInternalError)
244		}
245		return err
246	}
247	if hs.clientHello.scts {
248		hs.hello.scts = hs.cert.SignedCertificateTimestamps
249	}
250
251	hs.ecdheOk = supportsECDHE(c.config, c.vers, hs.clientHello.supportedCurves, hs.clientHello.supportedPoints)
252
253	if hs.ecdheOk && len(hs.clientHello.supportedPoints) > 0 {
254		// Although omitting the ec_point_formats extension is permitted, some
255		// old OpenSSL version will refuse to handshake if not present.
256		//
257		// Per RFC 4492, section 5.1.2, implementations MUST support the
258		// uncompressed point format. See golang.org/issue/31943.
259		hs.hello.supportedPoints = []uint8{pointFormatUncompressed}
260	}
261
262	if priv, ok := hs.cert.PrivateKey.(crypto.Signer); ok {
263		switch priv.Public().(type) {
264		case *ecdsa.PublicKey:
265			hs.ecSignOk = true
266		case ed25519.PublicKey:
267			hs.ecSignOk = true
268		case *rsa.PublicKey:
269			hs.rsaSignOk = true
270		default:
271			c.sendAlert(alertInternalError)
272			return fmt.Errorf("tls: unsupported signing key type (%T)", priv.Public())
273		}
274	}
275	if priv, ok := hs.cert.PrivateKey.(crypto.Decrypter); ok {
276		switch priv.Public().(type) {
277		case *rsa.PublicKey:
278			hs.rsaDecryptOk = true
279		default:
280			c.sendAlert(alertInternalError)
281			return fmt.Errorf("tls: unsupported decryption key type (%T)", priv.Public())
282		}
283	}
284
285	return nil
286}
287
288// negotiateALPN picks a shared ALPN protocol that both sides support in server
289// preference order. If ALPN is not configured or the peer doesn't support it,
290// it returns "" and no error.
291func negotiateALPN(serverProtos, clientProtos []string, quic bool) (string, error) {
292	if len(serverProtos) == 0 || len(clientProtos) == 0 {
293		if quic && len(serverProtos) != 0 {
294			// RFC 9001, Section 8.1
295			return "", fmt.Errorf("tls: client did not request an application protocol")
296		}
297		return "", nil
298	}
299	var http11fallback bool
300	for _, s := range serverProtos {
301		for _, c := range clientProtos {
302			if s == c {
303				return s, nil
304			}
305			if s == "h2" && c == "http/1.1" {
306				http11fallback = true
307			}
308		}
309	}
310	// As a special case, let http/1.1 clients connect to h2 servers as if they
311	// didn't support ALPN. We used not to enforce protocol overlap, so over
312	// time a number of HTTP servers were configured with only "h2", but
313	// expected to accept connections from "http/1.1" clients. See Issue 46310.
314	if http11fallback {
315		return "", nil
316	}
317	return "", fmt.Errorf("tls: client requested unsupported application protocols (%s)", clientProtos)
318}
319
320// supportsECDHE returns whether ECDHE key exchanges can be used with this
321// pre-TLS 1.3 client.
322func supportsECDHE(c *Config, version uint16, supportedCurves []CurveID, supportedPoints []uint8) bool {
323	supportsCurve := false
324	for _, curve := range supportedCurves {
325		if c.supportsCurve(version, curve) {
326			supportsCurve = true
327			break
328		}
329	}
330
331	supportsPointFormat := false
332	for _, pointFormat := range supportedPoints {
333		if pointFormat == pointFormatUncompressed {
334			supportsPointFormat = true
335			break
336		}
337	}
338	// Per RFC 8422, Section 5.1.2, if the Supported Point Formats extension is
339	// missing, uncompressed points are supported. If supportedPoints is empty,
340	// the extension must be missing, as an empty extension body is rejected by
341	// the parser. See https://go.dev/issue/49126.
342	if len(supportedPoints) == 0 {
343		supportsPointFormat = true
344	}
345
346	return supportsCurve && supportsPointFormat
347}
348
349func (hs *serverHandshakeState) pickCipherSuite() error {
350	c := hs.c
351
352	preferenceOrder := cipherSuitesPreferenceOrder
353	if !hasAESGCMHardwareSupport || !aesgcmPreferred(hs.clientHello.cipherSuites) {
354		preferenceOrder = cipherSuitesPreferenceOrderNoAES
355	}
356
357	configCipherSuites := c.config.cipherSuites()
358	preferenceList := make([]uint16, 0, len(configCipherSuites))
359	for _, suiteID := range preferenceOrder {
360		for _, id := range configCipherSuites {
361			if id == suiteID {
362				preferenceList = append(preferenceList, id)
363				break
364			}
365		}
366	}
367
368	hs.suite = selectCipherSuite(preferenceList, hs.clientHello.cipherSuites, hs.cipherSuiteOk)
369	if hs.suite == nil {
370		c.sendAlert(alertHandshakeFailure)
371		return errors.New("tls: no cipher suite supported by both client and server")
372	}
373	c.cipherSuite = hs.suite.id
374
375	if c.config.CipherSuites == nil && !needFIPS() && rsaKexCiphers[hs.suite.id] {
376		tlsrsakex.Value() // ensure godebug is initialized
377		tlsrsakex.IncNonDefault()
378	}
379	if c.config.CipherSuites == nil && !needFIPS() && tdesCiphers[hs.suite.id] {
380		tls3des.Value() // ensure godebug is initialized
381		tls3des.IncNonDefault()
382	}
383
384	for _, id := range hs.clientHello.cipherSuites {
385		if id == TLS_FALLBACK_SCSV {
386			// The client is doing a fallback connection. See RFC 7507.
387			if hs.clientHello.vers < c.config.maxSupportedVersion(roleServer) {
388				c.sendAlert(alertInappropriateFallback)
389				return errors.New("tls: client using inappropriate protocol fallback")
390			}
391			break
392		}
393	}
394
395	return nil
396}
397
398func (hs *serverHandshakeState) cipherSuiteOk(c *cipherSuite) bool {
399	if c.flags&suiteECDHE != 0 {
400		if !hs.ecdheOk {
401			return false
402		}
403		if c.flags&suiteECSign != 0 {
404			if !hs.ecSignOk {
405				return false
406			}
407		} else if !hs.rsaSignOk {
408			return false
409		}
410	} else if !hs.rsaDecryptOk {
411		return false
412	}
413	if hs.c.vers < VersionTLS12 && c.flags&suiteTLS12 != 0 {
414		return false
415	}
416	return true
417}
418
419// checkForResumption reports whether we should perform resumption on this connection.
420func (hs *serverHandshakeState) checkForResumption() error {
421	c := hs.c
422
423	if c.config.SessionTicketsDisabled {
424		return nil
425	}
426
427	var sessionState *SessionState
428	if c.config.UnwrapSession != nil {
429		ss, err := c.config.UnwrapSession(hs.clientHello.sessionTicket, c.connectionStateLocked())
430		if err != nil {
431			return err
432		}
433		if ss == nil {
434			return nil
435		}
436		sessionState = ss
437	} else {
438		plaintext := c.config.decryptTicket(hs.clientHello.sessionTicket, c.ticketKeys)
439		if plaintext == nil {
440			return nil
441		}
442		ss, err := ParseSessionState(plaintext)
443		if err != nil {
444			return nil
445		}
446		sessionState = ss
447	}
448
449	// TLS 1.2 tickets don't natively have a lifetime, but we want to avoid
450	// re-wrapping the same master secret in different tickets over and over for
451	// too long, weakening forward secrecy.
452	createdAt := time.Unix(int64(sessionState.createdAt), 0)
453	if c.config.time().Sub(createdAt) > maxSessionTicketLifetime {
454		return nil
455	}
456
457	// Never resume a session for a different TLS version.
458	if c.vers != sessionState.version {
459		return nil
460	}
461
462	cipherSuiteOk := false
463	// Check that the client is still offering the ciphersuite in the session.
464	for _, id := range hs.clientHello.cipherSuites {
465		if id == sessionState.cipherSuite {
466			cipherSuiteOk = true
467			break
468		}
469	}
470	if !cipherSuiteOk {
471		return nil
472	}
473
474	// Check that we also support the ciphersuite from the session.
475	suite := selectCipherSuite([]uint16{sessionState.cipherSuite},
476		c.config.cipherSuites(), hs.cipherSuiteOk)
477	if suite == nil {
478		return nil
479	}
480
481	sessionHasClientCerts := len(sessionState.peerCertificates) != 0
482	needClientCerts := requiresClientCert(c.config.ClientAuth)
483	if needClientCerts && !sessionHasClientCerts {
484		return nil
485	}
486	if sessionHasClientCerts && c.config.ClientAuth == NoClientCert {
487		return nil
488	}
489	if sessionHasClientCerts && c.config.time().After(sessionState.peerCertificates[0].NotAfter) {
490		return nil
491	}
492	if sessionHasClientCerts && c.config.ClientAuth >= VerifyClientCertIfGiven &&
493		len(sessionState.verifiedChains) == 0 {
494		return nil
495	}
496
497	// RFC 7627, Section 5.3
498	if !sessionState.extMasterSecret && hs.clientHello.extendedMasterSecret {
499		return nil
500	}
501	if sessionState.extMasterSecret && !hs.clientHello.extendedMasterSecret {
502		// Aborting is somewhat harsh, but it's a MUST and it would indicate a
503		// weird downgrade in client capabilities.
504		return errors.New("tls: session supported extended_master_secret but client does not")
505	}
506
507	c.peerCertificates = sessionState.peerCertificates
508	c.ocspResponse = sessionState.ocspResponse
509	c.scts = sessionState.scts
510	c.verifiedChains = sessionState.verifiedChains
511	c.extMasterSecret = sessionState.extMasterSecret
512	hs.sessionState = sessionState
513	hs.suite = suite
514	c.didResume = true
515	return nil
516}
517
518func (hs *serverHandshakeState) doResumeHandshake() error {
519	c := hs.c
520
521	hs.hello.cipherSuite = hs.suite.id
522	c.cipherSuite = hs.suite.id
523	// We echo the client's session ID in the ServerHello to let it know
524	// that we're doing a resumption.
525	hs.hello.sessionId = hs.clientHello.sessionId
526	// We always send a new session ticket, even if it wraps the same master
527	// secret and it's potentially encrypted with the same key, to help the
528	// client avoid cross-connection tracking from a network observer.
529	hs.hello.ticketSupported = true
530	hs.finishedHash = newFinishedHash(c.vers, hs.suite)
531	hs.finishedHash.discardHandshakeBuffer()
532	if err := transcriptMsg(hs.clientHello, &hs.finishedHash); err != nil {
533		return err
534	}
535	if _, err := hs.c.writeHandshakeRecord(hs.hello, &hs.finishedHash); err != nil {
536		return err
537	}
538
539	if c.config.VerifyConnection != nil {
540		if err := c.config.VerifyConnection(c.connectionStateLocked()); err != nil {
541			c.sendAlert(alertBadCertificate)
542			return err
543		}
544	}
545
546	hs.masterSecret = hs.sessionState.secret
547
548	return nil
549}
550
551func (hs *serverHandshakeState) doFullHandshake() error {
552	c := hs.c
553
554	if hs.clientHello.ocspStapling && len(hs.cert.OCSPStaple) > 0 {
555		hs.hello.ocspStapling = true
556	}
557
558	hs.hello.ticketSupported = hs.clientHello.ticketSupported && !c.config.SessionTicketsDisabled
559	hs.hello.cipherSuite = hs.suite.id
560
561	hs.finishedHash = newFinishedHash(hs.c.vers, hs.suite)
562	if c.config.ClientAuth == NoClientCert {
563		// No need to keep a full record of the handshake if client
564		// certificates won't be used.
565		hs.finishedHash.discardHandshakeBuffer()
566	}
567	if err := transcriptMsg(hs.clientHello, &hs.finishedHash); err != nil {
568		return err
569	}
570	if _, err := hs.c.writeHandshakeRecord(hs.hello, &hs.finishedHash); err != nil {
571		return err
572	}
573
574	certMsg := new(certificateMsg)
575	certMsg.certificates = hs.cert.Certificate
576	if _, err := hs.c.writeHandshakeRecord(certMsg, &hs.finishedHash); err != nil {
577		return err
578	}
579
580	if hs.hello.ocspStapling {
581		certStatus := new(certificateStatusMsg)
582		certStatus.response = hs.cert.OCSPStaple
583		if _, err := hs.c.writeHandshakeRecord(certStatus, &hs.finishedHash); err != nil {
584			return err
585		}
586	}
587
588	keyAgreement := hs.suite.ka(c.vers)
589	skx, err := keyAgreement.generateServerKeyExchange(c.config, hs.cert, hs.clientHello, hs.hello)
590	if err != nil {
591		c.sendAlert(alertHandshakeFailure)
592		return err
593	}
594	if skx != nil {
595		if len(skx.key) >= 3 && skx.key[0] == 3 /* named curve */ {
596			c.curveID = CurveID(byteorder.BeUint16(skx.key[1:]))
597		}
598		if _, err := hs.c.writeHandshakeRecord(skx, &hs.finishedHash); err != nil {
599			return err
600		}
601	}
602
603	var certReq *certificateRequestMsg
604	if c.config.ClientAuth >= RequestClientCert {
605		// Request a client certificate
606		certReq = new(certificateRequestMsg)
607		certReq.certificateTypes = []byte{
608			byte(certTypeRSASign),
609			byte(certTypeECDSASign),
610		}
611		if c.vers >= VersionTLS12 {
612			certReq.hasSignatureAlgorithm = true
613			certReq.supportedSignatureAlgorithms = supportedSignatureAlgorithms()
614		}
615
616		// An empty list of certificateAuthorities signals to
617		// the client that it may send any certificate in response
618		// to our request. When we know the CAs we trust, then
619		// we can send them down, so that the client can choose
620		// an appropriate certificate to give to us.
621		if c.config.ClientCAs != nil {
622			certReq.certificateAuthorities = c.config.ClientCAs.Subjects()
623		}
624		if _, err := hs.c.writeHandshakeRecord(certReq, &hs.finishedHash); err != nil {
625			return err
626		}
627	}
628
629	helloDone := new(serverHelloDoneMsg)
630	if _, err := hs.c.writeHandshakeRecord(helloDone, &hs.finishedHash); err != nil {
631		return err
632	}
633
634	if _, err := c.flush(); err != nil {
635		return err
636	}
637
638	var pub crypto.PublicKey // public key for client auth, if any
639
640	msg, err := c.readHandshake(&hs.finishedHash)
641	if err != nil {
642		return err
643	}
644
645	// If we requested a client certificate, then the client must send a
646	// certificate message, even if it's empty.
647	if c.config.ClientAuth >= RequestClientCert {
648		certMsg, ok := msg.(*certificateMsg)
649		if !ok {
650			c.sendAlert(alertUnexpectedMessage)
651			return unexpectedMessageError(certMsg, msg)
652		}
653
654		if err := c.processCertsFromClient(Certificate{
655			Certificate: certMsg.certificates,
656		}); err != nil {
657			return err
658		}
659		if len(certMsg.certificates) != 0 {
660			pub = c.peerCertificates[0].PublicKey
661		}
662
663		msg, err = c.readHandshake(&hs.finishedHash)
664		if err != nil {
665			return err
666		}
667	}
668	if c.config.VerifyConnection != nil {
669		if err := c.config.VerifyConnection(c.connectionStateLocked()); err != nil {
670			c.sendAlert(alertBadCertificate)
671			return err
672		}
673	}
674
675	// Get client key exchange
676	ckx, ok := msg.(*clientKeyExchangeMsg)
677	if !ok {
678		c.sendAlert(alertUnexpectedMessage)
679		return unexpectedMessageError(ckx, msg)
680	}
681
682	preMasterSecret, err := keyAgreement.processClientKeyExchange(c.config, hs.cert, ckx, c.vers)
683	if err != nil {
684		c.sendAlert(alertHandshakeFailure)
685		return err
686	}
687	if hs.hello.extendedMasterSecret {
688		c.extMasterSecret = true
689		hs.masterSecret = extMasterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret,
690			hs.finishedHash.Sum())
691	} else {
692		hs.masterSecret = masterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret,
693			hs.clientHello.random, hs.hello.random)
694	}
695	if err := c.config.writeKeyLog(keyLogLabelTLS12, hs.clientHello.random, hs.masterSecret); err != nil {
696		c.sendAlert(alertInternalError)
697		return err
698	}
699
700	// If we received a client cert in response to our certificate request message,
701	// the client will send us a certificateVerifyMsg immediately after the
702	// clientKeyExchangeMsg. This message is a digest of all preceding
703	// handshake-layer messages that is signed using the private key corresponding
704	// to the client's certificate. This allows us to verify that the client is in
705	// possession of the private key of the certificate.
706	if len(c.peerCertificates) > 0 {
707		// certificateVerifyMsg is included in the transcript, but not until
708		// after we verify the handshake signature, since the state before
709		// this message was sent is used.
710		msg, err = c.readHandshake(nil)
711		if err != nil {
712			return err
713		}
714		certVerify, ok := msg.(*certificateVerifyMsg)
715		if !ok {
716			c.sendAlert(alertUnexpectedMessage)
717			return unexpectedMessageError(certVerify, msg)
718		}
719
720		var sigType uint8
721		var sigHash crypto.Hash
722		if c.vers >= VersionTLS12 {
723			if !isSupportedSignatureAlgorithm(certVerify.signatureAlgorithm, certReq.supportedSignatureAlgorithms) {
724				c.sendAlert(alertIllegalParameter)
725				return errors.New("tls: client certificate used with invalid signature algorithm")
726			}
727			sigType, sigHash, err = typeAndHashFromSignatureScheme(certVerify.signatureAlgorithm)
728			if err != nil {
729				return c.sendAlert(alertInternalError)
730			}
731		} else {
732			sigType, sigHash, err = legacyTypeAndHashFromPublicKey(pub)
733			if err != nil {
734				c.sendAlert(alertIllegalParameter)
735				return err
736			}
737		}
738
739		signed := hs.finishedHash.hashForClientCertificate(sigType, sigHash)
740		if err := verifyHandshakeSignature(sigType, pub, sigHash, signed, certVerify.signature); err != nil {
741			c.sendAlert(alertDecryptError)
742			return errors.New("tls: invalid signature by the client certificate: " + err.Error())
743		}
744
745		if err := transcriptMsg(certVerify, &hs.finishedHash); err != nil {
746			return err
747		}
748	}
749
750	hs.finishedHash.discardHandshakeBuffer()
751
752	return nil
753}
754
755func (hs *serverHandshakeState) establishKeys() error {
756	c := hs.c
757
758	clientMAC, serverMAC, clientKey, serverKey, clientIV, serverIV :=
759		keysFromMasterSecret(c.vers, hs.suite, hs.masterSecret, hs.clientHello.random, hs.hello.random, hs.suite.macLen, hs.suite.keyLen, hs.suite.ivLen)
760
761	var clientCipher, serverCipher any
762	var clientHash, serverHash hash.Hash
763
764	if hs.suite.aead == nil {
765		clientCipher = hs.suite.cipher(clientKey, clientIV, true /* for reading */)
766		clientHash = hs.suite.mac(clientMAC)
767		serverCipher = hs.suite.cipher(serverKey, serverIV, false /* not for reading */)
768		serverHash = hs.suite.mac(serverMAC)
769	} else {
770		clientCipher = hs.suite.aead(clientKey, clientIV)
771		serverCipher = hs.suite.aead(serverKey, serverIV)
772	}
773
774	c.in.prepareCipherSpec(c.vers, clientCipher, clientHash)
775	c.out.prepareCipherSpec(c.vers, serverCipher, serverHash)
776
777	return nil
778}
779
780func (hs *serverHandshakeState) readFinished(out []byte) error {
781	c := hs.c
782
783	if err := c.readChangeCipherSpec(); err != nil {
784		return err
785	}
786
787	// finishedMsg is included in the transcript, but not until after we
788	// check the client version, since the state before this message was
789	// sent is used during verification.
790	msg, err := c.readHandshake(nil)
791	if err != nil {
792		return err
793	}
794	clientFinished, ok := msg.(*finishedMsg)
795	if !ok {
796		c.sendAlert(alertUnexpectedMessage)
797		return unexpectedMessageError(clientFinished, msg)
798	}
799
800	verify := hs.finishedHash.clientSum(hs.masterSecret)
801	if len(verify) != len(clientFinished.verifyData) ||
802		subtle.ConstantTimeCompare(verify, clientFinished.verifyData) != 1 {
803		c.sendAlert(alertHandshakeFailure)
804		return errors.New("tls: client's Finished message is incorrect")
805	}
806
807	if err := transcriptMsg(clientFinished, &hs.finishedHash); err != nil {
808		return err
809	}
810
811	copy(out, verify)
812	return nil
813}
814
815func (hs *serverHandshakeState) sendSessionTicket() error {
816	if !hs.hello.ticketSupported {
817		return nil
818	}
819
820	c := hs.c
821	m := new(newSessionTicketMsg)
822
823	state := c.sessionState()
824	state.secret = hs.masterSecret
825	if hs.sessionState != nil {
826		// If this is re-wrapping an old key, then keep
827		// the original time it was created.
828		state.createdAt = hs.sessionState.createdAt
829	}
830	if c.config.WrapSession != nil {
831		var err error
832		m.ticket, err = c.config.WrapSession(c.connectionStateLocked(), state)
833		if err != nil {
834			return err
835		}
836	} else {
837		stateBytes, err := state.Bytes()
838		if err != nil {
839			return err
840		}
841		m.ticket, err = c.config.encryptTicket(stateBytes, c.ticketKeys)
842		if err != nil {
843			return err
844		}
845	}
846
847	if _, err := hs.c.writeHandshakeRecord(m, &hs.finishedHash); err != nil {
848		return err
849	}
850
851	return nil
852}
853
854func (hs *serverHandshakeState) sendFinished(out []byte) error {
855	c := hs.c
856
857	if err := c.writeChangeCipherRecord(); err != nil {
858		return err
859	}
860
861	finished := new(finishedMsg)
862	finished.verifyData = hs.finishedHash.serverSum(hs.masterSecret)
863	if _, err := hs.c.writeHandshakeRecord(finished, &hs.finishedHash); err != nil {
864		return err
865	}
866
867	copy(out, finished.verifyData)
868
869	return nil
870}
871
872// processCertsFromClient takes a chain of client certificates either from a
873// Certificates message and verifies them.
874func (c *Conn) processCertsFromClient(certificate Certificate) error {
875	certificates := certificate.Certificate
876	certs := make([]*x509.Certificate, len(certificates))
877	var err error
878	for i, asn1Data := range certificates {
879		if certs[i], err = x509.ParseCertificate(asn1Data); err != nil {
880			c.sendAlert(alertBadCertificate)
881			return errors.New("tls: failed to parse client certificate: " + err.Error())
882		}
883		if certs[i].PublicKeyAlgorithm == x509.RSA {
884			n := certs[i].PublicKey.(*rsa.PublicKey).N.BitLen()
885			if max, ok := checkKeySize(n); !ok {
886				c.sendAlert(alertBadCertificate)
887				return fmt.Errorf("tls: client sent certificate containing RSA key larger than %d bits", max)
888			}
889		}
890	}
891
892	if len(certs) == 0 && requiresClientCert(c.config.ClientAuth) {
893		if c.vers == VersionTLS13 {
894			c.sendAlert(alertCertificateRequired)
895		} else {
896			c.sendAlert(alertBadCertificate)
897		}
898		return errors.New("tls: client didn't provide a certificate")
899	}
900
901	if c.config.ClientAuth >= VerifyClientCertIfGiven && len(certs) > 0 {
902		opts := x509.VerifyOptions{
903			Roots:         c.config.ClientCAs,
904			CurrentTime:   c.config.time(),
905			Intermediates: x509.NewCertPool(),
906			KeyUsages:     []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth},
907		}
908
909		for _, cert := range certs[1:] {
910			opts.Intermediates.AddCert(cert)
911		}
912
913		chains, err := certs[0].Verify(opts)
914		if err != nil {
915			var errCertificateInvalid x509.CertificateInvalidError
916			if errors.As(err, &x509.UnknownAuthorityError{}) {
917				c.sendAlert(alertUnknownCA)
918			} else if errors.As(err, &errCertificateInvalid) && errCertificateInvalid.Reason == x509.Expired {
919				c.sendAlert(alertCertificateExpired)
920			} else {
921				c.sendAlert(alertBadCertificate)
922			}
923			return &CertificateVerificationError{UnverifiedCertificates: certs, Err: err}
924		}
925
926		c.verifiedChains = chains
927	}
928
929	c.peerCertificates = certs
930	c.ocspResponse = certificate.OCSPStaple
931	c.scts = certificate.SignedCertificateTimestamps
932
933	if len(certs) > 0 {
934		switch certs[0].PublicKey.(type) {
935		case *ecdsa.PublicKey, *rsa.PublicKey, ed25519.PublicKey:
936		default:
937			c.sendAlert(alertUnsupportedCertificate)
938			return fmt.Errorf("tls: client certificate contains an unsupported public key of type %T", certs[0].PublicKey)
939		}
940	}
941
942	if c.config.VerifyPeerCertificate != nil {
943		if err := c.config.VerifyPeerCertificate(certificates, c.verifiedChains); err != nil {
944			c.sendAlert(alertBadCertificate)
945			return err
946		}
947	}
948
949	return nil
950}
951
952func clientHelloInfo(ctx context.Context, c *Conn, clientHello *clientHelloMsg) *ClientHelloInfo {
953	supportedVersions := clientHello.supportedVersions
954	if len(clientHello.supportedVersions) == 0 {
955		supportedVersions = supportedVersionsFromMax(clientHello.vers)
956	}
957
958	return &ClientHelloInfo{
959		CipherSuites:      clientHello.cipherSuites,
960		ServerName:        clientHello.serverName,
961		SupportedCurves:   clientHello.supportedCurves,
962		SupportedPoints:   clientHello.supportedPoints,
963		SignatureSchemes:  clientHello.supportedSignatureAlgorithms,
964		SupportedProtos:   clientHello.alpnProtocols,
965		SupportedVersions: supportedVersions,
966		Conn:              c.conn,
967		config:            c.config,
968		ctx:               ctx,
969	}
970}
971