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