github.com/Filosottile/go@v0.0.0-20170906193555-dbed9972d994/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  )
    18  
    19  // serverHandshakeState contains details of a server handshake in progress.
    20  // It's discarded once the handshake has completed.
    21  type 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.
    40  func (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  	if err := c.enableApplicationDataEncryption(); err != nil {
   107  		return err
   108  	}
   109  	c.handshakeComplete = true
   110  
   111  	return nil
   112  }
   113  
   114  // readClientHello reads a ClientHello message from the client and decides
   115  // whether we will perform session resumption.
   116  func (hs *serverHandshakeState) readClientHello() (isResume bool, err error) {
   117  	c := hs.c
   118  
   119  	msg, err := c.readHandshake()
   120  	if err != nil {
   121  		return false, err
   122  	}
   123  	var ok bool
   124  	hs.clientHello, ok = msg.(*clientHelloMsg)
   125  	if !ok {
   126  		c.sendAlert(alertUnexpectedMessage)
   127  		return false, unexpectedMessageError(hs.clientHello, msg)
   128  	}
   129  
   130  	if c.config.GetConfigForClient != nil {
   131  		if newConfig, err := c.config.GetConfigForClient(hs.clientHelloInfo()); err != nil {
   132  			c.sendAlert(alertInternalError)
   133  			return false, err
   134  		} else if newConfig != nil {
   135  			newConfig.serverInitOnce.Do(func() { newConfig.serverInit(c.config) })
   136  			c.config = newConfig
   137  		}
   138  	}
   139  
   140  	c.vers, ok = c.config.mutualVersion(hs.clientHello.vers)
   141  	if !ok {
   142  		c.sendAlert(alertProtocolVersion)
   143  		return false, fmt.Errorf("tls: client offered an unsupported, maximum protocol version of %x", hs.clientHello.vers)
   144  	}
   145  	c.haveVers = true
   146  
   147  	hs.hello = new(serverHelloMsg)
   148  
   149  	supportedCurve := false
   150  	preferredCurves := c.config.curvePreferences()
   151  Curves:
   152  	for _, curve := range hs.clientHello.supportedCurves {
   153  		for _, supported := range preferredCurves {
   154  			if supported == curve {
   155  				supportedCurve = true
   156  				break Curves
   157  			}
   158  		}
   159  	}
   160  
   161  	supportedPointFormat := false
   162  	for _, pointFormat := range hs.clientHello.supportedPoints {
   163  		if pointFormat == pointFormatUncompressed {
   164  			supportedPointFormat = true
   165  			break
   166  		}
   167  	}
   168  	hs.ellipticOk = supportedCurve && supportedPointFormat
   169  
   170  	foundCompression := false
   171  	// We only support null compression, so check that the client offered it.
   172  	for _, compression := range hs.clientHello.compressionMethods {
   173  		if compression == compressionNone {
   174  			foundCompression = true
   175  			break
   176  		}
   177  	}
   178  
   179  	if !foundCompression {
   180  		c.sendAlert(alertHandshakeFailure)
   181  		return false, errors.New("tls: client does not support uncompressed connections")
   182  	}
   183  
   184  	hs.hello.vers = c.vers
   185  	hs.hello.random = make([]byte, 32)
   186  	_, err = io.ReadFull(c.config.rand(), hs.hello.random)
   187  	if err != nil {
   188  		c.sendAlert(alertInternalError)
   189  		return false, err
   190  	}
   191  
   192  	if len(hs.clientHello.secureRenegotiation) != 0 {
   193  		c.sendAlert(alertHandshakeFailure)
   194  		return false, errors.New("tls: initial handshake had non-empty renegotiation extension")
   195  	}
   196  
   197  	hs.hello.secureRenegotiationSupported = hs.clientHello.secureRenegotiationSupported
   198  	hs.hello.compressionMethod = compressionNone
   199  	if len(hs.clientHello.serverName) > 0 {
   200  		c.serverName = hs.clientHello.serverName
   201  	}
   202  
   203  	if len(hs.clientHello.alpnProtocols) > 0 {
   204  		if selectedProto, fallback := mutualProtocol(hs.clientHello.alpnProtocols, c.config.NextProtos); !fallback {
   205  			hs.hello.alpnProtocol = selectedProto
   206  			c.clientProtocol = selectedProto
   207  		}
   208  	} else {
   209  		// Although sending an empty NPN extension is reasonable, Firefox has
   210  		// had a bug around this. Best to send nothing at all if
   211  		// c.config.NextProtos is empty. See
   212  		// https://golang.org/issue/5445.
   213  		if hs.clientHello.nextProtoNeg && len(c.config.NextProtos) > 0 {
   214  			hs.hello.nextProtoNeg = true
   215  			hs.hello.nextProtos = c.config.NextProtos
   216  		}
   217  	}
   218  
   219  	hs.cert, err = c.config.getCertificate(hs.clientHelloInfo())
   220  	if err != nil {
   221  		c.sendAlert(alertInternalError)
   222  		return false, err
   223  	}
   224  	if hs.clientHello.scts {
   225  		hs.hello.scts = hs.cert.SignedCertificateTimestamps
   226  	}
   227  
   228  	if priv, ok := hs.cert.PrivateKey.(crypto.Signer); ok {
   229  		switch priv.Public().(type) {
   230  		case *ecdsa.PublicKey:
   231  			hs.ecdsaOk = true
   232  		case *rsa.PublicKey:
   233  			hs.rsaSignOk = true
   234  		default:
   235  			c.sendAlert(alertInternalError)
   236  			return false, fmt.Errorf("tls: unsupported signing key type (%T)", priv.Public())
   237  		}
   238  	}
   239  	if priv, ok := hs.cert.PrivateKey.(crypto.Decrypter); ok {
   240  		switch priv.Public().(type) {
   241  		case *rsa.PublicKey:
   242  			hs.rsaDecryptOk = true
   243  		default:
   244  			c.sendAlert(alertInternalError)
   245  			return false, fmt.Errorf("tls: unsupported decryption key type (%T)", priv.Public())
   246  		}
   247  	}
   248  
   249  	if hs.checkForResumption() {
   250  		return true, nil
   251  	}
   252  
   253  	var preferenceList, supportedList []uint16
   254  	if c.config.PreferServerCipherSuites {
   255  		preferenceList = c.config.cipherSuites()
   256  		supportedList = hs.clientHello.cipherSuites
   257  	} else {
   258  		preferenceList = hs.clientHello.cipherSuites
   259  		supportedList = c.config.cipherSuites()
   260  	}
   261  
   262  	for _, id := range preferenceList {
   263  		if hs.setCipherSuite(id, supportedList, c.vers) {
   264  			break
   265  		}
   266  	}
   267  
   268  	if hs.suite == nil {
   269  		c.sendAlert(alertHandshakeFailure)
   270  		return false, errors.New("tls: no cipher suite supported by both client and server")
   271  	}
   272  
   273  	// See https://tools.ietf.org/html/rfc7507.
   274  	for _, id := range hs.clientHello.cipherSuites {
   275  		if id == TLS_FALLBACK_SCSV {
   276  			// The client is doing a fallback connection.
   277  			if hs.clientHello.vers < c.config.maxVersion() {
   278  				c.sendAlert(alertInappropriateFallback)
   279  				return false, errors.New("tls: client using inappropriate protocol fallback")
   280  			}
   281  			break
   282  		}
   283  	}
   284  
   285  	return false, nil
   286  }
   287  
   288  // checkForResumption reports whether we should perform resumption on this connection.
   289  func (hs *serverHandshakeState) checkForResumption() bool {
   290  	c := hs.c
   291  
   292  	if c.config.SessionTicketsDisabled {
   293  		return false
   294  	}
   295  
   296  	var ok bool
   297  	var sessionTicket = append([]uint8{}, hs.clientHello.sessionTicket...)
   298  	if hs.sessionState, ok = c.decryptTicket(sessionTicket); !ok {
   299  		return false
   300  	}
   301  
   302  	// Never resume a session for a different TLS version.
   303  	if c.vers != hs.sessionState.vers {
   304  		return false
   305  	}
   306  
   307  	cipherSuiteOk := false
   308  	// Check that the client is still offering the ciphersuite in the session.
   309  	for _, id := range hs.clientHello.cipherSuites {
   310  		if id == hs.sessionState.cipherSuite {
   311  			cipherSuiteOk = true
   312  			break
   313  		}
   314  	}
   315  	if !cipherSuiteOk {
   316  		return false
   317  	}
   318  
   319  	// Check that we also support the ciphersuite from the session.
   320  	if !hs.setCipherSuite(hs.sessionState.cipherSuite, c.config.cipherSuites(), hs.sessionState.vers) {
   321  		return false
   322  	}
   323  
   324  	sessionHasClientCerts := len(hs.sessionState.certificates) != 0
   325  	needClientCerts := c.config.ClientAuth == RequireAnyClientCert || c.config.ClientAuth == RequireAndVerifyClientCert
   326  	if needClientCerts && !sessionHasClientCerts {
   327  		return false
   328  	}
   329  	if sessionHasClientCerts && c.config.ClientAuth == NoClientCert {
   330  		return false
   331  	}
   332  
   333  	return true
   334  }
   335  
   336  func (hs *serverHandshakeState) doResumeHandshake() error {
   337  	c := hs.c
   338  
   339  	hs.hello.cipherSuite = hs.suite.id
   340  	// We echo the client's session ID in the ServerHello to let it know
   341  	// that we're doing a resumption.
   342  	hs.hello.sessionId = hs.clientHello.sessionId
   343  	hs.hello.ticketSupported = hs.sessionState.usedOldKey
   344  	hs.finishedHash = newFinishedHash(c.vers, hs.suite)
   345  	hs.finishedHash.discardHandshakeBuffer()
   346  	hs.finishedHash.Write(hs.clientHello.marshal())
   347  	hs.finishedHash.Write(hs.hello.marshal())
   348  	if _, err := c.writeRecord(recordTypeHandshake, hs.hello.marshal()); err != nil {
   349  		return err
   350  	}
   351  
   352  	if len(hs.sessionState.certificates) > 0 {
   353  		if _, err := hs.processCertsFromClient(hs.sessionState.certificates); err != nil {
   354  			return err
   355  		}
   356  	}
   357  
   358  	hs.masterSecret = hs.sessionState.masterSecret
   359  
   360  	return nil
   361  }
   362  
   363  func (hs *serverHandshakeState) doFullHandshake() error {
   364  	c := hs.c
   365  
   366  	if hs.clientHello.ocspStapling && len(hs.cert.OCSPStaple) > 0 {
   367  		hs.hello.ocspStapling = true
   368  	}
   369  
   370  	hs.hello.ticketSupported = hs.clientHello.ticketSupported && !c.config.SessionTicketsDisabled
   371  	hs.hello.cipherSuite = hs.suite.id
   372  
   373  	hs.finishedHash = newFinishedHash(hs.c.vers, hs.suite)
   374  	if c.config.ClientAuth == NoClientCert {
   375  		// No need to keep a full record of the handshake if client
   376  		// certificates won't be used.
   377  		hs.finishedHash.discardHandshakeBuffer()
   378  	}
   379  	hs.finishedHash.Write(hs.clientHello.marshal())
   380  	hs.finishedHash.Write(hs.hello.marshal())
   381  	if _, err := c.writeRecord(recordTypeHandshake, hs.hello.marshal()); err != nil {
   382  		return err
   383  	}
   384  
   385  	certMsg := new(certificateMsg)
   386  	certMsg.certificates = hs.cert.Certificate
   387  	hs.finishedHash.Write(certMsg.marshal())
   388  	if _, err := c.writeRecord(recordTypeHandshake, certMsg.marshal()); err != nil {
   389  		return err
   390  	}
   391  
   392  	if hs.hello.ocspStapling {
   393  		certStatus := new(certificateStatusMsg)
   394  		certStatus.statusType = statusTypeOCSP
   395  		certStatus.response = hs.cert.OCSPStaple
   396  		hs.finishedHash.Write(certStatus.marshal())
   397  		if _, err := c.writeRecord(recordTypeHandshake, certStatus.marshal()); err != nil {
   398  			return err
   399  		}
   400  	}
   401  
   402  	keyAgreement := hs.suite.ka(c.vers)
   403  	skx, err := keyAgreement.generateServerKeyExchange(c.config, hs.cert, hs.clientHello, hs.hello)
   404  	if err != nil {
   405  		c.sendAlert(alertHandshakeFailure)
   406  		return err
   407  	}
   408  	if skx != nil {
   409  		hs.finishedHash.Write(skx.marshal())
   410  		if _, err := c.writeRecord(recordTypeHandshake, skx.marshal()); err != nil {
   411  			return err
   412  		}
   413  	}
   414  
   415  	if c.config.ClientAuth >= RequestClientCert {
   416  		// Request a client certificate
   417  		certReq := new(certificateRequestMsg)
   418  		certReq.certificateTypes = []byte{
   419  			byte(certTypeRSASign),
   420  			byte(certTypeECDSASign),
   421  		}
   422  		if c.vers >= VersionTLS12 {
   423  			certReq.hasSignatureAndHash = true
   424  			certReq.signatureAndHashes = supportedSignatureAlgorithms
   425  		}
   426  
   427  		// An empty list of certificateAuthorities signals to
   428  		// the client that it may send any certificate in response
   429  		// to our request. When we know the CAs we trust, then
   430  		// we can send them down, so that the client can choose
   431  		// an appropriate certificate to give to us.
   432  		if c.config.ClientCAs != nil {
   433  			certReq.certificateAuthorities = c.config.ClientCAs.Subjects()
   434  		}
   435  		hs.finishedHash.Write(certReq.marshal())
   436  		if _, err := c.writeRecord(recordTypeHandshake, certReq.marshal()); err != nil {
   437  			return err
   438  		}
   439  	}
   440  
   441  	helloDone := new(serverHelloDoneMsg)
   442  	hs.finishedHash.Write(helloDone.marshal())
   443  	if _, err := c.writeRecord(recordTypeHandshake, helloDone.marshal()); err != nil {
   444  		return err
   445  	}
   446  
   447  	if _, err := c.flush(); err != nil {
   448  		return err
   449  	}
   450  
   451  	var pub crypto.PublicKey // public key for client auth, if any
   452  
   453  	msg, err := c.readHandshake()
   454  	if err != nil {
   455  		return err
   456  	}
   457  
   458  	var ok bool
   459  	// If we requested a client certificate, then the client must send a
   460  	// certificate message, even if it's empty.
   461  	if c.config.ClientAuth >= RequestClientCert {
   462  		if certMsg, ok = msg.(*certificateMsg); !ok {
   463  			c.sendAlert(alertUnexpectedMessage)
   464  			return unexpectedMessageError(certMsg, msg)
   465  		}
   466  		hs.finishedHash.Write(certMsg.marshal())
   467  
   468  		if len(certMsg.certificates) == 0 {
   469  			// The client didn't actually send a certificate
   470  			switch c.config.ClientAuth {
   471  			case RequireAnyClientCert, RequireAndVerifyClientCert:
   472  				c.sendAlert(alertBadCertificate)
   473  				return errors.New("tls: client didn't provide a certificate")
   474  			}
   475  		}
   476  
   477  		pub, err = hs.processCertsFromClient(certMsg.certificates)
   478  		if err != nil {
   479  			return err
   480  		}
   481  
   482  		msg, err = c.readHandshake()
   483  		if err != nil {
   484  			return err
   485  		}
   486  	}
   487  
   488  	// Get client key exchange
   489  	ckx, ok := msg.(*clientKeyExchangeMsg)
   490  	if !ok {
   491  		c.sendAlert(alertUnexpectedMessage)
   492  		return unexpectedMessageError(ckx, msg)
   493  	}
   494  	hs.finishedHash.Write(ckx.marshal())
   495  
   496  	preMasterSecret, err := keyAgreement.processClientKeyExchange(c.config, hs.cert, ckx, c.vers)
   497  	if err != nil {
   498  		c.sendAlert(alertHandshakeFailure)
   499  		return err
   500  	}
   501  	hs.masterSecret = masterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret, hs.clientHello.random, hs.hello.random)
   502  	if err := c.config.writeKeyLog(hs.clientHello.random, hs.masterSecret); err != nil {
   503  		c.sendAlert(alertInternalError)
   504  		return err
   505  	}
   506  
   507  	// If we received a client cert in response to our certificate request message,
   508  	// the client will send us a certificateVerifyMsg immediately after the
   509  	// clientKeyExchangeMsg. This message is a digest of all preceding
   510  	// handshake-layer messages that is signed using the private key corresponding
   511  	// to the client's certificate. This allows us to verify that the client is in
   512  	// possession of the private key of the certificate.
   513  	if len(c.peerCertificates) > 0 {
   514  		msg, err = c.readHandshake()
   515  		if err != nil {
   516  			return err
   517  		}
   518  		certVerify, ok := msg.(*certificateVerifyMsg)
   519  		if !ok {
   520  			c.sendAlert(alertUnexpectedMessage)
   521  			return unexpectedMessageError(certVerify, msg)
   522  		}
   523  
   524  		// Determine the signature type.
   525  		var signatureAndHash signatureAndHash
   526  		if certVerify.hasSignatureAndHash {
   527  			signatureAndHash = certVerify.signatureAndHash
   528  			if !isSupportedSignatureAndHash(signatureAndHash, supportedSignatureAlgorithms) {
   529  				return errors.New("tls: unsupported hash function for client certificate")
   530  			}
   531  		} else {
   532  			// Before TLS 1.2 the signature algorithm was implicit
   533  			// from the key type, and only one hash per signature
   534  			// algorithm was possible. Leave the hash as zero.
   535  			switch pub.(type) {
   536  			case *ecdsa.PublicKey:
   537  				signatureAndHash.signature = signatureECDSA
   538  			case *rsa.PublicKey:
   539  				signatureAndHash.signature = signatureRSA
   540  			}
   541  		}
   542  
   543  		switch key := pub.(type) {
   544  		case *ecdsa.PublicKey:
   545  			if signatureAndHash.signature != 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(signatureAndHash, 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 signatureAndHash.signature != 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(signatureAndHash, 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  
   589  func (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  
   614  func (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  
   658  func (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  
   686  func (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.
   709  func (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.
   769  func (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
   810  var suppVersArray = [...]uint16{VersionTLS12, VersionTLS11, VersionTLS10, VersionSSL30}
   811  
   812  func (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  	signatureSchemes := make([]SignatureScheme, 0, len(hs.clientHello.signatureAndHashes))
   825  	for _, sah := range hs.clientHello.signatureAndHashes {
   826  		signatureSchemes = append(signatureSchemes, SignatureScheme(sah.hash)<<8+SignatureScheme(sah.signature))
   827  	}
   828  
   829  	hs.cachedClientHelloInfo = &ClientHelloInfo{
   830  		CipherSuites:      hs.clientHello.cipherSuites,
   831  		ServerName:        hs.clientHello.serverName,
   832  		SupportedCurves:   hs.clientHello.supportedCurves,
   833  		SupportedPoints:   hs.clientHello.supportedPoints,
   834  		SignatureSchemes:  signatureSchemes,
   835  		SupportedProtos:   hs.clientHello.alpnProtocols,
   836  		SupportedVersions: supportedVersions,
   837  		Conn:              hs.c.conn,
   838  	}
   839  
   840  	return hs.cachedClientHelloInfo
   841  }