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