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