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