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