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