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 5package runner 6 7import ( 8 "bytes" 9 "crypto" 10 "crypto/ecdsa" 11 "crypto/ed25519" 12 "crypto/elliptic" 13 "crypto/rsa" 14 "crypto/subtle" 15 "crypto/x509" 16 "errors" 17 "fmt" 18 "io" 19 "math/big" 20 "net" 21 "time" 22 23 "boringssl.googlesource.com/boringssl/ssl/test/runner/hpke" 24 "golang.org/x/crypto/cryptobyte" 25) 26 27const echBadPayloadByte = 0xff 28 29type clientHandshakeState struct { 30 c *Conn 31 serverHello *serverHelloMsg 32 hello *clientHelloMsg 33 innerHello *clientHelloMsg 34 echHPKEContext *hpke.Context 35 suite *cipherSuite 36 finishedHash finishedHash 37 keyShares map[CurveID]kemImplementation 38 masterSecret []byte 39 session *ClientSessionState 40 finishedBytes []byte 41 peerPublicKey crypto.PublicKey 42} 43 44func mapClientHelloVersion(vers uint16, isDTLS bool) uint16 { 45 if !isDTLS { 46 return vers 47 } 48 49 switch vers { 50 case VersionTLS12: 51 return VersionDTLS12 52 case VersionTLS10: 53 return VersionDTLS10 54 } 55 56 panic("Unknown ClientHello version.") 57} 58 59// replaceClientHello returns a new clientHelloMsg which serializes to |in|, but 60// with key shares copied from |hello|. This allows sending an exact 61// externally-specified ClientHello in tests. However, we use |hello|'s key 62// shares. This ensures we have the private keys to complete the handshake. Note 63// this function does not update internal handshake state, so the test must be 64// configured compatibly with |in|. 65func replaceClientHello(hello *clientHelloMsg, in []byte) (*clientHelloMsg, error) { 66 copied := append([]byte{}, in...) 67 newHello := new(clientHelloMsg) 68 if !newHello.unmarshal(copied) { 69 return nil, errors.New("tls: invalid ClientHello") 70 } 71 72 // Replace |newHellos|'s key shares with those of |hello|. For simplicity, 73 // we require their lengths match, which is satisfied by matching the 74 // DefaultCurves setting to the selection in the replacement ClientHello. 75 bb := cryptobyte.NewBuilder(nil) 76 hello.marshalKeyShares(bb) 77 keyShares, err := bb.Bytes() 78 if err != nil { 79 return nil, err 80 } 81 if len(keyShares) != len(newHello.keySharesRaw) { 82 return nil, errors.New("tls: ClientHello key share length is inconsistent with DefaultCurves setting") 83 } 84 // |newHello.keySharesRaw| aliases |copied|. 85 copy(newHello.keySharesRaw, keyShares) 86 newHello.keyShares = hello.keyShares 87 88 return newHello, nil 89} 90 91func (c *Conn) clientHandshake() error { 92 if c.config == nil { 93 c.config = defaultConfig() 94 } 95 96 if len(c.config.ServerName) == 0 && !c.config.InsecureSkipVerify { 97 return errors.New("tls: either ServerName or InsecureSkipVerify must be specified in the tls.Config") 98 } 99 100 c.sendHandshakeSeq = 0 101 c.recvHandshakeSeq = 0 102 103 hs := &clientHandshakeState{ 104 c: c, 105 keyShares: make(map[CurveID]kemImplementation), 106 } 107 108 // Pick a session to resume. 109 var session *ClientSessionState 110 var cacheKey string 111 sessionCache := c.config.ClientSessionCache 112 if sessionCache != nil { 113 // Try to resume a previously negotiated TLS session, if 114 // available. 115 cacheKey = clientSessionCacheKey(c.conn.RemoteAddr(), c.config) 116 // TODO(nharper): Support storing more than one session 117 // ticket for TLS 1.3. 118 candidateSession, ok := sessionCache.Get(cacheKey) 119 if ok { 120 ticketOk := !c.config.SessionTicketsDisabled || candidateSession.sessionTicket == nil 121 122 // Check that the ciphersuite/version used for the 123 // previous session are still valid. 124 cipherSuiteOk := false 125 if candidateSession.vers <= VersionTLS12 { 126 for _, id := range c.config.cipherSuites() { 127 if id == candidateSession.cipherSuite.id { 128 cipherSuiteOk = true 129 break 130 } 131 } 132 } else { 133 // TLS 1.3 allows the cipher to change on 134 // resumption. 135 cipherSuiteOk = true 136 } 137 138 _, versOk := c.config.isSupportedVersion(candidateSession.wireVersion, c.isDTLS) 139 if ticketOk && versOk && cipherSuiteOk { 140 session = candidateSession 141 hs.session = session 142 } 143 } 144 } 145 146 // Set up ECH parameters. 147 var err error 148 var earlyHello *clientHelloMsg 149 if c.config.ClientECHConfig != nil { 150 if c.config.ClientECHConfig.KEM != hpke.X25519WithHKDFSHA256 { 151 return errors.New("tls: unsupported KEM type in ECHConfig") 152 } 153 154 echCipherSuite, ok := chooseECHCipherSuite(c.config.ClientECHConfig, c.config) 155 if !ok { 156 return errors.New("tls: did not find compatible cipher suite in ECHConfig") 157 } 158 159 info := []byte("tls ech\x00") 160 info = append(info, c.config.ClientECHConfig.Raw...) 161 162 var echEnc []byte 163 hs.echHPKEContext, echEnc, err = hpke.SetupBaseSenderX25519(echCipherSuite.KDF, echCipherSuite.AEAD, c.config.ClientECHConfig.PublicKey, info, nil) 164 if err != nil { 165 return errors.New("tls: ech: failed to set up client's HPKE sender context") 166 } 167 168 hs.innerHello, err = hs.createClientHello(nil, nil) 169 if err != nil { 170 return err 171 } 172 hs.hello, err = hs.createClientHello(hs.innerHello, echEnc) 173 if err != nil { 174 return err 175 } 176 earlyHello = hs.innerHello 177 } else { 178 hs.hello, err = hs.createClientHello(nil, nil) 179 if err != nil { 180 return err 181 } 182 earlyHello = hs.hello 183 } 184 185 if len(earlyHello.pskIdentities) == 0 || c.config.Bugs.SendEarlyData == nil { 186 earlyHello = nil 187 } 188 189 if c.config.Bugs.SendV2ClientHello { 190 hs.hello.isV2ClientHello = true 191 192 // The V2ClientHello "challenge" field is variable-length and is 193 // left-padded or truncated to become the SSL3/TLS random. 194 challengeLength := c.config.Bugs.V2ClientHelloChallengeLength 195 if challengeLength == 0 { 196 challengeLength = len(hs.hello.random) 197 } 198 if challengeLength <= len(hs.hello.random) { 199 skip := len(hs.hello.random) - challengeLength 200 for i := 0; i < skip; i++ { 201 hs.hello.random[i] = 0 202 } 203 hs.hello.v2Challenge = hs.hello.random[skip:] 204 } else { 205 hs.hello.v2Challenge = make([]byte, challengeLength) 206 copy(hs.hello.v2Challenge, hs.hello.random) 207 if _, err := io.ReadFull(c.config.rand(), hs.hello.v2Challenge[len(hs.hello.random):]); err != nil { 208 c.sendAlert(alertInternalError) 209 return fmt.Errorf("tls: short read from Rand: %s", err) 210 } 211 } 212 213 c.writeV2Record(hs.hello.marshal()) 214 } else { 215 helloBytes := hs.hello.marshal() 216 var appendToHello byte 217 if c.config.Bugs.PartialClientFinishedWithClientHello { 218 appendToHello = typeFinished 219 } else if c.config.Bugs.PartialEndOfEarlyDataWithClientHello { 220 appendToHello = typeEndOfEarlyData 221 } else if c.config.Bugs.PartialSecondClientHelloAfterFirst { 222 appendToHello = typeClientHello 223 } else if c.config.Bugs.PartialClientKeyExchangeWithClientHello { 224 appendToHello = typeClientKeyExchange 225 } 226 if appendToHello != 0 { 227 c.writeRecord(recordTypeHandshake, append(helloBytes[:len(helloBytes):len(helloBytes)], appendToHello)) 228 } else { 229 c.writeRecord(recordTypeHandshake, helloBytes) 230 } 231 } 232 c.flushHandshake() 233 234 if err := c.simulatePacketLoss(nil); err != nil { 235 return err 236 } 237 if c.config.Bugs.SendEarlyAlert { 238 c.sendAlert(alertHandshakeFailure) 239 } 240 if c.config.Bugs.SendFakeEarlyDataLength > 0 { 241 c.sendFakeEarlyData(c.config.Bugs.SendFakeEarlyDataLength) 242 } 243 244 // Derive early write keys and set Conn state to allow early writes. 245 if earlyHello != nil { 246 finishedHash := newFinishedHash(session.wireVersion, c.isDTLS, session.cipherSuite) 247 finishedHash.addEntropy(session.secret) 248 finishedHash.Write(earlyHello.marshal()) 249 250 if !c.config.Bugs.SkipChangeCipherSpec { 251 c.wireVersion = session.wireVersion 252 c.vers = VersionTLS13 253 c.writeRecord(recordTypeChangeCipherSpec, []byte{1}) 254 c.wireVersion = 0 255 c.vers = 0 256 } 257 258 earlyTrafficSecret := finishedHash.deriveSecret(earlyTrafficLabel) 259 c.earlyExporterSecret = finishedHash.deriveSecret(earlyExporterLabel) 260 261 c.useOutTrafficSecret(encryptionEarlyData, session.wireVersion, session.cipherSuite, earlyTrafficSecret) 262 for _, earlyData := range c.config.Bugs.SendEarlyData { 263 if _, err := c.writeRecord(recordTypeApplicationData, earlyData); err != nil { 264 return err 265 } 266 } 267 } 268 269 msg, err := c.readHandshake() 270 if err != nil { 271 return err 272 } 273 274 if c.isDTLS { 275 helloVerifyRequest, ok := msg.(*helloVerifyRequestMsg) 276 if ok { 277 if helloVerifyRequest.vers != VersionDTLS10 { 278 // Per RFC 6347, the version field in 279 // HelloVerifyRequest SHOULD be always DTLS 280 // 1.0. Enforce this for testing purposes. 281 return errors.New("dtls: bad HelloVerifyRequest version") 282 } 283 284 hs.hello.raw = nil 285 hs.hello.cookie = helloVerifyRequest.cookie 286 c.writeRecord(recordTypeHandshake, hs.hello.marshal()) 287 c.flushHandshake() 288 289 if err := c.simulatePacketLoss(nil); err != nil { 290 return err 291 } 292 msg, err = c.readHandshake() 293 if err != nil { 294 return err 295 } 296 } 297 } 298 299 // The first message is either ServerHello or HelloRetryRequest, either of 300 // which determines the version and cipher suite. 301 var serverWireVersion, suiteID uint16 302 switch m := msg.(type) { 303 case *helloRetryRequestMsg: 304 serverWireVersion = m.vers 305 suiteID = m.cipherSuite 306 case *serverHelloMsg: 307 serverWireVersion = m.vers 308 suiteID = m.cipherSuite 309 default: 310 c.sendAlert(alertUnexpectedMessage) 311 return fmt.Errorf("tls: received unexpected message of type %T when waiting for HelloRetryRequest or ServerHello", msg) 312 } 313 314 serverVersion, ok := c.config.isSupportedVersion(serverWireVersion, c.isDTLS) 315 if !ok { 316 c.sendAlert(alertProtocolVersion) 317 return fmt.Errorf("tls: server selected unsupported protocol version %x", c.vers) 318 } 319 c.wireVersion = serverWireVersion 320 c.vers = serverVersion 321 c.haveVers = true 322 323 // We only implement enough of SSL 3.0 to test that the server doesn't: 324 // we can send a ClientHello and attempt to read a ServerHello. The server 325 // should respond with a protocol_version alert and not get this far. 326 if c.vers == VersionSSL30 { 327 return errors.New("tls: server selected SSL 3.0") 328 } 329 330 cipherSuites := hs.hello.cipherSuites 331 if hs.innerHello != nil && c.config.Bugs.MinimalClientHelloOuter { 332 // hs.hello has a placeholder list of ciphers if testing with 333 // MinimalClientHelloOuter, so we use hs.innerHello instead. (We do not 334 // attempt to support actual different cipher suite preferences between 335 // the two.) 336 cipherSuites = hs.innerHello.cipherSuites 337 } 338 hs.suite = mutualCipherSuite(cipherSuites, suiteID) 339 if hs.suite == nil { 340 c.sendAlert(alertHandshakeFailure) 341 return fmt.Errorf("tls: server selected an unsupported cipher suite") 342 } 343 344 hs.finishedHash = newFinishedHash(c.wireVersion, c.isDTLS, hs.suite) 345 hs.finishedHash.WriteHandshake(hs.hello.marshal(), hs.c.sendHandshakeSeq-1) 346 347 if c.vers >= VersionTLS13 { 348 if err := hs.doTLS13Handshake(msg); err != nil { 349 return err 350 } 351 } else { 352 hs.serverHello, ok = msg.(*serverHelloMsg) 353 if !ok { 354 c.sendAlert(alertUnexpectedMessage) 355 return unexpectedMessageError(hs.serverHello, msg) 356 } 357 if isAllZero(hs.serverHello.random) { 358 // If the server forgets to fill in the server random, it will 359 // likely be all zero. 360 return errors.New("tls: ServerHello random was all zero") 361 } 362 363 hs.writeServerHash(hs.serverHello.marshal()) 364 if c.config.Bugs.EarlyChangeCipherSpec > 0 { 365 hs.establishKeys() 366 c.writeRecord(recordTypeChangeCipherSpec, []byte{1}) 367 } 368 369 if hs.serverHello.compressionMethod != compressionNone { 370 c.sendAlert(alertUnexpectedMessage) 371 return errors.New("tls: server selected unsupported compression format") 372 } 373 374 err = hs.processServerExtensions(&hs.serverHello.extensions) 375 if err != nil { 376 return err 377 } 378 379 isResume, err := hs.processServerHello() 380 if err != nil { 381 return err 382 } 383 384 if isResume { 385 if c.config.Bugs.EarlyChangeCipherSpec == 0 { 386 if err := hs.establishKeys(); err != nil { 387 return err 388 } 389 } 390 if err := hs.readSessionTicket(); err != nil { 391 return err 392 } 393 if err := hs.readFinished(c.firstFinished[:]); err != nil { 394 return err 395 } 396 if err := hs.sendFinished(nil, isResume); err != nil { 397 return err 398 } 399 } else { 400 if err := hs.doFullHandshake(); err != nil { 401 return err 402 } 403 if err := hs.establishKeys(); err != nil { 404 return err 405 } 406 if err := hs.sendFinished(c.firstFinished[:], isResume); err != nil { 407 return err 408 } 409 // Most retransmits are triggered by a timeout, but the final 410 // leg of the handshake is retransmited upon re-receiving a 411 // Finished. 412 if err := c.simulatePacketLoss(func() { 413 c.sendHandshakeSeq-- 414 c.writeRecord(recordTypeHandshake, hs.finishedBytes) 415 c.flushHandshake() 416 }); err != nil { 417 return err 418 } 419 if err := hs.readSessionTicket(); err != nil { 420 return err 421 } 422 if err := hs.readFinished(nil); err != nil { 423 return err 424 } 425 } 426 427 if sessionCache != nil && hs.session != nil && session != hs.session { 428 if c.config.Bugs.RequireSessionTickets && len(hs.session.sessionTicket) == 0 { 429 return errors.New("tls: new session used session IDs instead of tickets") 430 } 431 if c.config.Bugs.RequireSessionIDs && len(hs.session.sessionID) == 0 { 432 return errors.New("tls: new session used session tickets instead of IDs") 433 } 434 sessionCache.Put(cacheKey, hs.session) 435 } 436 437 c.didResume = isResume 438 c.exporterSecret = hs.masterSecret 439 } 440 441 c.handshakeComplete = true 442 c.cipherSuite = hs.suite 443 copy(c.clientRandom[:], hs.hello.random) 444 copy(c.serverRandom[:], hs.serverHello.random) 445 446 return nil 447} 448 449func chooseECHCipherSuite(echConfig *ECHConfig, config *Config) (HPKECipherSuite, bool) { 450 if echConfig.KEM != hpke.X25519WithHKDFSHA256 { 451 return HPKECipherSuite{}, false 452 } 453 454 for _, wantSuite := range config.echCipherSuitePreferences() { 455 if config.Bugs.IgnoreECHConfigCipherPreferences { 456 return wantSuite, true 457 } 458 for _, cipherSuite := range echConfig.CipherSuites { 459 if cipherSuite == wantSuite { 460 return cipherSuite, true 461 } 462 } 463 } 464 return HPKECipherSuite{}, false 465} 466 467// createClientHello creates a new ClientHello message. If |innerHello| is not 468// nil, this is a ClientHelloOuter that should contain an encrypted |innerHello| 469// with |echEnc| as the encapsulated public key. Otherwise, the ClientHello 470// should reflect the connection's true preferences. 471func (hs *clientHandshakeState) createClientHello(innerHello *clientHelloMsg, echEnc []byte) (*clientHelloMsg, error) { 472 c := hs.c 473 nextProtosLength := 0 474 for _, proto := range c.config.NextProtos { 475 if l := len(proto); l > 255 { 476 return nil, errors.New("tls: invalid NextProtos value") 477 } else { 478 nextProtosLength += 1 + l 479 } 480 } 481 if nextProtosLength > 0xffff { 482 return nil, errors.New("tls: NextProtos values too large") 483 } 484 485 quicTransportParams := c.config.QUICTransportParams 486 quicTransportParamsLegacy := c.config.QUICTransportParams 487 if !c.config.QUICTransportParamsUseLegacyCodepoint.IncludeStandard() { 488 quicTransportParams = nil 489 } 490 if !c.config.QUICTransportParamsUseLegacyCodepoint.IncludeLegacy() { 491 quicTransportParamsLegacy = nil 492 } 493 494 isInner := innerHello == nil && hs.echHPKEContext != nil 495 496 minVersion := c.config.minVersion(c.isDTLS) 497 maxVersion := c.config.maxVersion(c.isDTLS) 498 // The ClientHelloInner may not offer TLS 1.2 or below. 499 requireTLS13 := isInner && !c.config.Bugs.AllowTLS12InClientHelloInner 500 if requireTLS13 && minVersion < VersionTLS13 { 501 minVersion = VersionTLS13 502 if minVersion > maxVersion { 503 return nil, errors.New("tls: ECH requires TLS 1.3") 504 } 505 } 506 507 hello := &clientHelloMsg{ 508 isDTLS: c.isDTLS, 509 compressionMethods: []uint8{compressionNone}, 510 random: make([]byte, 32), 511 ocspStapling: !c.config.Bugs.NoOCSPStapling, 512 sctListSupported: !c.config.Bugs.NoSignedCertificateTimestamps, 513 supportedCurves: c.config.curvePreferences(), 514 supportedPoints: []uint8{pointFormatUncompressed}, 515 nextProtoNeg: len(c.config.NextProtos) > 0, 516 secureRenegotiation: []byte{}, 517 alpnProtocols: c.config.NextProtos, 518 quicTransportParams: quicTransportParams, 519 quicTransportParamsLegacy: quicTransportParamsLegacy, 520 duplicateExtension: c.config.Bugs.DuplicateExtension, 521 channelIDSupported: c.config.ChannelID != nil, 522 extendedMasterSecret: maxVersion >= VersionTLS10, 523 srtpProtectionProfiles: c.config.SRTPProtectionProfiles, 524 srtpMasterKeyIdentifier: c.config.Bugs.SRTPMasterKeyIdentifier, 525 customExtension: c.config.Bugs.CustomExtension, 526 omitExtensions: c.config.Bugs.OmitExtensions, 527 emptyExtensions: c.config.Bugs.EmptyExtensions, 528 delegatedCredential: c.config.DelegatedCredentialAlgorithms, 529 } 530 531 // Translate the bugs that modify ClientHello extension order into a 532 // list of prefix extensions. The marshal function will try these 533 // extensions before any others, followed by any remaining extensions in 534 // the default order. 535 if c.config.Bugs.PSKBinderFirst && !c.config.Bugs.OnlyCorruptSecondPSKBinder { 536 hello.prefixExtensions = append(hello.prefixExtensions, extensionPreSharedKey) 537 } 538 if c.config.Bugs.SwapNPNAndALPN { 539 hello.prefixExtensions = append(hello.prefixExtensions, extensionALPN) 540 hello.prefixExtensions = append(hello.prefixExtensions, extensionNextProtoNeg) 541 } 542 543 // Configure ech_outer_extensions. 544 if isInner { 545 hello.outerExtensions = c.config.ECHOuterExtensions 546 // If |OnlyCompressSecondClientHelloInner| is set, we still configure 547 // |hello.outerExtensions| for ordering, so that we do not introduce an 548 // unsolicited change across HelloRetryRequest. 549 hello.reorderOuterExtensionsWithoutCompressing = c.config.Bugs.OnlyCompressSecondClientHelloInner 550 } else { 551 // Compressed extensions must appear in the same relative order between 552 // ClientHelloInner and ClientHelloOuter. For simplicity, we default to 553 // forcing their order to match, but the caller can override this with 554 // either valid or invalid explicit orders. 555 if c.config.Bugs.ECHOuterExtensionOrder != nil { 556 hello.prefixExtensions = append(hello.prefixExtensions, c.config.Bugs.ECHOuterExtensionOrder...) 557 } else { 558 hello.prefixExtensions = append(hello.prefixExtensions, c.config.ECHOuterExtensions...) 559 } 560 } 561 562 if maxVersion >= VersionTLS13 { 563 hello.vers = mapClientHelloVersion(VersionTLS12, c.isDTLS) 564 if !c.config.Bugs.OmitSupportedVersions { 565 hello.supportedVersions = c.config.supportedVersions(c.isDTLS, requireTLS13) 566 } 567 hello.pskKEModes = []byte{pskDHEKEMode} 568 } else { 569 hello.vers = mapClientHelloVersion(maxVersion, c.isDTLS) 570 } 571 572 if c.config.Bugs.SendClientVersion != 0 { 573 hello.vers = c.config.Bugs.SendClientVersion 574 } 575 576 if len(c.config.Bugs.SendSupportedVersions) > 0 { 577 hello.supportedVersions = c.config.Bugs.SendSupportedVersions 578 } 579 580 if innerHello != nil { 581 hello.serverName = c.config.ClientECHConfig.PublicName 582 } else { 583 hello.serverName = c.config.ServerName 584 } 585 586 disableEMS := c.config.Bugs.NoExtendedMasterSecret 587 if c.cipherSuite != nil { 588 disableEMS = c.config.Bugs.NoExtendedMasterSecretOnRenegotiation 589 } 590 591 if disableEMS { 592 hello.extendedMasterSecret = false 593 } 594 595 if c.config.Bugs.NoSupportedCurves { 596 hello.supportedCurves = nil 597 } 598 599 if c.config.Bugs.SendPSKKeyExchangeModes != nil { 600 hello.pskKEModes = c.config.Bugs.SendPSKKeyExchangeModes 601 } 602 603 if c.config.Bugs.SendCompressionMethods != nil { 604 hello.compressionMethods = c.config.Bugs.SendCompressionMethods 605 } 606 607 if c.config.Bugs.SendSupportedPointFormats != nil { 608 hello.supportedPoints = c.config.Bugs.SendSupportedPointFormats 609 } 610 611 if len(c.clientVerify) > 0 && !c.config.Bugs.EmptyRenegotiationInfo { 612 if c.config.Bugs.BadRenegotiationInfo { 613 hello.secureRenegotiation = append(hello.secureRenegotiation, c.clientVerify...) 614 hello.secureRenegotiation[0] ^= 0x80 615 } else { 616 hello.secureRenegotiation = c.clientVerify 617 } 618 } 619 620 if c.config.Bugs.DuplicateCompressedCertAlgs { 621 hello.compressedCertAlgs = []uint16{1, 1} 622 } else if len(c.config.CertCompressionAlgs) > 0 { 623 hello.compressedCertAlgs = make([]uint16, 0, len(c.config.CertCompressionAlgs)) 624 for id := range c.config.CertCompressionAlgs { 625 hello.compressedCertAlgs = append(hello.compressedCertAlgs, uint16(id)) 626 } 627 } 628 629 if c.noRenegotiationInfo() { 630 hello.secureRenegotiation = nil 631 } 632 633 if c.config.ALPSUseNewCodepoint.IncludeNew() { 634 for protocol := range c.config.ApplicationSettings { 635 hello.alpsProtocols = append(hello.alpsProtocols, protocol) 636 } 637 } 638 if c.config.ALPSUseNewCodepoint.IncludeOld() { 639 for protocol := range c.config.ApplicationSettings { 640 hello.alpsProtocolsOld = append(hello.alpsProtocolsOld, protocol) 641 } 642 } 643 644 if maxVersion >= VersionTLS13 { 645 // Use the same key shares between ClientHelloInner and ClientHelloOuter. 646 if innerHello != nil { 647 hello.hasKeyShares = innerHello.hasKeyShares 648 hello.keyShares = innerHello.keyShares 649 } else { 650 hello.hasKeyShares = true 651 hello.trailingKeyShareData = c.config.Bugs.TrailingKeyShareData 652 curvesToSend := c.config.defaultCurves() 653 for _, curveID := range hello.supportedCurves { 654 if !curvesToSend[curveID] { 655 continue 656 } 657 kem, ok := kemForCurveID(curveID, c.config) 658 if !ok { 659 continue 660 } 661 publicKey, err := kem.generate(c.config.rand()) 662 if err != nil { 663 return nil, err 664 } 665 666 if c.config.Bugs.SendCurve != 0 { 667 curveID = c.config.Bugs.SendCurve 668 } 669 if c.config.Bugs.InvalidECDHPoint { 670 publicKey[0] ^= 0xff 671 } 672 673 hello.keyShares = append(hello.keyShares, keyShareEntry{ 674 group: curveID, 675 keyExchange: publicKey, 676 }) 677 hs.keyShares[curveID] = kem 678 679 if c.config.Bugs.DuplicateKeyShares { 680 hello.keyShares = append(hello.keyShares, hello.keyShares[len(hello.keyShares)-1]) 681 } 682 } 683 684 if c.config.Bugs.MissingKeyShare { 685 hello.hasKeyShares = false 686 } 687 } 688 } 689 690 possibleCipherSuites := c.config.cipherSuites() 691 hello.cipherSuites = make([]uint16, 0, len(possibleCipherSuites)) 692 693NextCipherSuite: 694 for _, suiteID := range possibleCipherSuites { 695 for _, suite := range cipherSuites { 696 if suite.id != suiteID { 697 continue 698 } 699 // Don't advertise TLS 1.2-only cipher suites unless 700 // we're attempting TLS 1.2. 701 if maxVersion < VersionTLS12 && suite.flags&suiteTLS12 != 0 { 702 continue 703 } 704 hello.cipherSuites = append(hello.cipherSuites, suiteID) 705 continue NextCipherSuite 706 } 707 } 708 709 if c.config.Bugs.AdvertiseAllConfiguredCiphers { 710 hello.cipherSuites = possibleCipherSuites 711 } 712 713 if c.config.Bugs.SendRenegotiationSCSV { 714 hello.cipherSuites = append(hello.cipherSuites, renegotiationSCSV) 715 } 716 717 if c.config.Bugs.SendFallbackSCSV { 718 hello.cipherSuites = append(hello.cipherSuites, fallbackSCSV) 719 } 720 721 _, err := io.ReadFull(c.config.rand(), hello.random) 722 if err != nil { 723 c.sendAlert(alertInternalError) 724 return nil, errors.New("tls: short read from Rand: " + err.Error()) 725 } 726 727 if maxVersion >= VersionTLS12 && !c.config.Bugs.NoSignatureAlgorithms { 728 hello.signatureAlgorithms = c.config.verifySignatureAlgorithms() 729 } 730 731 if c.config.ClientSessionCache != nil { 732 hello.ticketSupported = !c.config.SessionTicketsDisabled 733 } 734 735 session := hs.session 736 737 // ClientHelloOuter cannot offer sessions. 738 if innerHello != nil && !c.config.Bugs.OfferSessionInClientHelloOuter { 739 session = nil 740 } 741 742 if session != nil && c.config.time().Before(session.ticketExpiration) { 743 ticket := session.sessionTicket 744 if c.config.Bugs.FilterTicket != nil && len(ticket) > 0 { 745 // Copy the ticket so FilterTicket may act in-place. 746 ticket = make([]byte, len(session.sessionTicket)) 747 copy(ticket, session.sessionTicket) 748 749 ticket, err = c.config.Bugs.FilterTicket(ticket) 750 if err != nil { 751 return nil, err 752 } 753 } 754 755 if session.vers >= VersionTLS13 || c.config.Bugs.SendBothTickets { 756 // TODO(nharper): Support sending more 757 // than one PSK identity. 758 ticketAge := uint32(c.config.time().Sub(session.ticketCreationTime) / time.Millisecond) 759 if c.config.Bugs.SendTicketAge != 0 { 760 ticketAge = uint32(c.config.Bugs.SendTicketAge / time.Millisecond) 761 } 762 psk := pskIdentity{ 763 ticket: ticket, 764 obfuscatedTicketAge: session.ticketAgeAdd + ticketAge, 765 } 766 hello.pskIdentities = []pskIdentity{psk} 767 768 if c.config.Bugs.ExtraPSKIdentity { 769 hello.pskIdentities = append(hello.pskIdentities, psk) 770 } 771 } 772 773 if session.vers < VersionTLS13 || c.config.Bugs.SendBothTickets { 774 if ticket != nil { 775 hello.sessionTicket = ticket 776 // A random session ID is used to detect when the 777 // server accepted the ticket and is resuming a session 778 // (see RFC 5077). 779 sessionIDLen := 16 780 if c.config.Bugs.TicketSessionIDLength != 0 { 781 sessionIDLen = c.config.Bugs.TicketSessionIDLength 782 } 783 if c.config.Bugs.EmptyTicketSessionID { 784 sessionIDLen = 0 785 } 786 hello.sessionID = make([]byte, sessionIDLen) 787 if _, err := io.ReadFull(c.config.rand(), hello.sessionID); err != nil { 788 c.sendAlert(alertInternalError) 789 return nil, errors.New("tls: short read from Rand: " + err.Error()) 790 } 791 } else { 792 hello.sessionID = session.sessionID 793 } 794 } 795 } 796 797 if innerHello == nil { 798 // Request compatibility mode from the client by sending a fake session 799 // ID. Although BoringSSL always enables compatibility mode, other 800 // implementations make it conditional on the ClientHello. We test 801 // BoringSSL's expected behavior with SendClientHelloSessionID. 802 if len(hello.sessionID) == 0 && maxVersion >= VersionTLS13 { 803 hello.sessionID = make([]byte, 32) 804 if _, err := io.ReadFull(c.config.rand(), hello.sessionID); err != nil { 805 c.sendAlert(alertInternalError) 806 return nil, errors.New("tls: short read from Rand: " + err.Error()) 807 } 808 } 809 if c.config.Bugs.MockQUICTransport != nil && !c.config.Bugs.CompatModeWithQUIC { 810 hello.sessionID = []byte{} 811 } 812 if c.config.Bugs.SendClientHelloSessionID != nil { 813 hello.sessionID = c.config.Bugs.SendClientHelloSessionID 814 } 815 } else { 816 // ClientHelloOuter's session ID is copied from ClientHelloINnner. 817 hello.sessionID = innerHello.sessionID 818 } 819 820 if c.config.Bugs.SendCipherSuites != nil { 821 hello.cipherSuites = c.config.Bugs.SendCipherSuites 822 } 823 824 if innerHello == nil { 825 if len(hello.pskIdentities) > 0 && c.config.Bugs.SendEarlyData != nil { 826 hello.hasEarlyData = true 827 } 828 if c.config.Bugs.SendFakeEarlyDataLength > 0 { 829 hello.hasEarlyData = true 830 } 831 if c.config.Bugs.OmitEarlyDataExtension { 832 hello.hasEarlyData = false 833 } 834 } else { 835 hello.hasEarlyData = innerHello.hasEarlyData 836 } 837 838 if (isInner && !c.config.Bugs.OmitECHInner) || c.config.Bugs.AlwaysSendECHInner { 839 hello.echInner = true 840 hello.invalidECHInner = c.config.Bugs.SendInvalidECHInner 841 } 842 843 if innerHello != nil { 844 if err := hs.encryptClientHello(hello, innerHello, c.config.ClientECHConfig.ConfigID, echEnc); err != nil { 845 return nil, err 846 } 847 if c.config.Bugs.CorruptEncryptedClientHello { 848 if c.config.Bugs.NullAllCiphers { 849 hello.echOuter.payload = []byte{echBadPayloadByte} 850 } else { 851 hello.echOuter.payload[0] ^= 1 852 } 853 } 854 } 855 856 // PSK binders and ECH both must be computed last because they incorporate 857 // the rest of the ClientHello and conflict. ECH resolves this by forbidding 858 // clients from offering PSKs on ClientHelloOuter, but we still need to test 859 // servers handle it correctly so they tolerate GREASE. In other cases, we 860 // expect the server to reject ECH, so we put PSK last. Note this renders 861 // ECH undecryptable. 862 if len(hello.pskIdentities) > 0 { 863 version := session.wireVersion 864 // We may have a pre-1.3 session if SendBothTickets is set. 865 if session.vers < VersionTLS13 { 866 version = VersionTLS13 867 } 868 generatePSKBinders(version, hello, session, nil, nil, c.config) 869 } 870 871 if c.config.Bugs.SendClientHelloWithFixes != nil { 872 hello, err = replaceClientHello(hello, c.config.Bugs.SendClientHelloWithFixes) 873 if err != nil { 874 return nil, err 875 } 876 } 877 878 return hello, nil 879} 880 881// encryptClientHello encrypts |innerHello| using the specified HPKE context and 882// adds the extension to |hello|. 883func (hs *clientHandshakeState) encryptClientHello(hello, innerHello *clientHelloMsg, configID uint8, enc []byte) error { 884 c := hs.c 885 886 if c.config.Bugs.MinimalClientHelloOuter { 887 *hello = clientHelloMsg{ 888 vers: VersionTLS12, 889 random: hello.random, 890 sessionID: hello.sessionID, 891 cipherSuites: []uint16{0x0a0a}, 892 compressionMethods: hello.compressionMethods, 893 } 894 } 895 896 if c.config.Bugs.TruncateClientECHEnc { 897 enc = enc[:1] 898 } 899 900 encodedInner := innerHello.marshalForEncodedInner() 901 padding := make([]byte, c.config.Bugs.ClientECHPadding) 902 if c.config.Bugs.BadClientECHPadding { 903 padding[0] = 1 904 } 905 encodedInner = append(encodedInner, padding...) 906 907 // Encode ClientHelloOuter with a placeholder payload string. 908 payloadLength := len(encodedInner) 909 if !c.config.Bugs.NullAllCiphers { 910 payloadLength += hs.echHPKEContext.Overhead() 911 } 912 hello.echOuter = &echClientOuter{ 913 kdfID: hs.echHPKEContext.KDF(), 914 aeadID: hs.echHPKEContext.AEAD(), 915 configID: configID, 916 enc: enc, 917 payload: make([]byte, payloadLength), 918 } 919 aad := hello.marshal()[4:] // Remove message header 920 921 hello.raw = nil 922 hello.echOuter.payload = hs.echHPKEContext.Seal(encodedInner, aad) 923 if c.config.Bugs.NullAllCiphers { 924 hello.echOuter.payload = encodedInner 925 } 926 927 if c.config.Bugs.RecordClientHelloInner != nil { 928 if err := c.config.Bugs.RecordClientHelloInner(encodedInner, hello.marshal()[4:]); err != nil { 929 return err 930 } 931 // ECH is normally the last extension added to |hello|, but, when 932 // OfferSessionInClientHelloOuter is enabled, we may modify it again. 933 hello.raw = nil 934 } 935 936 return nil 937} 938 939func (hs *clientHandshakeState) checkECHConfirmation(msg any, hello *clientHelloMsg, finishedHash *finishedHash) bool { 940 var offset int 941 var raw, label []byte 942 if hrr, ok := msg.(*helloRetryRequestMsg); ok { 943 if hrr.echConfirmationOffset == 0 { 944 return false 945 } 946 raw = hrr.raw 947 label = echAcceptConfirmationHRRLabel 948 offset = hrr.echConfirmationOffset 949 } else { 950 raw = msg.(*serverHelloMsg).raw 951 label = echAcceptConfirmationLabel 952 offset = 4 + 2 + 32 - echAcceptConfirmationLength 953 } 954 955 withZeros := append(make([]byte, 0, len(raw)), raw...) 956 for i := 0; i < echAcceptConfirmationLength; i++ { 957 withZeros[i+offset] = 0 958 } 959 960 confirmation := finishedHash.echAcceptConfirmation(hello.random, label, withZeros) 961 return bytes.Equal(confirmation, raw[offset:offset+echAcceptConfirmationLength]) 962} 963 964func (hs *clientHandshakeState) doTLS13Handshake(msg any) error { 965 c := hs.c 966 967 // The first message may be a ServerHello or HelloRetryRequest. 968 helloRetryRequest, haveHelloRetryRequest := msg.(*helloRetryRequestMsg) 969 if haveHelloRetryRequest { 970 hs.finishedHash.UpdateForHelloRetryRequest() 971 } 972 973 // Determine whether the server accepted ECH and drop the unnecessary 974 // transcript. 975 if hs.innerHello != nil { 976 innerFinishedHash := newFinishedHash(c.wireVersion, c.isDTLS, hs.suite) 977 innerFinishedHash.WriteHandshake(hs.innerHello.marshal(), hs.c.sendHandshakeSeq-1) 978 if haveHelloRetryRequest { 979 innerFinishedHash.UpdateForHelloRetryRequest() 980 } 981 if hs.checkECHConfirmation(msg, hs.innerHello, &innerFinishedHash) { 982 c.echAccepted = true 983 // Replace the transcript. For now, leave hs.hello and hs.innerHello 984 // as-is. HelloRetryRequest requires both be available. 985 hs.finishedHash = innerFinishedHash 986 } 987 } else { 988 // When not offering ECH, test that the backend server does not (or does) 989 // send a confirmation as expected. 990 confirmed := hs.checkECHConfirmation(msg, hs.hello, &hs.finishedHash) 991 if hs.hello.echInner && !confirmed { 992 return fmt.Errorf("tls: server did not send ECH confirmation in %T when requested", msg) 993 } else if !hs.hello.echInner && confirmed { 994 return fmt.Errorf("tls: server sent ECH confirmation in %T when not requested", msg) 995 } 996 } 997 998 // Once the PRF hash is known, TLS 1.3 does not require a handshake buffer. 999 hs.finishedHash.discardHandshakeBuffer() 1000 1001 // The first server message must be followed by a ChangeCipherSpec. 1002 c.expectTLS13ChangeCipherSpec = true 1003 1004 if haveHelloRetryRequest { 1005 hs.writeServerHash(helloRetryRequest.marshal()) 1006 1007 if !bytes.Equal(hs.hello.sessionID, helloRetryRequest.sessionID) { 1008 return errors.New("tls: ClientHello and HelloRetryRequest session IDs did not match.") 1009 } 1010 1011 if c.config.Bugs.FailIfHelloRetryRequested { 1012 return errors.New("tls: unexpected HelloRetryRequest") 1013 } 1014 // Explicitly read the ChangeCipherSpec now; it should 1015 // be attached to the first flight, not the second flight. 1016 if err := c.readTLS13ChangeCipherSpec(); err != nil { 1017 return err 1018 } 1019 1020 // Reset the encryption state, in case we sent 0-RTT data. 1021 c.out.resetCipher() 1022 1023 if c.echAccepted { 1024 if err := hs.applyHelloRetryRequest(helloRetryRequest, hs.innerHello, hs.hello); err != nil { 1025 return err 1026 } 1027 hs.writeClientHash(hs.innerHello.marshal()) 1028 } else { 1029 if err := hs.applyHelloRetryRequest(helloRetryRequest, hs.hello, nil); err != nil { 1030 return err 1031 } 1032 hs.writeClientHash(hs.hello.marshal()) 1033 } 1034 toWrite := hs.hello.marshal() 1035 1036 if c.config.Bugs.PartialSecondClientHelloAfterFirst { 1037 // The first byte has already been sent. 1038 toWrite = toWrite[1:] 1039 } 1040 1041 if c.config.Bugs.InterleaveEarlyData { 1042 c.sendFakeEarlyData(4) 1043 c.writeRecord(recordTypeHandshake, toWrite[:16]) 1044 c.sendFakeEarlyData(4) 1045 c.writeRecord(recordTypeHandshake, toWrite[16:]) 1046 } else if c.config.Bugs.PartialClientFinishedWithSecondClientHello { 1047 toWrite = append(make([]byte, 0, len(toWrite)+1), toWrite...) 1048 toWrite = append(toWrite, typeFinished) 1049 c.writeRecord(recordTypeHandshake, toWrite) 1050 } else { 1051 c.writeRecord(recordTypeHandshake, toWrite) 1052 } 1053 c.flushHandshake() 1054 1055 if c.config.Bugs.SendEarlyDataOnSecondClientHello { 1056 c.sendFakeEarlyData(4) 1057 } 1058 1059 var err error 1060 msg, err = c.readHandshake() 1061 if err != nil { 1062 return err 1063 } 1064 } 1065 1066 // We no longer need to retain two ClientHellos. 1067 if c.echAccepted { 1068 hs.hello = hs.innerHello 1069 } 1070 hs.innerHello = nil 1071 1072 var ok bool 1073 hs.serverHello, ok = msg.(*serverHelloMsg) 1074 if !ok { 1075 c.sendAlert(alertUnexpectedMessage) 1076 return unexpectedMessageError(hs.serverHello, msg) 1077 } 1078 1079 if isAllZero(hs.serverHello.random) { 1080 // If the server forgets to fill in the server random, it will 1081 // likely be all zero. 1082 return errors.New("tls: ServerHello random was all zero") 1083 } 1084 1085 if c.wireVersion != hs.serverHello.vers { 1086 c.sendAlert(alertIllegalParameter) 1087 return fmt.Errorf("tls: server sent non-matching version %x vs %x", c.wireVersion, hs.serverHello.vers) 1088 } 1089 1090 if hs.suite.id != hs.serverHello.cipherSuite { 1091 c.sendAlert(alertIllegalParameter) 1092 return fmt.Errorf("tls: server sent non-matching cipher suite %04x vs %04x", hs.suite.id, hs.serverHello.cipherSuite) 1093 } 1094 1095 if haveHelloRetryRequest { 1096 if helloRetryRequest.hasSelectedGroup && helloRetryRequest.selectedGroup != hs.serverHello.keyShare.group { 1097 c.sendAlert(alertHandshakeFailure) 1098 return errors.New("tls: ServerHello parameters did not match HelloRetryRequest") 1099 } 1100 1101 // Both the ServerHello and HelloRetryRequest must have an ECH confirmation. 1102 echConfirmed := hs.checkECHConfirmation(hs.serverHello, hs.hello, &hs.finishedHash) 1103 if hs.hello.echInner && !echConfirmed { 1104 return errors.New("tls: server did not send ECH confirmation in ServerHello when requested") 1105 } else if !hs.hello.echInner && echConfirmed { 1106 return errors.New("tls: server sent ECH confirmation in ServerHello when not requested") 1107 } 1108 } 1109 1110 if !bytes.Equal(hs.hello.sessionID, hs.serverHello.sessionID) { 1111 return errors.New("tls: ClientHello and ServerHello session IDs did not match.") 1112 } 1113 1114 // Resolve PSK and compute the early secret. 1115 zeroSecret := hs.finishedHash.zeroSecret() 1116 pskSecret := zeroSecret 1117 if hs.serverHello.hasPSKIdentity { 1118 // We send at most one PSK identity. 1119 if hs.session == nil || hs.serverHello.pskIdentity != 0 { 1120 c.sendAlert(alertUnknownPSKIdentity) 1121 return errors.New("tls: server sent unknown PSK identity") 1122 } 1123 if hs.session.cipherSuite.hash() != hs.suite.hash() { 1124 c.sendAlert(alertHandshakeFailure) 1125 return errors.New("tls: server resumed an invalid session for the cipher suite") 1126 } 1127 pskSecret = hs.session.secret 1128 c.didResume = true 1129 } 1130 hs.finishedHash.addEntropy(pskSecret) 1131 1132 if !hs.serverHello.hasKeyShare { 1133 c.sendAlert(alertUnsupportedExtension) 1134 return errors.New("tls: server omitted KeyShare on resumption.") 1135 } 1136 1137 // Resolve ECDHE and compute the handshake secret. 1138 ecdheSecret := zeroSecret 1139 if !c.config.Bugs.MissingKeyShare && !c.config.Bugs.SecondClientHelloMissingKeyShare { 1140 kem, ok := hs.keyShares[hs.serverHello.keyShare.group] 1141 if !ok { 1142 c.sendAlert(alertHandshakeFailure) 1143 return errors.New("tls: server selected an unsupported group") 1144 } 1145 c.curveID = hs.serverHello.keyShare.group 1146 1147 var err error 1148 ecdheSecret, err = kem.decap(hs.serverHello.keyShare.keyExchange) 1149 if err != nil { 1150 return err 1151 } 1152 } 1153 hs.finishedHash.nextSecret() 1154 hs.finishedHash.addEntropy(ecdheSecret) 1155 hs.writeServerHash(hs.serverHello.marshal()) 1156 1157 // Derive handshake traffic keys and switch read key to handshake 1158 // traffic key. 1159 clientHandshakeTrafficSecret := hs.finishedHash.deriveSecret(clientHandshakeTrafficLabel) 1160 serverHandshakeTrafficSecret := hs.finishedHash.deriveSecret(serverHandshakeTrafficLabel) 1161 if err := c.useInTrafficSecret(encryptionHandshake, c.wireVersion, hs.suite, serverHandshakeTrafficSecret); err != nil { 1162 return err 1163 } 1164 1165 msg, err := c.readHandshake() 1166 if err != nil { 1167 return err 1168 } 1169 1170 encryptedExtensions, ok := msg.(*encryptedExtensionsMsg) 1171 if !ok { 1172 c.sendAlert(alertUnexpectedMessage) 1173 return unexpectedMessageError(encryptedExtensions, msg) 1174 } 1175 hs.writeServerHash(encryptedExtensions.marshal()) 1176 1177 if !bytes.Equal(encryptedExtensions.extensions.echRetryConfigs, c.config.Bugs.ExpectECHRetryConfigs) { 1178 return errors.New("tls: server sent ECH retry_configs with unexpected contents") 1179 } 1180 1181 err = hs.processServerExtensions(&encryptedExtensions.extensions) 1182 if err != nil { 1183 return err 1184 } 1185 1186 var credential *Credential 1187 var certReq *certificateRequestMsg 1188 if c.didResume { 1189 // Copy over authentication from the session. 1190 c.peerCertificates = hs.session.serverCertificates 1191 c.sctList = hs.session.sctList 1192 c.ocspResponse = hs.session.ocspResponse 1193 } else { 1194 msg, err := c.readHandshake() 1195 if err != nil { 1196 return err 1197 } 1198 1199 var ok bool 1200 certReq, ok = msg.(*certificateRequestMsg) 1201 if ok { 1202 if len(certReq.requestContext) != 0 { 1203 return errors.New("tls: non-empty certificate request context sent in handshake") 1204 } 1205 1206 if c.config.Bugs.ExpectNoCertificateAuthoritiesExtension && certReq.hasCAExtension { 1207 return errors.New("tls: expected no certificate_authorities extension") 1208 } 1209 1210 hs.writeServerHash(certReq.marshal()) 1211 1212 credential = c.config.Credential 1213 if credential != nil && c.config.Bugs.IgnorePeerSignatureAlgorithmPreferences { 1214 certReq.signatureAlgorithms = credential.signatureAlgorithms() 1215 } 1216 1217 msg, err = c.readHandshake() 1218 if err != nil { 1219 return err 1220 } 1221 } 1222 1223 var certMsg *certificateMsg 1224 1225 if compressedCertMsg, ok := msg.(*compressedCertificateMsg); ok { 1226 hs.writeServerHash(compressedCertMsg.marshal()) 1227 1228 alg, ok := c.config.CertCompressionAlgs[compressedCertMsg.algID] 1229 if !ok { 1230 c.sendAlert(alertBadCertificate) 1231 return fmt.Errorf("tls: received certificate compressed with unknown algorithm %x", compressedCertMsg.algID) 1232 } 1233 1234 decompressed := make([]byte, 4+int(compressedCertMsg.uncompressedLength)) 1235 if !alg.Decompress(decompressed[4:], compressedCertMsg.compressed) { 1236 c.sendAlert(alertBadCertificate) 1237 return fmt.Errorf("tls: failed to decompress certificate with algorithm %x", compressedCertMsg.algID) 1238 } 1239 1240 certMsg = &certificateMsg{ 1241 hasRequestContext: true, 1242 } 1243 1244 if !certMsg.unmarshal(decompressed) { 1245 c.sendAlert(alertBadCertificate) 1246 return errors.New("tls: failed to parse decompressed certificate") 1247 } 1248 1249 if expected := c.config.Bugs.ExpectedCompressedCert; expected != 0 && expected != compressedCertMsg.algID { 1250 return fmt.Errorf("tls: expected certificate compressed with algorithm %x, but message used %x", expected, compressedCertMsg.algID) 1251 } 1252 1253 if c.config.Bugs.ExpectUncompressedCert { 1254 return errors.New("tls: compressed certificate received") 1255 } 1256 } else { 1257 if certMsg, ok = msg.(*certificateMsg); !ok { 1258 c.sendAlert(alertUnexpectedMessage) 1259 return unexpectedMessageError(certMsg, msg) 1260 } 1261 hs.writeServerHash(certMsg.marshal()) 1262 1263 if c.config.Bugs.ExpectedCompressedCert != 0 { 1264 return errors.New("tls: uncompressed certificate received") 1265 } 1266 } 1267 1268 // Check for unsolicited extensions. 1269 for i, cert := range certMsg.certificates { 1270 if c.config.Bugs.NoOCSPStapling && cert.ocspResponse != nil { 1271 c.sendAlert(alertUnsupportedExtension) 1272 return errors.New("tls: unexpected OCSP response in the server certificate") 1273 } 1274 if c.config.Bugs.NoSignedCertificateTimestamps && cert.sctList != nil { 1275 c.sendAlert(alertUnsupportedExtension) 1276 return errors.New("tls: unexpected SCT list in the server certificate") 1277 } 1278 if i > 0 && c.config.Bugs.ExpectNoExtensionsOnIntermediate && (cert.ocspResponse != nil || cert.sctList != nil) { 1279 c.sendAlert(alertUnsupportedExtension) 1280 return errors.New("tls: unexpected extensions in the server certificate") 1281 } 1282 } 1283 1284 if err := hs.verifyCertificates(certMsg); err != nil { 1285 return err 1286 } 1287 c.ocspResponse = certMsg.certificates[0].ocspResponse 1288 c.sctList = certMsg.certificates[0].sctList 1289 1290 msg, err = c.readHandshake() 1291 if err != nil { 1292 return err 1293 } 1294 certVerifyMsg, ok := msg.(*certificateVerifyMsg) 1295 if !ok { 1296 c.sendAlert(alertUnexpectedMessage) 1297 return unexpectedMessageError(certVerifyMsg, msg) 1298 } 1299 1300 c.peerSignatureAlgorithm = certVerifyMsg.signatureAlgorithm 1301 input := hs.finishedHash.certificateVerifyInput(serverCertificateVerifyContextTLS13) 1302 if c.peerDelegatedCredential != nil { 1303 err = verifyMessageDC(c.vers, hs.peerPublicKey, c.config, certVerifyMsg.signatureAlgorithm, input, certVerifyMsg.signature) 1304 } else { 1305 err = verifyMessage(c.vers, hs.peerPublicKey, c.config, certVerifyMsg.signatureAlgorithm, input, certVerifyMsg.signature) 1306 } 1307 if err != nil { 1308 return err 1309 } 1310 1311 hs.writeServerHash(certVerifyMsg.marshal()) 1312 } 1313 1314 msg, err = c.readHandshake() 1315 if err != nil { 1316 return err 1317 } 1318 serverFinished, ok := msg.(*finishedMsg) 1319 if !ok { 1320 c.sendAlert(alertUnexpectedMessage) 1321 return unexpectedMessageError(serverFinished, msg) 1322 } 1323 1324 verify := hs.finishedHash.serverSum(serverHandshakeTrafficSecret) 1325 if len(verify) != len(serverFinished.verifyData) || 1326 subtle.ConstantTimeCompare(verify, serverFinished.verifyData) != 1 { 1327 c.sendAlert(alertHandshakeFailure) 1328 return errors.New("tls: server's Finished message was incorrect") 1329 } 1330 1331 hs.writeServerHash(serverFinished.marshal()) 1332 1333 // The various secrets do not incorporate the client's final leg, so 1334 // derive them now before updating the handshake context. 1335 hs.finishedHash.nextSecret() 1336 hs.finishedHash.addEntropy(zeroSecret) 1337 1338 clientTrafficSecret := hs.finishedHash.deriveSecret(clientApplicationTrafficLabel) 1339 serverTrafficSecret := hs.finishedHash.deriveSecret(serverApplicationTrafficLabel) 1340 c.exporterSecret = hs.finishedHash.deriveSecret(exporterLabel) 1341 1342 // Switch to application data keys on read. In particular, any alerts 1343 // from the client certificate are read over these keys. 1344 if err := c.useInTrafficSecret(encryptionApplication, c.wireVersion, hs.suite, serverTrafficSecret); err != nil { 1345 return err 1346 } 1347 1348 // If we're expecting 0.5-RTT messages from the server, read them now. 1349 var deferredTickets []*newSessionTicketMsg 1350 if encryptedExtensions.extensions.hasEarlyData { 1351 // BoringSSL will always send two tickets half-RTT when 1352 // negotiating 0-RTT. 1353 for i := 0; i < shimConfig.HalfRTTTickets; i++ { 1354 msg, err := c.readHandshake() 1355 if err != nil { 1356 return fmt.Errorf("tls: error reading half-RTT ticket: %s", err) 1357 } 1358 newSessionTicket, ok := msg.(*newSessionTicketMsg) 1359 if !ok { 1360 return errors.New("tls: expected half-RTT ticket") 1361 } 1362 // Defer processing until the resumption secret is computed. 1363 deferredTickets = append(deferredTickets, newSessionTicket) 1364 } 1365 for _, expectedMsg := range c.config.Bugs.ExpectHalfRTTData { 1366 if err := c.readRecord(recordTypeApplicationData); err != nil { 1367 return err 1368 } 1369 if !bytes.Equal(c.input.data[c.input.off:], expectedMsg) { 1370 return errors.New("ExpectHalfRTTData: did not get expected message") 1371 } 1372 c.in.freeBlock(c.input) 1373 c.input = nil 1374 } 1375 } 1376 1377 // Send EndOfEarlyData and then switch write key to handshake 1378 // traffic key. 1379 if encryptedExtensions.extensions.hasEarlyData && !c.config.Bugs.SkipEndOfEarlyData && c.config.Bugs.MockQUICTransport == nil { 1380 if c.config.Bugs.SendStrayEarlyHandshake { 1381 helloRequest := new(helloRequestMsg) 1382 c.writeRecord(recordTypeHandshake, helloRequest.marshal()) 1383 } 1384 endOfEarlyData := new(endOfEarlyDataMsg) 1385 endOfEarlyData.nonEmpty = c.config.Bugs.NonEmptyEndOfEarlyData 1386 hs.writeClientHash(endOfEarlyData.marshal()) 1387 if c.config.Bugs.PartialEndOfEarlyDataWithClientHello { 1388 // The first byte has already been sent. 1389 c.writeRecord(recordTypeHandshake, endOfEarlyData.marshal()[1:]) 1390 } else { 1391 c.writeRecord(recordTypeHandshake, endOfEarlyData.marshal()) 1392 } 1393 } 1394 1395 if !c.config.Bugs.SkipChangeCipherSpec && !hs.hello.hasEarlyData { 1396 c.writeRecord(recordTypeChangeCipherSpec, []byte{1}) 1397 } 1398 1399 for i := 0; i < c.config.Bugs.SendExtraChangeCipherSpec; i++ { 1400 c.writeRecord(recordTypeChangeCipherSpec, []byte{1}) 1401 } 1402 1403 c.useOutTrafficSecret(encryptionHandshake, c.wireVersion, hs.suite, clientHandshakeTrafficSecret) 1404 1405 // The client EncryptedExtensions message is sent if some extension uses it. 1406 // (Currently only ALPS does.) 1407 hasEncryptedExtensions := c.config.Bugs.AlwaysSendClientEncryptedExtensions 1408 clientEncryptedExtensions := new(clientEncryptedExtensionsMsg) 1409 if encryptedExtensions.extensions.hasApplicationSettings || (c.config.Bugs.SendApplicationSettingsWithEarlyData && c.hasApplicationSettings) { 1410 hasEncryptedExtensions = true 1411 if !c.config.Bugs.OmitClientApplicationSettings { 1412 clientEncryptedExtensions.hasApplicationSettings = true 1413 clientEncryptedExtensions.applicationSettings = c.localApplicationSettings 1414 } 1415 } 1416 if encryptedExtensions.extensions.hasApplicationSettingsOld || (c.config.Bugs.SendApplicationSettingsWithEarlyData && c.hasApplicationSettingsOld) { 1417 hasEncryptedExtensions = true 1418 if !c.config.Bugs.OmitClientApplicationSettings { 1419 clientEncryptedExtensions.hasApplicationSettingsOld = true 1420 clientEncryptedExtensions.applicationSettingsOld = c.localApplicationSettingsOld 1421 } 1422 } 1423 if c.config.Bugs.SendExtraClientEncryptedExtension { 1424 hasEncryptedExtensions = true 1425 clientEncryptedExtensions.customExtension = []byte{0} 1426 } 1427 if hasEncryptedExtensions && !c.config.Bugs.OmitClientEncryptedExtensions { 1428 hs.writeClientHash(clientEncryptedExtensions.marshal()) 1429 c.writeRecord(recordTypeHandshake, clientEncryptedExtensions.marshal()) 1430 } 1431 1432 if certReq != nil && !c.config.Bugs.SkipClientCertificate { 1433 certMsg := &certificateMsg{ 1434 hasRequestContext: true, 1435 requestContext: certReq.requestContext, 1436 } 1437 if credential != nil { 1438 for _, certData := range credential.Certificate { 1439 certMsg.certificates = append(certMsg.certificates, certificateEntry{ 1440 data: certData, 1441 extraExtension: c.config.Bugs.SendExtensionOnCertificate, 1442 }) 1443 } 1444 } 1445 hs.writeClientHash(certMsg.marshal()) 1446 c.writeRecord(recordTypeHandshake, certMsg.marshal()) 1447 1448 if credential != nil { 1449 certVerify := &certificateVerifyMsg{ 1450 hasSignatureAlgorithm: true, 1451 } 1452 1453 // Determine the hash to sign. 1454 var err error 1455 certVerify.signatureAlgorithm, err = selectSignatureAlgorithm(c.vers, credential, c.config, certReq.signatureAlgorithms) 1456 if err != nil { 1457 c.sendAlert(alertInternalError) 1458 return err 1459 } 1460 1461 privKey := credential.PrivateKey 1462 input := hs.finishedHash.certificateVerifyInput(clientCertificateVerifyContextTLS13) 1463 certVerify.signature, err = signMessage(c.vers, privKey, c.config, certVerify.signatureAlgorithm, input) 1464 if err != nil { 1465 c.sendAlert(alertInternalError) 1466 return err 1467 } 1468 if c.config.Bugs.SendSignatureAlgorithm != 0 { 1469 certVerify.signatureAlgorithm = c.config.Bugs.SendSignatureAlgorithm 1470 } 1471 1472 if !c.config.Bugs.SkipCertificateVerify { 1473 hs.writeClientHash(certVerify.marshal()) 1474 c.writeRecord(recordTypeHandshake, certVerify.marshal()) 1475 } 1476 } 1477 } 1478 1479 if encryptedExtensions.extensions.channelIDRequested { 1480 channelIDHash := crypto.SHA256.New() 1481 channelIDHash.Write(hs.finishedHash.certificateVerifyInput(channelIDContextTLS13)) 1482 channelIDMsgBytes, err := hs.writeChannelIDMessage(channelIDHash.Sum(nil)) 1483 if err != nil { 1484 return err 1485 } 1486 hs.writeClientHash(channelIDMsgBytes) 1487 c.writeRecord(recordTypeHandshake, channelIDMsgBytes) 1488 } 1489 1490 // Send a client Finished message. 1491 finished := new(finishedMsg) 1492 finished.verifyData = hs.finishedHash.clientSum(clientHandshakeTrafficSecret) 1493 if c.config.Bugs.BadFinished { 1494 finished.verifyData[0]++ 1495 } 1496 hs.writeClientHash(finished.marshal()) 1497 if c.config.Bugs.PartialClientFinishedWithClientHello { 1498 // The first byte has already been sent. 1499 c.writeRecord(recordTypeHandshake, finished.marshal()[1:]) 1500 } else if c.config.Bugs.InterleaveEarlyData { 1501 finishedBytes := finished.marshal() 1502 c.sendFakeEarlyData(4) 1503 c.writeRecord(recordTypeHandshake, finishedBytes[:1]) 1504 c.sendFakeEarlyData(4) 1505 c.writeRecord(recordTypeHandshake, finishedBytes[1:]) 1506 } else { 1507 c.writeRecord(recordTypeHandshake, finished.marshal()) 1508 } 1509 if c.config.Bugs.SendExtraFinished { 1510 c.writeRecord(recordTypeHandshake, finished.marshal()) 1511 } 1512 c.flushHandshake() 1513 1514 // Switch to application data keys. 1515 c.useOutTrafficSecret(encryptionApplication, c.wireVersion, hs.suite, clientTrafficSecret) 1516 c.resumptionSecret = hs.finishedHash.deriveSecret(resumptionLabel) 1517 for _, ticket := range deferredTickets { 1518 if err := c.processTLS13NewSessionTicket(ticket, hs.suite); err != nil { 1519 return err 1520 } 1521 } 1522 1523 return nil 1524} 1525 1526// applyHelloRetryRequest updates |hello| in-place based on |helloRetryRequest|. 1527// If |outerHello| is not nil, |outerHello| will be updated to contain an 1528// encrypted copy of |hello|. 1529func (hs *clientHandshakeState) applyHelloRetryRequest(helloRetryRequest *helloRetryRequestMsg, hello, outerHello *clientHelloMsg) error { 1530 c := hs.c 1531 firstHelloBytes := hello.marshal() 1532 if len(helloRetryRequest.cookie) > 0 { 1533 hello.tls13Cookie = helloRetryRequest.cookie 1534 } 1535 1536 if c.config.Bugs.MisinterpretHelloRetryRequestCurve != 0 { 1537 helloRetryRequest.hasSelectedGroup = true 1538 helloRetryRequest.selectedGroup = c.config.Bugs.MisinterpretHelloRetryRequestCurve 1539 } 1540 if helloRetryRequest.hasSelectedGroup { 1541 var hrrCurveFound bool 1542 group := helloRetryRequest.selectedGroup 1543 for _, curveID := range hello.supportedCurves { 1544 if group == curveID { 1545 hrrCurveFound = true 1546 break 1547 } 1548 } 1549 if !hrrCurveFound || hs.keyShares[group] != nil { 1550 c.sendAlert(alertHandshakeFailure) 1551 return errors.New("tls: received invalid HelloRetryRequest") 1552 } 1553 kem, ok := kemForCurveID(group, c.config) 1554 if !ok { 1555 return errors.New("tls: Unable to get curve requested in HelloRetryRequest") 1556 } 1557 publicKey, err := kem.generate(c.config.rand()) 1558 if err != nil { 1559 return err 1560 } 1561 hs.keyShares[group] = kem 1562 hello.keyShares = []keyShareEntry{{ 1563 group: group, 1564 keyExchange: publicKey, 1565 }} 1566 } 1567 1568 if c.config.Bugs.SecondClientHelloMissingKeyShare { 1569 hello.hasKeyShares = false 1570 } 1571 1572 if c.config.Bugs.OmitSecondECHInner { 1573 hello.echInner = false 1574 } 1575 1576 hello.hasEarlyData = c.config.Bugs.SendEarlyDataOnSecondClientHello 1577 // The first ClientHello may have skipped this due to OnlyCorruptSecondPSKBinder. 1578 if c.config.Bugs.PSKBinderFirst && c.config.Bugs.OnlyCorruptSecondPSKBinder { 1579 hello.prefixExtensions = append(hello.prefixExtensions, extensionPreSharedKey) 1580 } 1581 // The first ClientHello may have set this due to OnlyCompressSecondClientHelloInner. 1582 hello.reorderOuterExtensionsWithoutCompressing = false 1583 if c.config.Bugs.OmitPSKsOnSecondClientHello { 1584 hello.pskIdentities = nil 1585 hello.pskBinders = nil 1586 } 1587 hello.raw = nil 1588 1589 if len(hello.pskIdentities) > 0 { 1590 generatePSKBinders(c.wireVersion, hello, hs.session, firstHelloBytes, helloRetryRequest.marshal(), c.config) 1591 } 1592 1593 if outerHello != nil { 1594 outerHello.raw = nil 1595 // We know the server has accepted ECH, so the ClientHelloOuter's fields 1596 // are irrelevant. In the general case, the HelloRetryRequest may not 1597 // even be valid for ClientHelloOuter. However, we copy the key shares 1598 // from ClientHelloInner so they remain eligible for compression. 1599 if !c.config.Bugs.MinimalClientHelloOuter { 1600 outerHello.keyShares = hello.keyShares 1601 } 1602 1603 if c.config.Bugs.OmitSecondEncryptedClientHello { 1604 outerHello.echOuter = nil 1605 } else { 1606 configID := c.config.ClientECHConfig.ConfigID 1607 if c.config.Bugs.CorruptSecondEncryptedClientHelloConfigID { 1608 configID ^= 1 1609 } 1610 if err := hs.encryptClientHello(outerHello, hello, configID, nil); err != nil { 1611 return err 1612 } 1613 if c.config.Bugs.CorruptSecondEncryptedClientHello { 1614 if c.config.Bugs.NullAllCiphers { 1615 outerHello.echOuter.payload = []byte{echBadPayloadByte} 1616 } else { 1617 outerHello.echOuter.payload[0] ^= 1 1618 } 1619 } 1620 } 1621 } 1622 1623 return nil 1624} 1625 1626func (hs *clientHandshakeState) doFullHandshake() error { 1627 c := hs.c 1628 1629 var leaf *x509.Certificate 1630 if hs.suite.flags&suitePSK == 0 { 1631 msg, err := c.readHandshake() 1632 if err != nil { 1633 return err 1634 } 1635 1636 certMsg, ok := msg.(*certificateMsg) 1637 if !ok { 1638 c.sendAlert(alertUnexpectedMessage) 1639 return unexpectedMessageError(certMsg, msg) 1640 } 1641 hs.writeServerHash(certMsg.marshal()) 1642 1643 if err := hs.verifyCertificates(certMsg); err != nil { 1644 return err 1645 } 1646 leaf = c.peerCertificates[0] 1647 } 1648 1649 if hs.serverHello.extensions.ocspStapling { 1650 msg, err := c.readHandshake() 1651 if err != nil { 1652 return err 1653 } 1654 cs, ok := msg.(*certificateStatusMsg) 1655 if !ok { 1656 c.sendAlert(alertUnexpectedMessage) 1657 return unexpectedMessageError(cs, msg) 1658 } 1659 hs.writeServerHash(cs.marshal()) 1660 1661 if cs.statusType == statusTypeOCSP { 1662 c.ocspResponse = cs.response 1663 } 1664 } 1665 1666 msg, err := c.readHandshake() 1667 if err != nil { 1668 return err 1669 } 1670 1671 keyAgreement := hs.suite.ka(c.vers) 1672 1673 skx, ok := msg.(*serverKeyExchangeMsg) 1674 if ok { 1675 hs.writeServerHash(skx.marshal()) 1676 err = keyAgreement.processServerKeyExchange(c.config, hs.hello, hs.serverHello, hs.peerPublicKey, skx) 1677 if err != nil { 1678 c.sendAlert(alertUnexpectedMessage) 1679 return err 1680 } 1681 if ecdhe, ok := keyAgreement.(*ecdheKeyAgreement); ok { 1682 c.curveID = ecdhe.curveID 1683 } 1684 1685 c.peerSignatureAlgorithm = keyAgreement.peerSignatureAlgorithm() 1686 1687 msg, err = c.readHandshake() 1688 if err != nil { 1689 return err 1690 } 1691 } 1692 1693 var credential *Credential 1694 var certRequested bool 1695 certReq, ok := msg.(*certificateRequestMsg) 1696 if ok { 1697 certRequested = true 1698 hs.writeServerHash(certReq.marshal()) 1699 1700 credential = c.config.Credential 1701 if credential != nil && c.config.Bugs.IgnorePeerSignatureAlgorithmPreferences { 1702 certReq.signatureAlgorithms = credential.signatureAlgorithms() 1703 } 1704 1705 msg, err = c.readHandshake() 1706 if err != nil { 1707 return err 1708 } 1709 } 1710 1711 shd, ok := msg.(*serverHelloDoneMsg) 1712 if !ok { 1713 c.sendAlert(alertUnexpectedMessage) 1714 return unexpectedMessageError(shd, msg) 1715 } 1716 hs.writeServerHash(shd.marshal()) 1717 1718 // If the server requested a certificate then we have to send a 1719 // Certificate message in TLS, even if it's empty because we don't have 1720 // a certificate to send. 1721 if certRequested && !c.config.Bugs.SkipClientCertificate { 1722 certMsg := new(certificateMsg) 1723 if credential != nil { 1724 for _, certData := range credential.Certificate { 1725 certMsg.certificates = append(certMsg.certificates, certificateEntry{ 1726 data: certData, 1727 }) 1728 } 1729 } 1730 hs.writeClientHash(certMsg.marshal()) 1731 c.writeRecord(recordTypeHandshake, certMsg.marshal()) 1732 } 1733 1734 preMasterSecret, ckx, err := keyAgreement.generateClientKeyExchange(c.config, hs.hello, leaf) 1735 if err != nil { 1736 c.sendAlert(alertInternalError) 1737 return err 1738 } 1739 if ckx != nil { 1740 if c.config.Bugs.EarlyChangeCipherSpec < 2 { 1741 hs.writeClientHash(ckx.marshal()) 1742 } 1743 if c.config.Bugs.PartialClientKeyExchangeWithClientHello { 1744 // The first byte was already written. 1745 c.writeRecord(recordTypeHandshake, ckx.marshal()[1:]) 1746 } else { 1747 c.writeRecord(recordTypeHandshake, ckx.marshal()) 1748 } 1749 } 1750 1751 if hs.serverHello.extensions.extendedMasterSecret { 1752 hs.masterSecret = extendedMasterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret, hs.finishedHash) 1753 c.extendedMasterSecret = true 1754 } else { 1755 if c.config.Bugs.RequireExtendedMasterSecret { 1756 return errors.New("tls: extended master secret required but not supported by peer") 1757 } 1758 hs.masterSecret = masterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret, hs.hello.random, hs.serverHello.random) 1759 } 1760 1761 if credential != nil { 1762 certVerify := &certificateVerifyMsg{ 1763 hasSignatureAlgorithm: c.vers >= VersionTLS12, 1764 } 1765 1766 // Determine the hash to sign. 1767 if certVerify.hasSignatureAlgorithm { 1768 certVerify.signatureAlgorithm, err = selectSignatureAlgorithm(c.vers, credential, c.config, certReq.signatureAlgorithms) 1769 if err != nil { 1770 c.sendAlert(alertInternalError) 1771 return err 1772 } 1773 } 1774 1775 privKey := c.config.Credential.PrivateKey 1776 certVerify.signature, err = signMessage(c.vers, privKey, c.config, certVerify.signatureAlgorithm, hs.finishedHash.buffer) 1777 if err == nil && c.config.Bugs.SendSignatureAlgorithm != 0 { 1778 certVerify.signatureAlgorithm = c.config.Bugs.SendSignatureAlgorithm 1779 } 1780 if err != nil { 1781 c.sendAlert(alertInternalError) 1782 return errors.New("tls: failed to sign handshake with client certificate: " + err.Error()) 1783 } 1784 1785 if !c.config.Bugs.SkipCertificateVerify { 1786 hs.writeClientHash(certVerify.marshal()) 1787 c.writeRecord(recordTypeHandshake, certVerify.marshal()) 1788 } 1789 } 1790 // flushHandshake will be called in sendFinished. 1791 1792 hs.finishedHash.discardHandshakeBuffer() 1793 1794 return nil 1795} 1796 1797// delegatedCredentialSignedMessage returns the bytes that are signed in order 1798// to authenticate a delegated credential. 1799func delegatedCredentialSignedMessage(credBytes []byte, algorithm signatureAlgorithm, leafDER []byte) []byte { 1800 // https://www.rfc-editor.org/rfc/rfc9345.html#section-4 1801 ret := make([]byte, 64, 128) 1802 for i := range ret { 1803 ret[i] = 0x20 1804 } 1805 1806 ret = append(ret, []byte("TLS, server delegated credentials\x00")...) 1807 ret = append(ret, leafDER...) 1808 ret = append(ret, byte(algorithm>>8), byte(algorithm)) 1809 ret = append(ret, credBytes...) 1810 1811 return ret 1812} 1813 1814func (hs *clientHandshakeState) verifyCertificates(certMsg *certificateMsg) error { 1815 c := hs.c 1816 1817 if len(certMsg.certificates) == 0 { 1818 c.sendAlert(alertIllegalParameter) 1819 return errors.New("tls: no certificates sent") 1820 } 1821 1822 var dc *delegatedCredential 1823 certs := make([]*x509.Certificate, len(certMsg.certificates)) 1824 for i, certEntry := range certMsg.certificates { 1825 cert, err := x509.ParseCertificate(certEntry.data) 1826 if err != nil { 1827 c.sendAlert(alertBadCertificate) 1828 return errors.New("tls: failed to parse certificate from server: " + err.Error()) 1829 } 1830 certs[i] = cert 1831 1832 if certEntry.delegatedCredential != nil { 1833 if i != 0 { 1834 c.sendAlert(alertIllegalParameter) 1835 return errors.New("tls: non-leaf certificate has a delegated credential") 1836 } 1837 if len(c.config.DelegatedCredentialAlgorithms) == 0 { 1838 c.sendAlert(alertIllegalParameter) 1839 return errors.New("tls: server sent delegated credential without it being requested") 1840 } 1841 dc = certEntry.delegatedCredential 1842 } 1843 } 1844 1845 if !c.config.InsecureSkipVerify { 1846 opts := x509.VerifyOptions{ 1847 Roots: c.config.RootCAs, 1848 CurrentTime: c.config.time(), 1849 DNSName: c.config.ServerName, 1850 Intermediates: x509.NewCertPool(), 1851 } 1852 1853 for i, cert := range certs { 1854 if i == 0 { 1855 continue 1856 } 1857 opts.Intermediates.AddCert(cert) 1858 } 1859 var err error 1860 c.verifiedChains, err = certs[0].Verify(opts) 1861 if err != nil { 1862 c.sendAlert(alertBadCertificate) 1863 return err 1864 } 1865 } 1866 1867 leafPublicKey := certs[0].PublicKey 1868 switch leafPublicKey.(type) { 1869 case *rsa.PublicKey, *ecdsa.PublicKey, ed25519.PublicKey: 1870 break 1871 default: 1872 c.sendAlert(alertUnsupportedCertificate) 1873 return fmt.Errorf("tls: server's certificate contains an unsupported type of public key: %T", leafPublicKey) 1874 } 1875 1876 c.peerCertificates = certs 1877 1878 if dc != nil { 1879 // Note that this doesn't check a) the delegated credential temporal 1880 // validity nor b) that the certificate has the special OID asserted. 1881 var err error 1882 if hs.peerPublicKey, err = x509.ParsePKIXPublicKey(dc.pkixPublicKey); err != nil { 1883 c.sendAlert(alertBadCertificate) 1884 return errors.New("tls: failed to parse public key from delegated credential: " + err.Error()) 1885 } 1886 1887 signedMsg := delegatedCredentialSignedMessage(dc.signedBytes, dc.algorithm, certs[0].Raw) 1888 if err := verifyMessage(c.vers, leafPublicKey, c.config, dc.algorithm, signedMsg, dc.signature); err != nil { 1889 c.sendAlert(alertBadCertificate) 1890 return errors.New("tls: failed to verify delegated credential: " + err.Error()) 1891 } 1892 c.peerDelegatedCredential = dc.raw 1893 } else { 1894 hs.peerPublicKey = leafPublicKey 1895 } 1896 1897 return nil 1898} 1899 1900func (hs *clientHandshakeState) establishKeys() error { 1901 c := hs.c 1902 1903 clientMAC, serverMAC, clientKey, serverKey, clientIV, serverIV := 1904 keysFromMasterSecret(c.vers, hs.suite, hs.masterSecret, hs.hello.random, hs.serverHello.random, hs.suite.macLen, hs.suite.keyLen, hs.suite.ivLen(c.vers)) 1905 var clientCipher, serverCipher any 1906 var clientHash, serverHash macFunction 1907 if hs.suite.cipher != nil { 1908 clientCipher = hs.suite.cipher(clientKey, clientIV, false /* not for reading */) 1909 clientHash = hs.suite.mac(c.vers, clientMAC) 1910 serverCipher = hs.suite.cipher(serverKey, serverIV, true /* for reading */) 1911 serverHash = hs.suite.mac(c.vers, serverMAC) 1912 } else { 1913 clientCipher = hs.suite.aead(c.vers, clientKey, clientIV) 1914 serverCipher = hs.suite.aead(c.vers, serverKey, serverIV) 1915 } 1916 1917 c.in.prepareCipherSpec(c.wireVersion, serverCipher, serverHash) 1918 c.out.prepareCipherSpec(c.wireVersion, clientCipher, clientHash) 1919 return nil 1920} 1921 1922func (hs *clientHandshakeState) processServerExtensions(serverExtensions *serverExtensions) error { 1923 c := hs.c 1924 1925 if c.vers < VersionTLS13 { 1926 if c.config.Bugs.RequireRenegotiationInfo && serverExtensions.secureRenegotiation == nil { 1927 return errors.New("tls: renegotiation extension missing") 1928 } 1929 1930 if len(c.clientVerify) > 0 && !c.noRenegotiationInfo() { 1931 var expectedRenegInfo []byte 1932 expectedRenegInfo = append(expectedRenegInfo, c.clientVerify...) 1933 expectedRenegInfo = append(expectedRenegInfo, c.serverVerify...) 1934 if !bytes.Equal(serverExtensions.secureRenegotiation, expectedRenegInfo) { 1935 c.sendAlert(alertHandshakeFailure) 1936 return fmt.Errorf("tls: renegotiation mismatch") 1937 } 1938 } 1939 } else if serverExtensions.secureRenegotiation != nil { 1940 return errors.New("tls: renegotiation info sent in TLS 1.3") 1941 } 1942 1943 if expected := c.config.Bugs.ExpectedCustomExtension; expected != nil { 1944 if serverExtensions.customExtension != *expected { 1945 return fmt.Errorf("tls: bad custom extension contents %q", serverExtensions.customExtension) 1946 } 1947 } 1948 1949 clientDidNPN := hs.hello.nextProtoNeg 1950 clientDidALPN := len(hs.hello.alpnProtocols) > 0 1951 serverHasNPN := serverExtensions.nextProtoNeg 1952 serverHasALPN := len(serverExtensions.alpnProtocol) > 0 1953 1954 if !clientDidNPN && serverHasNPN { 1955 c.sendAlert(alertHandshakeFailure) 1956 return errors.New("server advertised unrequested NPN extension") 1957 } 1958 1959 if !clientDidALPN && serverHasALPN { 1960 c.sendAlert(alertHandshakeFailure) 1961 return errors.New("server advertised unrequested ALPN extension") 1962 } 1963 1964 if serverHasNPN && serverHasALPN { 1965 c.sendAlert(alertHandshakeFailure) 1966 return errors.New("server advertised both NPN and ALPN extensions") 1967 } 1968 1969 if serverHasALPN { 1970 c.clientProtocol = serverExtensions.alpnProtocol 1971 c.clientProtocolFallback = false 1972 c.usedALPN = true 1973 } 1974 1975 if serverHasNPN && c.vers >= VersionTLS13 { 1976 c.sendAlert(alertHandshakeFailure) 1977 return errors.New("server advertised NPN over TLS 1.3") 1978 } 1979 1980 if !hs.hello.channelIDSupported && serverExtensions.channelIDRequested { 1981 c.sendAlert(alertHandshakeFailure) 1982 return errors.New("server advertised unrequested Channel ID extension") 1983 } 1984 1985 if serverExtensions.extendedMasterSecret && c.vers >= VersionTLS13 { 1986 return errors.New("tls: server advertised extended master secret over TLS 1.3") 1987 } 1988 1989 if serverExtensions.ticketSupported && c.vers >= VersionTLS13 { 1990 return errors.New("tls: server advertised ticket extension over TLS 1.3") 1991 } 1992 1993 if serverExtensions.ocspStapling && c.vers >= VersionTLS13 { 1994 return errors.New("tls: server advertised OCSP in ServerHello over TLS 1.3") 1995 } 1996 1997 if serverExtensions.ocspStapling && c.config.Bugs.NoOCSPStapling { 1998 return errors.New("tls: server advertised unrequested OCSP extension") 1999 } 2000 2001 if len(serverExtensions.sctList) > 0 && c.vers >= VersionTLS13 { 2002 return errors.New("tls: server advertised SCTs in ServerHello over TLS 1.3") 2003 } 2004 2005 if len(serverExtensions.sctList) > 0 && c.config.Bugs.NoSignedCertificateTimestamps { 2006 return errors.New("tls: server advertised unrequested SCTs") 2007 } 2008 2009 if serverExtensions.srtpProtectionProfile != 0 { 2010 if serverExtensions.srtpMasterKeyIdentifier != "" { 2011 return errors.New("tls: server selected SRTP MKI value") 2012 } 2013 2014 found := false 2015 for _, p := range c.config.SRTPProtectionProfiles { 2016 if p == serverExtensions.srtpProtectionProfile { 2017 found = true 2018 break 2019 } 2020 } 2021 if !found { 2022 return errors.New("tls: server advertised unsupported SRTP profile") 2023 } 2024 2025 c.srtpProtectionProfile = serverExtensions.srtpProtectionProfile 2026 } 2027 2028 if c.vers >= VersionTLS13 && c.didResume { 2029 if c.config.Bugs.ExpectEarlyDataAccepted && !serverExtensions.hasEarlyData { 2030 c.sendAlert(alertHandshakeFailure) 2031 return errors.New("tls: server did not accept early data when expected") 2032 } 2033 2034 if !c.config.Bugs.ExpectEarlyDataAccepted && serverExtensions.hasEarlyData { 2035 c.sendAlert(alertHandshakeFailure) 2036 return errors.New("tls: server accepted early data when not expected") 2037 } 2038 } else if serverExtensions.hasEarlyData { 2039 return errors.New("tls: server accepted early data when not resuming") 2040 } 2041 2042 if len(serverExtensions.quicTransportParams) > 0 { 2043 if c.vers < VersionTLS13 { 2044 c.sendAlert(alertHandshakeFailure) 2045 return errors.New("tls: server sent QUIC transport params for TLS version less than 1.3") 2046 } 2047 c.quicTransportParams = serverExtensions.quicTransportParams 2048 } 2049 2050 if len(serverExtensions.quicTransportParamsLegacy) > 0 { 2051 if c.vers < VersionTLS13 { 2052 c.sendAlert(alertHandshakeFailure) 2053 return errors.New("tls: server sent QUIC transport params for TLS version less than 1.3") 2054 } 2055 c.quicTransportParamsLegacy = serverExtensions.quicTransportParamsLegacy 2056 } 2057 2058 if serverExtensions.hasApplicationSettings && serverExtensions.hasApplicationSettingsOld { 2059 return errors.New("tls: server negotiated both old and new application settings together") 2060 } 2061 2062 if serverExtensions.hasApplicationSettings || serverExtensions.hasApplicationSettingsOld { 2063 if c.vers < VersionTLS13 { 2064 return errors.New("tls: server sent application settings at invalid version") 2065 } 2066 if serverExtensions.hasEarlyData { 2067 return errors.New("tls: server sent application settings with 0-RTT") 2068 } 2069 if !serverHasALPN { 2070 return errors.New("tls: server sent application settings without ALPN") 2071 } 2072 settings, ok := c.config.ApplicationSettings[serverExtensions.alpnProtocol] 2073 if !ok { 2074 return errors.New("tls: server sent application settings for invalid protocol") 2075 } 2076 2077 if serverExtensions.hasApplicationSettings { 2078 c.hasApplicationSettings = true 2079 c.localApplicationSettings = settings 2080 c.peerApplicationSettings = serverExtensions.applicationSettings 2081 } 2082 2083 if serverExtensions.hasApplicationSettingsOld { 2084 c.hasApplicationSettingsOld = true 2085 c.localApplicationSettingsOld = settings 2086 c.peerApplicationSettingsOld = serverExtensions.applicationSettingsOld 2087 } 2088 } else if serverExtensions.hasEarlyData { 2089 // 0-RTT connections inherit application settings from the session. 2090 c.hasApplicationSettings = hs.session.hasApplicationSettings 2091 c.localApplicationSettings = hs.session.localApplicationSettings 2092 c.peerApplicationSettings = hs.session.peerApplicationSettings 2093 c.hasApplicationSettingsOld = hs.session.hasApplicationSettingsOld 2094 c.localApplicationSettingsOld = hs.session.localApplicationSettingsOld 2095 c.peerApplicationSettingsOld = hs.session.peerApplicationSettingsOld 2096 } 2097 2098 return nil 2099} 2100 2101func (hs *clientHandshakeState) serverResumedSession() bool { 2102 // If the server responded with the same sessionID then it means the 2103 // sessionTicket is being used to resume a TLS session. 2104 // 2105 // Note that, if hs.hello.sessionID is a non-nil empty array, this will 2106 // accept an empty session ID from the server as resumption. See 2107 // EmptyTicketSessionID. 2108 return hs.session != nil && hs.hello.sessionID != nil && 2109 bytes.Equal(hs.serverHello.sessionID, hs.hello.sessionID) 2110} 2111 2112func (hs *clientHandshakeState) processServerHello() (bool, error) { 2113 c := hs.c 2114 2115 // Check for downgrade signals in the server random, per RFC 8446, section 4.1.3. 2116 gotDowngrade := hs.serverHello.random[len(hs.serverHello.random)-8:] 2117 if !c.config.Bugs.IgnoreTLS13DowngradeRandom { 2118 if c.config.maxVersion(c.isDTLS) >= VersionTLS13 { 2119 if bytes.Equal(gotDowngrade, downgradeTLS13) { 2120 c.sendAlert(alertProtocolVersion) 2121 return false, errors.New("tls: downgrade from TLS 1.3 detected") 2122 } 2123 } 2124 if c.vers <= VersionTLS11 && c.config.maxVersion(c.isDTLS) >= VersionTLS12 { 2125 if bytes.Equal(gotDowngrade, downgradeTLS12) { 2126 c.sendAlert(alertProtocolVersion) 2127 return false, errors.New("tls: downgrade from TLS 1.2 detected") 2128 } 2129 } 2130 } 2131 2132 if bytes.Equal(gotDowngrade, downgradeJDK11) != c.config.Bugs.ExpectJDK11DowngradeRandom { 2133 c.sendAlert(alertProtocolVersion) 2134 if c.config.Bugs.ExpectJDK11DowngradeRandom { 2135 return false, errors.New("tls: server did not send a JDK 11 downgrade signal") 2136 } 2137 return false, errors.New("tls: server sent an unexpected JDK 11 downgrade signal") 2138 } 2139 2140 if c.config.Bugs.ExpectOmitExtensions && !hs.serverHello.omitExtensions { 2141 return false, errors.New("tls: ServerHello did not omit extensions") 2142 } 2143 2144 if hs.serverResumedSession() { 2145 // For test purposes, assert that the server never accepts the 2146 // resumption offer on renegotiation. 2147 if c.cipherSuite != nil && c.config.Bugs.FailIfResumeOnRenego { 2148 return false, errors.New("tls: server resumed session on renegotiation") 2149 } 2150 2151 if hs.serverHello.extensions.sctList != nil { 2152 return false, errors.New("tls: server sent SCT extension on session resumption") 2153 } 2154 2155 if hs.serverHello.extensions.ocspStapling { 2156 return false, errors.New("tls: server sent OCSP extension on session resumption") 2157 } 2158 2159 // Restore masterSecret and peerCerts from previous state 2160 hs.masterSecret = hs.session.secret 2161 c.peerCertificates = hs.session.serverCertificates 2162 c.peerDelegatedCredential = hs.session.serverDelegatedCredential 2163 c.extendedMasterSecret = hs.session.extendedMasterSecret 2164 c.sctList = hs.session.sctList 2165 c.ocspResponse = hs.session.ocspResponse 2166 hs.finishedHash.discardHandshakeBuffer() 2167 return true, nil 2168 } 2169 2170 if hs.serverHello.extensions.sctList != nil { 2171 c.sctList = hs.serverHello.extensions.sctList 2172 } 2173 2174 return false, nil 2175} 2176 2177func (hs *clientHandshakeState) readFinished(out []byte) error { 2178 c := hs.c 2179 2180 c.readRecord(recordTypeChangeCipherSpec) 2181 if err := c.in.error(); err != nil { 2182 return err 2183 } 2184 2185 msg, err := c.readHandshake() 2186 if err != nil { 2187 return err 2188 } 2189 serverFinished, ok := msg.(*finishedMsg) 2190 if !ok { 2191 c.sendAlert(alertUnexpectedMessage) 2192 return unexpectedMessageError(serverFinished, msg) 2193 } 2194 2195 if c.config.Bugs.EarlyChangeCipherSpec == 0 { 2196 verify := hs.finishedHash.serverSum(hs.masterSecret) 2197 if len(verify) != len(serverFinished.verifyData) || 2198 subtle.ConstantTimeCompare(verify, serverFinished.verifyData) != 1 { 2199 c.sendAlert(alertHandshakeFailure) 2200 return errors.New("tls: server's Finished message was incorrect") 2201 } 2202 } 2203 c.serverVerify = append(c.serverVerify[:0], serverFinished.verifyData...) 2204 copy(out, serverFinished.verifyData) 2205 hs.writeServerHash(serverFinished.marshal()) 2206 return nil 2207} 2208 2209func (hs *clientHandshakeState) readSessionTicket() error { 2210 c := hs.c 2211 2212 // Create a session with no server identifier. Either a 2213 // session ID or session ticket will be attached. 2214 session := &ClientSessionState{ 2215 vers: c.vers, 2216 wireVersion: c.wireVersion, 2217 cipherSuite: hs.suite, 2218 secret: hs.masterSecret, 2219 handshakeHash: hs.finishedHash.Sum(), 2220 serverCertificates: c.peerCertificates, 2221 serverDelegatedCredential: c.peerDelegatedCredential, 2222 sctList: c.sctList, 2223 ocspResponse: c.ocspResponse, 2224 ticketExpiration: c.config.time().Add(time.Duration(7 * 24 * time.Hour)), 2225 } 2226 2227 if !hs.serverHello.extensions.ticketSupported { 2228 if c.config.Bugs.ExpectNewTicket { 2229 return errors.New("tls: expected new ticket") 2230 } 2231 if hs.session == nil && len(hs.serverHello.sessionID) > 0 { 2232 session.sessionID = hs.serverHello.sessionID 2233 hs.session = session 2234 } 2235 return nil 2236 } 2237 2238 if c.config.Bugs.ExpectNoNewSessionTicket { 2239 return errors.New("tls: received unexpected NewSessionTicket") 2240 } 2241 2242 msg, err := c.readHandshake() 2243 if err != nil { 2244 return err 2245 } 2246 sessionTicketMsg, ok := msg.(*newSessionTicketMsg) 2247 if !ok { 2248 c.sendAlert(alertUnexpectedMessage) 2249 return unexpectedMessageError(sessionTicketMsg, msg) 2250 } 2251 2252 session.sessionTicket = sessionTicketMsg.ticket 2253 hs.session = session 2254 2255 hs.writeServerHash(sessionTicketMsg.marshal()) 2256 2257 return nil 2258} 2259 2260func (hs *clientHandshakeState) sendFinished(out []byte, isResume bool) error { 2261 c := hs.c 2262 2263 var postCCSMsgs [][]byte 2264 seqno := hs.c.sendHandshakeSeq 2265 if hs.serverHello.extensions.nextProtoNeg { 2266 nextProto := new(nextProtoMsg) 2267 proto, fallback := mutualProtocol(c.config.NextProtos, hs.serverHello.extensions.nextProtos) 2268 nextProto.proto = proto 2269 c.clientProtocol = proto 2270 c.clientProtocolFallback = fallback 2271 2272 nextProtoBytes := nextProto.marshal() 2273 hs.finishedHash.WriteHandshake(nextProtoBytes, seqno) 2274 seqno++ 2275 postCCSMsgs = append(postCCSMsgs, nextProtoBytes) 2276 } 2277 2278 if hs.serverHello.extensions.channelIDRequested { 2279 var resumeHash []byte 2280 if isResume { 2281 resumeHash = hs.session.handshakeHash 2282 } 2283 channelIDMsgBytes, err := hs.writeChannelIDMessage(hs.finishedHash.hashForChannelID(resumeHash)) 2284 if err != nil { 2285 return err 2286 } 2287 hs.finishedHash.WriteHandshake(channelIDMsgBytes, seqno) 2288 seqno++ 2289 postCCSMsgs = append(postCCSMsgs, channelIDMsgBytes) 2290 } 2291 2292 finished := new(finishedMsg) 2293 if c.config.Bugs.EarlyChangeCipherSpec == 2 { 2294 finished.verifyData = hs.finishedHash.clientSum(nil) 2295 } else { 2296 finished.verifyData = hs.finishedHash.clientSum(hs.masterSecret) 2297 } 2298 copy(out, finished.verifyData) 2299 if c.config.Bugs.BadFinished { 2300 finished.verifyData[0]++ 2301 } 2302 c.clientVerify = append(c.clientVerify[:0], finished.verifyData...) 2303 hs.finishedBytes = finished.marshal() 2304 hs.finishedHash.WriteHandshake(hs.finishedBytes, seqno) 2305 if c.config.Bugs.PartialClientFinishedWithClientHello { 2306 // The first byte has already been written. 2307 postCCSMsgs = append(postCCSMsgs, hs.finishedBytes[1:]) 2308 } else { 2309 postCCSMsgs = append(postCCSMsgs, hs.finishedBytes) 2310 } 2311 2312 if c.config.Bugs.FragmentAcrossChangeCipherSpec { 2313 c.writeRecord(recordTypeHandshake, postCCSMsgs[0][:5]) 2314 postCCSMsgs[0] = postCCSMsgs[0][5:] 2315 } else if c.config.Bugs.SendUnencryptedFinished { 2316 c.writeRecord(recordTypeHandshake, postCCSMsgs[0]) 2317 postCCSMsgs = postCCSMsgs[1:] 2318 } 2319 2320 if !c.config.Bugs.SkipChangeCipherSpec && 2321 c.config.Bugs.EarlyChangeCipherSpec == 0 { 2322 ccs := []byte{1} 2323 if c.config.Bugs.BadChangeCipherSpec != nil { 2324 ccs = c.config.Bugs.BadChangeCipherSpec 2325 } 2326 c.writeRecord(recordTypeChangeCipherSpec, ccs) 2327 } 2328 2329 if c.config.Bugs.AppDataAfterChangeCipherSpec != nil { 2330 c.writeRecord(recordTypeApplicationData, c.config.Bugs.AppDataAfterChangeCipherSpec) 2331 } 2332 if c.config.Bugs.AlertAfterChangeCipherSpec != 0 { 2333 c.sendAlert(c.config.Bugs.AlertAfterChangeCipherSpec) 2334 return errors.New("tls: simulating post-CCS alert") 2335 } 2336 2337 if !c.config.Bugs.SkipFinished { 2338 for _, msg := range postCCSMsgs { 2339 c.writeRecord(recordTypeHandshake, msg) 2340 } 2341 2342 if c.config.Bugs.SendExtraFinished { 2343 c.writeRecord(recordTypeHandshake, finished.marshal()) 2344 } 2345 } 2346 2347 if !isResume || !c.config.Bugs.PackAppDataWithHandshake { 2348 c.flushHandshake() 2349 } 2350 return nil 2351} 2352 2353func (hs *clientHandshakeState) writeChannelIDMessage(channelIDHash []byte) ([]byte, error) { 2354 c := hs.c 2355 channelIDMsg := new(channelIDMsg) 2356 if c.config.ChannelID.Curve != elliptic.P256() { 2357 return nil, fmt.Errorf("tls: Channel ID is not on P-256.") 2358 } 2359 r, s, err := ecdsa.Sign(c.config.rand(), c.config.ChannelID, channelIDHash) 2360 if err != nil { 2361 return nil, err 2362 } 2363 channelID := make([]byte, 128) 2364 writeIntPadded(channelID[0:32], c.config.ChannelID.X) 2365 writeIntPadded(channelID[32:64], c.config.ChannelID.Y) 2366 writeIntPadded(channelID[64:96], r) 2367 writeIntPadded(channelID[96:128], s) 2368 if c.config.Bugs.InvalidChannelIDSignature { 2369 channelID[64] ^= 1 2370 } 2371 channelIDMsg.channelID = channelID 2372 2373 c.channelID = &c.config.ChannelID.PublicKey 2374 2375 return channelIDMsg.marshal(), nil 2376} 2377 2378func (hs *clientHandshakeState) writeClientHash(msg []byte) { 2379 // writeClientHash is called before writeRecord. 2380 hs.finishedHash.WriteHandshake(msg, hs.c.sendHandshakeSeq) 2381} 2382 2383func (hs *clientHandshakeState) writeServerHash(msg []byte) { 2384 // writeServerHash is called after readHandshake. 2385 hs.finishedHash.WriteHandshake(msg, hs.c.recvHandshakeSeq-1) 2386} 2387 2388// clientSessionCacheKey returns a key used to cache sessionTickets that could 2389// be used to resume previously negotiated TLS sessions with a server. 2390func clientSessionCacheKey(serverAddr net.Addr, config *Config) string { 2391 if len(config.ServerName) > 0 { 2392 return config.ServerName 2393 } 2394 return serverAddr.String() 2395} 2396 2397// mutualProtocol finds the mutual Next Protocol Negotiation or ALPN protocol 2398// given list of possible protocols and a list of the preference order. The 2399// first list must not be empty. It returns the resulting protocol and flag 2400// indicating if the fallback case was reached. 2401func mutualProtocol(protos, preferenceProtos []string) (string, bool) { 2402 for _, s := range preferenceProtos { 2403 for _, c := range protos { 2404 if s == c { 2405 return s, false 2406 } 2407 } 2408 } 2409 2410 return protos[0], true 2411} 2412 2413// writeIntPadded writes x into b, padded up with leading zeros as 2414// needed. 2415func writeIntPadded(b []byte, x *big.Int) { 2416 for i := range b { 2417 b[i] = 0 2418 } 2419 xb := x.Bytes() 2420 copy(b[len(b)-len(xb):], xb) 2421} 2422 2423func generatePSKBinders(version uint16, hello *clientHelloMsg, session *ClientSessionState, firstClientHello, helloRetryRequest []byte, config *Config) { 2424 maybeCorruptBinder := !config.Bugs.OnlyCorruptSecondPSKBinder || len(firstClientHello) > 0 2425 binderLen := session.cipherSuite.hash().Size() 2426 numBinders := 1 2427 if maybeCorruptBinder { 2428 if config.Bugs.SendNoPSKBinder { 2429 // The binders may have been set from the previous 2430 // ClientHello. 2431 hello.pskBinders = nil 2432 return 2433 } 2434 2435 if config.Bugs.SendShortPSKBinder { 2436 binderLen-- 2437 } 2438 2439 if config.Bugs.SendExtraPSKBinder { 2440 numBinders++ 2441 } 2442 } 2443 2444 // Fill hello.pskBinders with appropriate length arrays of zeros so the 2445 // length prefixes are correct when computing the binder over the truncated 2446 // ClientHello message. 2447 hello.pskBinders = make([][]byte, numBinders) 2448 for i := range hello.pskBinders { 2449 hello.pskBinders[i] = make([]byte, binderLen) 2450 } 2451 2452 helloBytes := hello.marshal() 2453 binderSize := len(hello.pskBinders)*(binderLen+1) + 2 2454 truncatedHello := helloBytes[:len(helloBytes)-binderSize] 2455 binder := computePSKBinder(session.secret, version, resumptionPSKBinderLabel, session.cipherSuite, firstClientHello, helloRetryRequest, truncatedHello) 2456 if maybeCorruptBinder { 2457 if config.Bugs.SendShortPSKBinder { 2458 binder = binder[:binderLen] 2459 } 2460 if config.Bugs.SendInvalidPSKBinder { 2461 binder[0] ^= 1 2462 } 2463 } 2464 2465 for i := range hello.pskBinders { 2466 hello.pskBinders[i] = binder 2467 } 2468 2469 hello.raw = nil 2470} 2471