github.com/goproxy0/go@v0.0.0-20171111080102-49cc0c489d2c/src/crypto/tls/handshake_server.go (about)

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