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