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