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	"crypto"
9	"crypto/ecdsa"
10	"crypto/rsa"
11	"crypto/subtle"
12	"crypto/x509"
13	"encoding/asn1"
14	"errors"
15	"fmt"
16	"io"
17)
18
19// serverHandshakeState contains details of a server handshake in progress.
20// It's discarded once the handshake has completed.
21type serverHandshakeState struct {
22	c                     *Conn
23	clientHello           *clientHelloMsg
24	hello                 *serverHelloMsg
25	suite                 *cipherSuite
26	ellipticOk            bool
27	ecdsaOk               bool
28	rsaDecryptOk          bool
29	rsaSignOk             bool
30	sessionState          *sessionState
31	finishedHash          finishedHash
32	masterSecret          []byte
33	certsFromClient       [][]byte
34	cert                  *Certificate
35	cachedClientHelloInfo *ClientHelloInfo
36}
37
38// serverHandshake performs a TLS handshake as a server.
39// c.out.Mutex <= L; c.handshakeMutex <= L.
40func (c *Conn) serverHandshake() error {
41	// If this is the first server handshake, we generate a random key to
42	// encrypt the tickets with.
43	c.config.serverInitOnce.Do(func() { c.config.serverInit(nil) })
44
45	hs := serverHandshakeState{
46		c: c,
47	}
48	isResume, err := hs.readClientHello()
49	if err != nil {
50		return err
51	}
52
53	// For an overview of TLS handshaking, see https://tools.ietf.org/html/rfc5246#section-7.3
54	c.buffering = true
55	if isResume {
56		// The client has included a session ticket and so we do an abbreviated handshake.
57		if err := hs.doResumeHandshake(); err != nil {
58			return err
59		}
60		if err := hs.establishKeys(); err != nil {
61			return err
62		}
63		// ticketSupported is set in a resumption handshake if the
64		// ticket from the client was encrypted with an old session
65		// ticket key and thus a refreshed ticket should be sent.
66		if hs.hello.ticketSupported {
67			if err := hs.sendSessionTicket(); err != nil {
68				return err
69			}
70		}
71		if err := hs.sendFinished(c.serverFinished[:]); err != nil {
72			return err
73		}
74		if _, err := c.flush(); err != nil {
75			return err
76		}
77		c.clientFinishedIsFirst = false
78		if err := hs.readFinished(nil); err != nil {
79			return err
80		}
81		c.didResume = true
82	} else {
83		// The client didn't include a session ticket, or it wasn't
84		// valid so we do a full handshake.
85		if err := hs.doFullHandshake(); err != nil {
86			return err
87		}
88		if err := hs.establishKeys(); err != nil {
89			return err
90		}
91		if err := hs.readFinished(c.clientFinished[:]); err != nil {
92			return err
93		}
94		c.clientFinishedIsFirst = true
95		c.buffering = true
96		if err := hs.sendSessionTicket(); err != nil {
97			return err
98		}
99		if err := hs.sendFinished(nil); err != nil {
100			return err
101		}
102		if _, err := c.flush(); err != nil {
103			return err
104		}
105	}
106	c.handshakeComplete = true
107
108	return nil
109}
110
111// readClientHello reads a ClientHello message from the client and decides
112// whether we will perform session resumption.
113func (hs *serverHandshakeState) readClientHello() (isResume bool, err error) {
114	c := hs.c
115
116	msg, err := c.readHandshake()
117	if err != nil {
118		return false, err
119	}
120	var ok bool
121	hs.clientHello, ok = msg.(*clientHelloMsg)
122	if !ok {
123		c.sendAlert(alertUnexpectedMessage)
124		return false, unexpectedMessageError(hs.clientHello, msg)
125	}
126
127	if c.config.GetConfigForClient != nil {
128		if newConfig, err := c.config.GetConfigForClient(hs.clientHelloInfo()); err != nil {
129			c.sendAlert(alertInternalError)
130			return false, err
131		} else if newConfig != nil {
132			newConfig.serverInitOnce.Do(func() { newConfig.serverInit(c.config) })
133			c.config = newConfig
134		}
135	}
136
137	c.vers, ok = c.config.mutualVersion(hs.clientHello.vers)
138	if !ok {
139		c.sendAlert(alertProtocolVersion)
140		return false, fmt.Errorf("tls: client offered an unsupported, maximum protocol version of %x", hs.clientHello.vers)
141	}
142	c.haveVers = true
143
144	hs.hello = new(serverHelloMsg)
145
146	supportedCurve := false
147	preferredCurves := c.config.curvePreferences()
148Curves:
149	for _, curve := range hs.clientHello.supportedCurves {
150		for _, supported := range preferredCurves {
151			if supported == curve {
152				supportedCurve = true
153				break Curves
154			}
155		}
156	}
157
158	supportedPointFormat := false
159	for _, pointFormat := range hs.clientHello.supportedPoints {
160		if pointFormat == pointFormatUncompressed {
161			supportedPointFormat = true
162			break
163		}
164	}
165	hs.ellipticOk = supportedCurve && supportedPointFormat
166
167	foundCompression := false
168	// We only support null compression, so check that the client offered it.
169	for _, compression := range hs.clientHello.compressionMethods {
170		if compression == compressionNone {
171			foundCompression = true
172			break
173		}
174	}
175
176	if !foundCompression {
177		c.sendAlert(alertHandshakeFailure)
178		return false, errors.New("tls: client does not support uncompressed connections")
179	}
180
181	hs.hello.vers = c.vers
182	hs.hello.random = make([]byte, 32)
183	_, err = io.ReadFull(c.config.rand(), hs.hello.random)
184	if err != nil {
185		c.sendAlert(alertInternalError)
186		return false, err
187	}
188
189	if len(hs.clientHello.secureRenegotiation) != 0 {
190		c.sendAlert(alertHandshakeFailure)
191		return false, errors.New("tls: initial handshake had non-empty renegotiation extension")
192	}
193
194	hs.hello.secureRenegotiationSupported = hs.clientHello.secureRenegotiationSupported
195	hs.hello.compressionMethod = compressionNone
196	if len(hs.clientHello.serverName) > 0 {
197		c.serverName = hs.clientHello.serverName
198	}
199
200	if len(hs.clientHello.alpnProtocols) > 0 {
201		if selectedProto, fallback := mutualProtocol(hs.clientHello.alpnProtocols, c.config.NextProtos); !fallback {
202			hs.hello.alpnProtocol = selectedProto
203			c.clientProtocol = selectedProto
204		}
205	} else {
206		// Although sending an empty NPN extension is reasonable, Firefox has
207		// had a bug around this. Best to send nothing at all if
208		// c.config.NextProtos is empty. See
209		// https://golang.org/issue/5445.
210		if hs.clientHello.nextProtoNeg && len(c.config.NextProtos) > 0 {
211			hs.hello.nextProtoNeg = true
212			hs.hello.nextProtos = c.config.NextProtos
213		}
214	}
215
216	hs.cert, err = c.config.getCertificate(hs.clientHelloInfo())
217	if err != nil {
218		c.sendAlert(alertInternalError)
219		return false, err
220	}
221	if hs.clientHello.scts {
222		hs.hello.scts = hs.cert.SignedCertificateTimestamps
223	}
224
225	if priv, ok := hs.cert.PrivateKey.(crypto.Signer); ok {
226		switch priv.Public().(type) {
227		case *ecdsa.PublicKey:
228			hs.ecdsaOk = true
229		case *rsa.PublicKey:
230			hs.rsaSignOk = true
231		default:
232			c.sendAlert(alertInternalError)
233			return false, fmt.Errorf("tls: unsupported signing key type (%T)", priv.Public())
234		}
235	}
236	if priv, ok := hs.cert.PrivateKey.(crypto.Decrypter); ok {
237		switch priv.Public().(type) {
238		case *rsa.PublicKey:
239			hs.rsaDecryptOk = true
240		default:
241			c.sendAlert(alertInternalError)
242			return false, fmt.Errorf("tls: unsupported decryption key type (%T)", priv.Public())
243		}
244	}
245
246	if hs.checkForResumption() {
247		return true, nil
248	}
249
250	var preferenceList, supportedList []uint16
251	if c.config.PreferServerCipherSuites {
252		preferenceList = c.config.cipherSuites()
253		supportedList = hs.clientHello.cipherSuites
254	} else {
255		preferenceList = hs.clientHello.cipherSuites
256		supportedList = c.config.cipherSuites()
257	}
258
259	for _, id := range preferenceList {
260		if hs.setCipherSuite(id, supportedList, c.vers) {
261			break
262		}
263	}
264
265	if hs.suite == nil {
266		c.sendAlert(alertHandshakeFailure)
267		return false, errors.New("tls: no cipher suite supported by both client and server")
268	}
269
270	// See https://tools.ietf.org/html/rfc7507.
271	for _, id := range hs.clientHello.cipherSuites {
272		if id == TLS_FALLBACK_SCSV {
273			// The client is doing a fallback connection.
274			if hs.clientHello.vers < c.config.maxVersion() {
275				c.sendAlert(alertInappropriateFallback)
276				return false, errors.New("tls: client using inappropriate protocol fallback")
277			}
278			break
279		}
280	}
281
282	return false, nil
283}
284
285// checkForResumption reports whether we should perform resumption on this connection.
286func (hs *serverHandshakeState) checkForResumption() bool {
287	c := hs.c
288
289	if c.config.SessionTicketsDisabled {
290		return false
291	}
292
293	var ok bool
294	var sessionTicket = append([]uint8{}, hs.clientHello.sessionTicket...)
295	if hs.sessionState, ok = c.decryptTicket(sessionTicket); !ok {
296		return false
297	}
298
299	// Never resume a session for a different TLS version.
300	if c.vers != hs.sessionState.vers {
301		return false
302	}
303
304	cipherSuiteOk := false
305	// Check that the client is still offering the ciphersuite in the session.
306	for _, id := range hs.clientHello.cipherSuites {
307		if id == hs.sessionState.cipherSuite {
308			cipherSuiteOk = true
309			break
310		}
311	}
312	if !cipherSuiteOk {
313		return false
314	}
315
316	// Check that we also support the ciphersuite from the session.
317	if !hs.setCipherSuite(hs.sessionState.cipherSuite, c.config.cipherSuites(), hs.sessionState.vers) {
318		return false
319	}
320
321	sessionHasClientCerts := len(hs.sessionState.certificates) != 0
322	needClientCerts := c.config.ClientAuth == RequireAnyClientCert || c.config.ClientAuth == RequireAndVerifyClientCert
323	if needClientCerts && !sessionHasClientCerts {
324		return false
325	}
326	if sessionHasClientCerts && c.config.ClientAuth == NoClientCert {
327		return false
328	}
329
330	return true
331}
332
333func (hs *serverHandshakeState) doResumeHandshake() error {
334	c := hs.c
335
336	hs.hello.cipherSuite = hs.suite.id
337	// We echo the client's session ID in the ServerHello to let it know
338	// that we're doing a resumption.
339	hs.hello.sessionId = hs.clientHello.sessionId
340	hs.hello.ticketSupported = hs.sessionState.usedOldKey
341	hs.finishedHash = newFinishedHash(c.vers, hs.suite)
342	hs.finishedHash.discardHandshakeBuffer()
343	hs.finishedHash.Write(hs.clientHello.marshal())
344	hs.finishedHash.Write(hs.hello.marshal())
345	if _, err := c.writeRecord(recordTypeHandshake, hs.hello.marshal()); err != nil {
346		return err
347	}
348
349	if len(hs.sessionState.certificates) > 0 {
350		if _, err := hs.processCertsFromClient(hs.sessionState.certificates); err != nil {
351			return err
352		}
353	}
354
355	hs.masterSecret = hs.sessionState.masterSecret
356
357	return nil
358}
359
360func (hs *serverHandshakeState) doFullHandshake() error {
361	c := hs.c
362
363	if hs.clientHello.ocspStapling && len(hs.cert.OCSPStaple) > 0 {
364		hs.hello.ocspStapling = true
365	}
366
367	hs.hello.ticketSupported = hs.clientHello.ticketSupported && !c.config.SessionTicketsDisabled
368	hs.hello.cipherSuite = hs.suite.id
369
370	hs.finishedHash = newFinishedHash(hs.c.vers, hs.suite)
371	if c.config.ClientAuth == NoClientCert {
372		// No need to keep a full record of the handshake if client
373		// certificates won't be used.
374		hs.finishedHash.discardHandshakeBuffer()
375	}
376	hs.finishedHash.Write(hs.clientHello.marshal())
377	hs.finishedHash.Write(hs.hello.marshal())
378	if _, err := c.writeRecord(recordTypeHandshake, hs.hello.marshal()); err != nil {
379		return err
380	}
381
382	certMsg := new(certificateMsg)
383	certMsg.certificates = hs.cert.Certificate
384	hs.finishedHash.Write(certMsg.marshal())
385	if _, err := c.writeRecord(recordTypeHandshake, certMsg.marshal()); err != nil {
386		return err
387	}
388
389	if hs.hello.ocspStapling {
390		certStatus := new(certificateStatusMsg)
391		certStatus.statusType = statusTypeOCSP
392		certStatus.response = hs.cert.OCSPStaple
393		hs.finishedHash.Write(certStatus.marshal())
394		if _, err := c.writeRecord(recordTypeHandshake, certStatus.marshal()); err != nil {
395			return err
396		}
397	}
398
399	keyAgreement := hs.suite.ka(c.vers)
400	skx, err := keyAgreement.generateServerKeyExchange(c.config, hs.cert, hs.clientHello, hs.hello)
401	if err != nil {
402		c.sendAlert(alertHandshakeFailure)
403		return err
404	}
405	if skx != nil {
406		hs.finishedHash.Write(skx.marshal())
407		if _, err := c.writeRecord(recordTypeHandshake, skx.marshal()); err != nil {
408			return err
409		}
410	}
411
412	if c.config.ClientAuth >= RequestClientCert {
413		// Request a client certificate
414		certReq := new(certificateRequestMsg)
415		certReq.certificateTypes = []byte{
416			byte(certTypeRSASign),
417			byte(certTypeECDSASign),
418		}
419		if c.vers >= VersionTLS12 {
420			certReq.hasSignatureAndHash = true
421			certReq.supportedSignatureAlgorithms = supportedSignatureAlgorithms
422		}
423
424		// An empty list of certificateAuthorities signals to
425		// the client that it may send any certificate in response
426		// to our request. When we know the CAs we trust, then
427		// we can send them down, so that the client can choose
428		// an appropriate certificate to give to us.
429		if c.config.ClientCAs != nil {
430			certReq.certificateAuthorities = c.config.ClientCAs.Subjects()
431		}
432		hs.finishedHash.Write(certReq.marshal())
433		if _, err := c.writeRecord(recordTypeHandshake, certReq.marshal()); err != nil {
434			return err
435		}
436	}
437
438	helloDone := new(serverHelloDoneMsg)
439	hs.finishedHash.Write(helloDone.marshal())
440	if _, err := c.writeRecord(recordTypeHandshake, helloDone.marshal()); err != nil {
441		return err
442	}
443
444	if _, err := c.flush(); err != nil {
445		return err
446	}
447
448	var pub crypto.PublicKey // public key for client auth, if any
449
450	msg, err := c.readHandshake()
451	if err != nil {
452		return err
453	}
454
455	var ok bool
456	// If we requested a client certificate, then the client must send a
457	// certificate message, even if it's empty.
458	if c.config.ClientAuth >= RequestClientCert {
459		if certMsg, ok = msg.(*certificateMsg); !ok {
460			c.sendAlert(alertUnexpectedMessage)
461			return unexpectedMessageError(certMsg, msg)
462		}
463		hs.finishedHash.Write(certMsg.marshal())
464
465		if len(certMsg.certificates) == 0 {
466			// The client didn't actually send a certificate
467			switch c.config.ClientAuth {
468			case RequireAnyClientCert, RequireAndVerifyClientCert:
469				c.sendAlert(alertBadCertificate)
470				return errors.New("tls: client didn't provide a certificate")
471			}
472		}
473
474		pub, err = hs.processCertsFromClient(certMsg.certificates)
475		if err != nil {
476			return err
477		}
478
479		msg, err = c.readHandshake()
480		if err != nil {
481			return err
482		}
483	}
484
485	// Get client key exchange
486	ckx, ok := msg.(*clientKeyExchangeMsg)
487	if !ok {
488		c.sendAlert(alertUnexpectedMessage)
489		return unexpectedMessageError(ckx, msg)
490	}
491	hs.finishedHash.Write(ckx.marshal())
492
493	preMasterSecret, err := keyAgreement.processClientKeyExchange(c.config, hs.cert, ckx, c.vers)
494	if err != nil {
495		c.sendAlert(alertHandshakeFailure)
496		return err
497	}
498	hs.masterSecret = masterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret, hs.clientHello.random, hs.hello.random)
499	if err := c.config.writeKeyLog(hs.clientHello.random, hs.masterSecret); err != nil {
500		c.sendAlert(alertInternalError)
501		return err
502	}
503
504	// If we received a client cert in response to our certificate request message,
505	// the client will send us a certificateVerifyMsg immediately after the
506	// clientKeyExchangeMsg. This message is a digest of all preceding
507	// handshake-layer messages that is signed using the private key corresponding
508	// to the client's certificate. This allows us to verify that the client is in
509	// possession of the private key of the certificate.
510	if len(c.peerCertificates) > 0 {
511		msg, err = c.readHandshake()
512		if err != nil {
513			return err
514		}
515		certVerify, ok := msg.(*certificateVerifyMsg)
516		if !ok {
517			c.sendAlert(alertUnexpectedMessage)
518			return unexpectedMessageError(certVerify, msg)
519		}
520
521		// Determine the signature type.
522		var signatureAlgorithm SignatureScheme
523		var sigType uint8
524		if certVerify.hasSignatureAndHash {
525			signatureAlgorithm = certVerify.signatureAlgorithm
526			if !isSupportedSignatureAlgorithm(signatureAlgorithm, supportedSignatureAlgorithms) {
527				return errors.New("tls: unsupported hash function for client certificate")
528			}
529			sigType = signatureFromSignatureScheme(signatureAlgorithm)
530		} else {
531			// Before TLS 1.2 the signature algorithm was implicit
532			// from the key type, and only one hash per signature
533			// algorithm was possible. Leave signatureAlgorithm
534			// unset.
535			switch pub.(type) {
536			case *ecdsa.PublicKey:
537				sigType = signatureECDSA
538			case *rsa.PublicKey:
539				sigType = signatureRSA
540			}
541		}
542
543		switch key := pub.(type) {
544		case *ecdsa.PublicKey:
545			if sigType != signatureECDSA {
546				err = errors.New("tls: bad signature type for client's ECDSA certificate")
547				break
548			}
549			ecdsaSig := new(ecdsaSignature)
550			if _, err = asn1.Unmarshal(certVerify.signature, ecdsaSig); err != nil {
551				break
552			}
553			if ecdsaSig.R.Sign() <= 0 || ecdsaSig.S.Sign() <= 0 {
554				err = errors.New("tls: ECDSA signature contained zero or negative values")
555				break
556			}
557			var digest []byte
558			if digest, _, err = hs.finishedHash.hashForClientCertificate(sigType, signatureAlgorithm, hs.masterSecret); err != nil {
559				break
560			}
561			if !ecdsa.Verify(key, digest, ecdsaSig.R, ecdsaSig.S) {
562				err = errors.New("tls: ECDSA verification failure")
563			}
564		case *rsa.PublicKey:
565			if sigType != signatureRSA {
566				err = errors.New("tls: bad signature type for client's RSA certificate")
567				break
568			}
569			var digest []byte
570			var hashFunc crypto.Hash
571			if digest, hashFunc, err = hs.finishedHash.hashForClientCertificate(sigType, signatureAlgorithm, hs.masterSecret); err != nil {
572				break
573			}
574			err = rsa.VerifyPKCS1v15(key, hashFunc, digest, certVerify.signature)
575		}
576		if err != nil {
577			c.sendAlert(alertBadCertificate)
578			return errors.New("tls: could not validate signature of connection nonces: " + err.Error())
579		}
580
581		hs.finishedHash.Write(certVerify.marshal())
582	}
583
584	hs.finishedHash.discardHandshakeBuffer()
585
586	return nil
587}
588
589func (hs *serverHandshakeState) establishKeys() error {
590	c := hs.c
591
592	clientMAC, serverMAC, clientKey, serverKey, clientIV, serverIV :=
593		keysFromMasterSecret(c.vers, hs.suite, hs.masterSecret, hs.clientHello.random, hs.hello.random, hs.suite.macLen, hs.suite.keyLen, hs.suite.ivLen)
594
595	var clientCipher, serverCipher interface{}
596	var clientHash, serverHash macFunction
597
598	if hs.suite.aead == nil {
599		clientCipher = hs.suite.cipher(clientKey, clientIV, true /* for reading */)
600		clientHash = hs.suite.mac(c.vers, clientMAC)
601		serverCipher = hs.suite.cipher(serverKey, serverIV, false /* not for reading */)
602		serverHash = hs.suite.mac(c.vers, serverMAC)
603	} else {
604		clientCipher = hs.suite.aead(clientKey, clientIV)
605		serverCipher = hs.suite.aead(serverKey, serverIV)
606	}
607
608	c.in.prepareCipherSpec(c.vers, clientCipher, clientHash)
609	c.out.prepareCipherSpec(c.vers, serverCipher, serverHash)
610
611	return nil
612}
613
614func (hs *serverHandshakeState) readFinished(out []byte) error {
615	c := hs.c
616
617	c.readRecord(recordTypeChangeCipherSpec)
618	if c.in.err != nil {
619		return c.in.err
620	}
621
622	if hs.hello.nextProtoNeg {
623		msg, err := c.readHandshake()
624		if err != nil {
625			return err
626		}
627		nextProto, ok := msg.(*nextProtoMsg)
628		if !ok {
629			c.sendAlert(alertUnexpectedMessage)
630			return unexpectedMessageError(nextProto, msg)
631		}
632		hs.finishedHash.Write(nextProto.marshal())
633		c.clientProtocol = nextProto.proto
634	}
635
636	msg, err := c.readHandshake()
637	if err != nil {
638		return err
639	}
640	clientFinished, ok := msg.(*finishedMsg)
641	if !ok {
642		c.sendAlert(alertUnexpectedMessage)
643		return unexpectedMessageError(clientFinished, msg)
644	}
645
646	verify := hs.finishedHash.clientSum(hs.masterSecret)
647	if len(verify) != len(clientFinished.verifyData) ||
648		subtle.ConstantTimeCompare(verify, clientFinished.verifyData) != 1 {
649		c.sendAlert(alertHandshakeFailure)
650		return errors.New("tls: client's Finished message is incorrect")
651	}
652
653	hs.finishedHash.Write(clientFinished.marshal())
654	copy(out, verify)
655	return nil
656}
657
658func (hs *serverHandshakeState) sendSessionTicket() error {
659	if !hs.hello.ticketSupported {
660		return nil
661	}
662
663	c := hs.c
664	m := new(newSessionTicketMsg)
665
666	var err error
667	state := sessionState{
668		vers:         c.vers,
669		cipherSuite:  hs.suite.id,
670		masterSecret: hs.masterSecret,
671		certificates: hs.certsFromClient,
672	}
673	m.ticket, err = c.encryptTicket(&state)
674	if err != nil {
675		return err
676	}
677
678	hs.finishedHash.Write(m.marshal())
679	if _, err := c.writeRecord(recordTypeHandshake, m.marshal()); err != nil {
680		return err
681	}
682
683	return nil
684}
685
686func (hs *serverHandshakeState) sendFinished(out []byte) error {
687	c := hs.c
688
689	if _, err := c.writeRecord(recordTypeChangeCipherSpec, []byte{1}); err != nil {
690		return err
691	}
692
693	finished := new(finishedMsg)
694	finished.verifyData = hs.finishedHash.serverSum(hs.masterSecret)
695	hs.finishedHash.Write(finished.marshal())
696	if _, err := c.writeRecord(recordTypeHandshake, finished.marshal()); err != nil {
697		return err
698	}
699
700	c.cipherSuite = hs.suite.id
701	copy(out, finished.verifyData)
702
703	return nil
704}
705
706// processCertsFromClient takes a chain of client certificates either from a
707// Certificates message or from a sessionState and verifies them. It returns
708// the public key of the leaf certificate.
709func (hs *serverHandshakeState) processCertsFromClient(certificates [][]byte) (crypto.PublicKey, error) {
710	c := hs.c
711
712	hs.certsFromClient = certificates
713	certs := make([]*x509.Certificate, len(certificates))
714	var err error
715	for i, asn1Data := range certificates {
716		if certs[i], err = x509.ParseCertificate(asn1Data); err != nil {
717			c.sendAlert(alertBadCertificate)
718			return nil, errors.New("tls: failed to parse client certificate: " + err.Error())
719		}
720	}
721
722	if c.config.ClientAuth >= VerifyClientCertIfGiven && len(certs) > 0 {
723		opts := x509.VerifyOptions{
724			Roots:         c.config.ClientCAs,
725			CurrentTime:   c.config.time(),
726			Intermediates: x509.NewCertPool(),
727			KeyUsages:     []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth},
728		}
729
730		for _, cert := range certs[1:] {
731			opts.Intermediates.AddCert(cert)
732		}
733
734		chains, err := certs[0].Verify(opts)
735		if err != nil {
736			c.sendAlert(alertBadCertificate)
737			return nil, errors.New("tls: failed to verify client's certificate: " + err.Error())
738		}
739
740		c.verifiedChains = chains
741	}
742
743	if c.config.VerifyPeerCertificate != nil {
744		if err := c.config.VerifyPeerCertificate(certificates, c.verifiedChains); err != nil {
745			c.sendAlert(alertBadCertificate)
746			return nil, err
747		}
748	}
749
750	if len(certs) == 0 {
751		return nil, nil
752	}
753
754	var pub crypto.PublicKey
755	switch key := certs[0].PublicKey.(type) {
756	case *ecdsa.PublicKey, *rsa.PublicKey:
757		pub = key
758	default:
759		c.sendAlert(alertUnsupportedCertificate)
760		return nil, fmt.Errorf("tls: client's certificate contains an unsupported public key of type %T", certs[0].PublicKey)
761	}
762	c.peerCertificates = certs
763	return pub, nil
764}
765
766// setCipherSuite sets a cipherSuite with the given id as the serverHandshakeState
767// suite if that cipher suite is acceptable to use.
768// It returns a bool indicating if the suite was set.
769func (hs *serverHandshakeState) setCipherSuite(id uint16, supportedCipherSuites []uint16, version uint16) bool {
770	for _, supported := range supportedCipherSuites {
771		if id == supported {
772			var candidate *cipherSuite
773
774			for _, s := range cipherSuites {
775				if s.id == id {
776					candidate = s
777					break
778				}
779			}
780			if candidate == nil {
781				continue
782			}
783			// Don't select a ciphersuite which we can't
784			// support for this client.
785			if candidate.flags&suiteECDHE != 0 {
786				if !hs.ellipticOk {
787					continue
788				}
789				if candidate.flags&suiteECDSA != 0 {
790					if !hs.ecdsaOk {
791						continue
792					}
793				} else if !hs.rsaSignOk {
794					continue
795				}
796			} else if !hs.rsaDecryptOk {
797				continue
798			}
799			if version < VersionTLS12 && candidate.flags&suiteTLS12 != 0 {
800				continue
801			}
802			hs.suite = candidate
803			return true
804		}
805	}
806	return false
807}
808
809// suppVersArray is the backing array of ClientHelloInfo.SupportedVersions
810var suppVersArray = [...]uint16{VersionTLS12, VersionTLS11, VersionTLS10, VersionSSL30}
811
812func (hs *serverHandshakeState) clientHelloInfo() *ClientHelloInfo {
813	if hs.cachedClientHelloInfo != nil {
814		return hs.cachedClientHelloInfo
815	}
816
817	var supportedVersions []uint16
818	if hs.clientHello.vers > VersionTLS12 {
819		supportedVersions = suppVersArray[:]
820	} else if hs.clientHello.vers >= VersionSSL30 {
821		supportedVersions = suppVersArray[VersionTLS12-hs.clientHello.vers:]
822	}
823
824	hs.cachedClientHelloInfo = &ClientHelloInfo{
825		CipherSuites:      hs.clientHello.cipherSuites,
826		ServerName:        hs.clientHello.serverName,
827		SupportedCurves:   hs.clientHello.supportedCurves,
828		SupportedPoints:   hs.clientHello.supportedPoints,
829		SignatureSchemes:  hs.clientHello.supportedSignatureAlgorithms,
830		SupportedProtos:   hs.clientHello.alpnProtocols,
831		SupportedVersions: supportedVersions,
832		Conn:              hs.c.conn,
833	}
834
835	return hs.cachedClientHelloInfo
836}
837