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