Source file
src/crypto/tls/handshake_server.go
1
2
3
4
5 package tls
6
7 import (
8 "context"
9 "crypto"
10 "crypto/ecdsa"
11 "crypto/ed25519"
12 "crypto/rsa"
13 "crypto/subtle"
14 "crypto/tls/internal/fips140tls"
15 "crypto/x509"
16 "errors"
17 "fmt"
18 "hash"
19 "io"
20 "time"
21 )
22
23
24
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
42 func (c *Conn) serverHandshake(ctx context.Context) error {
43 clientHello, ech, err := c.readClientHello(ctx)
44 if err != nil {
45 return err
46 }
47
48 if c.vers == VersionTLS13 {
49 hs := serverHandshakeStateTLS13{
50 c: c,
51 ctx: ctx,
52 clientHello: clientHello,
53 echContext: ech,
54 }
55 return hs.handshake()
56 }
57
58 hs := serverHandshakeState{
59 c: c,
60 ctx: ctx,
61 clientHello: clientHello,
62 }
63 return hs.handshake()
64 }
65
66 func (hs *serverHandshakeState) handshake() error {
67 c := hs.c
68
69 if err := hs.processClientHello(); err != nil {
70 return err
71 }
72
73
74 c.buffering = true
75 if err := hs.checkForResumption(); err != nil {
76 return err
77 }
78 if hs.sessionState != nil {
79
80 if err := hs.doResumeHandshake(); err != nil {
81 return err
82 }
83 if err := hs.establishKeys(); err != nil {
84 return err
85 }
86 if err := hs.sendSessionTicket(); err != nil {
87 return err
88 }
89 if err := hs.sendFinished(c.serverFinished[:]); err != nil {
90 return err
91 }
92 if _, err := c.flush(); err != nil {
93 return err
94 }
95 c.clientFinishedIsFirst = false
96 if err := hs.readFinished(nil); err != nil {
97 return err
98 }
99 } else {
100
101
102 if err := hs.pickCipherSuite(); err != nil {
103 return err
104 }
105 if err := hs.doFullHandshake(); err != nil {
106 return err
107 }
108 if err := hs.establishKeys(); err != nil {
109 return err
110 }
111 if err := hs.readFinished(c.clientFinished[:]); err != nil {
112 return err
113 }
114 c.clientFinishedIsFirst = true
115 c.buffering = true
116 if err := hs.sendSessionTicket(); err != nil {
117 return err
118 }
119 if err := hs.sendFinished(nil); err != nil {
120 return err
121 }
122 if _, err := c.flush(); err != nil {
123 return err
124 }
125 }
126
127 c.ekm = ekmFromMasterSecret(c.vers, hs.suite, hs.masterSecret, hs.clientHello.random, hs.hello.random)
128 c.isHandshakeComplete.Store(true)
129
130 return nil
131 }
132
133
134 func (c *Conn) readClientHello(ctx context.Context) (*clientHelloMsg, *echServerContext, error) {
135
136
137 msg, err := c.readHandshake(nil)
138 if err != nil {
139 return nil, nil, err
140 }
141 clientHello, ok := msg.(*clientHelloMsg)
142 if !ok {
143 c.sendAlert(alertUnexpectedMessage)
144 return nil, nil, unexpectedMessageError(clientHello, msg)
145 }
146
147
148
149 var ech *echServerContext
150 if len(clientHello.encryptedClientHello) != 0 {
151 echKeys := c.config.EncryptedClientHelloKeys
152 if c.config.GetEncryptedClientHelloKeys != nil {
153 echKeys, err = c.config.GetEncryptedClientHelloKeys(clientHelloInfo(ctx, c, clientHello))
154 if err != nil {
155 c.sendAlert(alertInternalError)
156 return nil, nil, err
157 }
158 }
159 clientHello, ech, err = c.processECHClientHello(clientHello, echKeys)
160 if err != nil {
161 return nil, nil, err
162 }
163 }
164
165 var configForClient *Config
166 originalConfig := c.config
167 if c.config.GetConfigForClient != nil {
168 chi := clientHelloInfo(ctx, c, clientHello)
169 if configForClient, err = c.config.GetConfigForClient(chi); err != nil {
170 c.sendAlert(alertInternalError)
171 return nil, nil, err
172 } else if configForClient != nil {
173 c.config = configForClient
174 }
175 }
176 c.ticketKeys = originalConfig.ticketKeys(configForClient)
177
178 clientVersions := clientHello.supportedVersions
179 if clientHello.vers >= VersionTLS13 && len(clientVersions) == 0 {
180
181
182
183
184
185
186 clientVersions = supportedVersionsFromMax(VersionTLS12)
187 } else if len(clientVersions) == 0 {
188 clientVersions = supportedVersionsFromMax(clientHello.vers)
189 }
190 c.vers, ok = c.config.mutualVersion(roleServer, clientVersions)
191 if !ok {
192 c.sendAlert(alertProtocolVersion)
193 return nil, nil, fmt.Errorf("tls: client offered only unsupported versions: %x", clientVersions)
194 }
195 c.haveVers = true
196 c.in.version = c.vers
197 c.out.version = c.vers
198
199
200
201
202
203
204
205
206 if c.vers != VersionTLS13 && (ech != nil && !ech.inner) {
207 c.sendAlert(alertIllegalParameter)
208 return nil, nil, errors.New("tls: Encrypted Client Hello cannot be used pre-TLS 1.3")
209 }
210
211 if c.config.MinVersion == 0 && c.vers < VersionTLS12 {
212 tls10server.Value()
213 tls10server.IncNonDefault()
214 }
215
216 return clientHello, ech, nil
217 }
218
219 func (hs *serverHandshakeState) processClientHello() error {
220 c := hs.c
221
222 hs.hello = new(serverHelloMsg)
223 hs.hello.vers = c.vers
224
225 foundCompression := false
226
227 for _, compression := range hs.clientHello.compressionMethods {
228 if compression == compressionNone {
229 foundCompression = true
230 break
231 }
232 }
233
234 if !foundCompression {
235 c.sendAlert(alertIllegalParameter)
236 return errors.New("tls: client does not support uncompressed connections")
237 }
238
239 hs.hello.random = make([]byte, 32)
240 serverRandom := hs.hello.random
241
242 maxVers := c.config.maxSupportedVersion(roleServer)
243 if maxVers >= VersionTLS12 && c.vers < maxVers || testingOnlyForceDowngradeCanary {
244 if c.vers == VersionTLS12 {
245 copy(serverRandom[24:], downgradeCanaryTLS12)
246 } else {
247 copy(serverRandom[24:], downgradeCanaryTLS11)
248 }
249 serverRandom = serverRandom[:24]
250 }
251 _, err := io.ReadFull(c.config.rand(), serverRandom)
252 if err != nil {
253 c.sendAlert(alertInternalError)
254 return err
255 }
256
257 if len(hs.clientHello.secureRenegotiation) != 0 {
258 c.sendAlert(alertHandshakeFailure)
259 return errors.New("tls: initial handshake had non-empty renegotiation extension")
260 }
261
262 hs.hello.extendedMasterSecret = hs.clientHello.extendedMasterSecret
263 hs.hello.secureRenegotiationSupported = hs.clientHello.secureRenegotiationSupported
264 hs.hello.compressionMethod = compressionNone
265 if len(hs.clientHello.serverName) > 0 {
266 c.serverName = hs.clientHello.serverName
267 }
268
269 selectedProto, err := negotiateALPN(c.config.NextProtos, hs.clientHello.alpnProtocols, false)
270 if err != nil {
271 c.sendAlert(alertNoApplicationProtocol)
272 return err
273 }
274 hs.hello.alpnProtocol = selectedProto
275 c.clientProtocol = selectedProto
276
277 hs.cert, err = c.config.getCertificate(clientHelloInfo(hs.ctx, c, hs.clientHello))
278 if err != nil {
279 if err == errNoCertificates {
280 c.sendAlert(alertUnrecognizedName)
281 } else {
282 c.sendAlert(alertInternalError)
283 }
284 return err
285 }
286 if hs.clientHello.scts {
287 hs.hello.scts = hs.cert.SignedCertificateTimestamps
288 }
289
290 hs.ecdheOk, err = supportsECDHE(c.config, c.vers, hs.clientHello.supportedCurves, hs.clientHello.supportedPoints)
291 if err != nil {
292 c.sendAlert(alertMissingExtension)
293 return err
294 }
295
296 if hs.ecdheOk && len(hs.clientHello.supportedPoints) > 0 {
297
298
299
300
301
302 hs.hello.supportedPoints = []uint8{pointFormatUncompressed}
303 }
304
305 if priv, ok := hs.cert.PrivateKey.(crypto.Signer); ok {
306 switch priv.Public().(type) {
307 case *ecdsa.PublicKey:
308 hs.ecSignOk = true
309 case ed25519.PublicKey:
310 hs.ecSignOk = true
311 case *rsa.PublicKey:
312 hs.rsaSignOk = true
313 default:
314 c.sendAlert(alertInternalError)
315 return fmt.Errorf("tls: unsupported signing key type (%T)", priv.Public())
316 }
317 }
318 if priv, ok := hs.cert.PrivateKey.(crypto.Decrypter); ok {
319 switch priv.Public().(type) {
320 case *rsa.PublicKey:
321 hs.rsaDecryptOk = true
322 default:
323 c.sendAlert(alertInternalError)
324 return fmt.Errorf("tls: unsupported decryption key type (%T)", priv.Public())
325 }
326 }
327
328 return nil
329 }
330
331
332
333
334 func negotiateALPN(serverProtos, clientProtos []string, quic bool) (string, error) {
335 if len(serverProtos) == 0 || len(clientProtos) == 0 {
336 if quic && len(serverProtos) != 0 {
337
338 return "", fmt.Errorf("tls: client did not request an application protocol")
339 }
340 return "", nil
341 }
342 var http11fallback bool
343 for _, s := range serverProtos {
344 for _, c := range clientProtos {
345 if s == c {
346 return s, nil
347 }
348 if s == "h2" && c == "http/1.1" {
349 http11fallback = true
350 }
351 }
352 }
353
354
355
356
357 if http11fallback {
358 return "", nil
359 }
360 return "", fmt.Errorf("tls: client requested unsupported application protocols (%s)", clientProtos)
361 }
362
363
364
365 func supportsECDHE(c *Config, version uint16, supportedCurves []CurveID, supportedPoints []uint8) (bool, error) {
366 supportsCurve := false
367 for _, curve := range supportedCurves {
368 if c.supportsCurve(version, curve) {
369 supportsCurve = true
370 break
371 }
372 }
373
374 supportsPointFormat := false
375 offeredNonCompressedFormat := false
376 for _, pointFormat := range supportedPoints {
377 if pointFormat == pointFormatUncompressed {
378 supportsPointFormat = true
379 } else {
380 offeredNonCompressedFormat = true
381 }
382 }
383
384
385
386
387 if len(supportedPoints) == 0 {
388 supportsPointFormat = true
389 } else if offeredNonCompressedFormat && !supportsPointFormat {
390 return false, errors.New("tls: client offered only incompatible point formats")
391 }
392
393 return supportsCurve && supportsPointFormat, nil
394 }
395
396 func (hs *serverHandshakeState) pickCipherSuite() error {
397 c := hs.c
398
399 preferenceList := c.config.cipherSuites(isAESGCMPreferred(hs.clientHello.cipherSuites))
400
401 hs.suite = selectCipherSuite(preferenceList, hs.clientHello.cipherSuites, hs.cipherSuiteOk)
402 if hs.suite == nil {
403 c.sendAlert(alertHandshakeFailure)
404 return fmt.Errorf("tls: no cipher suite supported by both client and server; client offered: %x",
405 hs.clientHello.cipherSuites)
406 }
407 c.cipherSuite = hs.suite.id
408
409 if c.config.CipherSuites == nil && !fips140tls.Required() && rsaKexCiphers[hs.suite.id] {
410 tlsrsakex.Value()
411 tlsrsakex.IncNonDefault()
412 }
413 if c.config.CipherSuites == nil && !fips140tls.Required() && tdesCiphers[hs.suite.id] {
414 tls3des.Value()
415 tls3des.IncNonDefault()
416 }
417
418 for _, id := range hs.clientHello.cipherSuites {
419 if id == TLS_FALLBACK_SCSV {
420
421 if hs.clientHello.vers < c.config.maxSupportedVersion(roleServer) {
422 c.sendAlert(alertInappropriateFallback)
423 return errors.New("tls: client using inappropriate protocol fallback")
424 }
425 break
426 }
427 }
428
429 return nil
430 }
431
432 func (hs *serverHandshakeState) cipherSuiteOk(c *cipherSuite) bool {
433 if c.flags&suiteECDHE != 0 {
434 if !hs.ecdheOk {
435 return false
436 }
437 if c.flags&suiteECSign != 0 {
438 if !hs.ecSignOk {
439 return false
440 }
441 } else if !hs.rsaSignOk {
442 return false
443 }
444 } else if !hs.rsaDecryptOk {
445 return false
446 }
447 if hs.c.vers < VersionTLS12 && c.flags&suiteTLS12 != 0 {
448 return false
449 }
450 return true
451 }
452
453
454 func (hs *serverHandshakeState) checkForResumption() error {
455 c := hs.c
456
457 if c.config.SessionTicketsDisabled {
458 return nil
459 }
460
461 var sessionState *SessionState
462 if c.config.UnwrapSession != nil {
463 ss, err := c.config.UnwrapSession(hs.clientHello.sessionTicket, c.connectionStateLocked())
464 if err != nil {
465 return err
466 }
467 if ss == nil {
468 return nil
469 }
470 sessionState = ss
471 } else {
472 plaintext := c.config.decryptTicket(hs.clientHello.sessionTicket, c.ticketKeys)
473 if plaintext == nil {
474 return nil
475 }
476 ss, err := ParseSessionState(plaintext)
477 if err != nil {
478 return nil
479 }
480 sessionState = ss
481 }
482
483
484
485
486 createdAt := time.Unix(int64(sessionState.createdAt), 0)
487 if c.config.time().Sub(createdAt) > maxSessionTicketLifetime {
488 return nil
489 }
490
491
492 if c.vers != sessionState.version {
493 return nil
494 }
495
496 cipherSuiteOk := false
497
498 for _, id := range hs.clientHello.cipherSuites {
499 if id == sessionState.cipherSuite {
500 cipherSuiteOk = true
501 break
502 }
503 }
504 if !cipherSuiteOk {
505 return nil
506 }
507
508
509 suite := selectCipherSuite([]uint16{sessionState.cipherSuite},
510 c.config.supportedCipherSuites(), hs.cipherSuiteOk)
511 if suite == nil {
512 return nil
513 }
514
515 sessionHasClientCerts := len(sessionState.peerCertificates) != 0
516 needClientCerts := requiresClientCert(c.config.ClientAuth)
517 if needClientCerts && !sessionHasClientCerts {
518 return nil
519 }
520 if sessionHasClientCerts && c.config.ClientAuth == NoClientCert {
521 return nil
522 }
523 if sessionHasClientCerts && c.config.time().After(sessionState.peerCertificates[0].NotAfter) {
524 return nil
525 }
526 if sessionHasClientCerts && c.config.ClientAuth >= VerifyClientCertIfGiven &&
527 len(sessionState.verifiedChains) == 0 {
528 return nil
529 }
530
531
532 if !sessionState.extMasterSecret && hs.clientHello.extendedMasterSecret {
533 return nil
534 }
535 if sessionState.extMasterSecret && !hs.clientHello.extendedMasterSecret {
536
537
538 return errors.New("tls: session supported extended_master_secret but client does not")
539 }
540 if !sessionState.extMasterSecret && fips140tls.Required() {
541
542 return nil
543 }
544
545 c.peerCertificates = sessionState.peerCertificates
546 c.ocspResponse = sessionState.ocspResponse
547 c.scts = sessionState.scts
548 c.verifiedChains = sessionState.verifiedChains
549 c.extMasterSecret = sessionState.extMasterSecret
550 hs.sessionState = sessionState
551 hs.suite = suite
552 c.curveID = sessionState.curveID
553 c.didResume = true
554 return nil
555 }
556
557 func (hs *serverHandshakeState) doResumeHandshake() error {
558 c := hs.c
559
560 hs.hello.cipherSuite = hs.suite.id
561 c.cipherSuite = hs.suite.id
562
563
564 hs.hello.sessionId = hs.clientHello.sessionId
565
566
567
568 hs.hello.ticketSupported = true
569 hs.finishedHash = newFinishedHash(c.vers, hs.suite)
570 hs.finishedHash.discardHandshakeBuffer()
571 if err := transcriptMsg(hs.clientHello, &hs.finishedHash); err != nil {
572 return err
573 }
574 if _, err := hs.c.writeHandshakeRecord(hs.hello, &hs.finishedHash); err != nil {
575 return err
576 }
577
578 if c.config.VerifyConnection != nil {
579 if err := c.config.VerifyConnection(c.connectionStateLocked()); err != nil {
580 c.sendAlert(alertBadCertificate)
581 return err
582 }
583 }
584
585 hs.masterSecret = hs.sessionState.secret
586
587 return nil
588 }
589
590 func (hs *serverHandshakeState) doFullHandshake() error {
591 c := hs.c
592
593 if hs.clientHello.ocspStapling && len(hs.cert.OCSPStaple) > 0 {
594 hs.hello.ocspStapling = true
595 }
596
597 if hs.clientHello.serverName != "" {
598 hs.hello.serverNameAck = true
599 }
600
601 hs.hello.ticketSupported = hs.clientHello.ticketSupported && !c.config.SessionTicketsDisabled
602 hs.hello.cipherSuite = hs.suite.id
603
604 hs.finishedHash = newFinishedHash(hs.c.vers, hs.suite)
605 if c.config.ClientAuth == NoClientCert {
606
607
608 hs.finishedHash.discardHandshakeBuffer()
609 }
610 if err := transcriptMsg(hs.clientHello, &hs.finishedHash); err != nil {
611 return err
612 }
613 if _, err := hs.c.writeHandshakeRecord(hs.hello, &hs.finishedHash); err != nil {
614 return err
615 }
616
617 certMsg := new(certificateMsg)
618 certMsg.certificates = hs.cert.Certificate
619 if _, err := hs.c.writeHandshakeRecord(certMsg, &hs.finishedHash); err != nil {
620 return err
621 }
622
623 if hs.hello.ocspStapling {
624 certStatus := new(certificateStatusMsg)
625 certStatus.response = hs.cert.OCSPStaple
626 if _, err := hs.c.writeHandshakeRecord(certStatus, &hs.finishedHash); err != nil {
627 return err
628 }
629 }
630
631 keyAgreement := hs.suite.ka(c.vers)
632 skx, err := keyAgreement.generateServerKeyExchange(c.config, hs.cert, hs.clientHello, hs.hello)
633 if err != nil {
634 c.sendAlert(alertHandshakeFailure)
635 return err
636 }
637 if skx != nil {
638 if keyAgreement, ok := keyAgreement.(*ecdheKeyAgreement); ok {
639 c.curveID = keyAgreement.curveID
640 c.peerSigAlg = keyAgreement.signatureAlgorithm
641 }
642 if _, err := hs.c.writeHandshakeRecord(skx, &hs.finishedHash); err != nil {
643 return err
644 }
645 }
646
647 var certReq *certificateRequestMsg
648 if c.config.ClientAuth >= RequestClientCert {
649
650 certReq = new(certificateRequestMsg)
651 certReq.certificateTypes = []byte{
652 byte(certTypeRSASign),
653 byte(certTypeECDSASign),
654 }
655 if c.vers >= VersionTLS12 {
656 certReq.hasSignatureAlgorithm = true
657 certReq.supportedSignatureAlgorithms = supportedSignatureAlgorithms(c.vers)
658 }
659
660
661
662
663
664
665 if c.config.ClientCAs != nil {
666 certReq.certificateAuthorities = c.config.ClientCAs.Subjects()
667 }
668 if _, err := hs.c.writeHandshakeRecord(certReq, &hs.finishedHash); err != nil {
669 return err
670 }
671 }
672
673 helloDone := new(serverHelloDoneMsg)
674 if _, err := hs.c.writeHandshakeRecord(helloDone, &hs.finishedHash); err != nil {
675 return err
676 }
677
678 if _, err := c.flush(); err != nil {
679 return err
680 }
681
682 var pub crypto.PublicKey
683
684 msg, err := c.readHandshake(&hs.finishedHash)
685 if err != nil {
686 return err
687 }
688
689
690
691 if c.config.ClientAuth >= RequestClientCert {
692 certMsg, ok := msg.(*certificateMsg)
693 if !ok {
694 c.sendAlert(alertUnexpectedMessage)
695 return unexpectedMessageError(certMsg, msg)
696 }
697
698 if err := c.processCertsFromClient(Certificate{
699 Certificate: certMsg.certificates,
700 }); err != nil {
701 return err
702 }
703 if len(certMsg.certificates) != 0 {
704 pub = c.peerCertificates[0].PublicKey
705 }
706
707 msg, err = c.readHandshake(&hs.finishedHash)
708 if err != nil {
709 return err
710 }
711 }
712 if c.config.VerifyConnection != nil {
713 if err := c.config.VerifyConnection(c.connectionStateLocked()); err != nil {
714 c.sendAlert(alertBadCertificate)
715 return err
716 }
717 }
718
719
720 ckx, ok := msg.(*clientKeyExchangeMsg)
721 if !ok {
722 c.sendAlert(alertUnexpectedMessage)
723 return unexpectedMessageError(ckx, msg)
724 }
725
726 preMasterSecret, err := keyAgreement.processClientKeyExchange(c.config, hs.cert, ckx, c.vers)
727 if err != nil {
728 c.sendAlert(alertIllegalParameter)
729 return err
730 }
731 if hs.hello.extendedMasterSecret {
732 c.extMasterSecret = true
733 hs.masterSecret = extMasterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret,
734 hs.finishedHash.Sum())
735 } else {
736 if fips140tls.Required() {
737 c.sendAlert(alertHandshakeFailure)
738 return errors.New("tls: FIPS 140-3 requires the use of Extended Master Secret")
739 }
740 hs.masterSecret = masterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret,
741 hs.clientHello.random, hs.hello.random)
742 }
743 if err := c.config.writeKeyLog(keyLogLabelTLS12, hs.clientHello.random, hs.masterSecret); err != nil {
744 c.sendAlert(alertInternalError)
745 return err
746 }
747
748
749
750
751
752
753
754 if len(c.peerCertificates) > 0 {
755
756
757
758 msg, err = c.readHandshake(nil)
759 if err != nil {
760 return err
761 }
762 certVerify, ok := msg.(*certificateVerifyMsg)
763 if !ok {
764 c.sendAlert(alertUnexpectedMessage)
765 return unexpectedMessageError(certVerify, msg)
766 }
767
768 var sigType uint8
769 var sigHash crypto.Hash
770 if c.vers >= VersionTLS12 {
771 if !isSupportedSignatureAlgorithm(certVerify.signatureAlgorithm, certReq.supportedSignatureAlgorithms) {
772 c.sendAlert(alertIllegalParameter)
773 return errors.New("tls: client certificate used with invalid signature algorithm")
774 }
775 sigType, sigHash, err = typeAndHashFromSignatureScheme(certVerify.signatureAlgorithm)
776 if err != nil {
777 return c.sendAlert(alertInternalError)
778 }
779 if sigHash == crypto.SHA1 {
780 tlssha1.Value()
781 tlssha1.IncNonDefault()
782 }
783 } else {
784 sigType, sigHash, err = legacyTypeAndHashFromPublicKey(pub)
785 if err != nil {
786 c.sendAlert(alertIllegalParameter)
787 return err
788 }
789 }
790
791 signed := hs.finishedHash.hashForClientCertificate(sigType, sigHash)
792 if err := verifyHandshakeSignature(sigType, pub, sigHash, signed, certVerify.signature); err != nil {
793 c.sendAlert(alertDecryptError)
794 return errors.New("tls: invalid signature by the client certificate: " + err.Error())
795 }
796 c.peerSigAlg = certVerify.signatureAlgorithm
797
798 if err := transcriptMsg(certVerify, &hs.finishedHash); err != nil {
799 return err
800 }
801 }
802
803 hs.finishedHash.discardHandshakeBuffer()
804
805 return nil
806 }
807
808 func (hs *serverHandshakeState) establishKeys() error {
809 c := hs.c
810
811 clientMAC, serverMAC, clientKey, serverKey, clientIV, serverIV :=
812 keysFromMasterSecret(c.vers, hs.suite, hs.masterSecret, hs.clientHello.random, hs.hello.random, hs.suite.macLen, hs.suite.keyLen, hs.suite.ivLen)
813
814 var clientCipher, serverCipher any
815 var clientHash, serverHash hash.Hash
816
817 if hs.suite.aead == nil {
818 clientCipher = hs.suite.cipher(clientKey, clientIV, true )
819 clientHash = hs.suite.mac(clientMAC)
820 serverCipher = hs.suite.cipher(serverKey, serverIV, false )
821 serverHash = hs.suite.mac(serverMAC)
822 } else {
823 clientCipher = hs.suite.aead(clientKey, clientIV)
824 serverCipher = hs.suite.aead(serverKey, serverIV)
825 }
826
827 c.in.prepareCipherSpec(c.vers, clientCipher, clientHash)
828 c.out.prepareCipherSpec(c.vers, serverCipher, serverHash)
829
830 return nil
831 }
832
833 func (hs *serverHandshakeState) readFinished(out []byte) error {
834 c := hs.c
835
836 if err := c.readChangeCipherSpec(); err != nil {
837 return err
838 }
839
840
841
842
843 msg, err := c.readHandshake(nil)
844 if err != nil {
845 return err
846 }
847 clientFinished, ok := msg.(*finishedMsg)
848 if !ok {
849 c.sendAlert(alertUnexpectedMessage)
850 return unexpectedMessageError(clientFinished, msg)
851 }
852
853 verify := hs.finishedHash.clientSum(hs.masterSecret)
854 if len(verify) != len(clientFinished.verifyData) ||
855 subtle.ConstantTimeCompare(verify, clientFinished.verifyData) != 1 {
856 c.sendAlert(alertHandshakeFailure)
857 return errors.New("tls: client's Finished message is incorrect")
858 }
859
860 if err := transcriptMsg(clientFinished, &hs.finishedHash); err != nil {
861 return err
862 }
863
864 copy(out, verify)
865 return nil
866 }
867
868 func (hs *serverHandshakeState) sendSessionTicket() error {
869 if !hs.hello.ticketSupported {
870 return nil
871 }
872
873 c := hs.c
874 m := new(newSessionTicketMsg)
875
876 state := c.sessionState()
877 state.secret = hs.masterSecret
878 if hs.sessionState != nil {
879
880
881 state.createdAt = hs.sessionState.createdAt
882 }
883 if c.config.WrapSession != nil {
884 var err error
885 m.ticket, err = c.config.WrapSession(c.connectionStateLocked(), state)
886 if err != nil {
887 return err
888 }
889 } else {
890 stateBytes, err := state.Bytes()
891 if err != nil {
892 return err
893 }
894 m.ticket, err = c.config.encryptTicket(stateBytes, c.ticketKeys)
895 if err != nil {
896 return err
897 }
898 }
899
900 if _, err := hs.c.writeHandshakeRecord(m, &hs.finishedHash); err != nil {
901 return err
902 }
903
904 return nil
905 }
906
907 func (hs *serverHandshakeState) sendFinished(out []byte) error {
908 c := hs.c
909
910 if err := c.writeChangeCipherRecord(); err != nil {
911 return err
912 }
913
914 finished := new(finishedMsg)
915 finished.verifyData = hs.finishedHash.serverSum(hs.masterSecret)
916 if _, err := hs.c.writeHandshakeRecord(finished, &hs.finishedHash); err != nil {
917 return err
918 }
919
920 copy(out, finished.verifyData)
921
922 return nil
923 }
924
925
926
927 func (c *Conn) processCertsFromClient(certificate Certificate) error {
928 certificates := certificate.Certificate
929 certs := make([]*x509.Certificate, len(certificates))
930 var err error
931 for i, asn1Data := range certificates {
932 if certs[i], err = x509.ParseCertificate(asn1Data); err != nil {
933 c.sendAlert(alertDecodeError)
934 return errors.New("tls: failed to parse client certificate: " + err.Error())
935 }
936 if certs[i].PublicKeyAlgorithm == x509.RSA {
937 n := certs[i].PublicKey.(*rsa.PublicKey).N.BitLen()
938 if max, ok := checkKeySize(n); !ok {
939 c.sendAlert(alertBadCertificate)
940 return fmt.Errorf("tls: client sent certificate containing RSA key larger than %d bits", max)
941 }
942 }
943 }
944
945 if len(certs) == 0 && requiresClientCert(c.config.ClientAuth) {
946 if c.vers == VersionTLS13 {
947 c.sendAlert(alertCertificateRequired)
948 } else {
949 c.sendAlert(alertHandshakeFailure)
950 }
951 return errors.New("tls: client didn't provide a certificate")
952 }
953
954 if c.config.ClientAuth >= VerifyClientCertIfGiven && len(certs) > 0 {
955 opts := x509.VerifyOptions{
956 Roots: c.config.ClientCAs,
957 CurrentTime: c.config.time(),
958 Intermediates: x509.NewCertPool(),
959 KeyUsages: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth},
960 }
961
962 for _, cert := range certs[1:] {
963 opts.Intermediates.AddCert(cert)
964 }
965
966 chains, err := certs[0].Verify(opts)
967 if err != nil {
968 var errCertificateInvalid x509.CertificateInvalidError
969 if errors.As(err, &x509.UnknownAuthorityError{}) {
970 c.sendAlert(alertUnknownCA)
971 } else if errors.As(err, &errCertificateInvalid) && errCertificateInvalid.Reason == x509.Expired {
972 c.sendAlert(alertCertificateExpired)
973 } else {
974 c.sendAlert(alertBadCertificate)
975 }
976 return &CertificateVerificationError{UnverifiedCertificates: certs, Err: err}
977 }
978
979 c.verifiedChains, err = fipsAllowedChains(chains)
980 if err != nil {
981 c.sendAlert(alertBadCertificate)
982 return &CertificateVerificationError{UnverifiedCertificates: certs, Err: err}
983 }
984 }
985
986 c.peerCertificates = certs
987 c.ocspResponse = certificate.OCSPStaple
988 c.scts = certificate.SignedCertificateTimestamps
989
990 if len(certs) > 0 {
991 switch certs[0].PublicKey.(type) {
992 case *ecdsa.PublicKey, *rsa.PublicKey, ed25519.PublicKey:
993 default:
994 c.sendAlert(alertUnsupportedCertificate)
995 return fmt.Errorf("tls: client certificate contains an unsupported public key of type %T", certs[0].PublicKey)
996 }
997 }
998
999 if c.config.VerifyPeerCertificate != nil {
1000 if err := c.config.VerifyPeerCertificate(certificates, c.verifiedChains); err != nil {
1001 c.sendAlert(alertBadCertificate)
1002 return err
1003 }
1004 }
1005
1006 return nil
1007 }
1008
1009 func clientHelloInfo(ctx context.Context, c *Conn, clientHello *clientHelloMsg) *ClientHelloInfo {
1010 supportedVersions := clientHello.supportedVersions
1011 if len(clientHello.supportedVersions) == 0 {
1012 supportedVersions = supportedVersionsFromMax(clientHello.vers)
1013 }
1014
1015 return &ClientHelloInfo{
1016 CipherSuites: clientHello.cipherSuites,
1017 ServerName: clientHello.serverName,
1018 SupportedCurves: clientHello.supportedCurves,
1019 SupportedPoints: clientHello.supportedPoints,
1020 SignatureSchemes: clientHello.supportedSignatureAlgorithms,
1021 SupportedProtos: clientHello.alpnProtocols,
1022 SupportedVersions: supportedVersions,
1023 Extensions: clientHello.extensions,
1024 Conn: c.conn,
1025 config: c.config,
1026 ctx: ctx,
1027 }
1028 }
1029
View as plain text