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 "time" 21 22 "boringssl.googlesource.com/boringssl/ssl/test/runner/hpke" 23) 24 25// serverHandshakeState contains details of a server handshake in progress. 26// It's discarded once the handshake has completed. 27type serverHandshakeState struct { 28 c *Conn 29 clientHello *clientHelloMsg 30 hello *serverHelloMsg 31 suite *cipherSuite 32 ellipticOk bool 33 ecdsaOk bool 34 sessionState *sessionState 35 finishedHash finishedHash 36 masterSecret []byte 37 certsFromClient [][]byte 38 cert *Certificate 39 finishedBytes []byte 40 echHPKEContext *hpke.Context 41 echConfigID uint8 42} 43 44// serverHandshake performs a TLS handshake as a server. 45func (c *Conn) serverHandshake() error { 46 config := c.config 47 48 // If this is the first server handshake, we generate a random key to 49 // encrypt the tickets with. 50 config.serverInitOnce.Do(config.serverInit) 51 52 c.sendHandshakeSeq = 0 53 c.recvHandshakeSeq = 0 54 55 hs := serverHandshakeState{ 56 c: c, 57 } 58 if err := hs.readClientHello(); err != nil { 59 return err 60 } 61 62 if c.vers >= VersionTLS13 { 63 if err := hs.doTLS13Handshake(); err != nil { 64 return err 65 } 66 } else { 67 isResume, err := hs.processClientHello() 68 if err != nil { 69 return err 70 } 71 72 // We only implement enough of SSL 3.0 to test that the client doesn't: 73 // if negotiated (possibly with the NegotiateVersion bug), we send a 74 // ServerHello and look for the resulting client protocol_version alert. 75 if c.vers == VersionSSL30 { 76 c.writeRecord(recordTypeHandshake, hs.hello.marshal()) 77 c.flushHandshake() 78 if _, err := c.readHandshake(); err != nil { 79 return err 80 } 81 return errors.New("tls: client did not reject an SSL 3.0 ServerHello") 82 } 83 84 // For an overview of TLS handshaking, see https://tools.ietf.org/html/rfc5246#section-7.3 85 if isResume { 86 // The client has included a session ticket and so we do an abbreviated handshake. 87 if err := hs.doResumeHandshake(); err != nil { 88 return err 89 } 90 if err := hs.establishKeys(); err != nil { 91 return err 92 } 93 if c.config.Bugs.RenewTicketOnResume { 94 if err := hs.sendSessionTicket(); err != nil { 95 return err 96 } 97 } 98 if err := hs.sendFinished(c.firstFinished[:], isResume); err != nil { 99 return err 100 } 101 // Most retransmits are triggered by a timeout, but the final 102 // leg of the handshake is retransmited upon re-receiving a 103 // Finished. 104 if err := c.simulatePacketLoss(func() { 105 c.sendHandshakeSeq-- 106 c.writeRecord(recordTypeHandshake, hs.finishedBytes) 107 c.flushHandshake() 108 }); err != nil { 109 return err 110 } 111 if err := hs.readFinished(nil, isResume); err != nil { 112 return err 113 } 114 c.didResume = true 115 } else { 116 // The client didn't include a session ticket, or it wasn't 117 // valid so we do a full handshake. 118 if err := hs.doFullHandshake(); err != nil { 119 return err 120 } 121 if err := hs.establishKeys(); err != nil { 122 return err 123 } 124 if err := hs.readFinished(c.firstFinished[:], isResume); err != nil { 125 return err 126 } 127 if c.config.Bugs.AlertBeforeFalseStartTest != 0 { 128 c.sendAlert(c.config.Bugs.AlertBeforeFalseStartTest) 129 } 130 if c.config.Bugs.ExpectFalseStart { 131 if err := c.readRecord(recordTypeApplicationData); err != nil { 132 return fmt.Errorf("tls: peer did not false start: %s", err) 133 } 134 } 135 if err := hs.sendSessionTicket(); err != nil { 136 return err 137 } 138 if err := hs.sendFinished(nil, isResume); err != nil { 139 return err 140 } 141 } 142 143 c.exporterSecret = hs.masterSecret 144 } 145 c.handshakeComplete = true 146 copy(c.clientRandom[:], hs.clientHello.random) 147 copy(c.serverRandom[:], hs.hello.random) 148 149 return nil 150} 151 152// readClientHello reads a ClientHello message from the client and determines 153// the protocol version. 154func (hs *serverHandshakeState) readClientHello() error { 155 config := hs.c.config 156 c := hs.c 157 158 if err := c.simulatePacketLoss(nil); err != nil { 159 return err 160 } 161 msg, err := c.readHandshake() 162 if err != nil { 163 return err 164 } 165 var ok bool 166 hs.clientHello, ok = msg.(*clientHelloMsg) 167 if !ok { 168 c.sendAlert(alertUnexpectedMessage) 169 return unexpectedMessageError(hs.clientHello, msg) 170 } 171 if size := config.Bugs.RequireClientHelloSize; size != 0 && len(hs.clientHello.raw) != size { 172 return fmt.Errorf("tls: ClientHello record size is %d, but expected %d", len(hs.clientHello.raw), size) 173 } 174 if isAllZero(hs.clientHello.random) { 175 // If the client forgets to fill in the client random, it will likely be 176 // all zero. 177 return errors.New("tls: ClientHello random was all zero") 178 } 179 180 if expected := config.Bugs.ExpectOuterServerName; len(expected) != 0 && expected != hs.clientHello.serverName { 181 return fmt.Errorf("tls: unexpected ClientHelloOuter server name: wanted %q, got %q", expected, hs.clientHello.serverName) 182 } 183 184 // We check this both before and after decrypting ECH. 185 if !hs.clientHello.hasGREASEExtension && config.Bugs.ExpectGREASE { 186 return errors.New("tls: no GREASE extension found") 187 } 188 189 if config.Bugs.ExpectClientECH && hs.clientHello.echOuter == nil { 190 return errors.New("tls: expected client to offer ECH") 191 } 192 if config.Bugs.ExpectNoClientECH && hs.clientHello.echOuter != nil { 193 return errors.New("tls: expected client not to offer ECH") 194 } 195 196 if echOuter := hs.clientHello.echOuter; echOuter != nil { 197 for _, candidate := range config.ServerECHConfigs { 198 if candidate.ECHConfig.ConfigID != echOuter.configID { 199 continue 200 } 201 var found bool 202 for _, suite := range candidate.ECHConfig.CipherSuites { 203 if echOuter.kdfID == suite.KDF && echOuter.aeadID == suite.AEAD { 204 found = true 205 break 206 } 207 } 208 if !found { 209 continue 210 } 211 info := []byte("tls ech\x00") 212 info = append(info, candidate.ECHConfig.Raw...) 213 hs.echHPKEContext, err = hpke.SetupBaseReceiverX25519(echOuter.kdfID, echOuter.aeadID, echOuter.enc, candidate.Key, info) 214 if err != nil { 215 continue 216 } 217 clientHelloInner, err := hs.decryptClientHello(hs.clientHello) 218 if err != nil { 219 if _, ok := err.(*echDecryptError); ok { 220 continue 221 } 222 c.sendAlert(alertDecryptError) 223 return fmt.Errorf("tls: error decrypting ClientHello: %s", err) 224 } 225 if config.Bugs.UseInnerSessionWithClientHelloOuter { 226 hs.clientHello.pskIdentities = clientHelloInner.pskIdentities 227 } else { 228 c.echAccepted = true 229 hs.clientHello = clientHelloInner 230 hs.echConfigID = echOuter.configID 231 } 232 } 233 } 234 235 if c.isDTLS && !config.Bugs.SkipHelloVerifyRequest { 236 // Per RFC 6347, the version field in HelloVerifyRequest SHOULD 237 // be always DTLS 1.0 238 helloVerifyRequest := &helloVerifyRequestMsg{ 239 vers: VersionDTLS10, 240 cookie: make([]byte, 32), 241 } 242 if _, err := io.ReadFull(c.config.rand(), helloVerifyRequest.cookie); err != nil { 243 c.sendAlert(alertInternalError) 244 return errors.New("dtls: short read from Rand: " + err.Error()) 245 } 246 c.writeRecord(recordTypeHandshake, helloVerifyRequest.marshal()) 247 c.flushHandshake() 248 249 if err := c.simulatePacketLoss(nil); err != nil { 250 return err 251 } 252 msg, err := c.readHandshake() 253 if err != nil { 254 return err 255 } 256 newClientHello, ok := msg.(*clientHelloMsg) 257 if !ok { 258 c.sendAlert(alertUnexpectedMessage) 259 return unexpectedMessageError(hs.clientHello, msg) 260 } 261 if !bytes.Equal(newClientHello.cookie, helloVerifyRequest.cookie) { 262 return errors.New("dtls: invalid cookie") 263 } 264 if err := checkClientHellosEqual(hs.clientHello.raw, newClientHello.raw, c.isDTLS, nil); err != nil { 265 return err 266 } 267 hs.clientHello = newClientHello 268 } 269 270 if config.Bugs.RequireSameRenegoClientVersion && c.clientVersion != 0 { 271 if c.clientVersion != hs.clientHello.vers { 272 return fmt.Errorf("tls: client offered different version on renego") 273 } 274 } 275 276 if config.Bugs.FailIfCECPQ2Offered { 277 for _, offeredCurve := range hs.clientHello.supportedCurves { 278 if isPqGroup(offeredCurve) { 279 return errors.New("tls: CECPQ2 was offered") 280 } 281 } 282 } 283 284 if expected := config.Bugs.ExpectedKeyShares; expected != nil { 285 if len(expected) != len(hs.clientHello.keyShares) { 286 return fmt.Errorf("tls: expected %d key shares, but found %d", len(expected), len(hs.clientHello.keyShares)) 287 } 288 289 for i, group := range expected { 290 if found := hs.clientHello.keyShares[i].group; found != group { 291 return fmt.Errorf("tls: key share #%d is for group %d, not %d", i, found, group) 292 } 293 } 294 } 295 296 c.clientVersion = hs.clientHello.vers 297 298 // Use the versions extension if supplied, otherwise use the legacy ClientHello version. 299 if len(hs.clientHello.supportedVersions) == 0 { 300 if c.isDTLS { 301 if hs.clientHello.vers <= VersionDTLS12 { 302 hs.clientHello.supportedVersions = append(hs.clientHello.supportedVersions, VersionDTLS12) 303 } 304 if hs.clientHello.vers <= VersionDTLS10 { 305 hs.clientHello.supportedVersions = append(hs.clientHello.supportedVersions, VersionDTLS10) 306 } 307 } else { 308 if hs.clientHello.vers >= VersionTLS12 { 309 hs.clientHello.supportedVersions = append(hs.clientHello.supportedVersions, VersionTLS12) 310 } 311 if hs.clientHello.vers >= VersionTLS11 { 312 hs.clientHello.supportedVersions = append(hs.clientHello.supportedVersions, VersionTLS11) 313 } 314 if hs.clientHello.vers >= VersionTLS10 { 315 hs.clientHello.supportedVersions = append(hs.clientHello.supportedVersions, VersionTLS10) 316 } 317 if hs.clientHello.vers >= VersionSSL30 { 318 hs.clientHello.supportedVersions = append(hs.clientHello.supportedVersions, VersionSSL30) 319 } 320 } 321 } else if config.Bugs.ExpectGREASE && !containsGREASE(hs.clientHello.supportedVersions) { 322 return errors.New("tls: no GREASE version value found") 323 } 324 325 if !c.haveVers { 326 if config.Bugs.NegotiateVersion != 0 { 327 c.wireVersion = config.Bugs.NegotiateVersion 328 } else { 329 var found bool 330 for _, vers := range hs.clientHello.supportedVersions { 331 if _, ok := config.isSupportedVersion(vers, c.isDTLS); ok { 332 c.wireVersion = vers 333 found = true 334 break 335 } 336 } 337 if !found { 338 c.sendAlert(alertProtocolVersion) 339 return errors.New("tls: client did not offer any supported protocol versions") 340 } 341 } 342 } else if config.Bugs.NegotiateVersionOnRenego != 0 { 343 c.wireVersion = config.Bugs.NegotiateVersionOnRenego 344 } 345 346 c.vers, ok = wireToVersion(c.wireVersion, c.isDTLS) 347 if !ok { 348 panic("Could not map wire version") 349 } 350 c.haveVers = true 351 352 clientProtocol, ok := wireToVersion(c.clientVersion, c.isDTLS) 353 354 // Reject < 1.2 ClientHellos with signature_algorithms. 355 if ok && clientProtocol < VersionTLS12 && len(hs.clientHello.signatureAlgorithms) > 0 { 356 return fmt.Errorf("tls: client included signature_algorithms before TLS 1.2") 357 } 358 359 // Check the client cipher list is consistent with the version. 360 if ok && clientProtocol < VersionTLS12 { 361 for _, id := range hs.clientHello.cipherSuites { 362 if isTLS12Cipher(id) { 363 return fmt.Errorf("tls: client offered TLS 1.2 cipher before TLS 1.2") 364 } 365 } 366 } 367 368 if config.Bugs.MockQUICTransport != nil && len(hs.clientHello.sessionID) > 0 { 369 return fmt.Errorf("tls: QUIC client did not disable compatibility mode") 370 } 371 if config.Bugs.ExpectNoSessionID && len(hs.clientHello.sessionID) > 0 { 372 return fmt.Errorf("tls: client offered an unexpected session ID") 373 } 374 if config.Bugs.ExpectNoTLS12Session { 375 if len(hs.clientHello.sessionID) > 0 { 376 if _, ok := config.ServerSessionCache.Get(string(hs.clientHello.sessionID)); ok { 377 return fmt.Errorf("tls: client offered an unexpected TLS 1.2 session") 378 } 379 } 380 if len(hs.clientHello.sessionTicket) > 0 { 381 return fmt.Errorf("tls: client offered an unexpected session ticket") 382 } 383 } 384 385 if config.Bugs.ExpectNoTLS13PSK && len(hs.clientHello.pskIdentities) > 0 { 386 return fmt.Errorf("tls: client offered unexpected PSK identities") 387 } 388 389 var scsvFound bool 390 for _, cipherSuite := range hs.clientHello.cipherSuites { 391 if cipherSuite == fallbackSCSV { 392 scsvFound = true 393 break 394 } 395 } 396 397 if !scsvFound && config.Bugs.FailIfNotFallbackSCSV { 398 return errors.New("tls: no fallback SCSV found when expected") 399 } else if scsvFound && !config.Bugs.FailIfNotFallbackSCSV { 400 return errors.New("tls: fallback SCSV found when not expected") 401 } 402 403 if config.Bugs.ExpectGREASE && !containsGREASE(hs.clientHello.cipherSuites) { 404 return errors.New("tls: no GREASE cipher suite value found") 405 } 406 407 var greaseFound bool 408 for _, curve := range hs.clientHello.supportedCurves { 409 if isGREASEValue(uint16(curve)) { 410 greaseFound = true 411 break 412 } 413 } 414 415 if !greaseFound && config.Bugs.ExpectGREASE { 416 return errors.New("tls: no GREASE curve value found") 417 } 418 419 if len(hs.clientHello.keyShares) > 0 { 420 greaseFound = false 421 for _, keyShare := range hs.clientHello.keyShares { 422 if isGREASEValue(uint16(keyShare.group)) { 423 greaseFound = true 424 break 425 } 426 } 427 428 if !greaseFound && config.Bugs.ExpectGREASE { 429 return errors.New("tls: no GREASE curve value found") 430 } 431 } 432 433 if len(hs.clientHello.sessionID) == 0 && c.config.Bugs.ExpectClientHelloSessionID { 434 return errors.New("tls: expected non-empty session ID from client") 435 } 436 437 applyBugsToClientHello(hs.clientHello, config) 438 439 return nil 440} 441 442func applyBugsToClientHello(clientHello *clientHelloMsg, config *Config) { 443 if config.Bugs.IgnorePeerSignatureAlgorithmPreferences { 444 clientHello.signatureAlgorithms = config.signSignatureAlgorithms() 445 } 446 if config.Bugs.IgnorePeerCurvePreferences { 447 clientHello.supportedCurves = config.curvePreferences() 448 } 449 if config.Bugs.IgnorePeerCipherPreferences { 450 clientHello.cipherSuites = config.cipherSuites() 451 } 452} 453 454type echDecryptError struct { 455 error 456} 457 458func (hs *serverHandshakeState) decryptClientHello(helloOuter *clientHelloMsg) (helloInner *clientHelloMsg, err error) { 459 // ClientHelloOuterAAD is ClientHelloOuter with the payload replaced by 460 // zeros. See draft-ietf-tls-esni-13, section 5.2. 461 aad := make([]byte, len(helloOuter.raw)-4) 462 copy(aad, helloOuter.raw[4:helloOuter.echPayloadStart]) 463 copy(aad[helloOuter.echPayloadEnd-4:], helloOuter.raw[helloOuter.echPayloadEnd:]) 464 465 // In fuzzer mode, the payload is cleartext. 466 encoded := helloOuter.echOuter.payload 467 if !hs.c.config.Bugs.NullAllCiphers { 468 var err error 469 encoded, err = hs.echHPKEContext.Open(helloOuter.echOuter.payload, aad) 470 if err != nil { 471 // Wrap |err| so the caller can implement trial decryption. 472 return nil, &echDecryptError{err} 473 } 474 } 475 476 helloInner, err = decodeClientHelloInner(hs.c.config, encoded, helloOuter) 477 if err != nil { 478 return nil, err 479 } 480 481 if isAllZero(helloInner.random) { 482 // If the client forgets to fill in the client random, it will likely be 483 // all zero. 484 return nil, errors.New("tls: ClientHelloInner random was all zero") 485 } 486 if bytes.Equal(helloInner.random, helloOuter.random) { 487 return nil, errors.New("tls: ClientHelloOuter and ClientHelloInner have the same random values") 488 } 489 // ClientHelloInner should not offer TLS 1.2 and below. 490 if len(helloInner.supportedVersions) == 0 { 491 return nil, errors.New("tls: ClientHelloInner did not offer supported_versions") 492 } 493 for _, vers := range helloInner.supportedVersions { 494 switch vers { 495 case VersionSSL30, VersionTLS10, VersionTLS11, VersionTLS12, VersionDTLS10, VersionDTLS12: 496 return nil, fmt.Errorf("tls: ClientHelloInner offered invalid version: %04x", vers) 497 } 498 } 499 // ClientHelloInner should omit TLS-1.2-only extensions. 500 if helloInner.nextProtoNeg || len(helloInner.supportedPoints) != 0 || helloInner.ticketSupported || helloInner.secureRenegotiation != nil || helloInner.extendedMasterSecret { 501 return nil, errors.New("tls: ClientHelloInner included a TLS-1.2-only extension") 502 } 503 if !helloInner.echInner { 504 return nil, errors.New("tls: ClientHelloInner missing inner encrypted_client_hello extension") 505 } 506 507 return helloInner, nil 508} 509 510func (hs *serverHandshakeState) doTLS13Handshake() error { 511 c := hs.c 512 config := c.config 513 514 // We've read the ClientHello, so the next record must be preceded with ChangeCipherSpec. 515 c.expectTLS13ChangeCipherSpec = true 516 517 hs.hello = &serverHelloMsg{ 518 isDTLS: c.isDTLS, 519 vers: c.wireVersion, 520 sessionID: hs.clientHello.sessionID, 521 compressionMethod: config.Bugs.SendCompressionMethod, 522 versOverride: config.Bugs.SendServerHelloVersion, 523 supportedVersOverride: config.Bugs.SendServerSupportedVersionExtension, 524 omitSupportedVers: config.Bugs.OmitServerSupportedVersionExtension, 525 customExtension: config.Bugs.CustomUnencryptedExtension, 526 unencryptedALPN: config.Bugs.SendUnencryptedALPN, 527 } 528 529 hs.hello.random = make([]byte, 32) 530 if _, err := io.ReadFull(config.rand(), hs.hello.random); err != nil { 531 c.sendAlert(alertInternalError) 532 return err 533 } 534 535 // TLS 1.3 forbids clients from advertising any non-null compression. 536 if len(hs.clientHello.compressionMethods) != 1 || hs.clientHello.compressionMethods[0] != compressionNone { 537 return errors.New("tls: client sent compression method other than null for TLS 1.3") 538 } 539 540 // Prepare an EncryptedExtensions message, but do not send it yet. 541 encryptedExtensions := new(encryptedExtensionsMsg) 542 encryptedExtensions.empty = config.Bugs.EmptyEncryptedExtensions 543 if err := hs.processClientExtensions(&encryptedExtensions.extensions); err != nil { 544 return err 545 } 546 547 // Select the cipher suite. 548 var preferenceList, supportedList []uint16 549 if config.PreferServerCipherSuites { 550 preferenceList = config.cipherSuites() 551 supportedList = hs.clientHello.cipherSuites 552 } else { 553 preferenceList = hs.clientHello.cipherSuites 554 supportedList = config.cipherSuites() 555 } 556 557 for _, id := range preferenceList { 558 if hs.suite = c.tryCipherSuite(id, supportedList, c.vers, true, true); hs.suite != nil { 559 break 560 } 561 } 562 563 if hs.suite == nil { 564 c.sendAlert(alertHandshakeFailure) 565 return errors.New("tls: no cipher suite supported by both client and server") 566 } 567 568 hs.hello.cipherSuite = hs.suite.id 569 if c.config.Bugs.SendCipherSuite != 0 { 570 hs.hello.cipherSuite = c.config.Bugs.SendCipherSuite 571 } 572 573 hs.finishedHash = newFinishedHash(c.wireVersion, c.isDTLS, hs.suite) 574 hs.finishedHash.discardHandshakeBuffer() 575 hs.writeClientHash(hs.clientHello.marshal()) 576 577 supportedCurve := false 578 var selectedCurve CurveID 579 preferredCurves := config.curvePreferences() 580Curves: 581 for _, curve := range hs.clientHello.supportedCurves { 582 for _, supported := range preferredCurves { 583 if supported == curve { 584 supportedCurve = true 585 selectedCurve = curve 586 break Curves 587 } 588 } 589 } 590 591 if !supportedCurve { 592 c.sendAlert(alertHandshakeFailure) 593 return errors.New("tls: no curve supported by both client and server") 594 } 595 596 pskIdentities := hs.clientHello.pskIdentities 597 pskKEModes := hs.clientHello.pskKEModes 598 599 var replacedPSKIdentities bool 600 if len(pskIdentities) == 0 && len(hs.clientHello.sessionTicket) > 0 && c.config.Bugs.AcceptAnySession { 601 // Pick up the ticket from the TLS 1.2 extension, to test the 602 // client does not get in a mixed up state. 603 psk := pskIdentity{ 604 ticket: hs.clientHello.sessionTicket, 605 } 606 pskIdentities = []pskIdentity{psk} 607 pskKEModes = []byte{pskDHEKEMode} 608 replacedPSKIdentities = true 609 } 610 if config.Bugs.UseInnerSessionWithClientHelloOuter { 611 replacedPSKIdentities = true 612 } 613 614 var pskIndex int 615 foundKEMode := bytes.IndexByte(pskKEModes, pskDHEKEMode) >= 0 616 if foundKEMode && !config.SessionTicketsDisabled { 617 for i, pskIdentity := range pskIdentities { 618 // TODO(svaldez): Check the obfuscatedTicketAge before accepting 0-RTT. 619 sessionState, ok := c.decryptTicket(pskIdentity.ticket) 620 if !ok { 621 continue 622 } 623 624 if !config.Bugs.AcceptAnySession { 625 if sessionState.vers != c.vers { 626 continue 627 } 628 if sessionState.ticketExpiration.Before(c.config.time()) { 629 continue 630 } 631 sessionCipher := cipherSuiteFromID(sessionState.cipherSuite) 632 if sessionCipher == nil || sessionCipher.hash() != hs.suite.hash() { 633 continue 634 } 635 } 636 637 clientTicketAge := time.Duration(uint32(pskIdentity.obfuscatedTicketAge-sessionState.ticketAgeAdd)) * time.Millisecond 638 if config.Bugs.ExpectTicketAge != 0 && clientTicketAge != config.Bugs.ExpectTicketAge { 639 c.sendAlert(alertHandshakeFailure) 640 return errors.New("tls: invalid ticket age") 641 } 642 643 if !replacedPSKIdentities { 644 binderToVerify := hs.clientHello.pskBinders[i] 645 if err := verifyPSKBinder(c.wireVersion, hs.clientHello, sessionState, binderToVerify, []byte{}, []byte{}); err != nil { 646 return err 647 } 648 } 649 650 hs.sessionState = sessionState 651 hs.hello.hasPSKIdentity = true 652 hs.hello.pskIdentity = uint16(i) 653 pskIndex = i 654 if config.Bugs.SelectPSKIdentityOnResume != 0 { 655 hs.hello.pskIdentity = config.Bugs.SelectPSKIdentityOnResume 656 } 657 c.didResume = true 658 break 659 } 660 } 661 662 if config.Bugs.AlwaysSelectPSKIdentity { 663 hs.hello.hasPSKIdentity = true 664 hs.hello.pskIdentity = 0 665 } 666 667 // Resolve PSK and compute the early secret. 668 if hs.sessionState != nil { 669 hs.finishedHash.addEntropy(hs.sessionState.secret) 670 } else { 671 hs.finishedHash.addEntropy(hs.finishedHash.zeroSecret()) 672 } 673 674 hs.hello.hasKeyShare = true 675 if hs.sessionState != nil && config.Bugs.NegotiatePSKResumption { 676 hs.hello.hasKeyShare = false 677 } 678 if config.Bugs.MissingKeyShare { 679 hs.hello.hasKeyShare = false 680 } 681 682 firstHelloRetryRequest := true 683 684ResendHelloRetryRequest: 685 var sendHelloRetryRequest bool 686 cipherSuite := hs.suite.id 687 if config.Bugs.SendHelloRetryRequestCipherSuite != 0 { 688 cipherSuite = config.Bugs.SendHelloRetryRequestCipherSuite 689 } 690 helloRetryRequest := &helloRetryRequestMsg{ 691 vers: c.wireVersion, 692 sessionID: hs.clientHello.sessionID, 693 cipherSuite: cipherSuite, 694 compressionMethod: config.Bugs.SendCompressionMethod, 695 duplicateExtensions: config.Bugs.DuplicateHelloRetryRequestExtensions, 696 } 697 698 if config.Bugs.AlwaysSendHelloRetryRequest { 699 sendHelloRetryRequest = true 700 } 701 702 if config.Bugs.SendHelloRetryRequestCookie != nil { 703 sendHelloRetryRequest = true 704 helloRetryRequest.cookie = config.Bugs.SendHelloRetryRequestCookie 705 } 706 707 if len(config.Bugs.CustomHelloRetryRequestExtension) > 0 { 708 sendHelloRetryRequest = true 709 helloRetryRequest.customExtension = config.Bugs.CustomHelloRetryRequestExtension 710 } 711 712 var selectedKeyShare *keyShareEntry 713 if hs.hello.hasKeyShare { 714 // Look for the key share corresponding to our selected curve. 715 for i := range hs.clientHello.keyShares { 716 if hs.clientHello.keyShares[i].group == selectedCurve { 717 selectedKeyShare = &hs.clientHello.keyShares[i] 718 break 719 } 720 } 721 722 if config.Bugs.ExpectMissingKeyShare && selectedKeyShare != nil { 723 return errors.New("tls: expected missing key share") 724 } 725 726 if selectedKeyShare == nil { 727 helloRetryRequest.hasSelectedGroup = true 728 helloRetryRequest.selectedGroup = selectedCurve 729 sendHelloRetryRequest = true 730 } 731 } 732 733 if config.Bugs.SendHelloRetryRequestCurve != 0 { 734 helloRetryRequest.hasSelectedGroup = true 735 helloRetryRequest.selectedGroup = config.Bugs.SendHelloRetryRequestCurve 736 sendHelloRetryRequest = true 737 } 738 739 if config.Bugs.SkipHelloRetryRequest { 740 sendHelloRetryRequest = false 741 } 742 743 if sendHelloRetryRequest { 744 hs.finishedHash.UpdateForHelloRetryRequest() 745 746 // Emit the ECH confirmation signal when requested. 747 if hs.clientHello.echInner { 748 helloRetryRequest.echConfirmation = make([]byte, 8) 749 helloRetryRequest.echConfirmation = hs.finishedHash.echAcceptConfirmation(hs.clientHello.random, echAcceptConfirmationHRRLabel, helloRetryRequest.marshal()) 750 helloRetryRequest.raw = nil 751 } else if config.Bugs.AlwaysSendECHHelloRetryRequest { 752 // When solicited, a random ECH confirmation string should be ignored. 753 helloRetryRequest.echConfirmation = make([]byte, 8) 754 if _, err := io.ReadFull(config.rand(), helloRetryRequest.echConfirmation); err != nil { 755 c.sendAlert(alertInternalError) 756 return fmt.Errorf("tls: short read from Rand: %s", err) 757 } 758 } 759 760 hs.writeServerHash(helloRetryRequest.marshal()) 761 if c.config.Bugs.PartialServerHelloWithHelloRetryRequest { 762 data := helloRetryRequest.marshal() 763 c.writeRecord(recordTypeHandshake, append(data[:len(data):len(data)], typeServerHello)) 764 } else { 765 c.writeRecord(recordTypeHandshake, helloRetryRequest.marshal()) 766 } 767 c.flushHandshake() 768 769 if !c.config.Bugs.SkipChangeCipherSpec { 770 c.writeRecord(recordTypeChangeCipherSpec, []byte{1}) 771 } 772 773 if hs.clientHello.hasEarlyData { 774 c.setSkipEarlyData() 775 } 776 777 // Read new ClientHello. 778 newMsg, err := c.readHandshake() 779 if err != nil { 780 return err 781 } 782 newClientHello, ok := newMsg.(*clientHelloMsg) 783 if !ok { 784 c.sendAlert(alertUnexpectedMessage) 785 return unexpectedMessageError(newClientHello, newMsg) 786 } 787 788 if expected := config.Bugs.ExpectOuterServerName; len(expected) != 0 && expected != newClientHello.serverName { 789 return fmt.Errorf("tls: unexpected ClientHelloOuter server name: wanted %q, got %q", expected, newClientHello.serverName) 790 } 791 792 if c.echAccepted { 793 if newClientHello.echOuter == nil { 794 c.sendAlert(alertMissingExtension) 795 return errors.New("tls: second ClientHelloOuter had no encrypted_client_hello extension") 796 } 797 if newClientHello.echOuter.configID != hs.echConfigID || 798 newClientHello.echOuter.kdfID != hs.echHPKEContext.KDF() || 799 newClientHello.echOuter.aeadID != hs.echHPKEContext.AEAD() { 800 c.sendAlert(alertIllegalParameter) 801 return errors.New("tls: ECH parameters changed in second ClientHelloOuter") 802 } 803 if len(newClientHello.echOuter.enc) != 0 { 804 c.sendAlert(alertIllegalParameter) 805 return errors.New("tls: second ClientHelloOuter had non-empty ECH enc") 806 } 807 newClientHello, err = hs.decryptClientHello(newClientHello) 808 if err != nil { 809 c.sendAlert(alertDecryptError) 810 return fmt.Errorf("tls: error decrypting ClientHello: %s", err) 811 } 812 } 813 814 hs.writeClientHash(newClientHello.marshal()) 815 816 if config.Bugs.ExpectNoTLS13PSKAfterHRR && len(newClientHello.pskIdentities) > 0 { 817 return fmt.Errorf("tls: client offered unexpected PSK identities after HelloRetryRequest") 818 } 819 820 applyBugsToClientHello(newClientHello, config) 821 822 // Check that the new ClientHello matches the old ClientHello, 823 // except for relevant modifications. See RFC 8446, section 4.1.2. 824 ignoreExtensions := []uint16{extensionPadding} 825 826 if helloRetryRequest.hasSelectedGroup { 827 newKeyShares := newClientHello.keyShares 828 if len(newKeyShares) != 1 || newKeyShares[0].group != helloRetryRequest.selectedGroup { 829 return errors.New("tls: KeyShare from HelloRetryRequest not in new ClientHello") 830 } 831 selectedKeyShare = &newKeyShares[0] 832 ignoreExtensions = append(ignoreExtensions, extensionKeyShare) 833 } 834 835 if len(helloRetryRequest.cookie) > 0 { 836 if !bytes.Equal(newClientHello.tls13Cookie, helloRetryRequest.cookie) { 837 return errors.New("tls: cookie from HelloRetryRequest not present in new ClientHello") 838 } 839 ignoreExtensions = append(ignoreExtensions, extensionCookie) 840 } 841 842 // The second ClientHello refreshes binders, and may drop PSK identities 843 // that are no longer consistent with the cipher suite. 844 oldPSKIdentities := hs.clientHello.pskIdentities 845 for _, identity := range newClientHello.pskIdentities { 846 // Skip to the matching PSK identity in oldPSKIdentities. 847 for len(oldPSKIdentities) > 0 && !bytes.Equal(oldPSKIdentities[0].ticket, identity.ticket) { 848 oldPSKIdentities = oldPSKIdentities[1:] 849 } 850 // The identity now either matches, or oldPSKIdentities is empty. 851 if len(oldPSKIdentities) == 0 { 852 return errors.New("tls: unexpected PSK identity in second ClientHello") 853 } 854 oldPSKIdentities = oldPSKIdentities[1:] 855 } 856 ignoreExtensions = append(ignoreExtensions, extensionPreSharedKey) 857 858 // Update the index for the identity we resumed. The client may have 859 // dropped some entries. 860 if hs.sessionState != nil { 861 var found bool 862 ticket := hs.clientHello.pskIdentities[pskIndex].ticket 863 for i, identity := range newClientHello.pskIdentities { 864 if bytes.Equal(identity.ticket, ticket) { 865 found = true 866 pskIndex = i 867 break 868 } 869 } 870 if found { 871 binderToVerify := newClientHello.pskBinders[pskIndex] 872 if err := verifyPSKBinder(c.wireVersion, newClientHello, hs.sessionState, binderToVerify, hs.clientHello.marshal(), helloRetryRequest.marshal()); err != nil { 873 return err 874 } 875 } else if !config.Bugs.AcceptAnySession { 876 // If AcceptAnySession is set, the client may have already noticed 877 // the selected session is incompatible with the HelloRetryRequest 878 // and correctly dropped the PSK identity. We may also have 879 // attempted to resume a session from the TLS 1.2 extension. 880 return errors.New("tls: second ClientHello is missing selected session") 881 } 882 } 883 884 // The second ClientHello must stop offering early data. 885 if newClientHello.hasEarlyData { 886 return errors.New("tls: EarlyData sent in new ClientHello") 887 } 888 ignoreExtensions = append(ignoreExtensions, extensionEarlyData) 889 890 if err := checkClientHellosEqual(hs.clientHello.raw, newClientHello.raw, c.isDTLS, ignoreExtensions); err != nil { 891 return err 892 } 893 894 if firstHelloRetryRequest && config.Bugs.SecondHelloRetryRequest { 895 firstHelloRetryRequest = false 896 goto ResendHelloRetryRequest 897 } 898 } 899 900 // Decide whether or not to accept early data. 901 if !sendHelloRetryRequest && hs.clientHello.hasEarlyData { 902 if !config.Bugs.AlwaysRejectEarlyData && hs.sessionState != nil { 903 if hs.sessionState.cipherSuite == hs.suite.id && 904 c.clientProtocol == string(hs.sessionState.earlyALPN) && 905 c.hasApplicationSettings == hs.sessionState.hasApplicationSettings && 906 bytes.Equal(c.localApplicationSettings, hs.sessionState.localApplicationSettings) { 907 encryptedExtensions.extensions.hasEarlyData = true 908 } 909 if config.Bugs.AlwaysAcceptEarlyData { 910 encryptedExtensions.extensions.hasEarlyData = true 911 } 912 } 913 if encryptedExtensions.extensions.hasEarlyData { 914 earlyTrafficSecret := hs.finishedHash.deriveSecret(earlyTrafficLabel) 915 c.earlyExporterSecret = hs.finishedHash.deriveSecret(earlyExporterLabel) 916 917 // Applications are implicit with early data. 918 if !config.Bugs.SendApplicationSettingsWithEarlyData { 919 encryptedExtensions.extensions.hasApplicationSettings = false 920 encryptedExtensions.extensions.applicationSettings = nil 921 } 922 923 sessionCipher := cipherSuiteFromID(hs.sessionState.cipherSuite) 924 if err := c.useInTrafficSecret(encryptionEarlyData, c.wireVersion, sessionCipher, earlyTrafficSecret); err != nil { 925 return err 926 } 927 928 for _, expectedMsg := range config.Bugs.ExpectEarlyData { 929 if err := c.readRecord(recordTypeApplicationData); err != nil { 930 return err 931 } 932 msg := c.input.data[c.input.off:] 933 if !bytes.Equal(msg, expectedMsg) { 934 return fmt.Errorf("tls: got early data record %x, wanted %x", msg, expectedMsg) 935 } 936 c.in.freeBlock(c.input) 937 c.input = nil 938 } 939 } else { 940 c.setSkipEarlyData() 941 } 942 } 943 944 if config.Bugs.SendEarlyDataExtension { 945 encryptedExtensions.extensions.hasEarlyData = true 946 } 947 948 // Resolve ECDHE and compute the handshake secret. 949 if hs.hello.hasKeyShare { 950 // Once a curve has been selected and a key share identified, 951 // the server needs to generate a public value and send it in 952 // the ServerHello. 953 curve, ok := curveForCurveID(selectedCurve, config) 954 if !ok { 955 panic("tls: server failed to look up curve ID") 956 } 957 c.curveID = selectedCurve 958 959 var peerKey []byte 960 if config.Bugs.SkipHelloRetryRequest { 961 // If skipping HelloRetryRequest, use a random key to 962 // avoid crashing. 963 curve2, _ := curveForCurveID(selectedCurve, config) 964 var err error 965 peerKey, err = curve2.offer(config.rand()) 966 if err != nil { 967 return err 968 } 969 } else { 970 peerKey = selectedKeyShare.keyExchange 971 } 972 973 publicKey, ecdheSecret, err := curve.accept(config.rand(), peerKey) 974 if err != nil { 975 c.sendAlert(alertHandshakeFailure) 976 return err 977 } 978 hs.finishedHash.nextSecret() 979 hs.finishedHash.addEntropy(ecdheSecret) 980 hs.hello.hasKeyShare = true 981 982 curveID := selectedCurve 983 if c.config.Bugs.SendCurve != 0 { 984 curveID = config.Bugs.SendCurve 985 } 986 if c.config.Bugs.InvalidECDHPoint { 987 publicKey[0] ^= 0xff 988 } 989 990 hs.hello.keyShare = keyShareEntry{ 991 group: curveID, 992 keyExchange: publicKey, 993 } 994 995 if config.Bugs.EncryptedExtensionsWithKeyShare { 996 encryptedExtensions.extensions.hasKeyShare = true 997 encryptedExtensions.extensions.keyShare = keyShareEntry{ 998 group: curveID, 999 keyExchange: publicKey, 1000 } 1001 } 1002 } else { 1003 hs.finishedHash.nextSecret() 1004 hs.finishedHash.addEntropy(hs.finishedHash.zeroSecret()) 1005 } 1006 1007 // Emit the ECH confirmation signal when requested. 1008 if hs.clientHello.echInner && !config.Bugs.OmitServerHelloECHConfirmation { 1009 randomSuffix := hs.hello.random[len(hs.hello.random)-echAcceptConfirmationLength:] 1010 for i := range randomSuffix { 1011 randomSuffix[i] = 0 1012 } 1013 copy(randomSuffix, hs.finishedHash.echAcceptConfirmation(hs.clientHello.random, echAcceptConfirmationLabel, hs.hello.marshal())) 1014 hs.hello.raw = nil 1015 } 1016 1017 // Send unencrypted ServerHello. 1018 helloBytes := hs.hello.marshal() 1019 hs.writeServerHash(helloBytes) 1020 if config.Bugs.PartialServerHelloWithHelloRetryRequest { 1021 // The first byte has already been written. 1022 helloBytes = helloBytes[1:] 1023 } 1024 if config.Bugs.PartialEncryptedExtensionsWithServerHello { 1025 c.writeRecord(recordTypeHandshake, append(helloBytes[:len(helloBytes):len(helloBytes)], typeEncryptedExtensions)) 1026 } else { 1027 c.writeRecord(recordTypeHandshake, helloBytes) 1028 } 1029 c.flushHandshake() 1030 1031 if !c.config.Bugs.SkipChangeCipherSpec && !sendHelloRetryRequest { 1032 c.writeRecord(recordTypeChangeCipherSpec, []byte{1}) 1033 } 1034 1035 for i := 0; i < c.config.Bugs.SendExtraChangeCipherSpec; i++ { 1036 c.writeRecord(recordTypeChangeCipherSpec, []byte{1}) 1037 } 1038 1039 // Switch to handshake traffic keys. 1040 serverHandshakeTrafficSecret := hs.finishedHash.deriveSecret(serverHandshakeTrafficLabel) 1041 c.useOutTrafficSecret(encryptionHandshake, c.wireVersion, hs.suite, serverHandshakeTrafficSecret) 1042 // Derive handshake traffic read key, but don't switch yet. 1043 clientHandshakeTrafficSecret := hs.finishedHash.deriveSecret(clientHandshakeTrafficLabel) 1044 1045 // Send EncryptedExtensions. 1046 hs.writeServerHash(encryptedExtensions.marshal()) 1047 if config.Bugs.PartialEncryptedExtensionsWithServerHello { 1048 // The first byte has already been sent. 1049 c.writeRecord(recordTypeHandshake, encryptedExtensions.marshal()[1:]) 1050 } else { 1051 c.writeRecord(recordTypeHandshake, encryptedExtensions.marshal()) 1052 } 1053 1054 if hs.sessionState == nil { 1055 if config.ClientAuth >= RequestClientCert { 1056 // Request a client certificate 1057 certReq := &certificateRequestMsg{ 1058 vers: c.wireVersion, 1059 hasSignatureAlgorithm: !config.Bugs.OmitCertificateRequestAlgorithms, 1060 hasRequestContext: true, 1061 requestContext: config.Bugs.SendRequestContext, 1062 customExtension: config.Bugs.SendCustomCertificateRequest, 1063 } 1064 if !config.Bugs.NoSignatureAlgorithms { 1065 certReq.signatureAlgorithms = config.verifySignatureAlgorithms() 1066 } 1067 1068 // An empty list of certificateAuthorities signals to 1069 // the client that it may send any certificate in response 1070 // to our request. When we know the CAs we trust, then 1071 // we can send them down, so that the client can choose 1072 // an appropriate certificate to give to us. 1073 if config.ClientCAs != nil { 1074 certReq.certificateAuthorities = config.ClientCAs.Subjects() 1075 } 1076 hs.writeServerHash(certReq.marshal()) 1077 c.writeRecord(recordTypeHandshake, certReq.marshal()) 1078 } 1079 1080 certMsg := &certificateMsg{ 1081 hasRequestContext: true, 1082 } 1083 if !config.Bugs.EmptyCertificateList { 1084 for i, certData := range hs.cert.Certificate { 1085 cert := certificateEntry{ 1086 data: certData, 1087 } 1088 if i == 0 { 1089 if hs.clientHello.ocspStapling && !c.config.Bugs.NoOCSPStapling { 1090 cert.ocspResponse = hs.cert.OCSPStaple 1091 } 1092 if hs.clientHello.sctListSupported && !c.config.Bugs.NoSignedCertificateTimestamps { 1093 cert.sctList = hs.cert.SignedCertificateTimestampList 1094 } 1095 cert.duplicateExtensions = config.Bugs.SendDuplicateCertExtensions 1096 cert.extraExtension = config.Bugs.SendExtensionOnCertificate 1097 } else { 1098 if config.Bugs.SendOCSPOnIntermediates != nil { 1099 cert.ocspResponse = config.Bugs.SendOCSPOnIntermediates 1100 } 1101 if config.Bugs.SendSCTOnIntermediates != nil { 1102 cert.sctList = config.Bugs.SendSCTOnIntermediates 1103 } 1104 } 1105 certMsg.certificates = append(certMsg.certificates, cert) 1106 } 1107 } 1108 certMsgBytes := certMsg.marshal() 1109 sentCompressedCertMsg := false 1110 1111 FindCertCompressionAlg: 1112 for candidate, alg := range c.config.CertCompressionAlgs { 1113 for _, id := range hs.clientHello.compressedCertAlgs { 1114 if id == candidate { 1115 if expected := config.Bugs.ExpectedCompressedCert; expected != 0 && expected != id { 1116 return fmt.Errorf("tls: expected to send compressed cert with alg %d, but picked %d", expected, id) 1117 } 1118 if config.Bugs.ExpectUncompressedCert { 1119 return errors.New("tls: expected to send uncompressed cert") 1120 } 1121 1122 if override := config.Bugs.SendCertCompressionAlgID; override != 0 { 1123 id = override 1124 } 1125 1126 uncompressed := certMsgBytes[4:] 1127 uncompressedLen := uint32(len(uncompressed)) 1128 if override := config.Bugs.SendCertUncompressedLength; override != 0 { 1129 uncompressedLen = override 1130 } 1131 1132 compressedCertMsgBytes := (&compressedCertificateMsg{ 1133 algID: id, 1134 uncompressedLength: uncompressedLen, 1135 compressed: alg.Compress(uncompressed), 1136 }).marshal() 1137 1138 hs.writeServerHash(compressedCertMsgBytes) 1139 c.writeRecord(recordTypeHandshake, compressedCertMsgBytes) 1140 sentCompressedCertMsg = true 1141 break FindCertCompressionAlg 1142 } 1143 } 1144 } 1145 1146 if !sentCompressedCertMsg { 1147 if config.Bugs.ExpectedCompressedCert != 0 { 1148 return errors.New("tls: unexpectedly sent uncompressed certificate") 1149 } 1150 hs.writeServerHash(certMsgBytes) 1151 c.writeRecord(recordTypeHandshake, certMsgBytes) 1152 } 1153 1154 certVerify := &certificateVerifyMsg{ 1155 hasSignatureAlgorithm: true, 1156 } 1157 1158 // Determine the hash to sign. 1159 privKey := hs.cert.PrivateKey 1160 1161 var err error 1162 certVerify.signatureAlgorithm, err = selectSignatureAlgorithm(c.vers, privKey, config, hs.clientHello.signatureAlgorithms) 1163 if err != nil { 1164 c.sendAlert(alertInternalError) 1165 return err 1166 } 1167 1168 input := hs.finishedHash.certificateVerifyInput(serverCertificateVerifyContextTLS13) 1169 certVerify.signature, err = signMessage(c.vers, privKey, c.config, certVerify.signatureAlgorithm, input) 1170 if err != nil { 1171 c.sendAlert(alertInternalError) 1172 return err 1173 } 1174 1175 if config.Bugs.SendSignatureAlgorithm != 0 { 1176 certVerify.signatureAlgorithm = config.Bugs.SendSignatureAlgorithm 1177 } 1178 1179 if !config.Bugs.SkipCertificateVerify { 1180 hs.writeServerHash(certVerify.marshal()) 1181 c.writeRecord(recordTypeHandshake, certVerify.marshal()) 1182 } 1183 } else if hs.sessionState != nil { 1184 // Pick up certificates from the session instead. 1185 if len(hs.sessionState.certificates) > 0 { 1186 if _, err := hs.processCertsFromClient(hs.sessionState.certificates); err != nil { 1187 return err 1188 } 1189 } 1190 } 1191 1192 finished := new(finishedMsg) 1193 finished.verifyData = hs.finishedHash.serverSum(serverHandshakeTrafficSecret) 1194 if config.Bugs.BadFinished { 1195 finished.verifyData[0]++ 1196 } 1197 hs.writeServerHash(finished.marshal()) 1198 c.writeRecord(recordTypeHandshake, finished.marshal()) 1199 if c.config.Bugs.SendExtraFinished { 1200 c.writeRecord(recordTypeHandshake, finished.marshal()) 1201 } 1202 c.flushHandshake() 1203 1204 if encryptedExtensions.extensions.hasEarlyData && !c.shouldSkipEarlyData() { 1205 for _, expectedMsg := range config.Bugs.ExpectLateEarlyData { 1206 if err := c.readRecord(recordTypeApplicationData); err != nil { 1207 return err 1208 } 1209 if !bytes.Equal(c.input.data[c.input.off:], expectedMsg) { 1210 return errors.New("ExpectLateEarlyData: did not get expected message") 1211 } 1212 c.in.freeBlock(c.input) 1213 c.input = nil 1214 } 1215 } 1216 1217 // The various secrets do not incorporate the client's final leg, so 1218 // derive them now before updating the handshake context. 1219 hs.finishedHash.nextSecret() 1220 hs.finishedHash.addEntropy(hs.finishedHash.zeroSecret()) 1221 1222 clientTrafficSecret := hs.finishedHash.deriveSecret(clientApplicationTrafficLabel) 1223 serverTrafficSecret := hs.finishedHash.deriveSecret(serverApplicationTrafficLabel) 1224 c.exporterSecret = hs.finishedHash.deriveSecret(exporterLabel) 1225 1226 // Switch to application data keys on write. In particular, any alerts 1227 // from the client certificate are sent over these keys. 1228 c.useOutTrafficSecret(encryptionApplication, c.wireVersion, hs.suite, serverTrafficSecret) 1229 1230 // Send 0.5-RTT messages. 1231 for _, halfRTTMsg := range config.Bugs.SendHalfRTTData { 1232 if _, err := c.writeRecord(recordTypeApplicationData, halfRTTMsg); err != nil { 1233 return err 1234 } 1235 } 1236 1237 // Read end_of_early_data. 1238 if encryptedExtensions.extensions.hasEarlyData && config.Bugs.MockQUICTransport == nil { 1239 msg, err := c.readHandshake() 1240 if err != nil { 1241 return err 1242 } 1243 1244 endOfEarlyData, ok := msg.(*endOfEarlyDataMsg) 1245 if !ok { 1246 c.sendAlert(alertUnexpectedMessage) 1247 return unexpectedMessageError(endOfEarlyData, msg) 1248 } 1249 hs.writeClientHash(endOfEarlyData.marshal()) 1250 } 1251 1252 // Switch input stream to handshake traffic keys. 1253 if err := c.useInTrafficSecret(encryptionHandshake, c.wireVersion, hs.suite, clientHandshakeTrafficSecret); err != nil { 1254 return err 1255 } 1256 1257 // If we sent an ALPS extension, the client must respond with one. 1258 if encryptedExtensions.extensions.hasApplicationSettings { 1259 msg, err := c.readHandshake() 1260 if err != nil { 1261 return err 1262 } 1263 clientEncryptedExtensions, ok := msg.(*clientEncryptedExtensionsMsg) 1264 if !ok { 1265 c.sendAlert(alertUnexpectedMessage) 1266 return unexpectedMessageError(clientEncryptedExtensions, msg) 1267 } 1268 hs.writeClientHash(clientEncryptedExtensions.marshal()) 1269 1270 if !clientEncryptedExtensions.hasApplicationSettings { 1271 c.sendAlert(alertMissingExtension) 1272 return errors.New("tls: client didn't provide application settings") 1273 } 1274 c.peerApplicationSettings = clientEncryptedExtensions.applicationSettings 1275 } else if encryptedExtensions.extensions.hasEarlyData { 1276 // 0-RTT sessions carry application settings over. 1277 c.peerApplicationSettings = hs.sessionState.peerApplicationSettings 1278 } 1279 1280 // If we requested a client certificate, then the client must send a 1281 // certificate message, even if it's empty. 1282 if config.ClientAuth >= RequestClientCert { 1283 msg, err := c.readHandshake() 1284 if err != nil { 1285 return err 1286 } 1287 1288 certMsg, ok := msg.(*certificateMsg) 1289 if !ok { 1290 c.sendAlert(alertUnexpectedMessage) 1291 return unexpectedMessageError(certMsg, msg) 1292 } 1293 hs.writeClientHash(certMsg.marshal()) 1294 1295 if len(certMsg.certificates) == 0 { 1296 // The client didn't actually send a certificate 1297 switch config.ClientAuth { 1298 case RequireAnyClientCert, RequireAndVerifyClientCert: 1299 c.sendAlert(alertCertificateRequired) 1300 return errors.New("tls: client didn't provide a certificate") 1301 } 1302 } 1303 1304 var certs [][]byte 1305 for _, cert := range certMsg.certificates { 1306 certs = append(certs, cert.data) 1307 // OCSP responses and SCT lists are not negotiated in 1308 // client certificates. 1309 if cert.ocspResponse != nil || cert.sctList != nil { 1310 c.sendAlert(alertUnsupportedExtension) 1311 return errors.New("tls: unexpected extensions in the client certificate") 1312 } 1313 } 1314 pub, err := hs.processCertsFromClient(certs) 1315 if err != nil { 1316 return err 1317 } 1318 1319 if len(c.peerCertificates) > 0 { 1320 msg, err = c.readHandshake() 1321 if err != nil { 1322 return err 1323 } 1324 1325 certVerify, ok := msg.(*certificateVerifyMsg) 1326 if !ok { 1327 c.sendAlert(alertUnexpectedMessage) 1328 return unexpectedMessageError(certVerify, msg) 1329 } 1330 1331 c.peerSignatureAlgorithm = certVerify.signatureAlgorithm 1332 input := hs.finishedHash.certificateVerifyInput(clientCertificateVerifyContextTLS13) 1333 if err := verifyMessage(c.vers, pub, config, certVerify.signatureAlgorithm, input, certVerify.signature); err != nil { 1334 c.sendAlert(alertBadCertificate) 1335 return err 1336 } 1337 hs.writeClientHash(certVerify.marshal()) 1338 } 1339 } 1340 1341 if encryptedExtensions.extensions.channelIDRequested { 1342 msg, err := c.readHandshake() 1343 if err != nil { 1344 return err 1345 } 1346 channelIDMsg, ok := msg.(*channelIDMsg) 1347 if !ok { 1348 c.sendAlert(alertUnexpectedMessage) 1349 return unexpectedMessageError(channelIDMsg, msg) 1350 } 1351 channelIDHash := crypto.SHA256.New() 1352 channelIDHash.Write(hs.finishedHash.certificateVerifyInput(channelIDContextTLS13)) 1353 channelID, err := verifyChannelIDMessage(channelIDMsg, channelIDHash.Sum(nil)) 1354 if err != nil { 1355 return err 1356 } 1357 c.channelID = channelID 1358 1359 hs.writeClientHash(channelIDMsg.marshal()) 1360 } 1361 1362 // Read the client Finished message. 1363 msg, err := c.readHandshake() 1364 if err != nil { 1365 return err 1366 } 1367 clientFinished, ok := msg.(*finishedMsg) 1368 if !ok { 1369 c.sendAlert(alertUnexpectedMessage) 1370 return unexpectedMessageError(clientFinished, msg) 1371 } 1372 1373 verify := hs.finishedHash.clientSum(clientHandshakeTrafficSecret) 1374 if len(verify) != len(clientFinished.verifyData) || 1375 subtle.ConstantTimeCompare(verify, clientFinished.verifyData) != 1 { 1376 c.sendAlert(alertHandshakeFailure) 1377 return errors.New("tls: client's Finished message was incorrect") 1378 } 1379 hs.writeClientHash(clientFinished.marshal()) 1380 1381 // Switch to application data keys on read. 1382 if err := c.useInTrafficSecret(encryptionApplication, c.wireVersion, hs.suite, clientTrafficSecret); err != nil { 1383 return err 1384 } 1385 1386 c.cipherSuite = hs.suite 1387 c.resumptionSecret = hs.finishedHash.deriveSecret(resumptionLabel) 1388 1389 // TODO(davidben): Allow configuring the number of tickets sent for 1390 // testing. 1391 if !c.config.SessionTicketsDisabled && foundKEMode { 1392 ticketCount := 2 1393 for i := 0; i < ticketCount; i++ { 1394 c.SendNewSessionTicket([]byte{byte(i)}) 1395 } 1396 } 1397 return nil 1398} 1399 1400// processClientHello processes the ClientHello message from the client and 1401// decides whether we will perform session resumption. 1402func (hs *serverHandshakeState) processClientHello() (isResume bool, err error) { 1403 config := hs.c.config 1404 c := hs.c 1405 1406 hs.hello = &serverHelloMsg{ 1407 isDTLS: c.isDTLS, 1408 vers: c.wireVersion, 1409 versOverride: config.Bugs.SendServerHelloVersion, 1410 compressionMethod: config.Bugs.SendCompressionMethod, 1411 extensions: serverExtensions{ 1412 supportedVersion: config.Bugs.SendServerSupportedVersionExtension, 1413 }, 1414 omitExtensions: config.Bugs.OmitExtensions, 1415 emptyExtensions: config.Bugs.EmptyExtensions, 1416 } 1417 1418 hs.hello.random = make([]byte, 32) 1419 _, err = io.ReadFull(config.rand(), hs.hello.random) 1420 if err != nil { 1421 c.sendAlert(alertInternalError) 1422 return false, err 1423 } 1424 1425 _, supportsTLS13 := c.config.isSupportedVersion(VersionTLS13, false) 1426 1427 // Signal downgrades in the server random, per RFC 8446, section 4.1.3. 1428 if supportsTLS13 || config.Bugs.SendTLS13DowngradeRandom { 1429 if c.vers <= VersionTLS12 && config.maxVersion(c.isDTLS) >= VersionTLS13 { 1430 copy(hs.hello.random[len(hs.hello.random)-8:], downgradeTLS13) 1431 } 1432 if c.vers <= VersionTLS11 && config.maxVersion(c.isDTLS) == VersionTLS12 { 1433 copy(hs.hello.random[len(hs.hello.random)-8:], downgradeTLS12) 1434 } 1435 } 1436 if config.Bugs.SendJDK11DowngradeRandom { 1437 copy(hs.hello.random[len(hs.hello.random)-8:], downgradeJDK11) 1438 } 1439 1440 foundCompression := false 1441 // We only support null compression, so check that the client offered it. 1442 for _, compression := range hs.clientHello.compressionMethods { 1443 if compression == compressionNone { 1444 foundCompression = true 1445 break 1446 } 1447 } 1448 1449 if !foundCompression { 1450 c.sendAlert(alertHandshakeFailure) 1451 return false, errors.New("tls: client does not support uncompressed connections") 1452 } 1453 1454 if err := hs.processClientExtensions(&hs.hello.extensions); err != nil { 1455 return false, err 1456 } 1457 1458 supportedCurve := false 1459 preferredCurves := config.curvePreferences() 1460Curves: 1461 for _, curve := range hs.clientHello.supportedCurves { 1462 if isPqGroup(curve) && c.vers < VersionTLS13 { 1463 // CECPQ2 is TLS 1.3-only. 1464 continue 1465 } 1466 1467 for _, supported := range preferredCurves { 1468 if supported == curve { 1469 supportedCurve = true 1470 break Curves 1471 } 1472 } 1473 } 1474 1475 supportedPointFormat := false 1476 for _, pointFormat := range hs.clientHello.supportedPoints { 1477 if pointFormat == pointFormatUncompressed { 1478 supportedPointFormat = true 1479 break 1480 } 1481 } 1482 hs.ellipticOk = supportedCurve && supportedPointFormat 1483 1484 _, hs.ecdsaOk = hs.cert.PrivateKey.(*ecdsa.PrivateKey) 1485 // Ed25519 also uses ECDSA certificates. 1486 _, ed25519Ok := hs.cert.PrivateKey.(ed25519.PrivateKey) 1487 hs.ecdsaOk = hs.ecdsaOk || ed25519Ok 1488 1489 // For test purposes, check that the peer never offers a session when 1490 // renegotiating. 1491 if c.cipherSuite != nil && len(hs.clientHello.sessionID) > 0 && c.config.Bugs.FailIfResumeOnRenego { 1492 return false, errors.New("tls: offered resumption on renegotiation") 1493 } 1494 1495 if hs.checkForResumption() { 1496 return true, nil 1497 } 1498 1499 var preferenceList, supportedList []uint16 1500 if c.config.PreferServerCipherSuites { 1501 preferenceList = c.config.cipherSuites() 1502 supportedList = hs.clientHello.cipherSuites 1503 } else { 1504 preferenceList = hs.clientHello.cipherSuites 1505 supportedList = c.config.cipherSuites() 1506 } 1507 1508 for _, id := range preferenceList { 1509 if hs.suite = c.tryCipherSuite(id, supportedList, c.vers, hs.ellipticOk, hs.ecdsaOk); hs.suite != nil { 1510 break 1511 } 1512 } 1513 1514 if hs.suite == nil { 1515 c.sendAlert(alertHandshakeFailure) 1516 return false, errors.New("tls: no cipher suite supported by both client and server") 1517 } 1518 1519 return false, nil 1520} 1521 1522// processClientExtensions processes all ClientHello extensions not directly 1523// related to cipher suite negotiation and writes responses in serverExtensions. 1524func (hs *serverHandshakeState) processClientExtensions(serverExtensions *serverExtensions) error { 1525 config := hs.c.config 1526 c := hs.c 1527 1528 if c.vers < VersionTLS13 || config.Bugs.NegotiateRenegotiationInfoAtAllVersions { 1529 if !bytes.Equal(c.clientVerify, hs.clientHello.secureRenegotiation) { 1530 c.sendAlert(alertHandshakeFailure) 1531 return errors.New("tls: renegotiation mismatch") 1532 } 1533 1534 if len(c.clientVerify) > 0 && !c.config.Bugs.EmptyRenegotiationInfo { 1535 serverExtensions.secureRenegotiation = append(serverExtensions.secureRenegotiation, c.clientVerify...) 1536 serverExtensions.secureRenegotiation = append(serverExtensions.secureRenegotiation, c.serverVerify...) 1537 if c.config.Bugs.BadRenegotiationInfo { 1538 serverExtensions.secureRenegotiation[0] ^= 0x80 1539 } 1540 if c.config.Bugs.BadRenegotiationInfoEnd { 1541 serverExtensions.secureRenegotiation[len(serverExtensions.secureRenegotiation)-1] ^= 0x80 1542 } 1543 } else { 1544 serverExtensions.secureRenegotiation = hs.clientHello.secureRenegotiation 1545 } 1546 1547 if c.noRenegotiationInfo() { 1548 serverExtensions.secureRenegotiation = nil 1549 } 1550 } 1551 1552 serverExtensions.duplicateExtension = c.config.Bugs.DuplicateExtension 1553 1554 if len(hs.clientHello.serverName) > 0 { 1555 c.serverName = hs.clientHello.serverName 1556 } 1557 if len(config.Certificates) == 0 { 1558 c.sendAlert(alertInternalError) 1559 return errors.New("tls: no certificates configured") 1560 } 1561 hs.cert = &config.Certificates[0] 1562 if len(hs.clientHello.serverName) > 0 { 1563 hs.cert = config.getCertificateForName(hs.clientHello.serverName) 1564 } 1565 if expected := c.config.Bugs.ExpectServerName; expected != "" && expected != hs.clientHello.serverName { 1566 return fmt.Errorf("tls: unexpected server name: wanted %q, got %q", expected, hs.clientHello.serverName) 1567 } 1568 1569 if cert := config.Bugs.RenegotiationCertificate; c.cipherSuite != nil && cert != nil { 1570 hs.cert = cert 1571 } 1572 1573 if len(hs.clientHello.alpnProtocols) > 0 { 1574 // We will never offer ALPN as a client on renegotiation 1575 // handshakes. 1576 if len(c.clientVerify) > 0 { 1577 return errors.New("tls: offered ALPN on renegotiation") 1578 } 1579 if proto := c.config.Bugs.ALPNProtocol; proto != nil { 1580 serverExtensions.alpnProtocol = *proto 1581 serverExtensions.alpnProtocolEmpty = len(*proto) == 0 1582 c.clientProtocol = *proto 1583 c.usedALPN = true 1584 } else if selectedProto, fallback := mutualProtocol(hs.clientHello.alpnProtocols, c.config.NextProtos); !fallback { 1585 serverExtensions.alpnProtocol = selectedProto 1586 c.clientProtocol = selectedProto 1587 c.usedALPN = true 1588 } 1589 1590 var alpsAllowed bool 1591 if c.vers >= VersionTLS13 { 1592 for _, proto := range hs.clientHello.alpsProtocols { 1593 if proto == c.clientProtocol { 1594 alpsAllowed = true 1595 break 1596 } 1597 } 1598 } 1599 if c.config.Bugs.AlwaysNegotiateApplicationSettings { 1600 alpsAllowed = true 1601 } 1602 if settings, ok := c.config.ApplicationSettings[c.clientProtocol]; ok && alpsAllowed { 1603 c.hasApplicationSettings = true 1604 c.localApplicationSettings = settings 1605 // Note these fields may later be cleared we accept 0-RTT. 1606 serverExtensions.hasApplicationSettings = true 1607 serverExtensions.applicationSettings = settings 1608 } 1609 } 1610 1611 if len(c.config.Bugs.SendALPN) > 0 { 1612 serverExtensions.alpnProtocol = c.config.Bugs.SendALPN 1613 } 1614 1615 if c.vers < VersionTLS13 || config.Bugs.NegotiateNPNAtAllVersions { 1616 if len(hs.clientHello.alpnProtocols) == 0 || c.config.Bugs.NegotiateALPNAndNPN { 1617 // Although sending an empty NPN extension is reasonable, Firefox has 1618 // had a bug around this. Best to send nothing at all if 1619 // config.NextProtos is empty. See 1620 // https://code.google.com/p/go/issues/detail?id=5445. 1621 if hs.clientHello.nextProtoNeg && len(config.NextProtos) > 0 { 1622 serverExtensions.nextProtoNeg = true 1623 serverExtensions.nextProtos = config.NextProtos 1624 serverExtensions.npnAfterAlpn = config.Bugs.SwapNPNAndALPN 1625 } 1626 } 1627 } 1628 1629 if len(hs.clientHello.quicTransportParams) > 0 { 1630 c.quicTransportParams = hs.clientHello.quicTransportParams 1631 } 1632 if c.config.QUICTransportParamsUseLegacyCodepoint.IncludeStandard() { 1633 serverExtensions.quicTransportParams = c.config.QUICTransportParams 1634 } 1635 1636 if len(hs.clientHello.quicTransportParamsLegacy) > 0 { 1637 c.quicTransportParamsLegacy = hs.clientHello.quicTransportParamsLegacy 1638 } 1639 if c.config.QUICTransportParamsUseLegacyCodepoint.IncludeLegacy() { 1640 serverExtensions.quicTransportParamsLegacy = c.config.QUICTransportParams 1641 } 1642 1643 if c.vers < VersionTLS13 || config.Bugs.NegotiateEMSAtAllVersions { 1644 disableEMS := config.Bugs.NoExtendedMasterSecret 1645 if c.cipherSuite != nil { 1646 disableEMS = config.Bugs.NoExtendedMasterSecretOnRenegotiation 1647 } 1648 serverExtensions.extendedMasterSecret = hs.clientHello.extendedMasterSecret && !disableEMS 1649 } 1650 1651 if config.Bugs.AlwaysNegotiateChannelID || (hs.clientHello.channelIDSupported && config.RequestChannelID) { 1652 serverExtensions.channelIDRequested = true 1653 } 1654 1655 if hs.clientHello.srtpProtectionProfiles != nil { 1656 SRTPLoop: 1657 for _, p1 := range c.config.SRTPProtectionProfiles { 1658 for _, p2 := range hs.clientHello.srtpProtectionProfiles { 1659 if p1 == p2 { 1660 serverExtensions.srtpProtectionProfile = p1 1661 c.srtpProtectionProfile = p1 1662 break SRTPLoop 1663 } 1664 } 1665 } 1666 } 1667 1668 if c.config.Bugs.SendSRTPProtectionProfile != 0 { 1669 serverExtensions.srtpProtectionProfile = c.config.Bugs.SendSRTPProtectionProfile 1670 } 1671 1672 if expected := c.config.Bugs.ExpectedCustomExtension; expected != nil { 1673 if hs.clientHello.customExtension != *expected { 1674 return fmt.Errorf("tls: bad custom extension contents %q", hs.clientHello.customExtension) 1675 } 1676 } 1677 serverExtensions.customExtension = config.Bugs.CustomExtension 1678 1679 if c.config.Bugs.AdvertiseTicketExtension { 1680 serverExtensions.ticketSupported = true 1681 } 1682 1683 if c.config.Bugs.SendSupportedPointFormats != nil { 1684 serverExtensions.supportedPoints = c.config.Bugs.SendSupportedPointFormats 1685 } 1686 1687 if c.config.Bugs.SendServerSupportedCurves { 1688 serverExtensions.supportedCurves = c.config.curvePreferences() 1689 } 1690 1691 if !hs.clientHello.hasGREASEExtension && config.Bugs.ExpectGREASE { 1692 return errors.New("tls: no GREASE extension found") 1693 } 1694 1695 serverExtensions.serverNameAck = c.config.Bugs.SendServerNameAck 1696 1697 if (c.vers >= VersionTLS13 && hs.clientHello.echOuter != nil) || c.config.Bugs.AlwaysSendECHRetryConfigs { 1698 if len(config.Bugs.SendECHRetryConfigs) > 0 { 1699 serverExtensions.echRetryConfigs = config.Bugs.SendECHRetryConfigs 1700 } else if len(config.ServerECHConfigs) > 0 { 1701 echConfigs := make([][]byte, len(config.ServerECHConfigs)) 1702 for i, echConfig := range config.ServerECHConfigs { 1703 echConfigs[i] = echConfig.ECHConfig.Raw 1704 } 1705 serverExtensions.echRetryConfigs = CreateECHConfigList(echConfigs...) 1706 } 1707 } 1708 1709 return nil 1710} 1711 1712// checkForResumption returns true if we should perform resumption on this connection. 1713func (hs *serverHandshakeState) checkForResumption() bool { 1714 c := hs.c 1715 1716 ticket := hs.clientHello.sessionTicket 1717 if len(ticket) == 0 && len(hs.clientHello.pskIdentities) > 0 && c.config.Bugs.AcceptAnySession { 1718 ticket = hs.clientHello.pskIdentities[0].ticket 1719 } 1720 if len(ticket) > 0 { 1721 if c.config.SessionTicketsDisabled { 1722 return false 1723 } 1724 1725 var ok bool 1726 if hs.sessionState, ok = c.decryptTicket(ticket); !ok { 1727 return false 1728 } 1729 } else { 1730 if c.config.ServerSessionCache == nil { 1731 return false 1732 } 1733 1734 var ok bool 1735 sessionID := string(hs.clientHello.sessionID) 1736 if hs.sessionState, ok = c.config.ServerSessionCache.Get(sessionID); !ok { 1737 return false 1738 } 1739 } 1740 1741 if c.config.Bugs.AcceptAnySession { 1742 // Replace the cipher suite with one known to work, to test 1743 // cross-version resumption attempts. 1744 hs.sessionState.cipherSuite = TLS_RSA_WITH_AES_128_CBC_SHA 1745 } else { 1746 // Never resume a session for a different SSL version. 1747 if c.vers != hs.sessionState.vers { 1748 return false 1749 } 1750 1751 cipherSuiteOk := false 1752 // Check that the client is still offering the ciphersuite in the session. 1753 for _, id := range hs.clientHello.cipherSuites { 1754 if id == hs.sessionState.cipherSuite { 1755 cipherSuiteOk = true 1756 break 1757 } 1758 } 1759 if !cipherSuiteOk { 1760 return false 1761 } 1762 } 1763 1764 // Check that we also support the ciphersuite from the session. 1765 hs.suite = c.tryCipherSuite(hs.sessionState.cipherSuite, c.config.cipherSuites(), c.vers, hs.ellipticOk, hs.ecdsaOk) 1766 1767 if hs.suite == nil { 1768 return false 1769 } 1770 1771 sessionHasClientCerts := len(hs.sessionState.certificates) != 0 1772 needClientCerts := c.config.ClientAuth == RequireAnyClientCert || c.config.ClientAuth == RequireAndVerifyClientCert 1773 if needClientCerts && !sessionHasClientCerts { 1774 return false 1775 } 1776 if sessionHasClientCerts && c.config.ClientAuth == NoClientCert { 1777 return false 1778 } 1779 1780 return true 1781} 1782 1783func (hs *serverHandshakeState) doResumeHandshake() error { 1784 c := hs.c 1785 1786 hs.hello.cipherSuite = hs.suite.id 1787 if c.config.Bugs.SendCipherSuite != 0 { 1788 hs.hello.cipherSuite = c.config.Bugs.SendCipherSuite 1789 } 1790 // We echo the client's session ID in the ServerHello to let it know 1791 // that we're doing a resumption. 1792 hs.hello.sessionID = hs.clientHello.sessionID 1793 hs.hello.extensions.ticketSupported = c.config.Bugs.RenewTicketOnResume 1794 1795 if c.config.Bugs.SendSCTListOnResume != nil { 1796 hs.hello.extensions.sctList = c.config.Bugs.SendSCTListOnResume 1797 } 1798 1799 if c.config.Bugs.SendOCSPResponseOnResume != nil { 1800 // There is no way, syntactically, to send an OCSP response on a 1801 // resumption handshake. 1802 hs.hello.extensions.ocspStapling = true 1803 } 1804 1805 hs.finishedHash = newFinishedHash(c.wireVersion, c.isDTLS, hs.suite) 1806 hs.finishedHash.discardHandshakeBuffer() 1807 hs.writeClientHash(hs.clientHello.marshal()) 1808 hs.writeServerHash(hs.hello.marshal()) 1809 1810 c.writeRecord(recordTypeHandshake, hs.hello.marshal()) 1811 1812 if len(hs.sessionState.certificates) > 0 { 1813 if _, err := hs.processCertsFromClient(hs.sessionState.certificates); err != nil { 1814 return err 1815 } 1816 } 1817 1818 hs.masterSecret = hs.sessionState.secret 1819 c.extendedMasterSecret = hs.sessionState.extendedMasterSecret 1820 1821 return nil 1822} 1823 1824func (hs *serverHandshakeState) doFullHandshake() error { 1825 config := hs.c.config 1826 c := hs.c 1827 1828 isPSK := hs.suite.flags&suitePSK != 0 1829 if !isPSK && hs.clientHello.ocspStapling && len(hs.cert.OCSPStaple) > 0 && !c.config.Bugs.NoOCSPStapling { 1830 hs.hello.extensions.ocspStapling = true 1831 } 1832 1833 if hs.clientHello.sctListSupported && len(hs.cert.SignedCertificateTimestampList) > 0 && !c.config.Bugs.NoSignedCertificateTimestamps { 1834 hs.hello.extensions.sctList = hs.cert.SignedCertificateTimestampList 1835 } 1836 1837 if len(c.clientVerify) > 0 && config.Bugs.SendSCTListOnRenegotiation != nil { 1838 hs.hello.extensions.sctList = config.Bugs.SendSCTListOnRenegotiation 1839 } 1840 1841 hs.hello.extensions.ticketSupported = hs.clientHello.ticketSupported && !config.SessionTicketsDisabled 1842 hs.hello.cipherSuite = hs.suite.id 1843 if config.Bugs.SendCipherSuite != 0 { 1844 hs.hello.cipherSuite = config.Bugs.SendCipherSuite 1845 } 1846 c.extendedMasterSecret = hs.hello.extensions.extendedMasterSecret 1847 1848 // Generate a session ID if we're to save the session. 1849 if !hs.hello.extensions.ticketSupported && config.ServerSessionCache != nil { 1850 l := config.Bugs.NewSessionIDLength 1851 if l == 0 { 1852 l = 32 1853 } 1854 hs.hello.sessionID = make([]byte, l) 1855 if _, err := io.ReadFull(config.rand(), hs.hello.sessionID); err != nil { 1856 c.sendAlert(alertInternalError) 1857 return errors.New("tls: short read from Rand: " + err.Error()) 1858 } 1859 } 1860 if config.Bugs.EchoSessionIDInFullHandshake { 1861 hs.hello.sessionID = hs.clientHello.sessionID 1862 } 1863 1864 hs.finishedHash = newFinishedHash(c.wireVersion, c.isDTLS, hs.suite) 1865 hs.writeClientHash(hs.clientHello.marshal()) 1866 hs.writeServerHash(hs.hello.marshal()) 1867 1868 if config.Bugs.SendSNIWarningAlert { 1869 c.SendAlert(alertLevelWarning, alertUnrecognizedName) 1870 } 1871 1872 c.writeRecord(recordTypeHandshake, hs.hello.marshal()) 1873 1874 if !isPSK { 1875 certMsg := new(certificateMsg) 1876 if !config.Bugs.EmptyCertificateList { 1877 for _, certData := range hs.cert.Certificate { 1878 certMsg.certificates = append(certMsg.certificates, certificateEntry{ 1879 data: certData, 1880 }) 1881 } 1882 } 1883 if !config.Bugs.UnauthenticatedECDH { 1884 certMsgBytes := certMsg.marshal() 1885 hs.writeServerHash(certMsgBytes) 1886 c.writeRecord(recordTypeHandshake, certMsgBytes) 1887 } 1888 } 1889 1890 if hs.hello.extensions.ocspStapling && !c.config.Bugs.SkipCertificateStatus { 1891 certStatus := new(certificateStatusMsg) 1892 certStatus.statusType = statusTypeOCSP 1893 certStatus.response = hs.cert.OCSPStaple 1894 if len(c.clientVerify) > 0 && config.Bugs.SendOCSPResponseOnRenegotiation != nil { 1895 certStatus.response = config.Bugs.SendOCSPResponseOnRenegotiation 1896 } 1897 hs.writeServerHash(certStatus.marshal()) 1898 c.writeRecord(recordTypeHandshake, certStatus.marshal()) 1899 } 1900 1901 keyAgreement := hs.suite.ka(c.vers) 1902 skx, err := keyAgreement.generateServerKeyExchange(config, hs.cert, hs.clientHello, hs.hello, c.vers) 1903 if err != nil { 1904 c.sendAlert(alertHandshakeFailure) 1905 return err 1906 } 1907 if ecdhe, ok := keyAgreement.(*ecdheKeyAgreement); ok { 1908 c.curveID = ecdhe.curveID 1909 } 1910 if skx != nil && !config.Bugs.SkipServerKeyExchange { 1911 hs.writeServerHash(skx.marshal()) 1912 c.writeRecord(recordTypeHandshake, skx.marshal()) 1913 } 1914 1915 if config.ClientAuth >= RequestClientCert { 1916 // Request a client certificate 1917 certReq := &certificateRequestMsg{ 1918 vers: c.wireVersion, 1919 certificateTypes: config.ClientCertificateTypes, 1920 } 1921 if certReq.certificateTypes == nil { 1922 certReq.certificateTypes = []byte{ 1923 byte(CertTypeRSASign), 1924 byte(CertTypeECDSASign), 1925 } 1926 } 1927 if c.vers >= VersionTLS12 { 1928 certReq.hasSignatureAlgorithm = true 1929 if !config.Bugs.NoSignatureAlgorithms { 1930 certReq.signatureAlgorithms = config.verifySignatureAlgorithms() 1931 } 1932 } 1933 1934 // An empty list of certificateAuthorities signals to 1935 // the client that it may send any certificate in response 1936 // to our request. When we know the CAs we trust, then 1937 // we can send them down, so that the client can choose 1938 // an appropriate certificate to give to us. 1939 if config.ClientCAs != nil { 1940 certReq.certificateAuthorities = config.ClientCAs.Subjects() 1941 } 1942 hs.writeServerHash(certReq.marshal()) 1943 c.writeRecord(recordTypeHandshake, certReq.marshal()) 1944 } 1945 1946 helloDone := new(serverHelloDoneMsg) 1947 helloDoneBytes := helloDone.marshal() 1948 hs.writeServerHash(helloDoneBytes) 1949 var toAppend byte 1950 if config.Bugs.PartialNewSessionTicketWithServerHelloDone { 1951 toAppend = typeNewSessionTicket 1952 } else if config.Bugs.PartialFinishedWithServerHelloDone { 1953 toAppend = typeFinished 1954 } 1955 if toAppend != 0 { 1956 c.writeRecord(recordTypeHandshake, append(helloDoneBytes[:len(helloDoneBytes):len(helloDoneBytes)], toAppend)) 1957 } else { 1958 c.writeRecord(recordTypeHandshake, helloDoneBytes) 1959 } 1960 c.flushHandshake() 1961 1962 var pub crypto.PublicKey // public key for client auth, if any 1963 1964 if err := c.simulatePacketLoss(nil); err != nil { 1965 return err 1966 } 1967 msg, err := c.readHandshake() 1968 if err != nil { 1969 return err 1970 } 1971 1972 // If we requested a client certificate, then the client must send a 1973 // certificate message, even if it's empty. 1974 if config.ClientAuth >= RequestClientCert { 1975 certMsg, ok := msg.(*certificateMsg) 1976 if !ok { 1977 c.sendAlert(alertUnexpectedMessage) 1978 return unexpectedMessageError(certMsg, msg) 1979 } 1980 hs.writeClientHash(certMsg.marshal()) 1981 1982 if len(certMsg.certificates) == 0 { 1983 // The client didn't actually send a certificate 1984 switch config.ClientAuth { 1985 case RequireAnyClientCert, RequireAndVerifyClientCert: 1986 c.sendAlert(alertBadCertificate) 1987 return errors.New("tls: client didn't provide a certificate") 1988 } 1989 } 1990 1991 var certificates [][]byte 1992 for _, cert := range certMsg.certificates { 1993 certificates = append(certificates, cert.data) 1994 } 1995 1996 pub, err = hs.processCertsFromClient(certificates) 1997 if err != nil { 1998 return err 1999 } 2000 2001 msg, err = c.readHandshake() 2002 if err != nil { 2003 return err 2004 } 2005 } 2006 2007 // Get client key exchange 2008 ckx, ok := msg.(*clientKeyExchangeMsg) 2009 if !ok { 2010 c.sendAlert(alertUnexpectedMessage) 2011 return unexpectedMessageError(ckx, msg) 2012 } 2013 hs.writeClientHash(ckx.marshal()) 2014 2015 preMasterSecret, err := keyAgreement.processClientKeyExchange(config, hs.cert, ckx, c.vers) 2016 if err != nil { 2017 c.sendAlert(alertHandshakeFailure) 2018 return err 2019 } 2020 if c.extendedMasterSecret { 2021 hs.masterSecret = extendedMasterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret, hs.finishedHash) 2022 } else { 2023 if c.config.Bugs.RequireExtendedMasterSecret { 2024 return errors.New("tls: extended master secret required but not supported by peer") 2025 } 2026 hs.masterSecret = masterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret, hs.clientHello.random, hs.hello.random) 2027 } 2028 2029 // If we received a client cert in response to our certificate request message, 2030 // the client will send us a certificateVerifyMsg immediately after the 2031 // clientKeyExchangeMsg. This message is a digest of all preceding 2032 // handshake-layer messages that is signed using the private key corresponding 2033 // to the client's certificate. This allows us to verify that the client is in 2034 // possession of the private key of the certificate. 2035 if len(c.peerCertificates) > 0 { 2036 msg, err = c.readHandshake() 2037 if err != nil { 2038 return err 2039 } 2040 certVerify, ok := msg.(*certificateVerifyMsg) 2041 if !ok { 2042 c.sendAlert(alertUnexpectedMessage) 2043 return unexpectedMessageError(certVerify, msg) 2044 } 2045 2046 // Determine the signature type. 2047 var sigAlg signatureAlgorithm 2048 if certVerify.hasSignatureAlgorithm { 2049 sigAlg = certVerify.signatureAlgorithm 2050 c.peerSignatureAlgorithm = sigAlg 2051 } 2052 2053 if err := verifyMessage(c.vers, pub, c.config, sigAlg, hs.finishedHash.buffer, certVerify.signature); err != nil { 2054 c.sendAlert(alertBadCertificate) 2055 return errors.New("could not validate signature of connection nonces: " + err.Error()) 2056 } 2057 2058 hs.writeClientHash(certVerify.marshal()) 2059 } 2060 2061 hs.finishedHash.discardHandshakeBuffer() 2062 2063 return nil 2064} 2065 2066func (hs *serverHandshakeState) establishKeys() error { 2067 c := hs.c 2068 2069 clientMAC, serverMAC, clientKey, serverKey, clientIV, serverIV := 2070 keysFromMasterSecret(c.vers, hs.suite, hs.masterSecret, hs.clientHello.random, hs.hello.random, hs.suite.macLen, hs.suite.keyLen, hs.suite.ivLen(c.vers)) 2071 2072 var clientCipher, serverCipher interface{} 2073 var clientHash, serverHash macFunction 2074 2075 if hs.suite.aead == nil { 2076 clientCipher = hs.suite.cipher(clientKey, clientIV, true /* for reading */) 2077 clientHash = hs.suite.mac(c.vers, clientMAC) 2078 serverCipher = hs.suite.cipher(serverKey, serverIV, false /* not for reading */) 2079 serverHash = hs.suite.mac(c.vers, serverMAC) 2080 } else { 2081 clientCipher = hs.suite.aead(c.vers, clientKey, clientIV) 2082 serverCipher = hs.suite.aead(c.vers, serverKey, serverIV) 2083 } 2084 2085 c.in.prepareCipherSpec(c.wireVersion, clientCipher, clientHash) 2086 c.out.prepareCipherSpec(c.wireVersion, serverCipher, serverHash) 2087 2088 return nil 2089} 2090 2091func (hs *serverHandshakeState) readFinished(out []byte, isResume bool) error { 2092 c := hs.c 2093 2094 c.readRecord(recordTypeChangeCipherSpec) 2095 if err := c.in.error(); err != nil { 2096 return err 2097 } 2098 2099 if hs.hello.extensions.nextProtoNeg { 2100 msg, err := c.readHandshake() 2101 if err != nil { 2102 return err 2103 } 2104 nextProto, ok := msg.(*nextProtoMsg) 2105 if !ok { 2106 c.sendAlert(alertUnexpectedMessage) 2107 return unexpectedMessageError(nextProto, msg) 2108 } 2109 hs.writeClientHash(nextProto.marshal()) 2110 c.clientProtocol = nextProto.proto 2111 } 2112 2113 if hs.hello.extensions.channelIDRequested { 2114 msg, err := c.readHandshake() 2115 if err != nil { 2116 return err 2117 } 2118 channelIDMsg, ok := msg.(*channelIDMsg) 2119 if !ok { 2120 c.sendAlert(alertUnexpectedMessage) 2121 return unexpectedMessageError(channelIDMsg, msg) 2122 } 2123 var resumeHash []byte 2124 if isResume { 2125 resumeHash = hs.sessionState.handshakeHash 2126 } 2127 channelID, err := verifyChannelIDMessage(channelIDMsg, hs.finishedHash.hashForChannelID(resumeHash)) 2128 if err != nil { 2129 return err 2130 } 2131 c.channelID = channelID 2132 2133 hs.writeClientHash(channelIDMsg.marshal()) 2134 } 2135 2136 msg, err := c.readHandshake() 2137 if err != nil { 2138 return err 2139 } 2140 clientFinished, ok := msg.(*finishedMsg) 2141 if !ok { 2142 c.sendAlert(alertUnexpectedMessage) 2143 return unexpectedMessageError(clientFinished, msg) 2144 } 2145 2146 verify := hs.finishedHash.clientSum(hs.masterSecret) 2147 if len(verify) != len(clientFinished.verifyData) || 2148 subtle.ConstantTimeCompare(verify, clientFinished.verifyData) != 1 { 2149 c.sendAlert(alertHandshakeFailure) 2150 return errors.New("tls: client's Finished message is incorrect") 2151 } 2152 c.clientVerify = append(c.clientVerify[:0], clientFinished.verifyData...) 2153 copy(out, clientFinished.verifyData) 2154 2155 hs.writeClientHash(clientFinished.marshal()) 2156 return nil 2157} 2158 2159func (hs *serverHandshakeState) sendSessionTicket() error { 2160 c := hs.c 2161 state := sessionState{ 2162 vers: c.vers, 2163 cipherSuite: hs.suite.id, 2164 secret: hs.masterSecret, 2165 certificates: hs.certsFromClient, 2166 handshakeHash: hs.finishedHash.Sum(), 2167 } 2168 2169 if !hs.hello.extensions.ticketSupported || hs.c.config.Bugs.SkipNewSessionTicket { 2170 if c.config.ServerSessionCache != nil && len(hs.hello.sessionID) != 0 { 2171 c.config.ServerSessionCache.Put(string(hs.hello.sessionID), &state) 2172 } 2173 return nil 2174 } 2175 2176 m := new(newSessionTicketMsg) 2177 m.vers = c.wireVersion 2178 m.isDTLS = c.isDTLS 2179 if c.config.Bugs.SendTicketLifetime != 0 { 2180 m.ticketLifetime = uint32(c.config.Bugs.SendTicketLifetime / time.Second) 2181 } 2182 2183 if !c.config.Bugs.SendEmptySessionTicket { 2184 var err error 2185 m.ticket, err = c.encryptTicket(&state) 2186 if err != nil { 2187 return err 2188 } 2189 } 2190 2191 hs.writeServerHash(m.marshal()) 2192 if c.config.Bugs.PartialNewSessionTicketWithServerHelloDone { 2193 // The first byte was already sent. 2194 c.writeRecord(recordTypeHandshake, m.marshal()[1:]) 2195 } else { 2196 c.writeRecord(recordTypeHandshake, m.marshal()) 2197 } 2198 2199 return nil 2200} 2201 2202func (hs *serverHandshakeState) sendFinished(out []byte, isResume bool) error { 2203 c := hs.c 2204 2205 finished := new(finishedMsg) 2206 finished.verifyData = hs.finishedHash.serverSum(hs.masterSecret) 2207 copy(out, finished.verifyData) 2208 if c.config.Bugs.BadFinished { 2209 finished.verifyData[0]++ 2210 } 2211 c.serverVerify = append(c.serverVerify[:0], finished.verifyData...) 2212 hs.finishedBytes = finished.marshal() 2213 hs.writeServerHash(hs.finishedBytes) 2214 postCCSBytes := hs.finishedBytes 2215 if c.config.Bugs.PartialFinishedWithServerHelloDone { 2216 // The first byte has already been sent. 2217 postCCSBytes = postCCSBytes[1:] 2218 } 2219 2220 if c.config.Bugs.FragmentAcrossChangeCipherSpec { 2221 c.writeRecord(recordTypeHandshake, postCCSBytes[:5]) 2222 postCCSBytes = postCCSBytes[5:] 2223 } else if c.config.Bugs.SendUnencryptedFinished { 2224 c.writeRecord(recordTypeHandshake, postCCSBytes) 2225 postCCSBytes = nil 2226 } 2227 2228 if !c.config.Bugs.SkipChangeCipherSpec { 2229 ccs := []byte{1} 2230 if c.config.Bugs.BadChangeCipherSpec != nil { 2231 ccs = c.config.Bugs.BadChangeCipherSpec 2232 } 2233 c.writeRecord(recordTypeChangeCipherSpec, ccs) 2234 } 2235 2236 if c.config.Bugs.AppDataAfterChangeCipherSpec != nil { 2237 c.writeRecord(recordTypeApplicationData, c.config.Bugs.AppDataAfterChangeCipherSpec) 2238 } 2239 if c.config.Bugs.AlertAfterChangeCipherSpec != 0 { 2240 c.sendAlert(c.config.Bugs.AlertAfterChangeCipherSpec) 2241 return errors.New("tls: simulating post-CCS alert") 2242 } 2243 2244 if !c.config.Bugs.SkipFinished && len(postCCSBytes) > 0 { 2245 c.writeRecord(recordTypeHandshake, postCCSBytes) 2246 if c.config.Bugs.SendExtraFinished { 2247 c.writeRecord(recordTypeHandshake, finished.marshal()) 2248 } 2249 } 2250 2251 if isResume || (!c.config.Bugs.PackHelloRequestWithFinished && !c.config.Bugs.PackAppDataWithHandshake) { 2252 // Defer flushing until Renegotiate() or Write(). 2253 c.flushHandshake() 2254 } 2255 2256 c.cipherSuite = hs.suite 2257 2258 return nil 2259} 2260 2261// processCertsFromClient takes a chain of client certificates either from a 2262// Certificates message or from a sessionState and verifies them. It returns 2263// the public key of the leaf certificate. 2264func (hs *serverHandshakeState) processCertsFromClient(certificates [][]byte) (crypto.PublicKey, error) { 2265 c := hs.c 2266 2267 hs.certsFromClient = certificates 2268 certs := make([]*x509.Certificate, len(certificates)) 2269 var err error 2270 for i, asn1Data := range certificates { 2271 if certs[i], err = x509.ParseCertificate(asn1Data); err != nil { 2272 c.sendAlert(alertBadCertificate) 2273 return nil, errors.New("tls: failed to parse client certificate: " + err.Error()) 2274 } 2275 } 2276 2277 if c.config.ClientAuth >= VerifyClientCertIfGiven && len(certs) > 0 { 2278 opts := x509.VerifyOptions{ 2279 Roots: c.config.ClientCAs, 2280 CurrentTime: c.config.time(), 2281 Intermediates: x509.NewCertPool(), 2282 KeyUsages: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth}, 2283 } 2284 2285 for _, cert := range certs[1:] { 2286 opts.Intermediates.AddCert(cert) 2287 } 2288 2289 chains, err := certs[0].Verify(opts) 2290 if err != nil { 2291 c.sendAlert(alertBadCertificate) 2292 return nil, errors.New("tls: failed to verify client's certificate: " + err.Error()) 2293 } 2294 2295 ok := false 2296 for _, ku := range certs[0].ExtKeyUsage { 2297 if ku == x509.ExtKeyUsageClientAuth { 2298 ok = true 2299 break 2300 } 2301 } 2302 if !ok { 2303 c.sendAlert(alertHandshakeFailure) 2304 return nil, errors.New("tls: client's certificate's extended key usage doesn't permit it to be used for client authentication") 2305 } 2306 2307 c.verifiedChains = chains 2308 } 2309 2310 if len(certs) > 0 { 2311 pub := certs[0].PublicKey 2312 switch pub.(type) { 2313 case *ecdsa.PublicKey, *rsa.PublicKey, ed25519.PublicKey: 2314 break 2315 default: 2316 c.sendAlert(alertUnsupportedCertificate) 2317 return nil, fmt.Errorf("tls: client's certificate contains an unsupported public key of type %T", pub) 2318 } 2319 c.peerCertificates = certs 2320 return pub, nil 2321 } 2322 2323 return nil, nil 2324} 2325 2326func verifyChannelIDMessage(channelIDMsg *channelIDMsg, channelIDHash []byte) (*ecdsa.PublicKey, error) { 2327 x := new(big.Int).SetBytes(channelIDMsg.channelID[0:32]) 2328 y := new(big.Int).SetBytes(channelIDMsg.channelID[32:64]) 2329 r := new(big.Int).SetBytes(channelIDMsg.channelID[64:96]) 2330 s := new(big.Int).SetBytes(channelIDMsg.channelID[96:128]) 2331 if !elliptic.P256().IsOnCurve(x, y) { 2332 return nil, errors.New("tls: invalid channel ID public key") 2333 } 2334 channelID := &ecdsa.PublicKey{Curve: elliptic.P256(), X: x, Y: y} 2335 if !ecdsa.Verify(channelID, channelIDHash, r, s) { 2336 return nil, errors.New("tls: invalid channel ID signature") 2337 } 2338 return channelID, nil 2339} 2340 2341func (hs *serverHandshakeState) writeServerHash(msg []byte) { 2342 // writeServerHash is called before writeRecord. 2343 hs.finishedHash.WriteHandshake(msg, hs.c.sendHandshakeSeq) 2344} 2345 2346func (hs *serverHandshakeState) writeClientHash(msg []byte) { 2347 // writeClientHash is called after readHandshake. 2348 hs.finishedHash.WriteHandshake(msg, hs.c.recvHandshakeSeq-1) 2349} 2350 2351// tryCipherSuite returns a cipherSuite with the given id if that cipher suite 2352// is acceptable to use. 2353func (c *Conn) tryCipherSuite(id uint16, supportedCipherSuites []uint16, version uint16, ellipticOk, ecdsaOk bool) *cipherSuite { 2354 for _, supported := range supportedCipherSuites { 2355 if id == supported { 2356 var candidate *cipherSuite 2357 2358 for _, s := range cipherSuites { 2359 if s.id == id { 2360 candidate = s 2361 break 2362 } 2363 } 2364 if candidate == nil { 2365 continue 2366 } 2367 2368 // Don't select a ciphersuite which we can't 2369 // support for this client. 2370 if version >= VersionTLS13 || candidate.flags&suiteTLS13 != 0 { 2371 if version < VersionTLS13 || candidate.flags&suiteTLS13 == 0 { 2372 continue 2373 } 2374 return candidate 2375 } 2376 if (candidate.flags&suiteECDHE != 0) && !ellipticOk { 2377 continue 2378 } 2379 if (candidate.flags&suiteECDSA != 0) != ecdsaOk { 2380 continue 2381 } 2382 if version < VersionTLS12 && candidate.flags&suiteTLS12 != 0 { 2383 continue 2384 } 2385 return candidate 2386 } 2387 } 2388 2389 return nil 2390} 2391 2392func isTLS12Cipher(id uint16) bool { 2393 for _, cipher := range cipherSuites { 2394 if cipher.id != id { 2395 continue 2396 } 2397 return cipher.flags&suiteTLS12 != 0 2398 } 2399 // Unknown cipher. 2400 return false 2401} 2402 2403func isGREASEValue(val uint16) bool { 2404 return val&0x0f0f == 0x0a0a && val&0xff == val>>8 2405} 2406 2407func verifyPSKBinder(version uint16, clientHello *clientHelloMsg, sessionState *sessionState, binderToVerify, firstClientHello, helloRetryRequest []byte) error { 2408 binderLen := 2 2409 for _, binder := range clientHello.pskBinders { 2410 binderLen += 1 + len(binder) 2411 } 2412 2413 truncatedHello := clientHello.marshal() 2414 truncatedHello = truncatedHello[:len(truncatedHello)-binderLen] 2415 pskCipherSuite := cipherSuiteFromID(sessionState.cipherSuite) 2416 if pskCipherSuite == nil { 2417 return errors.New("tls: Unknown cipher suite for PSK in session") 2418 } 2419 2420 binder := computePSKBinder(sessionState.secret, version, resumptionPSKBinderLabel, pskCipherSuite, firstClientHello, helloRetryRequest, truncatedHello) 2421 if !bytes.Equal(binder, binderToVerify) { 2422 return errors.New("tls: PSK binder does not verify") 2423 } 2424 2425 return nil 2426} 2427 2428// checkClientHellosEqual checks whether a and b are equal ClientHello 2429// messages. If isDTLS is true, the ClientHellos are parsed as DTLS and any 2430// differences in the cookie field are ignored. Extensions listed in 2431// ignoreExtensions may change or be removed between the two ClientHellos. 2432func checkClientHellosEqual(a, b []byte, isDTLS bool, ignoreExtensions []uint16) error { 2433 ignoreExtensionsSet := make(map[uint16]struct{}) 2434 for _, ext := range ignoreExtensions { 2435 ignoreExtensionsSet[ext] = struct{}{} 2436 } 2437 2438 // Skip the handshake message header. 2439 aReader := byteReader(a[4:]) 2440 bReader := byteReader(b[4:]) 2441 2442 var aVers, bVers uint16 2443 var aRandom, bRandom []byte 2444 var aSessionID, bSessionID []byte 2445 if !aReader.readU16(&aVers) || 2446 !bReader.readU16(&bVers) || 2447 !aReader.readBytes(&aRandom, 32) || 2448 !bReader.readBytes(&bRandom, 32) || 2449 !aReader.readU8LengthPrefixedBytes(&aSessionID) || 2450 !bReader.readU8LengthPrefixedBytes(&bSessionID) { 2451 return errors.New("tls: could not parse ClientHello") 2452 } 2453 2454 if aVers != bVers { 2455 return errors.New("tls: second ClientHello version did not match") 2456 } 2457 if !bytes.Equal(aRandom, bRandom) { 2458 return errors.New("tls: second ClientHello random did not match") 2459 } 2460 if !bytes.Equal(aSessionID, bSessionID) { 2461 return errors.New("tls: second ClientHello session ID did not match") 2462 } 2463 2464 if isDTLS { 2465 // DTLS 1.2 checks two ClientHellos match after a HelloVerifyRequest, 2466 // where we expect the cookies to change. DTLS 1.3 forbids the legacy 2467 // cookie altogether. If we implement DTLS 1.3, we'll need to ensure 2468 // that parsing logic above this function rejects this cookie. 2469 var aCookie, bCookie []byte 2470 if !aReader.readU8LengthPrefixedBytes(&aCookie) || 2471 !bReader.readU8LengthPrefixedBytes(&bCookie) { 2472 return errors.New("tls: could not parse ClientHello") 2473 } 2474 } 2475 2476 var aCipherSuites, bCipherSuites, aCompressionMethods, bCompressionMethods []byte 2477 if !aReader.readU16LengthPrefixedBytes(&aCipherSuites) || 2478 !bReader.readU16LengthPrefixedBytes(&bCipherSuites) || 2479 !aReader.readU8LengthPrefixedBytes(&aCompressionMethods) || 2480 !bReader.readU8LengthPrefixedBytes(&bCompressionMethods) { 2481 return errors.New("tls: could not parse ClientHello") 2482 } 2483 if !bytes.Equal(aCipherSuites, bCipherSuites) { 2484 return errors.New("tls: second ClientHello cipher suites did not match") 2485 } 2486 if !bytes.Equal(aCompressionMethods, bCompressionMethods) { 2487 return errors.New("tls: second ClientHello compression methods did not match") 2488 } 2489 2490 if len(aReader) == 0 && len(bReader) == 0 { 2491 // Both ClientHellos omit the extensions block. 2492 return nil 2493 } 2494 2495 var aExtensions, bExtensions byteReader 2496 if !aReader.readU16LengthPrefixed(&aExtensions) || 2497 !bReader.readU16LengthPrefixed(&bExtensions) || 2498 len(aReader) != 0 || 2499 len(bReader) != 0 { 2500 return errors.New("tls: could not parse ClientHello") 2501 } 2502 2503 for len(aExtensions) != 0 { 2504 var aID uint16 2505 var aBody []byte 2506 if !aExtensions.readU16(&aID) || 2507 !aExtensions.readU16LengthPrefixedBytes(&aBody) { 2508 return errors.New("tls: could not parse ClientHello") 2509 } 2510 if _, ok := ignoreExtensionsSet[aID]; ok { 2511 continue 2512 } 2513 2514 for { 2515 if len(bExtensions) == 0 { 2516 return fmt.Errorf("tls: second ClientHello missing extension %d", aID) 2517 } 2518 var bID uint16 2519 var bBody []byte 2520 if !bExtensions.readU16(&bID) || 2521 !bExtensions.readU16LengthPrefixedBytes(&bBody) { 2522 return errors.New("tls: could not parse ClientHello") 2523 } 2524 if _, ok := ignoreExtensionsSet[bID]; ok { 2525 continue 2526 } 2527 if aID != bID { 2528 return fmt.Errorf("tls: unexpected extension %d in second ClientHello (wanted %d)", bID, aID) 2529 } 2530 if !bytes.Equal(aBody, bBody) { 2531 return fmt.Errorf("tls: extension %d in second ClientHello unexpectedly changed", aID) 2532 } 2533 break 2534 } 2535 } 2536 2537 // Any remaining extensions in the second ClientHello must be in the 2538 // ignored set. 2539 for len(bExtensions) != 0 { 2540 var id uint16 2541 var body []byte 2542 if !bExtensions.readU16(&id) || 2543 !bExtensions.readU16LengthPrefixedBytes(&body) { 2544 return errors.New("tls: could not parse ClientHello") 2545 } 2546 if _, ok := ignoreExtensionsSet[id]; !ok { 2547 return fmt.Errorf("tls: unexpected extension %d in second ClientHello", id) 2548 } 2549 } 2550 2551 return nil 2552} 2553