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