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