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