Black Lives Matter. Support the Equal Justice Initiative.

Source file src/crypto/tls/handshake_client_tls13.go

Documentation: crypto/tls

     1  // Copyright 2018 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  	"bytes"
     9  	"context"
    10  	"crypto"
    11  	"crypto/hmac"
    12  	"crypto/rsa"
    13  	"errors"
    14  	"hash"
    15  	"sync/atomic"
    16  	"time"
    17  )
    18  
    19  type clientHandshakeStateTLS13 struct {
    20  	c           *Conn
    21  	ctx         context.Context
    22  	serverHello *serverHelloMsg
    23  	hello       *clientHelloMsg
    24  	ecdheParams ecdheParameters
    25  
    26  	session     *ClientSessionState
    27  	earlySecret []byte
    28  	binderKey   []byte
    29  
    30  	certReq       *certificateRequestMsgTLS13
    31  	usingPSK      bool
    32  	sentDummyCCS  bool
    33  	suite         *cipherSuiteTLS13
    34  	transcript    hash.Hash
    35  	masterSecret  []byte
    36  	trafficSecret []byte // client_application_traffic_secret_0
    37  }
    38  
    39  // handshake requires hs.c, hs.hello, hs.serverHello, hs.ecdheParams, and,
    40  // optionally, hs.session, hs.earlySecret and hs.binderKey to be set.
    41  func (hs *clientHandshakeStateTLS13) handshake() error {
    42  	c := hs.c
    43  
    44  	// The server must not select TLS 1.3 in a renegotiation. See RFC 8446,
    45  	// sections 4.1.2 and 4.1.3.
    46  	if c.handshakes > 0 {
    47  		c.sendAlert(alertProtocolVersion)
    48  		return errors.New("tls: server selected TLS 1.3 in a renegotiation")
    49  	}
    50  
    51  	// Consistency check on the presence of a keyShare and its parameters.
    52  	if hs.ecdheParams == nil || len(hs.hello.keyShares) != 1 {
    53  		return c.sendAlert(alertInternalError)
    54  	}
    55  
    56  	if err := hs.checkServerHelloOrHRR(); err != nil {
    57  		return err
    58  	}
    59  
    60  	hs.transcript = hs.suite.hash.New()
    61  	hs.transcript.Write(hs.hello.marshal())
    62  
    63  	if bytes.Equal(hs.serverHello.random, helloRetryRequestRandom) {
    64  		if err := hs.sendDummyChangeCipherSpec(); err != nil {
    65  			return err
    66  		}
    67  		if err := hs.processHelloRetryRequest(); err != nil {
    68  			return err
    69  		}
    70  	}
    71  
    72  	hs.transcript.Write(hs.serverHello.marshal())
    73  
    74  	c.buffering = true
    75  	if err := hs.processServerHello(); err != nil {
    76  		return err
    77  	}
    78  	if err := hs.sendDummyChangeCipherSpec(); err != nil {
    79  		return err
    80  	}
    81  	if err := hs.establishHandshakeKeys(); err != nil {
    82  		return err
    83  	}
    84  	if err := hs.readServerParameters(); err != nil {
    85  		return err
    86  	}
    87  	if err := hs.readServerCertificate(); err != nil {
    88  		return err
    89  	}
    90  	if err := hs.readServerFinished(); err != nil {
    91  		return err
    92  	}
    93  	if err := hs.sendClientCertificate(); err != nil {
    94  		return err
    95  	}
    96  	if err := hs.sendClientFinished(); err != nil {
    97  		return err
    98  	}
    99  	if _, err := c.flush(); err != nil {
   100  		return err
   101  	}
   102  
   103  	atomic.StoreUint32(&c.handshakeStatus, 1)
   104  
   105  	return nil
   106  }
   107  
   108  // checkServerHelloOrHRR does validity checks that apply to both ServerHello and
   109  // HelloRetryRequest messages. It sets hs.suite.
   110  func (hs *clientHandshakeStateTLS13) checkServerHelloOrHRR() error {
   111  	c := hs.c
   112  
   113  	if hs.serverHello.supportedVersion == 0 {
   114  		c.sendAlert(alertMissingExtension)
   115  		return errors.New("tls: server selected TLS 1.3 using the legacy version field")
   116  	}
   117  
   118  	if hs.serverHello.supportedVersion != VersionTLS13 {
   119  		c.sendAlert(alertIllegalParameter)
   120  		return errors.New("tls: server selected an invalid version after a HelloRetryRequest")
   121  	}
   122  
   123  	if hs.serverHello.vers != VersionTLS12 {
   124  		c.sendAlert(alertIllegalParameter)
   125  		return errors.New("tls: server sent an incorrect legacy version")
   126  	}
   127  
   128  	if hs.serverHello.ocspStapling ||
   129  		hs.serverHello.ticketSupported ||
   130  		hs.serverHello.secureRenegotiationSupported ||
   131  		len(hs.serverHello.secureRenegotiation) != 0 ||
   132  		len(hs.serverHello.alpnProtocol) != 0 ||
   133  		len(hs.serverHello.scts) != 0 {
   134  		c.sendAlert(alertUnsupportedExtension)
   135  		return errors.New("tls: server sent a ServerHello extension forbidden in TLS 1.3")
   136  	}
   137  
   138  	if !bytes.Equal(hs.hello.sessionId, hs.serverHello.sessionId) {
   139  		c.sendAlert(alertIllegalParameter)
   140  		return errors.New("tls: server did not echo the legacy session ID")
   141  	}
   142  
   143  	if hs.serverHello.compressionMethod != compressionNone {
   144  		c.sendAlert(alertIllegalParameter)
   145  		return errors.New("tls: server selected unsupported compression format")
   146  	}
   147  
   148  	selectedSuite := mutualCipherSuiteTLS13(hs.hello.cipherSuites, hs.serverHello.cipherSuite)
   149  	if hs.suite != nil && selectedSuite != hs.suite {
   150  		c.sendAlert(alertIllegalParameter)
   151  		return errors.New("tls: server changed cipher suite after a HelloRetryRequest")
   152  	}
   153  	if selectedSuite == nil {
   154  		c.sendAlert(alertIllegalParameter)
   155  		return errors.New("tls: server chose an unconfigured cipher suite")
   156  	}
   157  	hs.suite = selectedSuite
   158  	c.cipherSuite = hs.suite.id
   159  
   160  	return nil
   161  }
   162  
   163  // sendDummyChangeCipherSpec sends a ChangeCipherSpec record for compatibility
   164  // with middleboxes that didn't implement TLS correctly. See RFC 8446, Appendix D.4.
   165  func (hs *clientHandshakeStateTLS13) sendDummyChangeCipherSpec() error {
   166  	if hs.sentDummyCCS {
   167  		return nil
   168  	}
   169  	hs.sentDummyCCS = true
   170  
   171  	_, err := hs.c.writeRecord(recordTypeChangeCipherSpec, []byte{1})
   172  	return err
   173  }
   174  
   175  // processHelloRetryRequest handles the HRR in hs.serverHello, modifies and
   176  // resends hs.hello, and reads the new ServerHello into hs.serverHello.
   177  func (hs *clientHandshakeStateTLS13) processHelloRetryRequest() error {
   178  	c := hs.c
   179  
   180  	// The first ClientHello gets double-hashed into the transcript upon a
   181  	// HelloRetryRequest. (The idea is that the server might offload transcript
   182  	// storage to the client in the cookie.) See RFC 8446, Section 4.4.1.
   183  	chHash := hs.transcript.Sum(nil)
   184  	hs.transcript.Reset()
   185  	hs.transcript.Write([]byte{typeMessageHash, 0, 0, uint8(len(chHash))})
   186  	hs.transcript.Write(chHash)
   187  	hs.transcript.Write(hs.serverHello.marshal())
   188  
   189  	// The only HelloRetryRequest extensions we support are key_share and
   190  	// cookie, and clients must abort the handshake if the HRR would not result
   191  	// in any change in the ClientHello.
   192  	if hs.serverHello.selectedGroup == 0 && hs.serverHello.cookie == nil {
   193  		c.sendAlert(alertIllegalParameter)
   194  		return errors.New("tls: server sent an unnecessary HelloRetryRequest message")
   195  	}
   196  
   197  	if hs.serverHello.cookie != nil {
   198  		hs.hello.cookie = hs.serverHello.cookie
   199  	}
   200  
   201  	if hs.serverHello.serverShare.group != 0 {
   202  		c.sendAlert(alertDecodeError)
   203  		return errors.New("tls: received malformed key_share extension")
   204  	}
   205  
   206  	// If the server sent a key_share extension selecting a group, ensure it's
   207  	// a group we advertised but did not send a key share for, and send a key
   208  	// share for it this time.
   209  	if curveID := hs.serverHello.selectedGroup; curveID != 0 {
   210  		curveOK := false
   211  		for _, id := range hs.hello.supportedCurves {
   212  			if id == curveID {
   213  				curveOK = true
   214  				break
   215  			}
   216  		}
   217  		if !curveOK {
   218  			c.sendAlert(alertIllegalParameter)
   219  			return errors.New("tls: server selected unsupported group")
   220  		}
   221  		if hs.ecdheParams.CurveID() == curveID {
   222  			c.sendAlert(alertIllegalParameter)
   223  			return errors.New("tls: server sent an unnecessary HelloRetryRequest key_share")
   224  		}
   225  		if _, ok := curveForCurveID(curveID); curveID != X25519 && !ok {
   226  			c.sendAlert(alertInternalError)
   227  			return errors.New("tls: CurvePreferences includes unsupported curve")
   228  		}
   229  		params, err := generateECDHEParameters(c.config.rand(), curveID)
   230  		if err != nil {
   231  			c.sendAlert(alertInternalError)
   232  			return err
   233  		}
   234  		hs.ecdheParams = params
   235  		hs.hello.keyShares = []keyShare{{group: curveID, data: params.PublicKey()}}
   236  	}
   237  
   238  	hs.hello.raw = nil
   239  	if len(hs.hello.pskIdentities) > 0 {
   240  		pskSuite := cipherSuiteTLS13ByID(hs.session.cipherSuite)
   241  		if pskSuite == nil {
   242  			return c.sendAlert(alertInternalError)
   243  		}
   244  		if pskSuite.hash == hs.suite.hash {
   245  			// Update binders and obfuscated_ticket_age.
   246  			ticketAge := uint32(c.config.time().Sub(hs.session.receivedAt) / time.Millisecond)
   247  			hs.hello.pskIdentities[0].obfuscatedTicketAge = ticketAge + hs.session.ageAdd
   248  
   249  			transcript := hs.suite.hash.New()
   250  			transcript.Write([]byte{typeMessageHash, 0, 0, uint8(len(chHash))})
   251  			transcript.Write(chHash)
   252  			transcript.Write(hs.serverHello.marshal())
   253  			transcript.Write(hs.hello.marshalWithoutBinders())
   254  			pskBinders := [][]byte{hs.suite.finishedHash(hs.binderKey, transcript)}
   255  			hs.hello.updateBinders(pskBinders)
   256  		} else {
   257  			// Server selected a cipher suite incompatible with the PSK.
   258  			hs.hello.pskIdentities = nil
   259  			hs.hello.pskBinders = nil
   260  		}
   261  	}
   262  
   263  	hs.transcript.Write(hs.hello.marshal())
   264  	if _, err := c.writeRecord(recordTypeHandshake, hs.hello.marshal()); err != nil {
   265  		return err
   266  	}
   267  
   268  	msg, err := c.readHandshake()
   269  	if err != nil {
   270  		return err
   271  	}
   272  
   273  	serverHello, ok := msg.(*serverHelloMsg)
   274  	if !ok {
   275  		c.sendAlert(alertUnexpectedMessage)
   276  		return unexpectedMessageError(serverHello, msg)
   277  	}
   278  	hs.serverHello = serverHello
   279  
   280  	if err := hs.checkServerHelloOrHRR(); err != nil {
   281  		return err
   282  	}
   283  
   284  	return nil
   285  }
   286  
   287  func (hs *clientHandshakeStateTLS13) processServerHello() error {
   288  	c := hs.c
   289  
   290  	if bytes.Equal(hs.serverHello.random, helloRetryRequestRandom) {
   291  		c.sendAlert(alertUnexpectedMessage)
   292  		return errors.New("tls: server sent two HelloRetryRequest messages")
   293  	}
   294  
   295  	if len(hs.serverHello.cookie) != 0 {
   296  		c.sendAlert(alertUnsupportedExtension)
   297  		return errors.New("tls: server sent a cookie in a normal ServerHello")
   298  	}
   299  
   300  	if hs.serverHello.selectedGroup != 0 {
   301  		c.sendAlert(alertDecodeError)
   302  		return errors.New("tls: malformed key_share extension")
   303  	}
   304  
   305  	if hs.serverHello.serverShare.group == 0 {
   306  		c.sendAlert(alertIllegalParameter)
   307  		return errors.New("tls: server did not send a key share")
   308  	}
   309  	if hs.serverHello.serverShare.group != hs.ecdheParams.CurveID() {
   310  		c.sendAlert(alertIllegalParameter)
   311  		return errors.New("tls: server selected unsupported group")
   312  	}
   313  
   314  	if !hs.serverHello.selectedIdentityPresent {
   315  		return nil
   316  	}
   317  
   318  	if int(hs.serverHello.selectedIdentity) >= len(hs.hello.pskIdentities) {
   319  		c.sendAlert(alertIllegalParameter)
   320  		return errors.New("tls: server selected an invalid PSK")
   321  	}
   322  
   323  	if len(hs.hello.pskIdentities) != 1 || hs.session == nil {
   324  		return c.sendAlert(alertInternalError)
   325  	}
   326  	pskSuite := cipherSuiteTLS13ByID(hs.session.cipherSuite)
   327  	if pskSuite == nil {
   328  		return c.sendAlert(alertInternalError)
   329  	}
   330  	if pskSuite.hash != hs.suite.hash {
   331  		c.sendAlert(alertIllegalParameter)
   332  		return errors.New("tls: server selected an invalid PSK and cipher suite pair")
   333  	}
   334  
   335  	hs.usingPSK = true
   336  	c.didResume = true
   337  	c.peerCertificates = hs.session.serverCertificates
   338  	c.verifiedChains = hs.session.verifiedChains
   339  	c.ocspResponse = hs.session.ocspResponse
   340  	c.scts = hs.session.scts
   341  	return nil
   342  }
   343  
   344  func (hs *clientHandshakeStateTLS13) establishHandshakeKeys() error {
   345  	c := hs.c
   346  
   347  	sharedKey := hs.ecdheParams.SharedKey(hs.serverHello.serverShare.data)
   348  	if sharedKey == nil {
   349  		c.sendAlert(alertIllegalParameter)
   350  		return errors.New("tls: invalid server key share")
   351  	}
   352  
   353  	earlySecret := hs.earlySecret
   354  	if !hs.usingPSK {
   355  		earlySecret = hs.suite.extract(nil, nil)
   356  	}
   357  	handshakeSecret := hs.suite.extract(sharedKey,
   358  		hs.suite.deriveSecret(earlySecret, "derived", nil))
   359  
   360  	clientSecret := hs.suite.deriveSecret(handshakeSecret,
   361  		clientHandshakeTrafficLabel, hs.transcript)
   362  	c.out.setTrafficSecret(hs.suite, clientSecret)
   363  	serverSecret := hs.suite.deriveSecret(handshakeSecret,
   364  		serverHandshakeTrafficLabel, hs.transcript)
   365  	c.in.setTrafficSecret(hs.suite, serverSecret)
   366  
   367  	err := c.config.writeKeyLog(keyLogLabelClientHandshake, hs.hello.random, clientSecret)
   368  	if err != nil {
   369  		c.sendAlert(alertInternalError)
   370  		return err
   371  	}
   372  	err = c.config.writeKeyLog(keyLogLabelServerHandshake, hs.hello.random, serverSecret)
   373  	if err != nil {
   374  		c.sendAlert(alertInternalError)
   375  		return err
   376  	}
   377  
   378  	hs.masterSecret = hs.suite.extract(nil,
   379  		hs.suite.deriveSecret(handshakeSecret, "derived", nil))
   380  
   381  	return nil
   382  }
   383  
   384  func (hs *clientHandshakeStateTLS13) readServerParameters() error {
   385  	c := hs.c
   386  
   387  	msg, err := c.readHandshake()
   388  	if err != nil {
   389  		return err
   390  	}
   391  
   392  	encryptedExtensions, ok := msg.(*encryptedExtensionsMsg)
   393  	if !ok {
   394  		c.sendAlert(alertUnexpectedMessage)
   395  		return unexpectedMessageError(encryptedExtensions, msg)
   396  	}
   397  	hs.transcript.Write(encryptedExtensions.marshal())
   398  
   399  	if err := checkALPN(hs.hello.alpnProtocols, encryptedExtensions.alpnProtocol); err != nil {
   400  		c.sendAlert(alertUnsupportedExtension)
   401  		return err
   402  	}
   403  	c.clientProtocol = encryptedExtensions.alpnProtocol
   404  
   405  	return nil
   406  }
   407  
   408  func (hs *clientHandshakeStateTLS13) readServerCertificate() error {
   409  	c := hs.c
   410  
   411  	// Either a PSK or a certificate is always used, but not both.
   412  	// See RFC 8446, Section 4.1.1.
   413  	if hs.usingPSK {
   414  		// Make sure the connection is still being verified whether or not this
   415  		// is a resumption. Resumptions currently don't reverify certificates so
   416  		// they don't call verifyServerCertificate. See Issue 31641.
   417  		if c.config.VerifyConnection != nil {
   418  			if err := c.config.VerifyConnection(c.connectionStateLocked()); err != nil {
   419  				c.sendAlert(alertBadCertificate)
   420  				return err
   421  			}
   422  		}
   423  		return nil
   424  	}
   425  
   426  	msg, err := c.readHandshake()
   427  	if err != nil {
   428  		return err
   429  	}
   430  
   431  	certReq, ok := msg.(*certificateRequestMsgTLS13)
   432  	if ok {
   433  		hs.transcript.Write(certReq.marshal())
   434  
   435  		hs.certReq = certReq
   436  
   437  		msg, err = c.readHandshake()
   438  		if err != nil {
   439  			return err
   440  		}
   441  	}
   442  
   443  	certMsg, ok := msg.(*certificateMsgTLS13)
   444  	if !ok {
   445  		c.sendAlert(alertUnexpectedMessage)
   446  		return unexpectedMessageError(certMsg, msg)
   447  	}
   448  	if len(certMsg.certificate.Certificate) == 0 {
   449  		c.sendAlert(alertDecodeError)
   450  		return errors.New("tls: received empty certificates message")
   451  	}
   452  	hs.transcript.Write(certMsg.marshal())
   453  
   454  	c.scts = certMsg.certificate.SignedCertificateTimestamps
   455  	c.ocspResponse = certMsg.certificate.OCSPStaple
   456  
   457  	if err := c.verifyServerCertificate(certMsg.certificate.Certificate); err != nil {
   458  		return err
   459  	}
   460  
   461  	msg, err = c.readHandshake()
   462  	if err != nil {
   463  		return err
   464  	}
   465  
   466  	certVerify, ok := msg.(*certificateVerifyMsg)
   467  	if !ok {
   468  		c.sendAlert(alertUnexpectedMessage)
   469  		return unexpectedMessageError(certVerify, msg)
   470  	}
   471  
   472  	// See RFC 8446, Section 4.4.3.
   473  	if !isSupportedSignatureAlgorithm(certVerify.signatureAlgorithm, supportedSignatureAlgorithms) {
   474  		c.sendAlert(alertIllegalParameter)
   475  		return errors.New("tls: certificate used with invalid signature algorithm")
   476  	}
   477  	sigType, sigHash, err := typeAndHashFromSignatureScheme(certVerify.signatureAlgorithm)
   478  	if err != nil {
   479  		return c.sendAlert(alertInternalError)
   480  	}
   481  	if sigType == signaturePKCS1v15 || sigHash == crypto.SHA1 {
   482  		c.sendAlert(alertIllegalParameter)
   483  		return errors.New("tls: certificate used with invalid signature algorithm")
   484  	}
   485  	signed := signedMessage(sigHash, serverSignatureContext, hs.transcript)
   486  	if err := verifyHandshakeSignature(sigType, c.peerCertificates[0].PublicKey,
   487  		sigHash, signed, certVerify.signature); err != nil {
   488  		c.sendAlert(alertDecryptError)
   489  		return errors.New("tls: invalid signature by the server certificate: " + err.Error())
   490  	}
   491  
   492  	hs.transcript.Write(certVerify.marshal())
   493  
   494  	return nil
   495  }
   496  
   497  func (hs *clientHandshakeStateTLS13) readServerFinished() error {
   498  	c := hs.c
   499  
   500  	msg, err := c.readHandshake()
   501  	if err != nil {
   502  		return err
   503  	}
   504  
   505  	finished, ok := msg.(*finishedMsg)
   506  	if !ok {
   507  		c.sendAlert(alertUnexpectedMessage)
   508  		return unexpectedMessageError(finished, msg)
   509  	}
   510  
   511  	expectedMAC := hs.suite.finishedHash(c.in.trafficSecret, hs.transcript)
   512  	if !hmac.Equal(expectedMAC, finished.verifyData) {
   513  		c.sendAlert(alertDecryptError)
   514  		return errors.New("tls: invalid server finished hash")
   515  	}
   516  
   517  	hs.transcript.Write(finished.marshal())
   518  
   519  	// Derive secrets that take context through the server Finished.
   520  
   521  	hs.trafficSecret = hs.suite.deriveSecret(hs.masterSecret,
   522  		clientApplicationTrafficLabel, hs.transcript)
   523  	serverSecret := hs.suite.deriveSecret(hs.masterSecret,
   524  		serverApplicationTrafficLabel, hs.transcript)
   525  	c.in.setTrafficSecret(hs.suite, serverSecret)
   526  
   527  	err = c.config.writeKeyLog(keyLogLabelClientTraffic, hs.hello.random, hs.trafficSecret)
   528  	if err != nil {
   529  		c.sendAlert(alertInternalError)
   530  		return err
   531  	}
   532  	err = c.config.writeKeyLog(keyLogLabelServerTraffic, hs.hello.random, serverSecret)
   533  	if err != nil {
   534  		c.sendAlert(alertInternalError)
   535  		return err
   536  	}
   537  
   538  	c.ekm = hs.suite.exportKeyingMaterial(hs.masterSecret, hs.transcript)
   539  
   540  	return nil
   541  }
   542  
   543  func (hs *clientHandshakeStateTLS13) sendClientCertificate() error {
   544  	c := hs.c
   545  
   546  	if hs.certReq == nil {
   547  		return nil
   548  	}
   549  
   550  	cert, err := c.getClientCertificate(&CertificateRequestInfo{
   551  		AcceptableCAs:    hs.certReq.certificateAuthorities,
   552  		SignatureSchemes: hs.certReq.supportedSignatureAlgorithms,
   553  		Version:          c.vers,
   554  		ctx:              hs.ctx,
   555  	})
   556  	if err != nil {
   557  		return err
   558  	}
   559  
   560  	certMsg := new(certificateMsgTLS13)
   561  
   562  	certMsg.certificate = *cert
   563  	certMsg.scts = hs.certReq.scts && len(cert.SignedCertificateTimestamps) > 0
   564  	certMsg.ocspStapling = hs.certReq.ocspStapling && len(cert.OCSPStaple) > 0
   565  
   566  	hs.transcript.Write(certMsg.marshal())
   567  	if _, err := c.writeRecord(recordTypeHandshake, certMsg.marshal()); err != nil {
   568  		return err
   569  	}
   570  
   571  	// If we sent an empty certificate message, skip the CertificateVerify.
   572  	if len(cert.Certificate) == 0 {
   573  		return nil
   574  	}
   575  
   576  	certVerifyMsg := new(certificateVerifyMsg)
   577  	certVerifyMsg.hasSignatureAlgorithm = true
   578  
   579  	certVerifyMsg.signatureAlgorithm, err = selectSignatureScheme(c.vers, cert, hs.certReq.supportedSignatureAlgorithms)
   580  	if err != nil {
   581  		// getClientCertificate returned a certificate incompatible with the
   582  		// CertificateRequestInfo supported signature algorithms.
   583  		c.sendAlert(alertHandshakeFailure)
   584  		return err
   585  	}
   586  
   587  	sigType, sigHash, err := typeAndHashFromSignatureScheme(certVerifyMsg.signatureAlgorithm)
   588  	if err != nil {
   589  		return c.sendAlert(alertInternalError)
   590  	}
   591  
   592  	signed := signedMessage(sigHash, clientSignatureContext, hs.transcript)
   593  	signOpts := crypto.SignerOpts(sigHash)
   594  	if sigType == signatureRSAPSS {
   595  		signOpts = &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthEqualsHash, Hash: sigHash}
   596  	}
   597  	sig, err := cert.PrivateKey.(crypto.Signer).Sign(c.config.rand(), signed, signOpts)
   598  	if err != nil {
   599  		c.sendAlert(alertInternalError)
   600  		return errors.New("tls: failed to sign handshake: " + err.Error())
   601  	}
   602  	certVerifyMsg.signature = sig
   603  
   604  	hs.transcript.Write(certVerifyMsg.marshal())
   605  	if _, err := c.writeRecord(recordTypeHandshake, certVerifyMsg.marshal()); err != nil {
   606  		return err
   607  	}
   608  
   609  	return nil
   610  }
   611  
   612  func (hs *clientHandshakeStateTLS13) sendClientFinished() error {
   613  	c := hs.c
   614  
   615  	finished := &finishedMsg{
   616  		verifyData: hs.suite.finishedHash(c.out.trafficSecret, hs.transcript),
   617  	}
   618  
   619  	hs.transcript.Write(finished.marshal())
   620  	if _, err := c.writeRecord(recordTypeHandshake, finished.marshal()); err != nil {
   621  		return err
   622  	}
   623  
   624  	c.out.setTrafficSecret(hs.suite, hs.trafficSecret)
   625  
   626  	if !c.config.SessionTicketsDisabled && c.config.ClientSessionCache != nil {
   627  		c.resumptionSecret = hs.suite.deriveSecret(hs.masterSecret,
   628  			resumptionLabel, hs.transcript)
   629  	}
   630  
   631  	return nil
   632  }
   633  
   634  func (c *Conn) handleNewSessionTicket(msg *newSessionTicketMsgTLS13) error {
   635  	if !c.isClient {
   636  		c.sendAlert(alertUnexpectedMessage)
   637  		return errors.New("tls: received new session ticket from a client")
   638  	}
   639  
   640  	if c.config.SessionTicketsDisabled || c.config.ClientSessionCache == nil {
   641  		return nil
   642  	}
   643  
   644  	// See RFC 8446, Section 4.6.1.
   645  	if msg.lifetime == 0 {
   646  		return nil
   647  	}
   648  	lifetime := time.Duration(msg.lifetime) * time.Second
   649  	if lifetime > maxSessionTicketLifetime {
   650  		c.sendAlert(alertIllegalParameter)
   651  		return errors.New("tls: received a session ticket with invalid lifetime")
   652  	}
   653  
   654  	cipherSuite := cipherSuiteTLS13ByID(c.cipherSuite)
   655  	if cipherSuite == nil || c.resumptionSecret == nil {
   656  		return c.sendAlert(alertInternalError)
   657  	}
   658  
   659  	// Save the resumption_master_secret and nonce instead of deriving the PSK
   660  	// to do the least amount of work on NewSessionTicket messages before we
   661  	// know if the ticket will be used. Forward secrecy of resumed connections
   662  	// is guaranteed by the requirement for pskModeDHE.
   663  	session := &ClientSessionState{
   664  		sessionTicket:      msg.label,
   665  		vers:               c.vers,
   666  		cipherSuite:        c.cipherSuite,
   667  		masterSecret:       c.resumptionSecret,
   668  		serverCertificates: c.peerCertificates,
   669  		verifiedChains:     c.verifiedChains,
   670  		receivedAt:         c.config.time(),
   671  		nonce:              msg.nonce,
   672  		useBy:              c.config.time().Add(lifetime),
   673  		ageAdd:             msg.ageAdd,
   674  		ocspResponse:       c.ocspResponse,
   675  		scts:               c.scts,
   676  	}
   677  
   678  	cacheKey := clientSessionCacheKey(c.conn.RemoteAddr(), c.config)
   679  	c.config.ClientSessionCache.Put(cacheKey, session)
   680  
   681  	return nil
   682  }
   683  

View as plain text