• 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/elliptic"
12	"crypto/rsa"
13	"crypto/subtle"
14	"crypto/x509"
15	"encoding/asn1"
16	"errors"
17	"fmt"
18	"io"
19	"math/big"
20)
21
22// serverHandshakeState contains details of a server handshake in progress.
23// It's discarded once the handshake has completed.
24type serverHandshakeState struct {
25	c               *Conn
26	clientHello     *clientHelloMsg
27	hello           *serverHelloMsg
28	suite           *cipherSuite
29	ellipticOk      bool
30	ecdsaOk         bool
31	sessionState    *sessionState
32	finishedHash    finishedHash
33	masterSecret    []byte
34	certsFromClient [][]byte
35	cert            *Certificate
36	finishedBytes   []byte
37}
38
39// serverHandshake performs a TLS handshake as a server.
40func (c *Conn) serverHandshake() error {
41	config := c.config
42
43	// If this is the first server handshake, we generate a random key to
44	// encrypt the tickets with.
45	config.serverInitOnce.Do(config.serverInit)
46
47	c.sendHandshakeSeq = 0
48	c.recvHandshakeSeq = 0
49
50	hs := serverHandshakeState{
51		c: c,
52	}
53	isResume, err := hs.readClientHello()
54	if err != nil {
55		return err
56	}
57
58	// For an overview of TLS handshaking, see https://tools.ietf.org/html/rfc5246#section-7.3
59	if isResume {
60		// The client has included a session ticket and so we do an abbreviated handshake.
61		if err := hs.doResumeHandshake(); err != nil {
62			return err
63		}
64		if err := hs.establishKeys(); err != nil {
65			return err
66		}
67		if c.config.Bugs.RenewTicketOnResume {
68			if err := hs.sendSessionTicket(); err != nil {
69				return err
70			}
71		}
72		if err := hs.sendFinished(c.firstFinished[:]); err != nil {
73			return err
74		}
75		// Most retransmits are triggered by a timeout, but the final
76		// leg of the handshake is retransmited upon re-receiving a
77		// Finished.
78		if err := c.simulatePacketLoss(func() {
79			c.writeRecord(recordTypeHandshake, hs.finishedBytes)
80			c.dtlsFlushHandshake()
81		}); err != nil {
82			return err
83		}
84		if err := hs.readFinished(nil, isResume); err != nil {
85			return err
86		}
87		c.didResume = true
88	} else {
89		// The client didn't include a session ticket, or it wasn't
90		// valid so we do a full handshake.
91		if err := hs.doFullHandshake(); err != nil {
92			return err
93		}
94		if err := hs.establishKeys(); err != nil {
95			return err
96		}
97		if err := hs.readFinished(c.firstFinished[:], isResume); err != nil {
98			return err
99		}
100		if c.config.Bugs.AlertBeforeFalseStartTest != 0 {
101			c.sendAlert(c.config.Bugs.AlertBeforeFalseStartTest)
102		}
103		if c.config.Bugs.ExpectFalseStart {
104			if err := c.readRecord(recordTypeApplicationData); err != nil {
105				return fmt.Errorf("tls: peer did not false start: %s", err)
106			}
107		}
108		if err := hs.sendSessionTicket(); err != nil {
109			return err
110		}
111		if err := hs.sendFinished(nil); err != nil {
112			return err
113		}
114	}
115	c.handshakeComplete = true
116	copy(c.clientRandom[:], hs.clientHello.random)
117	copy(c.serverRandom[:], hs.hello.random)
118	copy(c.masterSecret[:], hs.masterSecret)
119
120	return nil
121}
122
123// readClientHello reads a ClientHello message from the client and decides
124// whether we will perform session resumption.
125func (hs *serverHandshakeState) readClientHello() (isResume bool, err error) {
126	config := hs.c.config
127	c := hs.c
128
129	if err := c.simulatePacketLoss(nil); err != nil {
130		return false, err
131	}
132	msg, err := c.readHandshake()
133	if err != nil {
134		return false, err
135	}
136	var ok bool
137	hs.clientHello, ok = msg.(*clientHelloMsg)
138	if !ok {
139		c.sendAlert(alertUnexpectedMessage)
140		return false, unexpectedMessageError(hs.clientHello, msg)
141	}
142	if size := config.Bugs.RequireClientHelloSize; size != 0 && len(hs.clientHello.raw) != size {
143		return false, fmt.Errorf("tls: ClientHello record size is %d, but expected %d", len(hs.clientHello.raw), size)
144	}
145
146	if c.isDTLS && !config.Bugs.SkipHelloVerifyRequest {
147		// Per RFC 6347, the version field in HelloVerifyRequest SHOULD
148		// be always DTLS 1.0
149		helloVerifyRequest := &helloVerifyRequestMsg{
150			vers:   VersionTLS10,
151			cookie: make([]byte, 32),
152		}
153		if _, err := io.ReadFull(c.config.rand(), helloVerifyRequest.cookie); err != nil {
154			c.sendAlert(alertInternalError)
155			return false, errors.New("dtls: short read from Rand: " + err.Error())
156		}
157		c.writeRecord(recordTypeHandshake, helloVerifyRequest.marshal())
158		c.dtlsFlushHandshake()
159
160		if err := c.simulatePacketLoss(nil); err != nil {
161			return false, err
162		}
163		msg, err := c.readHandshake()
164		if err != nil {
165			return false, err
166		}
167		newClientHello, ok := msg.(*clientHelloMsg)
168		if !ok {
169			c.sendAlert(alertUnexpectedMessage)
170			return false, unexpectedMessageError(hs.clientHello, msg)
171		}
172		if !bytes.Equal(newClientHello.cookie, helloVerifyRequest.cookie) {
173			return false, errors.New("dtls: invalid cookie")
174		}
175
176		// Apart from the cookie, the two ClientHellos must
177		// match. Note that clientHello.equal compares the
178		// serialization, so we make a copy.
179		oldClientHelloCopy := *hs.clientHello
180		oldClientHelloCopy.raw = nil
181		oldClientHelloCopy.cookie = nil
182		newClientHelloCopy := *newClientHello
183		newClientHelloCopy.raw = nil
184		newClientHelloCopy.cookie = nil
185		if !oldClientHelloCopy.equal(&newClientHelloCopy) {
186			return false, errors.New("dtls: retransmitted ClientHello does not match")
187		}
188		hs.clientHello = newClientHello
189	}
190
191	if config.Bugs.RequireSameRenegoClientVersion && c.clientVersion != 0 {
192		if c.clientVersion != hs.clientHello.vers {
193			return false, fmt.Errorf("tls: client offered different version on renego")
194		}
195	}
196	c.clientVersion = hs.clientHello.vers
197
198	// Reject < 1.2 ClientHellos with signature_algorithms.
199	if c.clientVersion < VersionTLS12 && len(hs.clientHello.signatureAndHashes) > 0 {
200		return false, fmt.Errorf("tls: client included signature_algorithms before TLS 1.2")
201	}
202	if config.Bugs.IgnorePeerSignatureAlgorithmPreferences {
203		hs.clientHello.signatureAndHashes = config.signatureAndHashesForServer()
204	}
205
206	// Check the client cipher list is consistent with the version.
207	if hs.clientHello.vers < VersionTLS12 {
208		for _, id := range hs.clientHello.cipherSuites {
209			if isTLS12Cipher(id) {
210				return false, fmt.Errorf("tls: client offered TLS 1.2 cipher before TLS 1.2")
211			}
212		}
213	}
214
215	c.vers, ok = config.mutualVersion(hs.clientHello.vers)
216	if !ok {
217		c.sendAlert(alertProtocolVersion)
218		return false, fmt.Errorf("tls: client offered an unsupported, maximum protocol version of %x", hs.clientHello.vers)
219	}
220	c.haveVers = true
221
222	hs.hello = &serverHelloMsg{
223		isDTLS:          c.isDTLS,
224		customExtension: config.Bugs.CustomExtension,
225		npnLast:         config.Bugs.SwapNPNAndALPN,
226	}
227
228	supportedCurve := false
229	preferredCurves := config.curvePreferences()
230	if config.Bugs.IgnorePeerCurvePreferences {
231		hs.clientHello.supportedCurves = preferredCurves
232	}
233Curves:
234	for _, curve := range hs.clientHello.supportedCurves {
235		for _, supported := range preferredCurves {
236			if supported == curve {
237				supportedCurve = true
238				break Curves
239			}
240		}
241	}
242
243	supportedPointFormat := false
244	for _, pointFormat := range hs.clientHello.supportedPoints {
245		if pointFormat == pointFormatUncompressed {
246			supportedPointFormat = true
247			break
248		}
249	}
250	hs.ellipticOk = supportedCurve && supportedPointFormat
251
252	foundCompression := false
253	// We only support null compression, so check that the client offered it.
254	for _, compression := range hs.clientHello.compressionMethods {
255		if compression == compressionNone {
256			foundCompression = true
257			break
258		}
259	}
260
261	if !foundCompression {
262		c.sendAlert(alertHandshakeFailure)
263		return false, errors.New("tls: client does not support uncompressed connections")
264	}
265
266	hs.hello.vers = c.vers
267	hs.hello.random = make([]byte, 32)
268	_, err = io.ReadFull(config.rand(), hs.hello.random)
269	if err != nil {
270		c.sendAlert(alertInternalError)
271		return false, err
272	}
273
274	if !bytes.Equal(c.clientVerify, hs.clientHello.secureRenegotiation) {
275		c.sendAlert(alertHandshakeFailure)
276		return false, errors.New("tls: renegotiation mismatch")
277	}
278
279	if len(c.clientVerify) > 0 && !c.config.Bugs.EmptyRenegotiationInfo {
280		hs.hello.secureRenegotiation = append(hs.hello.secureRenegotiation, c.clientVerify...)
281		hs.hello.secureRenegotiation = append(hs.hello.secureRenegotiation, c.serverVerify...)
282		if c.config.Bugs.BadRenegotiationInfo {
283			hs.hello.secureRenegotiation[0] ^= 0x80
284		}
285	} else {
286		hs.hello.secureRenegotiation = hs.clientHello.secureRenegotiation
287	}
288
289	if c.noRenegotiationInfo() {
290		hs.hello.secureRenegotiation = nil
291	}
292
293	hs.hello.compressionMethod = compressionNone
294	hs.hello.duplicateExtension = c.config.Bugs.DuplicateExtension
295	if len(hs.clientHello.serverName) > 0 {
296		c.serverName = hs.clientHello.serverName
297	}
298
299	if len(hs.clientHello.alpnProtocols) > 0 {
300		if proto := c.config.Bugs.ALPNProtocol; proto != nil {
301			hs.hello.alpnProtocol = *proto
302			hs.hello.alpnProtocolEmpty = len(*proto) == 0
303			c.clientProtocol = *proto
304			c.usedALPN = true
305		} else if selectedProto, fallback := mutualProtocol(hs.clientHello.alpnProtocols, c.config.NextProtos); !fallback {
306			hs.hello.alpnProtocol = selectedProto
307			c.clientProtocol = selectedProto
308			c.usedALPN = true
309		}
310	}
311	if len(hs.clientHello.alpnProtocols) == 0 || c.config.Bugs.NegotiateALPNAndNPN {
312		// Although sending an empty NPN extension is reasonable, Firefox has
313		// had a bug around this. Best to send nothing at all if
314		// config.NextProtos is empty. See
315		// https://code.google.com/p/go/issues/detail?id=5445.
316		if hs.clientHello.nextProtoNeg && len(config.NextProtos) > 0 {
317			hs.hello.nextProtoNeg = true
318			hs.hello.nextProtos = config.NextProtos
319		}
320	}
321	hs.hello.extendedMasterSecret = c.vers >= VersionTLS10 && hs.clientHello.extendedMasterSecret && !c.config.Bugs.NoExtendedMasterSecret
322
323	if len(config.Certificates) == 0 {
324		c.sendAlert(alertInternalError)
325		return false, errors.New("tls: no certificates configured")
326	}
327	hs.cert = &config.Certificates[0]
328	if len(hs.clientHello.serverName) > 0 {
329		hs.cert = config.getCertificateForName(hs.clientHello.serverName)
330	}
331	if expected := c.config.Bugs.ExpectServerName; expected != "" && expected != hs.clientHello.serverName {
332		return false, errors.New("tls: unexpected server name")
333	}
334
335	if hs.clientHello.channelIDSupported && config.RequestChannelID {
336		hs.hello.channelIDRequested = true
337	}
338
339	if hs.clientHello.srtpProtectionProfiles != nil {
340	SRTPLoop:
341		for _, p1 := range c.config.SRTPProtectionProfiles {
342			for _, p2 := range hs.clientHello.srtpProtectionProfiles {
343				if p1 == p2 {
344					hs.hello.srtpProtectionProfile = p1
345					c.srtpProtectionProfile = p1
346					break SRTPLoop
347				}
348			}
349		}
350	}
351
352	if c.config.Bugs.SendSRTPProtectionProfile != 0 {
353		hs.hello.srtpProtectionProfile = c.config.Bugs.SendSRTPProtectionProfile
354	}
355
356	if expected := c.config.Bugs.ExpectedCustomExtension; expected != nil {
357		if hs.clientHello.customExtension != *expected {
358			return false, fmt.Errorf("tls: bad custom extension contents %q", hs.clientHello.customExtension)
359		}
360	}
361
362	_, hs.ecdsaOk = hs.cert.PrivateKey.(*ecdsa.PrivateKey)
363
364	// For test purposes, check that the peer never offers a session when
365	// renegotiating.
366	if c.cipherSuite != nil && len(hs.clientHello.sessionId) > 0 && c.config.Bugs.FailIfResumeOnRenego {
367		return false, errors.New("tls: offered resumption on renegotiation")
368	}
369
370	if c.config.Bugs.FailIfSessionOffered && (len(hs.clientHello.sessionTicket) > 0 || len(hs.clientHello.sessionId) > 0) {
371		return false, errors.New("tls: client offered a session ticket or ID")
372	}
373
374	if hs.checkForResumption() {
375		return true, nil
376	}
377
378	var scsvFound bool
379
380	for _, cipherSuite := range hs.clientHello.cipherSuites {
381		if cipherSuite == fallbackSCSV {
382			scsvFound = true
383			break
384		}
385	}
386
387	if !scsvFound && config.Bugs.FailIfNotFallbackSCSV {
388		return false, errors.New("tls: no fallback SCSV found when expected")
389	} else if scsvFound && !config.Bugs.FailIfNotFallbackSCSV {
390		return false, errors.New("tls: fallback SCSV found when not expected")
391	}
392
393	if config.Bugs.IgnorePeerCipherPreferences {
394		hs.clientHello.cipherSuites = c.config.cipherSuites()
395	}
396	var preferenceList, supportedList []uint16
397	if c.config.PreferServerCipherSuites {
398		preferenceList = c.config.cipherSuites()
399		supportedList = hs.clientHello.cipherSuites
400	} else {
401		preferenceList = hs.clientHello.cipherSuites
402		supportedList = c.config.cipherSuites()
403	}
404
405	for _, id := range preferenceList {
406		if hs.suite = c.tryCipherSuite(id, supportedList, c.vers, hs.ellipticOk, hs.ecdsaOk); hs.suite != nil {
407			break
408		}
409	}
410
411	if hs.suite == nil {
412		c.sendAlert(alertHandshakeFailure)
413		return false, errors.New("tls: no cipher suite supported by both client and server")
414	}
415
416	return false, nil
417}
418
419// checkForResumption returns true if we should perform resumption on this connection.
420func (hs *serverHandshakeState) checkForResumption() bool {
421	c := hs.c
422
423	if len(hs.clientHello.sessionTicket) > 0 {
424		if c.config.SessionTicketsDisabled {
425			return false
426		}
427
428		var ok bool
429		if hs.sessionState, ok = c.decryptTicket(hs.clientHello.sessionTicket); !ok {
430			return false
431		}
432	} else {
433		if c.config.ServerSessionCache == nil {
434			return false
435		}
436
437		var ok bool
438		sessionId := string(hs.clientHello.sessionId)
439		if hs.sessionState, ok = c.config.ServerSessionCache.Get(sessionId); !ok {
440			return false
441		}
442	}
443
444	// Never resume a session for a different SSL version.
445	if !c.config.Bugs.AllowSessionVersionMismatch && c.vers != hs.sessionState.vers {
446		return false
447	}
448
449	cipherSuiteOk := false
450	// Check that the client is still offering the ciphersuite in the session.
451	for _, id := range hs.clientHello.cipherSuites {
452		if id == hs.sessionState.cipherSuite {
453			cipherSuiteOk = true
454			break
455		}
456	}
457	if !cipherSuiteOk {
458		return false
459	}
460
461	// Check that we also support the ciphersuite from the session.
462	hs.suite = c.tryCipherSuite(hs.sessionState.cipherSuite, c.config.cipherSuites(), hs.sessionState.vers, hs.ellipticOk, hs.ecdsaOk)
463	if hs.suite == nil {
464		return false
465	}
466
467	sessionHasClientCerts := len(hs.sessionState.certificates) != 0
468	needClientCerts := c.config.ClientAuth == RequireAnyClientCert || c.config.ClientAuth == RequireAndVerifyClientCert
469	if needClientCerts && !sessionHasClientCerts {
470		return false
471	}
472	if sessionHasClientCerts && c.config.ClientAuth == NoClientCert {
473		return false
474	}
475
476	return true
477}
478
479func (hs *serverHandshakeState) doResumeHandshake() error {
480	c := hs.c
481
482	hs.hello.cipherSuite = hs.suite.id
483	if c.config.Bugs.SendCipherSuite != 0 {
484		hs.hello.cipherSuite = c.config.Bugs.SendCipherSuite
485	}
486	// We echo the client's session ID in the ServerHello to let it know
487	// that we're doing a resumption.
488	hs.hello.sessionId = hs.clientHello.sessionId
489	hs.hello.ticketSupported = c.config.Bugs.RenewTicketOnResume
490
491	hs.finishedHash = newFinishedHash(c.vers, hs.suite)
492	hs.finishedHash.discardHandshakeBuffer()
493	hs.writeClientHash(hs.clientHello.marshal())
494	hs.writeServerHash(hs.hello.marshal())
495
496	c.writeRecord(recordTypeHandshake, hs.hello.marshal())
497
498	if len(hs.sessionState.certificates) > 0 {
499		if _, err := hs.processCertsFromClient(hs.sessionState.certificates); err != nil {
500			return err
501		}
502	}
503
504	hs.masterSecret = hs.sessionState.masterSecret
505	c.extendedMasterSecret = hs.sessionState.extendedMasterSecret
506
507	return nil
508}
509
510func (hs *serverHandshakeState) doFullHandshake() error {
511	config := hs.c.config
512	c := hs.c
513
514	isPSK := hs.suite.flags&suitePSK != 0
515	if !isPSK && hs.clientHello.ocspStapling && len(hs.cert.OCSPStaple) > 0 {
516		hs.hello.ocspStapling = true
517	}
518
519	if hs.clientHello.sctListSupported && len(hs.cert.SignedCertificateTimestampList) > 0 {
520		hs.hello.sctList = hs.cert.SignedCertificateTimestampList
521	}
522
523	hs.hello.ticketSupported = hs.clientHello.ticketSupported && !config.SessionTicketsDisabled && c.vers > VersionSSL30
524	hs.hello.cipherSuite = hs.suite.id
525	if config.Bugs.SendCipherSuite != 0 {
526		hs.hello.cipherSuite = config.Bugs.SendCipherSuite
527	}
528	c.extendedMasterSecret = hs.hello.extendedMasterSecret
529
530	// Generate a session ID if we're to save the session.
531	if !hs.hello.ticketSupported && config.ServerSessionCache != nil {
532		hs.hello.sessionId = make([]byte, 32)
533		if _, err := io.ReadFull(config.rand(), hs.hello.sessionId); err != nil {
534			c.sendAlert(alertInternalError)
535			return errors.New("tls: short read from Rand: " + err.Error())
536		}
537	}
538
539	hs.finishedHash = newFinishedHash(c.vers, hs.suite)
540	hs.writeClientHash(hs.clientHello.marshal())
541	hs.writeServerHash(hs.hello.marshal())
542
543	c.writeRecord(recordTypeHandshake, hs.hello.marshal())
544
545	if !isPSK {
546		certMsg := new(certificateMsg)
547		if !config.Bugs.EmptyCertificateList {
548			certMsg.certificates = hs.cert.Certificate
549		}
550		if !config.Bugs.UnauthenticatedECDH {
551			certMsgBytes := certMsg.marshal()
552			if config.Bugs.WrongCertificateMessageType {
553				certMsgBytes[0] += 42
554			}
555			hs.writeServerHash(certMsgBytes)
556			c.writeRecord(recordTypeHandshake, certMsgBytes)
557		}
558	}
559
560	if hs.hello.ocspStapling && !c.config.Bugs.SkipCertificateStatus {
561		certStatus := new(certificateStatusMsg)
562		certStatus.statusType = statusTypeOCSP
563		certStatus.response = hs.cert.OCSPStaple
564		hs.writeServerHash(certStatus.marshal())
565		c.writeRecord(recordTypeHandshake, certStatus.marshal())
566	}
567
568	keyAgreement := hs.suite.ka(c.vers)
569	skx, err := keyAgreement.generateServerKeyExchange(config, hs.cert, hs.clientHello, hs.hello)
570	if err != nil {
571		c.sendAlert(alertHandshakeFailure)
572		return err
573	}
574	if skx != nil && !config.Bugs.SkipServerKeyExchange {
575		hs.writeServerHash(skx.marshal())
576		c.writeRecord(recordTypeHandshake, skx.marshal())
577	}
578
579	if config.ClientAuth >= RequestClientCert {
580		// Request a client certificate
581		certReq := &certificateRequestMsg{
582			certificateTypes: config.ClientCertificateTypes,
583		}
584		if certReq.certificateTypes == nil {
585			certReq.certificateTypes = []byte{
586				byte(CertTypeRSASign),
587				byte(CertTypeECDSASign),
588			}
589		}
590		if c.vers >= VersionTLS12 {
591			certReq.hasSignatureAndHash = true
592			if !config.Bugs.NoSignatureAndHashes {
593				certReq.signatureAndHashes = config.signatureAndHashesForServer()
594			}
595		}
596
597		// An empty list of certificateAuthorities signals to
598		// the client that it may send any certificate in response
599		// to our request. When we know the CAs we trust, then
600		// we can send them down, so that the client can choose
601		// an appropriate certificate to give to us.
602		if config.ClientCAs != nil {
603			certReq.certificateAuthorities = config.ClientCAs.Subjects()
604		}
605		hs.writeServerHash(certReq.marshal())
606		c.writeRecord(recordTypeHandshake, certReq.marshal())
607	}
608
609	helloDone := new(serverHelloDoneMsg)
610	hs.writeServerHash(helloDone.marshal())
611	c.writeRecord(recordTypeHandshake, helloDone.marshal())
612	c.dtlsFlushHandshake()
613
614	var pub crypto.PublicKey // public key for client auth, if any
615
616	if err := c.simulatePacketLoss(nil); err != nil {
617		return err
618	}
619	msg, err := c.readHandshake()
620	if err != nil {
621		return err
622	}
623
624	var ok bool
625	// If we requested a client certificate, then the client must send a
626	// certificate message, even if it's empty.
627	if config.ClientAuth >= RequestClientCert {
628		var certMsg *certificateMsg
629		if certMsg, ok = msg.(*certificateMsg); !ok {
630			c.sendAlert(alertUnexpectedMessage)
631			return unexpectedMessageError(certMsg, msg)
632		}
633		hs.writeClientHash(certMsg.marshal())
634
635		if len(certMsg.certificates) == 0 {
636			// The client didn't actually send a certificate
637			switch config.ClientAuth {
638			case RequireAnyClientCert, RequireAndVerifyClientCert:
639				c.sendAlert(alertBadCertificate)
640				return errors.New("tls: client didn't provide a certificate")
641			}
642		}
643
644		pub, err = hs.processCertsFromClient(certMsg.certificates)
645		if err != nil {
646			return err
647		}
648
649		msg, err = c.readHandshake()
650		if err != nil {
651			return err
652		}
653	}
654
655	// Get client key exchange
656	ckx, ok := msg.(*clientKeyExchangeMsg)
657	if !ok {
658		c.sendAlert(alertUnexpectedMessage)
659		return unexpectedMessageError(ckx, msg)
660	}
661	hs.writeClientHash(ckx.marshal())
662
663	preMasterSecret, err := keyAgreement.processClientKeyExchange(config, hs.cert, ckx, c.vers)
664	if err != nil {
665		c.sendAlert(alertHandshakeFailure)
666		return err
667	}
668	if c.extendedMasterSecret {
669		hs.masterSecret = extendedMasterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret, hs.finishedHash)
670	} else {
671		if c.config.Bugs.RequireExtendedMasterSecret {
672			return errors.New("tls: extended master secret required but not supported by peer")
673		}
674		hs.masterSecret = masterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret, hs.clientHello.random, hs.hello.random)
675	}
676
677	// If we received a client cert in response to our certificate request message,
678	// the client will send us a certificateVerifyMsg immediately after the
679	// clientKeyExchangeMsg.  This message is a digest of all preceding
680	// handshake-layer messages that is signed using the private key corresponding
681	// to the client's certificate. This allows us to verify that the client is in
682	// possession of the private key of the certificate.
683	if len(c.peerCertificates) > 0 {
684		msg, err = c.readHandshake()
685		if err != nil {
686			return err
687		}
688		certVerify, ok := msg.(*certificateVerifyMsg)
689		if !ok {
690			c.sendAlert(alertUnexpectedMessage)
691			return unexpectedMessageError(certVerify, msg)
692		}
693
694		// Determine the signature type.
695		var signatureAndHash signatureAndHash
696		if certVerify.hasSignatureAndHash {
697			signatureAndHash = certVerify.signatureAndHash
698			if !isSupportedSignatureAndHash(signatureAndHash, config.signatureAndHashesForServer()) {
699				return errors.New("tls: unsupported hash function for client certificate")
700			}
701			c.clientCertSignatureHash = signatureAndHash.hash
702		} else {
703			// Before TLS 1.2 the signature algorithm was implicit
704			// from the key type, and only one hash per signature
705			// algorithm was possible. Leave the hash as zero.
706			switch pub.(type) {
707			case *ecdsa.PublicKey:
708				signatureAndHash.signature = signatureECDSA
709			case *rsa.PublicKey:
710				signatureAndHash.signature = signatureRSA
711			}
712		}
713
714		switch key := pub.(type) {
715		case *ecdsa.PublicKey:
716			if signatureAndHash.signature != signatureECDSA {
717				err = errors.New("tls: bad signature type for client's ECDSA certificate")
718				break
719			}
720			ecdsaSig := new(ecdsaSignature)
721			if _, err = asn1.Unmarshal(certVerify.signature, ecdsaSig); err != nil {
722				break
723			}
724			if ecdsaSig.R.Sign() <= 0 || ecdsaSig.S.Sign() <= 0 {
725				err = errors.New("ECDSA signature contained zero or negative values")
726				break
727			}
728			var digest []byte
729			digest, _, err = hs.finishedHash.hashForClientCertificate(signatureAndHash, hs.masterSecret)
730			if err != nil {
731				break
732			}
733			if !ecdsa.Verify(key, digest, ecdsaSig.R, ecdsaSig.S) {
734				err = errors.New("ECDSA verification failure")
735				break
736			}
737		case *rsa.PublicKey:
738			if signatureAndHash.signature != signatureRSA {
739				err = errors.New("tls: bad signature type for client's RSA certificate")
740				break
741			}
742			var digest []byte
743			var hashFunc crypto.Hash
744			digest, hashFunc, err = hs.finishedHash.hashForClientCertificate(signatureAndHash, hs.masterSecret)
745			if err != nil {
746				break
747			}
748			err = rsa.VerifyPKCS1v15(key, hashFunc, digest, certVerify.signature)
749		}
750		if err != nil {
751			c.sendAlert(alertBadCertificate)
752			return errors.New("could not validate signature of connection nonces: " + err.Error())
753		}
754
755		hs.writeClientHash(certVerify.marshal())
756	}
757
758	hs.finishedHash.discardHandshakeBuffer()
759
760	return nil
761}
762
763func (hs *serverHandshakeState) establishKeys() error {
764	c := hs.c
765
766	clientMAC, serverMAC, clientKey, serverKey, clientIV, serverIV :=
767		keysFromMasterSecret(c.vers, hs.suite, hs.masterSecret, hs.clientHello.random, hs.hello.random, hs.suite.macLen, hs.suite.keyLen, hs.suite.ivLen)
768
769	var clientCipher, serverCipher interface{}
770	var clientHash, serverHash macFunction
771
772	if hs.suite.aead == nil {
773		clientCipher = hs.suite.cipher(clientKey, clientIV, true /* for reading */)
774		clientHash = hs.suite.mac(c.vers, clientMAC)
775		serverCipher = hs.suite.cipher(serverKey, serverIV, false /* not for reading */)
776		serverHash = hs.suite.mac(c.vers, serverMAC)
777	} else {
778		clientCipher = hs.suite.aead(clientKey, clientIV)
779		serverCipher = hs.suite.aead(serverKey, serverIV)
780	}
781
782	c.in.prepareCipherSpec(c.vers, clientCipher, clientHash)
783	c.out.prepareCipherSpec(c.vers, serverCipher, serverHash)
784
785	return nil
786}
787
788func (hs *serverHandshakeState) readFinished(out []byte, isResume bool) error {
789	c := hs.c
790
791	c.readRecord(recordTypeChangeCipherSpec)
792	if err := c.in.error(); err != nil {
793		return err
794	}
795
796	if hs.hello.nextProtoNeg {
797		msg, err := c.readHandshake()
798		if err != nil {
799			return err
800		}
801		nextProto, ok := msg.(*nextProtoMsg)
802		if !ok {
803			c.sendAlert(alertUnexpectedMessage)
804			return unexpectedMessageError(nextProto, msg)
805		}
806		hs.writeClientHash(nextProto.marshal())
807		c.clientProtocol = nextProto.proto
808	}
809
810	if hs.hello.channelIDRequested {
811		msg, err := c.readHandshake()
812		if err != nil {
813			return err
814		}
815		encryptedExtensions, ok := msg.(*encryptedExtensionsMsg)
816		if !ok {
817			c.sendAlert(alertUnexpectedMessage)
818			return unexpectedMessageError(encryptedExtensions, msg)
819		}
820		x := new(big.Int).SetBytes(encryptedExtensions.channelID[0:32])
821		y := new(big.Int).SetBytes(encryptedExtensions.channelID[32:64])
822		r := new(big.Int).SetBytes(encryptedExtensions.channelID[64:96])
823		s := new(big.Int).SetBytes(encryptedExtensions.channelID[96:128])
824		if !elliptic.P256().IsOnCurve(x, y) {
825			return errors.New("tls: invalid channel ID public key")
826		}
827		channelID := &ecdsa.PublicKey{elliptic.P256(), x, y}
828		var resumeHash []byte
829		if isResume {
830			resumeHash = hs.sessionState.handshakeHash
831		}
832		if !ecdsa.Verify(channelID, hs.finishedHash.hashForChannelID(resumeHash), r, s) {
833			return errors.New("tls: invalid channel ID signature")
834		}
835		c.channelID = channelID
836
837		hs.writeClientHash(encryptedExtensions.marshal())
838	}
839
840	msg, err := c.readHandshake()
841	if err != nil {
842		return err
843	}
844	clientFinished, ok := msg.(*finishedMsg)
845	if !ok {
846		c.sendAlert(alertUnexpectedMessage)
847		return unexpectedMessageError(clientFinished, msg)
848	}
849
850	verify := hs.finishedHash.clientSum(hs.masterSecret)
851	if len(verify) != len(clientFinished.verifyData) ||
852		subtle.ConstantTimeCompare(verify, clientFinished.verifyData) != 1 {
853		c.sendAlert(alertHandshakeFailure)
854		return errors.New("tls: client's Finished message is incorrect")
855	}
856	c.clientVerify = append(c.clientVerify[:0], clientFinished.verifyData...)
857	copy(out, clientFinished.verifyData)
858
859	hs.writeClientHash(clientFinished.marshal())
860	return nil
861}
862
863func (hs *serverHandshakeState) sendSessionTicket() error {
864	c := hs.c
865	state := sessionState{
866		vers:          c.vers,
867		cipherSuite:   hs.suite.id,
868		masterSecret:  hs.masterSecret,
869		certificates:  hs.certsFromClient,
870		handshakeHash: hs.finishedHash.server.Sum(nil),
871	}
872
873	if !hs.hello.ticketSupported || hs.c.config.Bugs.SkipNewSessionTicket {
874		if c.config.ServerSessionCache != nil && len(hs.hello.sessionId) != 0 {
875			c.config.ServerSessionCache.Put(string(hs.hello.sessionId), &state)
876		}
877		return nil
878	}
879
880	m := new(newSessionTicketMsg)
881
882	if !c.config.Bugs.SendEmptySessionTicket {
883		var err error
884		m.ticket, err = c.encryptTicket(&state)
885		if err != nil {
886			return err
887		}
888	}
889
890	hs.writeServerHash(m.marshal())
891	c.writeRecord(recordTypeHandshake, m.marshal())
892
893	return nil
894}
895
896func (hs *serverHandshakeState) sendFinished(out []byte) error {
897	c := hs.c
898
899	finished := new(finishedMsg)
900	finished.verifyData = hs.finishedHash.serverSum(hs.masterSecret)
901	copy(out, finished.verifyData)
902	if c.config.Bugs.BadFinished {
903		finished.verifyData[0]++
904	}
905	c.serverVerify = append(c.serverVerify[:0], finished.verifyData...)
906	hs.finishedBytes = finished.marshal()
907	hs.writeServerHash(hs.finishedBytes)
908	postCCSBytes := hs.finishedBytes
909
910	if c.config.Bugs.FragmentAcrossChangeCipherSpec {
911		c.writeRecord(recordTypeHandshake, postCCSBytes[:5])
912		postCCSBytes = postCCSBytes[5:]
913	}
914	c.dtlsFlushHandshake()
915
916	if !c.config.Bugs.SkipChangeCipherSpec {
917		ccs := []byte{1}
918		if c.config.Bugs.BadChangeCipherSpec != nil {
919			ccs = c.config.Bugs.BadChangeCipherSpec
920		}
921		c.writeRecord(recordTypeChangeCipherSpec, ccs)
922	}
923
924	if c.config.Bugs.AppDataAfterChangeCipherSpec != nil {
925		c.writeRecord(recordTypeApplicationData, c.config.Bugs.AppDataAfterChangeCipherSpec)
926	}
927	if c.config.Bugs.AlertAfterChangeCipherSpec != 0 {
928		c.sendAlert(c.config.Bugs.AlertAfterChangeCipherSpec)
929		return errors.New("tls: simulating post-CCS alert")
930	}
931
932	if !c.config.Bugs.SkipFinished {
933		c.writeRecord(recordTypeHandshake, postCCSBytes)
934		c.dtlsFlushHandshake()
935	}
936
937	c.cipherSuite = hs.suite
938
939	return nil
940}
941
942// processCertsFromClient takes a chain of client certificates either from a
943// Certificates message or from a sessionState and verifies them. It returns
944// the public key of the leaf certificate.
945func (hs *serverHandshakeState) processCertsFromClient(certificates [][]byte) (crypto.PublicKey, error) {
946	c := hs.c
947
948	hs.certsFromClient = certificates
949	certs := make([]*x509.Certificate, len(certificates))
950	var err error
951	for i, asn1Data := range certificates {
952		if certs[i], err = x509.ParseCertificate(asn1Data); err != nil {
953			c.sendAlert(alertBadCertificate)
954			return nil, errors.New("tls: failed to parse client certificate: " + err.Error())
955		}
956	}
957
958	if c.config.ClientAuth >= VerifyClientCertIfGiven && len(certs) > 0 {
959		opts := x509.VerifyOptions{
960			Roots:         c.config.ClientCAs,
961			CurrentTime:   c.config.time(),
962			Intermediates: x509.NewCertPool(),
963			KeyUsages:     []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth},
964		}
965
966		for _, cert := range certs[1:] {
967			opts.Intermediates.AddCert(cert)
968		}
969
970		chains, err := certs[0].Verify(opts)
971		if err != nil {
972			c.sendAlert(alertBadCertificate)
973			return nil, errors.New("tls: failed to verify client's certificate: " + err.Error())
974		}
975
976		ok := false
977		for _, ku := range certs[0].ExtKeyUsage {
978			if ku == x509.ExtKeyUsageClientAuth {
979				ok = true
980				break
981			}
982		}
983		if !ok {
984			c.sendAlert(alertHandshakeFailure)
985			return nil, errors.New("tls: client's certificate's extended key usage doesn't permit it to be used for client authentication")
986		}
987
988		c.verifiedChains = chains
989	}
990
991	if len(certs) > 0 {
992		var pub crypto.PublicKey
993		switch key := certs[0].PublicKey.(type) {
994		case *ecdsa.PublicKey, *rsa.PublicKey:
995			pub = key
996		default:
997			c.sendAlert(alertUnsupportedCertificate)
998			return nil, fmt.Errorf("tls: client's certificate contains an unsupported public key of type %T", certs[0].PublicKey)
999		}
1000		c.peerCertificates = certs
1001		return pub, nil
1002	}
1003
1004	return nil, nil
1005}
1006
1007func (hs *serverHandshakeState) writeServerHash(msg []byte) {
1008	// writeServerHash is called before writeRecord.
1009	hs.writeHash(msg, hs.c.sendHandshakeSeq)
1010}
1011
1012func (hs *serverHandshakeState) writeClientHash(msg []byte) {
1013	// writeClientHash is called after readHandshake.
1014	hs.writeHash(msg, hs.c.recvHandshakeSeq-1)
1015}
1016
1017func (hs *serverHandshakeState) writeHash(msg []byte, seqno uint16) {
1018	if hs.c.isDTLS {
1019		// This is somewhat hacky. DTLS hashes a slightly different format.
1020		// First, the TLS header.
1021		hs.finishedHash.Write(msg[:4])
1022		// Then the sequence number and reassembled fragment offset (always 0).
1023		hs.finishedHash.Write([]byte{byte(seqno >> 8), byte(seqno), 0, 0, 0})
1024		// Then the reassembled fragment (always equal to the message length).
1025		hs.finishedHash.Write(msg[1:4])
1026		// And then the message body.
1027		hs.finishedHash.Write(msg[4:])
1028	} else {
1029		hs.finishedHash.Write(msg)
1030	}
1031}
1032
1033// tryCipherSuite returns a cipherSuite with the given id if that cipher suite
1034// is acceptable to use.
1035func (c *Conn) tryCipherSuite(id uint16, supportedCipherSuites []uint16, version uint16, ellipticOk, ecdsaOk bool) *cipherSuite {
1036	for _, supported := range supportedCipherSuites {
1037		if id == supported {
1038			var candidate *cipherSuite
1039
1040			for _, s := range cipherSuites {
1041				if s.id == id {
1042					candidate = s
1043					break
1044				}
1045			}
1046			if candidate == nil {
1047				continue
1048			}
1049			// Don't select a ciphersuite which we can't
1050			// support for this client.
1051			if (candidate.flags&suiteECDHE != 0) && !ellipticOk {
1052				continue
1053			}
1054			if (candidate.flags&suiteECDSA != 0) != ecdsaOk {
1055				continue
1056			}
1057			if !c.config.Bugs.SkipCipherVersionCheck && version < VersionTLS12 && candidate.flags&suiteTLS12 != 0 {
1058				continue
1059			}
1060			if c.isDTLS && candidate.flags&suiteNoDTLS != 0 {
1061				continue
1062			}
1063			return candidate
1064		}
1065	}
1066
1067	return nil
1068}
1069
1070func isTLS12Cipher(id uint16) bool {
1071	for _, cipher := range cipherSuites {
1072		if cipher.id != id {
1073			continue
1074		}
1075		return cipher.flags&suiteTLS12 != 0
1076	}
1077	// Unknown cipher.
1078	return false
1079}
1080