Source file
src/crypto/tls/handshake_client.go
1
2
3
4
5 package tls
6
7 import (
8 "bytes"
9 "context"
10 "crypto"
11 "crypto/ecdsa"
12 "crypto/ed25519"
13 "crypto/internal/fips140/mlkem"
14 "crypto/internal/fips140/tls13"
15 "crypto/internal/hpke"
16 "crypto/rsa"
17 "crypto/subtle"
18 "crypto/tls/internal/fips140tls"
19 "crypto/x509"
20 "errors"
21 "fmt"
22 "hash"
23 "internal/byteorder"
24 "internal/godebug"
25 "io"
26 "net"
27 "slices"
28 "strconv"
29 "strings"
30 "time"
31 )
32
33 type clientHandshakeState struct {
34 c *Conn
35 ctx context.Context
36 serverHello *serverHelloMsg
37 hello *clientHelloMsg
38 suite *cipherSuite
39 finishedHash finishedHash
40 masterSecret []byte
41 session *SessionState
42 ticket []byte
43 }
44
45 var testingOnlyForceClientHelloSignatureAlgorithms []SignatureScheme
46
47 func (c *Conn) makeClientHello() (*clientHelloMsg, *keySharePrivateKeys, *echClientContext, error) {
48 config := c.config
49 if len(config.ServerName) == 0 && !config.InsecureSkipVerify {
50 return nil, nil, nil, errors.New("tls: either ServerName or InsecureSkipVerify must be specified in the tls.Config")
51 }
52
53 nextProtosLength := 0
54 for _, proto := range config.NextProtos {
55 if l := len(proto); l == 0 || l > 255 {
56 return nil, nil, nil, errors.New("tls: invalid NextProtos value")
57 } else {
58 nextProtosLength += 1 + l
59 }
60 }
61 if nextProtosLength > 0xffff {
62 return nil, nil, nil, errors.New("tls: NextProtos values too large")
63 }
64
65 supportedVersions := config.supportedVersions(roleClient)
66 if len(supportedVersions) == 0 {
67 return nil, nil, nil, errors.New("tls: no supported versions satisfy MinVersion and MaxVersion")
68 }
69 maxVersion := config.maxSupportedVersion(roleClient)
70
71 hello := &clientHelloMsg{
72 vers: maxVersion,
73 compressionMethods: []uint8{compressionNone},
74 random: make([]byte, 32),
75 extendedMasterSecret: true,
76 ocspStapling: true,
77 scts: true,
78 serverName: hostnameInSNI(config.ServerName),
79 supportedCurves: config.curvePreferences(maxVersion),
80 supportedPoints: []uint8{pointFormatUncompressed},
81 secureRenegotiationSupported: true,
82 alpnProtocols: config.NextProtos,
83 supportedVersions: supportedVersions,
84 }
85
86
87
88
89 if hello.vers > VersionTLS12 {
90 hello.vers = VersionTLS12
91 }
92
93 if c.handshakes > 0 {
94 hello.secureRenegotiation = c.clientFinished[:]
95 }
96
97 hello.cipherSuites = config.cipherSuites(hasAESGCMHardwareSupport)
98
99 if maxVersion < VersionTLS12 {
100 hello.cipherSuites = slices.DeleteFunc(hello.cipherSuites, func(id uint16) bool {
101 return cipherSuiteByID(id).flags&suiteTLS12 != 0
102 })
103 }
104
105 _, err := io.ReadFull(config.rand(), hello.random)
106 if err != nil {
107 return nil, nil, nil, errors.New("tls: short read from Rand: " + err.Error())
108 }
109
110
111
112
113
114
115 if c.quic == nil {
116 hello.sessionId = make([]byte, 32)
117 if _, err := io.ReadFull(config.rand(), hello.sessionId); err != nil {
118 return nil, nil, nil, errors.New("tls: short read from Rand: " + err.Error())
119 }
120 }
121
122 if maxVersion >= VersionTLS12 {
123 hello.supportedSignatureAlgorithms = supportedSignatureAlgorithms()
124 }
125 if testingOnlyForceClientHelloSignatureAlgorithms != nil {
126 hello.supportedSignatureAlgorithms = testingOnlyForceClientHelloSignatureAlgorithms
127 }
128
129 var keyShareKeys *keySharePrivateKeys
130 if hello.supportedVersions[0] == VersionTLS13 {
131
132 if len(hello.supportedVersions) == 1 {
133 hello.cipherSuites = nil
134 }
135 if fips140tls.Required() {
136 hello.cipherSuites = append(hello.cipherSuites, allowedCipherSuitesTLS13FIPS...)
137 } else if hasAESGCMHardwareSupport {
138 hello.cipherSuites = append(hello.cipherSuites, defaultCipherSuitesTLS13...)
139 } else {
140 hello.cipherSuites = append(hello.cipherSuites, defaultCipherSuitesTLS13NoAES...)
141 }
142
143 if len(hello.supportedCurves) == 0 {
144 return nil, nil, nil, errors.New("tls: no supported elliptic curves for ECDHE")
145 }
146 curveID := hello.supportedCurves[0]
147 keyShareKeys = &keySharePrivateKeys{curveID: curveID}
148
149
150 if curveID == X25519MLKEM768 {
151 keyShareKeys.ecdhe, err = generateECDHEKey(config.rand(), X25519)
152 if err != nil {
153 return nil, nil, nil, err
154 }
155 seed := make([]byte, mlkem.SeedSize)
156 if _, err := io.ReadFull(config.rand(), seed); err != nil {
157 return nil, nil, nil, err
158 }
159 keyShareKeys.mlkem, err = mlkem.NewDecapsulationKey768(seed)
160 if err != nil {
161 return nil, nil, nil, err
162 }
163 mlkemEncapsulationKey := keyShareKeys.mlkem.EncapsulationKey().Bytes()
164 x25519EphemeralKey := keyShareKeys.ecdhe.PublicKey().Bytes()
165 hello.keyShares = []keyShare{
166 {group: X25519MLKEM768, data: append(mlkemEncapsulationKey, x25519EphemeralKey...)},
167 }
168
169
170
171 if slices.Contains(hello.supportedCurves, X25519) {
172 hello.keyShares = append(hello.keyShares, keyShare{group: X25519, data: x25519EphemeralKey})
173 }
174 } else {
175 if _, ok := curveForCurveID(curveID); !ok {
176 return nil, nil, nil, errors.New("tls: CurvePreferences includes unsupported curve")
177 }
178 keyShareKeys.ecdhe, err = generateECDHEKey(config.rand(), curveID)
179 if err != nil {
180 return nil, nil, nil, err
181 }
182 hello.keyShares = []keyShare{{group: curveID, data: keyShareKeys.ecdhe.PublicKey().Bytes()}}
183 }
184 }
185
186 if c.quic != nil {
187 p, err := c.quicGetTransportParameters()
188 if err != nil {
189 return nil, nil, nil, err
190 }
191 if p == nil {
192 p = []byte{}
193 }
194 hello.quicTransportParameters = p
195 }
196
197 var ech *echClientContext
198 if c.config.EncryptedClientHelloConfigList != nil {
199 if c.config.MinVersion != 0 && c.config.MinVersion < VersionTLS13 {
200 return nil, nil, nil, errors.New("tls: MinVersion must be >= VersionTLS13 if EncryptedClientHelloConfigList is populated")
201 }
202 if c.config.MaxVersion != 0 && c.config.MaxVersion <= VersionTLS12 {
203 return nil, nil, nil, errors.New("tls: MaxVersion must be >= VersionTLS13 if EncryptedClientHelloConfigList is populated")
204 }
205 echConfigs, err := parseECHConfigList(c.config.EncryptedClientHelloConfigList)
206 if err != nil {
207 return nil, nil, nil, err
208 }
209 echConfig := pickECHConfig(echConfigs)
210 if echConfig == nil {
211 return nil, nil, nil, errors.New("tls: EncryptedClientHelloConfigList contains no valid configs")
212 }
213 ech = &echClientContext{config: echConfig}
214 hello.encryptedClientHello = []byte{1}
215
216
217
218 hello.supportedPoints = nil
219 hello.ticketSupported = false
220 hello.secureRenegotiationSupported = false
221 hello.extendedMasterSecret = false
222
223 echPK, err := hpke.ParseHPKEPublicKey(ech.config.KemID, ech.config.PublicKey)
224 if err != nil {
225 return nil, nil, nil, err
226 }
227 suite, err := pickECHCipherSuite(ech.config.SymmetricCipherSuite)
228 if err != nil {
229 return nil, nil, nil, err
230 }
231 ech.kdfID, ech.aeadID = suite.KDFID, suite.AEADID
232 info := append([]byte("tls ech\x00"), ech.config.raw...)
233 ech.encapsulatedKey, ech.hpkeContext, err = hpke.SetupSender(ech.config.KemID, suite.KDFID, suite.AEADID, echPK, info)
234 if err != nil {
235 return nil, nil, nil, err
236 }
237 }
238
239 return hello, keyShareKeys, ech, nil
240 }
241
242 type echClientContext struct {
243 config *echConfig
244 hpkeContext *hpke.Sender
245 encapsulatedKey []byte
246 innerHello *clientHelloMsg
247 innerTranscript hash.Hash
248 kdfID uint16
249 aeadID uint16
250 echRejected bool
251 retryConfigs []byte
252 }
253
254 func (c *Conn) clientHandshake(ctx context.Context) (err error) {
255 if c.config == nil {
256 c.config = defaultConfig()
257 }
258
259
260
261 c.didResume = false
262 c.curveID = 0
263
264 hello, keyShareKeys, ech, err := c.makeClientHello()
265 if err != nil {
266 return err
267 }
268
269 session, earlySecret, binderKey, err := c.loadSession(hello)
270 if err != nil {
271 return err
272 }
273 if session != nil {
274 defer func() {
275
276
277
278
279
280
281 if err != nil {
282 if cacheKey := c.clientSessionCacheKey(); cacheKey != "" {
283 c.config.ClientSessionCache.Put(cacheKey, nil)
284 }
285 }
286 }()
287 }
288
289 if ech != nil {
290
291 ech.innerHello = hello.clone()
292
293
294
295 hello.serverName = string(ech.config.PublicName)
296
297 hello.random = make([]byte, 32)
298 _, err = io.ReadFull(c.config.rand(), hello.random)
299 if err != nil {
300 return errors.New("tls: short read from Rand: " + err.Error())
301 }
302
303
304
305
306
307 if err := computeAndUpdateOuterECHExtension(hello, ech.innerHello, ech, true); err != nil {
308 return err
309 }
310 }
311
312 c.serverName = hello.serverName
313
314 if _, err := c.writeHandshakeRecord(hello, nil); err != nil {
315 return err
316 }
317
318 if hello.earlyData {
319 suite := cipherSuiteTLS13ByID(session.cipherSuite)
320 transcript := suite.hash.New()
321 if err := transcriptMsg(hello, transcript); err != nil {
322 return err
323 }
324 earlyTrafficSecret := earlySecret.ClientEarlyTrafficSecret(transcript)
325 c.quicSetWriteSecret(QUICEncryptionLevelEarly, suite.id, earlyTrafficSecret)
326 }
327
328
329 msg, err := c.readHandshake(nil)
330 if err != nil {
331 return err
332 }
333
334 serverHello, ok := msg.(*serverHelloMsg)
335 if !ok {
336 c.sendAlert(alertUnexpectedMessage)
337 return unexpectedMessageError(serverHello, msg)
338 }
339
340 if err := c.pickTLSVersion(serverHello); err != nil {
341 return err
342 }
343
344
345
346
347 maxVers := c.config.maxSupportedVersion(roleClient)
348 tls12Downgrade := string(serverHello.random[24:]) == downgradeCanaryTLS12
349 tls11Downgrade := string(serverHello.random[24:]) == downgradeCanaryTLS11
350 if maxVers == VersionTLS13 && c.vers <= VersionTLS12 && (tls12Downgrade || tls11Downgrade) ||
351 maxVers == VersionTLS12 && c.vers <= VersionTLS11 && tls11Downgrade {
352 c.sendAlert(alertIllegalParameter)
353 return errors.New("tls: downgrade attempt detected, possibly due to a MitM attack or a broken middlebox")
354 }
355
356 if c.vers == VersionTLS13 {
357 hs := &clientHandshakeStateTLS13{
358 c: c,
359 ctx: ctx,
360 serverHello: serverHello,
361 hello: hello,
362 keyShareKeys: keyShareKeys,
363 session: session,
364 earlySecret: earlySecret,
365 binderKey: binderKey,
366 echContext: ech,
367 }
368 return hs.handshake()
369 }
370
371 hs := &clientHandshakeState{
372 c: c,
373 ctx: ctx,
374 serverHello: serverHello,
375 hello: hello,
376 session: session,
377 }
378 return hs.handshake()
379 }
380
381 func (c *Conn) loadSession(hello *clientHelloMsg) (
382 session *SessionState, earlySecret *tls13.EarlySecret, binderKey []byte, err error) {
383 if c.config.SessionTicketsDisabled || c.config.ClientSessionCache == nil {
384 return nil, nil, nil, nil
385 }
386
387 echInner := bytes.Equal(hello.encryptedClientHello, []byte{1})
388
389
390
391 hello.ticketSupported = true && !echInner
392
393 if hello.supportedVersions[0] == VersionTLS13 {
394
395
396 hello.pskModes = []uint8{pskModeDHE}
397 }
398
399
400
401
402 if c.handshakes != 0 {
403 return nil, nil, nil, nil
404 }
405
406
407 cacheKey := c.clientSessionCacheKey()
408 if cacheKey == "" {
409 return nil, nil, nil, nil
410 }
411 cs, ok := c.config.ClientSessionCache.Get(cacheKey)
412 if !ok || cs == nil {
413 return nil, nil, nil, nil
414 }
415 session = cs.session
416
417
418 versOk := false
419 for _, v := range hello.supportedVersions {
420 if v == session.version {
421 versOk = true
422 break
423 }
424 }
425 if !versOk {
426 return nil, nil, nil, nil
427 }
428
429
430
431
432 if c.config.time().After(session.peerCertificates[0].NotAfter) {
433
434 c.config.ClientSessionCache.Put(cacheKey, nil)
435 return nil, nil, nil, nil
436 }
437 if !c.config.InsecureSkipVerify {
438 if len(session.verifiedChains) == 0 {
439
440 return nil, nil, nil, nil
441 }
442 if err := session.peerCertificates[0].VerifyHostname(c.config.ServerName); err != nil {
443 return nil, nil, nil, nil
444 }
445 }
446
447 if session.version != VersionTLS13 {
448
449
450 if mutualCipherSuite(hello.cipherSuites, session.cipherSuite) == nil {
451 return nil, nil, nil, nil
452 }
453
454
455 if !session.extMasterSecret && fips140tls.Required() {
456 return nil, nil, nil, nil
457 }
458
459 hello.sessionTicket = session.ticket
460 return
461 }
462
463
464 if c.config.time().After(time.Unix(int64(session.useBy), 0)) {
465 c.config.ClientSessionCache.Put(cacheKey, nil)
466 return nil, nil, nil, nil
467 }
468
469
470
471 cipherSuite := cipherSuiteTLS13ByID(session.cipherSuite)
472 if cipherSuite == nil {
473 return nil, nil, nil, nil
474 }
475 cipherSuiteOk := false
476 for _, offeredID := range hello.cipherSuites {
477 offeredSuite := cipherSuiteTLS13ByID(offeredID)
478 if offeredSuite != nil && offeredSuite.hash == cipherSuite.hash {
479 cipherSuiteOk = true
480 break
481 }
482 }
483 if !cipherSuiteOk {
484 return nil, nil, nil, nil
485 }
486
487 if c.quic != nil {
488 if c.quic.enableSessionEvents {
489 c.quicResumeSession(session)
490 }
491
492
493
494 if session.EarlyData && mutualCipherSuiteTLS13(hello.cipherSuites, session.cipherSuite) != nil {
495 for _, alpn := range hello.alpnProtocols {
496 if alpn == session.alpnProtocol {
497 hello.earlyData = true
498 break
499 }
500 }
501 }
502 }
503
504
505 ticketAge := c.config.time().Sub(time.Unix(int64(session.createdAt), 0))
506 identity := pskIdentity{
507 label: session.ticket,
508 obfuscatedTicketAge: uint32(ticketAge/time.Millisecond) + session.ageAdd,
509 }
510 hello.pskIdentities = []pskIdentity{identity}
511 hello.pskBinders = [][]byte{make([]byte, cipherSuite.hash.Size())}
512
513
514 earlySecret = tls13.NewEarlySecret(cipherSuite.hash.New, session.secret)
515 binderKey = earlySecret.ResumptionBinderKey()
516 transcript := cipherSuite.hash.New()
517 if err := computeAndUpdatePSK(hello, binderKey, transcript, cipherSuite.finishedHash); err != nil {
518 return nil, nil, nil, err
519 }
520
521 return
522 }
523
524 func (c *Conn) pickTLSVersion(serverHello *serverHelloMsg) error {
525 peerVersion := serverHello.vers
526 if serverHello.supportedVersion != 0 {
527 peerVersion = serverHello.supportedVersion
528 }
529
530 vers, ok := c.config.mutualVersion(roleClient, []uint16{peerVersion})
531 if !ok {
532 c.sendAlert(alertProtocolVersion)
533 return fmt.Errorf("tls: server selected unsupported protocol version %x", peerVersion)
534 }
535
536 c.vers = vers
537 c.haveVers = true
538 c.in.version = vers
539 c.out.version = vers
540
541 return nil
542 }
543
544
545
546 func (hs *clientHandshakeState) handshake() error {
547 c := hs.c
548
549
550
551
552
553
554
555
556
557 if hs.session == nil && hs.hello.sessionId != nil && bytes.Equal(hs.hello.sessionId, hs.serverHello.sessionId) {
558 c.sendAlert(alertIllegalParameter)
559 return errors.New("tls: server echoed TLS 1.3 compatibility session ID in TLS 1.2")
560 }
561
562 isResume, err := hs.processServerHello()
563 if err != nil {
564 return err
565 }
566
567 hs.finishedHash = newFinishedHash(c.vers, hs.suite)
568
569
570
571
572
573 if isResume || (len(c.config.Certificates) == 0 && c.config.GetClientCertificate == nil) {
574 hs.finishedHash.discardHandshakeBuffer()
575 }
576
577 if err := transcriptMsg(hs.hello, &hs.finishedHash); err != nil {
578 return err
579 }
580 if err := transcriptMsg(hs.serverHello, &hs.finishedHash); err != nil {
581 return err
582 }
583
584 c.buffering = true
585 c.didResume = isResume
586 if isResume {
587 if err := hs.establishKeys(); err != nil {
588 return err
589 }
590 if err := hs.readSessionTicket(); err != nil {
591 return err
592 }
593 if err := hs.readFinished(c.serverFinished[:]); err != nil {
594 return err
595 }
596 c.clientFinishedIsFirst = false
597
598
599
600 if c.config.VerifyConnection != nil {
601 if err := c.config.VerifyConnection(c.connectionStateLocked()); err != nil {
602 c.sendAlert(alertBadCertificate)
603 return err
604 }
605 }
606 if err := hs.sendFinished(c.clientFinished[:]); err != nil {
607 return err
608 }
609 if _, err := c.flush(); err != nil {
610 return err
611 }
612 } else {
613 if err := hs.doFullHandshake(); err != nil {
614 return err
615 }
616 if err := hs.establishKeys(); err != nil {
617 return err
618 }
619 if err := hs.sendFinished(c.clientFinished[:]); err != nil {
620 return err
621 }
622 if _, err := c.flush(); err != nil {
623 return err
624 }
625 c.clientFinishedIsFirst = true
626 if err := hs.readSessionTicket(); err != nil {
627 return err
628 }
629 if err := hs.readFinished(c.serverFinished[:]); err != nil {
630 return err
631 }
632 }
633 if err := hs.saveSessionTicket(); err != nil {
634 return err
635 }
636
637 c.ekm = ekmFromMasterSecret(c.vers, hs.suite, hs.masterSecret, hs.hello.random, hs.serverHello.random)
638 c.isHandshakeComplete.Store(true)
639
640 return nil
641 }
642
643 func (hs *clientHandshakeState) pickCipherSuite() error {
644 if hs.suite = mutualCipherSuite(hs.hello.cipherSuites, hs.serverHello.cipherSuite); hs.suite == nil {
645 hs.c.sendAlert(alertHandshakeFailure)
646 return errors.New("tls: server chose an unconfigured cipher suite")
647 }
648
649 if hs.c.config.CipherSuites == nil && !fips140tls.Required() && rsaKexCiphers[hs.suite.id] {
650 tlsrsakex.Value()
651 tlsrsakex.IncNonDefault()
652 }
653 if hs.c.config.CipherSuites == nil && !fips140tls.Required() && tdesCiphers[hs.suite.id] {
654 tls3des.Value()
655 tls3des.IncNonDefault()
656 }
657
658 hs.c.cipherSuite = hs.suite.id
659 return nil
660 }
661
662 func (hs *clientHandshakeState) doFullHandshake() error {
663 c := hs.c
664
665 msg, err := c.readHandshake(&hs.finishedHash)
666 if err != nil {
667 return err
668 }
669 certMsg, ok := msg.(*certificateMsg)
670 if !ok || len(certMsg.certificates) == 0 {
671 c.sendAlert(alertUnexpectedMessage)
672 return unexpectedMessageError(certMsg, msg)
673 }
674
675 msg, err = c.readHandshake(&hs.finishedHash)
676 if err != nil {
677 return err
678 }
679
680 cs, ok := msg.(*certificateStatusMsg)
681 if ok {
682
683
684
685 if !hs.serverHello.ocspStapling {
686
687
688
689
690 c.sendAlert(alertUnexpectedMessage)
691 return errors.New("tls: received unexpected CertificateStatus message")
692 }
693
694 c.ocspResponse = cs.response
695
696 msg, err = c.readHandshake(&hs.finishedHash)
697 if err != nil {
698 return err
699 }
700 }
701
702 if c.handshakes == 0 {
703
704
705 if err := c.verifyServerCertificate(certMsg.certificates); err != nil {
706 return err
707 }
708 } else {
709
710
711
712
713
714
715 if !bytes.Equal(c.peerCertificates[0].Raw, certMsg.certificates[0]) {
716 c.sendAlert(alertBadCertificate)
717 return errors.New("tls: server's identity changed during renegotiation")
718 }
719 }
720
721 keyAgreement := hs.suite.ka(c.vers)
722
723 skx, ok := msg.(*serverKeyExchangeMsg)
724 if ok {
725 err = keyAgreement.processServerKeyExchange(c.config, hs.hello, hs.serverHello, c.peerCertificates[0], skx)
726 if err != nil {
727 c.sendAlert(alertIllegalParameter)
728 return err
729 }
730 if len(skx.key) >= 3 && skx.key[0] == 3 {
731 c.curveID = CurveID(byteorder.BEUint16(skx.key[1:]))
732 }
733
734 msg, err = c.readHandshake(&hs.finishedHash)
735 if err != nil {
736 return err
737 }
738 }
739
740 var chainToSend *Certificate
741 var certRequested bool
742 certReq, ok := msg.(*certificateRequestMsg)
743 if ok {
744 certRequested = true
745
746 cri := certificateRequestInfoFromMsg(hs.ctx, c.vers, certReq)
747 if chainToSend, err = c.getClientCertificate(cri); err != nil {
748 c.sendAlert(alertInternalError)
749 return err
750 }
751
752 msg, err = c.readHandshake(&hs.finishedHash)
753 if err != nil {
754 return err
755 }
756 }
757
758 shd, ok := msg.(*serverHelloDoneMsg)
759 if !ok {
760 c.sendAlert(alertUnexpectedMessage)
761 return unexpectedMessageError(shd, msg)
762 }
763
764
765
766
767 if certRequested {
768 certMsg = new(certificateMsg)
769 certMsg.certificates = chainToSend.Certificate
770 if _, err := hs.c.writeHandshakeRecord(certMsg, &hs.finishedHash); err != nil {
771 return err
772 }
773 }
774
775 preMasterSecret, ckx, err := keyAgreement.generateClientKeyExchange(c.config, hs.hello, c.peerCertificates[0])
776 if err != nil {
777 c.sendAlert(alertInternalError)
778 return err
779 }
780 if ckx != nil {
781 if _, err := hs.c.writeHandshakeRecord(ckx, &hs.finishedHash); err != nil {
782 return err
783 }
784 }
785
786 if hs.serverHello.extendedMasterSecret {
787 c.extMasterSecret = true
788 hs.masterSecret = extMasterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret,
789 hs.finishedHash.Sum())
790 } else {
791 if fips140tls.Required() {
792 c.sendAlert(alertHandshakeFailure)
793 return errors.New("tls: FIPS 140-3 requires the use of Extended Master Secret")
794 }
795 hs.masterSecret = masterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret,
796 hs.hello.random, hs.serverHello.random)
797 }
798 if err := c.config.writeKeyLog(keyLogLabelTLS12, hs.hello.random, hs.masterSecret); err != nil {
799 c.sendAlert(alertInternalError)
800 return errors.New("tls: failed to write to key log: " + err.Error())
801 }
802
803 if chainToSend != nil && len(chainToSend.Certificate) > 0 {
804 certVerify := &certificateVerifyMsg{}
805
806 key, ok := chainToSend.PrivateKey.(crypto.Signer)
807 if !ok {
808 c.sendAlert(alertInternalError)
809 return fmt.Errorf("tls: client certificate private key of type %T does not implement crypto.Signer", chainToSend.PrivateKey)
810 }
811
812 var sigType uint8
813 var sigHash crypto.Hash
814 if c.vers >= VersionTLS12 {
815 signatureAlgorithm, err := selectSignatureScheme(c.vers, chainToSend, certReq.supportedSignatureAlgorithms)
816 if err != nil {
817 c.sendAlert(alertIllegalParameter)
818 return err
819 }
820 sigType, sigHash, err = typeAndHashFromSignatureScheme(signatureAlgorithm)
821 if err != nil {
822 return c.sendAlert(alertInternalError)
823 }
824 certVerify.hasSignatureAlgorithm = true
825 certVerify.signatureAlgorithm = signatureAlgorithm
826 } else {
827 sigType, sigHash, err = legacyTypeAndHashFromPublicKey(key.Public())
828 if err != nil {
829 c.sendAlert(alertIllegalParameter)
830 return err
831 }
832 }
833
834 signed := hs.finishedHash.hashForClientCertificate(sigType, sigHash)
835 signOpts := crypto.SignerOpts(sigHash)
836 if sigType == signatureRSAPSS {
837 signOpts = &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthEqualsHash, Hash: sigHash}
838 }
839 certVerify.signature, err = key.Sign(c.config.rand(), signed, signOpts)
840 if err != nil {
841 c.sendAlert(alertInternalError)
842 return err
843 }
844
845 if _, err := hs.c.writeHandshakeRecord(certVerify, &hs.finishedHash); err != nil {
846 return err
847 }
848 }
849
850 hs.finishedHash.discardHandshakeBuffer()
851
852 return nil
853 }
854
855 func (hs *clientHandshakeState) establishKeys() error {
856 c := hs.c
857
858 clientMAC, serverMAC, clientKey, serverKey, clientIV, serverIV :=
859 keysFromMasterSecret(c.vers, hs.suite, hs.masterSecret, hs.hello.random, hs.serverHello.random, hs.suite.macLen, hs.suite.keyLen, hs.suite.ivLen)
860 var clientCipher, serverCipher any
861 var clientHash, serverHash hash.Hash
862 if hs.suite.cipher != nil {
863 clientCipher = hs.suite.cipher(clientKey, clientIV, false )
864 clientHash = hs.suite.mac(clientMAC)
865 serverCipher = hs.suite.cipher(serverKey, serverIV, true )
866 serverHash = hs.suite.mac(serverMAC)
867 } else {
868 clientCipher = hs.suite.aead(clientKey, clientIV)
869 serverCipher = hs.suite.aead(serverKey, serverIV)
870 }
871
872 c.in.prepareCipherSpec(c.vers, serverCipher, serverHash)
873 c.out.prepareCipherSpec(c.vers, clientCipher, clientHash)
874 return nil
875 }
876
877 func (hs *clientHandshakeState) serverResumedSession() bool {
878
879
880 return hs.session != nil && hs.hello.sessionId != nil &&
881 bytes.Equal(hs.serverHello.sessionId, hs.hello.sessionId)
882 }
883
884 func (hs *clientHandshakeState) processServerHello() (bool, error) {
885 c := hs.c
886
887 if err := hs.pickCipherSuite(); err != nil {
888 return false, err
889 }
890
891 if hs.serverHello.compressionMethod != compressionNone {
892 c.sendAlert(alertIllegalParameter)
893 return false, errors.New("tls: server selected unsupported compression format")
894 }
895
896 supportsPointFormat := false
897 offeredNonCompressedFormat := false
898 for _, format := range hs.serverHello.supportedPoints {
899 if format == pointFormatUncompressed {
900 supportsPointFormat = true
901 } else {
902 offeredNonCompressedFormat = true
903 }
904 }
905 if !supportsPointFormat && offeredNonCompressedFormat {
906 return false, errors.New("tls: server offered only incompatible point formats")
907 }
908
909 if c.handshakes == 0 && hs.serverHello.secureRenegotiationSupported {
910 c.secureRenegotiation = true
911 if len(hs.serverHello.secureRenegotiation) != 0 {
912 c.sendAlert(alertHandshakeFailure)
913 return false, errors.New("tls: initial handshake had non-empty renegotiation extension")
914 }
915 }
916
917 if c.handshakes > 0 && c.secureRenegotiation {
918 var expectedSecureRenegotiation [24]byte
919 copy(expectedSecureRenegotiation[:], c.clientFinished[:])
920 copy(expectedSecureRenegotiation[12:], c.serverFinished[:])
921 if !bytes.Equal(hs.serverHello.secureRenegotiation, expectedSecureRenegotiation[:]) {
922 c.sendAlert(alertHandshakeFailure)
923 return false, errors.New("tls: incorrect renegotiation extension contents")
924 }
925 }
926
927 if err := checkALPN(hs.hello.alpnProtocols, hs.serverHello.alpnProtocol, false); err != nil {
928 c.sendAlert(alertUnsupportedExtension)
929 return false, err
930 }
931 c.clientProtocol = hs.serverHello.alpnProtocol
932
933 c.scts = hs.serverHello.scts
934
935 if !hs.serverResumedSession() {
936 return false, nil
937 }
938
939 if hs.session.version != c.vers {
940 c.sendAlert(alertHandshakeFailure)
941 return false, errors.New("tls: server resumed a session with a different version")
942 }
943
944 if hs.session.cipherSuite != hs.suite.id {
945 c.sendAlert(alertHandshakeFailure)
946 return false, errors.New("tls: server resumed a session with a different cipher suite")
947 }
948
949
950 if hs.session.extMasterSecret != hs.serverHello.extendedMasterSecret {
951 c.sendAlert(alertHandshakeFailure)
952 return false, errors.New("tls: server resumed a session with a different EMS extension")
953 }
954
955
956 hs.masterSecret = hs.session.secret
957 c.extMasterSecret = hs.session.extMasterSecret
958 c.peerCertificates = hs.session.peerCertificates
959 c.activeCertHandles = hs.c.activeCertHandles
960 c.verifiedChains = hs.session.verifiedChains
961 c.ocspResponse = hs.session.ocspResponse
962
963
964 if len(c.scts) == 0 && len(hs.session.scts) != 0 {
965 c.scts = hs.session.scts
966 }
967 c.curveID = hs.session.curveID
968
969 return true, nil
970 }
971
972
973
974 func checkALPN(clientProtos []string, serverProto string, quic bool) error {
975 if serverProto == "" {
976 if quic && len(clientProtos) > 0 {
977
978 return errors.New("tls: server did not select an ALPN protocol")
979 }
980 return nil
981 }
982 if len(clientProtos) == 0 {
983 return errors.New("tls: server advertised unrequested ALPN extension")
984 }
985 for _, proto := range clientProtos {
986 if proto == serverProto {
987 return nil
988 }
989 }
990 return errors.New("tls: server selected unadvertised ALPN protocol")
991 }
992
993 func (hs *clientHandshakeState) readFinished(out []byte) error {
994 c := hs.c
995
996 if err := c.readChangeCipherSpec(); err != nil {
997 return err
998 }
999
1000
1001
1002
1003 msg, err := c.readHandshake(nil)
1004 if err != nil {
1005 return err
1006 }
1007 serverFinished, ok := msg.(*finishedMsg)
1008 if !ok {
1009 c.sendAlert(alertUnexpectedMessage)
1010 return unexpectedMessageError(serverFinished, msg)
1011 }
1012
1013 verify := hs.finishedHash.serverSum(hs.masterSecret)
1014 if len(verify) != len(serverFinished.verifyData) ||
1015 subtle.ConstantTimeCompare(verify, serverFinished.verifyData) != 1 {
1016 c.sendAlert(alertHandshakeFailure)
1017 return errors.New("tls: server's Finished message was incorrect")
1018 }
1019
1020 if err := transcriptMsg(serverFinished, &hs.finishedHash); err != nil {
1021 return err
1022 }
1023
1024 copy(out, verify)
1025 return nil
1026 }
1027
1028 func (hs *clientHandshakeState) readSessionTicket() error {
1029 if !hs.serverHello.ticketSupported {
1030 return nil
1031 }
1032 c := hs.c
1033
1034 if !hs.hello.ticketSupported {
1035 c.sendAlert(alertIllegalParameter)
1036 return errors.New("tls: server sent unrequested session ticket")
1037 }
1038
1039 msg, err := c.readHandshake(&hs.finishedHash)
1040 if err != nil {
1041 return err
1042 }
1043 sessionTicketMsg, ok := msg.(*newSessionTicketMsg)
1044 if !ok {
1045 c.sendAlert(alertUnexpectedMessage)
1046 return unexpectedMessageError(sessionTicketMsg, msg)
1047 }
1048
1049 hs.ticket = sessionTicketMsg.ticket
1050 return nil
1051 }
1052
1053 func (hs *clientHandshakeState) saveSessionTicket() error {
1054 if hs.ticket == nil {
1055 return nil
1056 }
1057 c := hs.c
1058
1059 cacheKey := c.clientSessionCacheKey()
1060 if cacheKey == "" {
1061 return nil
1062 }
1063
1064 session := c.sessionState()
1065 session.secret = hs.masterSecret
1066 session.ticket = hs.ticket
1067
1068 cs := &ClientSessionState{session: session}
1069 c.config.ClientSessionCache.Put(cacheKey, cs)
1070 return nil
1071 }
1072
1073 func (hs *clientHandshakeState) sendFinished(out []byte) error {
1074 c := hs.c
1075
1076 if err := c.writeChangeCipherRecord(); err != nil {
1077 return err
1078 }
1079
1080 finished := new(finishedMsg)
1081 finished.verifyData = hs.finishedHash.clientSum(hs.masterSecret)
1082 if _, err := hs.c.writeHandshakeRecord(finished, &hs.finishedHash); err != nil {
1083 return err
1084 }
1085 copy(out, finished.verifyData)
1086 return nil
1087 }
1088
1089
1090
1091 const defaultMaxRSAKeySize = 8192
1092
1093 var tlsmaxrsasize = godebug.New("tlsmaxrsasize")
1094
1095 func checkKeySize(n int) (max int, ok bool) {
1096 if v := tlsmaxrsasize.Value(); v != "" {
1097 if max, err := strconv.Atoi(v); err == nil {
1098 if (n <= max) != (n <= defaultMaxRSAKeySize) {
1099 tlsmaxrsasize.IncNonDefault()
1100 }
1101 return max, n <= max
1102 }
1103 }
1104 return defaultMaxRSAKeySize, n <= defaultMaxRSAKeySize
1105 }
1106
1107
1108
1109 func (c *Conn) verifyServerCertificate(certificates [][]byte) error {
1110 activeHandles := make([]*activeCert, len(certificates))
1111 certs := make([]*x509.Certificate, len(certificates))
1112 for i, asn1Data := range certificates {
1113 cert, err := globalCertCache.newCert(asn1Data)
1114 if err != nil {
1115 c.sendAlert(alertDecodeError)
1116 return errors.New("tls: failed to parse certificate from server: " + err.Error())
1117 }
1118 if cert.cert.PublicKeyAlgorithm == x509.RSA {
1119 n := cert.cert.PublicKey.(*rsa.PublicKey).N.BitLen()
1120 if max, ok := checkKeySize(n); !ok {
1121 c.sendAlert(alertBadCertificate)
1122 return fmt.Errorf("tls: server sent certificate containing RSA key larger than %d bits", max)
1123 }
1124 }
1125 activeHandles[i] = cert
1126 certs[i] = cert.cert
1127 }
1128
1129 echRejected := c.config.EncryptedClientHelloConfigList != nil && !c.echAccepted
1130 if echRejected {
1131 if c.config.EncryptedClientHelloRejectionVerify != nil {
1132 if err := c.config.EncryptedClientHelloRejectionVerify(c.connectionStateLocked()); err != nil {
1133 c.sendAlert(alertBadCertificate)
1134 return err
1135 }
1136 } else {
1137 opts := x509.VerifyOptions{
1138 Roots: c.config.RootCAs,
1139 CurrentTime: c.config.time(),
1140 DNSName: c.serverName,
1141 Intermediates: x509.NewCertPool(),
1142 }
1143
1144 for _, cert := range certs[1:] {
1145 opts.Intermediates.AddCert(cert)
1146 }
1147 chains, err := certs[0].Verify(opts)
1148 if err != nil {
1149 c.sendAlert(alertBadCertificate)
1150 return &CertificateVerificationError{UnverifiedCertificates: certs, Err: err}
1151 }
1152
1153 c.verifiedChains, err = fipsAllowedChains(chains)
1154 if err != nil {
1155 c.sendAlert(alertBadCertificate)
1156 return &CertificateVerificationError{UnverifiedCertificates: certs, Err: err}
1157 }
1158 }
1159 } else if !c.config.InsecureSkipVerify {
1160 opts := x509.VerifyOptions{
1161 Roots: c.config.RootCAs,
1162 CurrentTime: c.config.time(),
1163 DNSName: c.config.ServerName,
1164 Intermediates: x509.NewCertPool(),
1165 }
1166
1167 for _, cert := range certs[1:] {
1168 opts.Intermediates.AddCert(cert)
1169 }
1170 chains, err := certs[0].Verify(opts)
1171 if err != nil {
1172 c.sendAlert(alertBadCertificate)
1173 return &CertificateVerificationError{UnverifiedCertificates: certs, Err: err}
1174 }
1175
1176 c.verifiedChains, err = fipsAllowedChains(chains)
1177 if err != nil {
1178 c.sendAlert(alertBadCertificate)
1179 return &CertificateVerificationError{UnverifiedCertificates: certs, Err: err}
1180 }
1181 }
1182
1183 switch certs[0].PublicKey.(type) {
1184 case *rsa.PublicKey, *ecdsa.PublicKey, ed25519.PublicKey:
1185 break
1186 default:
1187 c.sendAlert(alertUnsupportedCertificate)
1188 return fmt.Errorf("tls: server's certificate contains an unsupported type of public key: %T", certs[0].PublicKey)
1189 }
1190
1191 c.activeCertHandles = activeHandles
1192 c.peerCertificates = certs
1193
1194 if c.config.VerifyPeerCertificate != nil && !echRejected {
1195 if err := c.config.VerifyPeerCertificate(certificates, c.verifiedChains); err != nil {
1196 c.sendAlert(alertBadCertificate)
1197 return err
1198 }
1199 }
1200
1201 if c.config.VerifyConnection != nil && !echRejected {
1202 if err := c.config.VerifyConnection(c.connectionStateLocked()); err != nil {
1203 c.sendAlert(alertBadCertificate)
1204 return err
1205 }
1206 }
1207
1208 return nil
1209 }
1210
1211
1212
1213 func certificateRequestInfoFromMsg(ctx context.Context, vers uint16, certReq *certificateRequestMsg) *CertificateRequestInfo {
1214 cri := &CertificateRequestInfo{
1215 AcceptableCAs: certReq.certificateAuthorities,
1216 Version: vers,
1217 ctx: ctx,
1218 }
1219
1220 var rsaAvail, ecAvail bool
1221 for _, certType := range certReq.certificateTypes {
1222 switch certType {
1223 case certTypeRSASign:
1224 rsaAvail = true
1225 case certTypeECDSASign:
1226 ecAvail = true
1227 }
1228 }
1229
1230 if !certReq.hasSignatureAlgorithm {
1231
1232
1233
1234
1235
1236 switch {
1237 case rsaAvail && ecAvail:
1238 cri.SignatureSchemes = []SignatureScheme{
1239 ECDSAWithP256AndSHA256, ECDSAWithP384AndSHA384, ECDSAWithP521AndSHA512,
1240 PKCS1WithSHA256, PKCS1WithSHA384, PKCS1WithSHA512, PKCS1WithSHA1,
1241 }
1242 case rsaAvail:
1243 cri.SignatureSchemes = []SignatureScheme{
1244 PKCS1WithSHA256, PKCS1WithSHA384, PKCS1WithSHA512, PKCS1WithSHA1,
1245 }
1246 case ecAvail:
1247 cri.SignatureSchemes = []SignatureScheme{
1248 ECDSAWithP256AndSHA256, ECDSAWithP384AndSHA384, ECDSAWithP521AndSHA512,
1249 }
1250 }
1251 return cri
1252 }
1253
1254
1255
1256 cri.SignatureSchemes = make([]SignatureScheme, 0, len(certReq.supportedSignatureAlgorithms))
1257 for _, sigScheme := range certReq.supportedSignatureAlgorithms {
1258 sigType, _, err := typeAndHashFromSignatureScheme(sigScheme)
1259 if err != nil {
1260 continue
1261 }
1262 switch sigType {
1263 case signatureECDSA, signatureEd25519:
1264 if ecAvail {
1265 cri.SignatureSchemes = append(cri.SignatureSchemes, sigScheme)
1266 }
1267 case signatureRSAPSS, signaturePKCS1v15:
1268 if rsaAvail {
1269 cri.SignatureSchemes = append(cri.SignatureSchemes, sigScheme)
1270 }
1271 }
1272 }
1273
1274 return cri
1275 }
1276
1277 func (c *Conn) getClientCertificate(cri *CertificateRequestInfo) (*Certificate, error) {
1278 if c.config.GetClientCertificate != nil {
1279 return c.config.GetClientCertificate(cri)
1280 }
1281
1282 for _, chain := range c.config.Certificates {
1283 if err := cri.SupportsCertificate(&chain); err != nil {
1284 continue
1285 }
1286 return &chain, nil
1287 }
1288
1289
1290 return new(Certificate), nil
1291 }
1292
1293
1294
1295 func (c *Conn) clientSessionCacheKey() string {
1296 if len(c.config.ServerName) > 0 {
1297 return c.config.ServerName
1298 }
1299 if c.conn != nil {
1300 return c.conn.RemoteAddr().String()
1301 }
1302 return ""
1303 }
1304
1305
1306
1307
1308 func hostnameInSNI(name string) string {
1309 host := name
1310 if len(host) > 0 && host[0] == '[' && host[len(host)-1] == ']' {
1311 host = host[1 : len(host)-1]
1312 }
1313 if i := strings.LastIndex(host, "%"); i > 0 {
1314 host = host[:i]
1315 }
1316 if net.ParseIP(host) != nil {
1317 return ""
1318 }
1319 for len(name) > 0 && name[len(name)-1] == '.' {
1320 name = name[:len(name)-1]
1321 }
1322 return name
1323 }
1324
1325 func computeAndUpdatePSK(m *clientHelloMsg, binderKey []byte, transcript hash.Hash, finishedHash func([]byte, hash.Hash) []byte) error {
1326 helloBytes, err := m.marshalWithoutBinders()
1327 if err != nil {
1328 return err
1329 }
1330 transcript.Write(helloBytes)
1331 pskBinders := [][]byte{finishedHash(binderKey, transcript)}
1332 return m.updateBinders(pskBinders)
1333 }
1334
View as plain text