Source file src/pkg/crypto/tls/handshake_server_tls13.go
1
2
3
4
5 package tls
6
7 import (
8 "bytes"
9 "crypto"
10 "crypto/hmac"
11 "crypto/rsa"
12 "errors"
13 "hash"
14 "io"
15 "sync/atomic"
16 "time"
17 )
18
19
20
21
22 const maxClientPSKIdentities = 5
23
24 type serverHandshakeStateTLS13 struct {
25 c *Conn
26 clientHello *clientHelloMsg
27 hello *serverHelloMsg
28 sentDummyCCS bool
29 usingPSK bool
30 suite *cipherSuiteTLS13
31 cert *Certificate
32 sigAlg SignatureScheme
33 earlySecret []byte
34 sharedKey []byte
35 handshakeSecret []byte
36 masterSecret []byte
37 trafficSecret []byte
38 transcript hash.Hash
39 clientFinished []byte
40 }
41
42 func (hs *serverHandshakeStateTLS13) handshake() error {
43 c := hs.c
44
45
46 if err := hs.processClientHello(); err != nil {
47 return err
48 }
49 if err := hs.checkForResumption(); err != nil {
50 return err
51 }
52 if err := hs.pickCertificate(); err != nil {
53 return err
54 }
55 c.buffering = true
56 if err := hs.sendServerParameters(); err != nil {
57 return err
58 }
59 if err := hs.sendServerCertificate(); err != nil {
60 return err
61 }
62 if err := hs.sendServerFinished(); err != nil {
63 return err
64 }
65
66
67
68 if _, err := c.flush(); err != nil {
69 return err
70 }
71 if err := hs.readClientCertificate(); err != nil {
72 return err
73 }
74 if err := hs.readClientFinished(); err != nil {
75 return err
76 }
77
78 atomic.StoreUint32(&c.handshakeStatus, 1)
79
80 return nil
81 }
82
83 func (hs *serverHandshakeStateTLS13) processClientHello() error {
84 c := hs.c
85
86 hs.hello = new(serverHelloMsg)
87
88
89
90 hs.hello.vers = VersionTLS12
91 hs.hello.supportedVersion = c.vers
92
93 if len(hs.clientHello.supportedVersions) == 0 {
94 c.sendAlert(alertIllegalParameter)
95 return errors.New("tls: client used the legacy version field to negotiate TLS 1.3")
96 }
97
98
99
100
101
102
103
104
105
106
107 for _, id := range hs.clientHello.cipherSuites {
108 if id == TLS_FALLBACK_SCSV {
109
110
111 if c.vers < c.config.maxSupportedVersion(false) {
112 c.sendAlert(alertInappropriateFallback)
113 return errors.New("tls: client using inappropriate protocol fallback")
114 }
115 break
116 }
117 }
118
119 if len(hs.clientHello.compressionMethods) != 1 ||
120 hs.clientHello.compressionMethods[0] != compressionNone {
121 c.sendAlert(alertIllegalParameter)
122 return errors.New("tls: TLS 1.3 client supports illegal compression methods")
123 }
124
125 hs.hello.random = make([]byte, 32)
126 if _, err := io.ReadFull(c.config.rand(), hs.hello.random); err != nil {
127 c.sendAlert(alertInternalError)
128 return err
129 }
130
131 if len(hs.clientHello.secureRenegotiation) != 0 {
132 c.sendAlert(alertHandshakeFailure)
133 return errors.New("tls: initial handshake had non-empty renegotiation extension")
134 }
135
136 if hs.clientHello.earlyData {
137
138
139
140
141
142
143 c.sendAlert(alertUnsupportedExtension)
144 return errors.New("tls: client sent unexpected early data")
145 }
146
147 hs.hello.sessionId = hs.clientHello.sessionId
148 hs.hello.compressionMethod = compressionNone
149
150 var preferenceList, supportedList []uint16
151 if c.config.PreferServerCipherSuites {
152 preferenceList = defaultCipherSuitesTLS13()
153 supportedList = hs.clientHello.cipherSuites
154 } else {
155 preferenceList = hs.clientHello.cipherSuites
156 supportedList = defaultCipherSuitesTLS13()
157 }
158 for _, suiteID := range preferenceList {
159 hs.suite = mutualCipherSuiteTLS13(supportedList, suiteID)
160 if hs.suite != nil {
161 break
162 }
163 }
164 if hs.suite == nil {
165 c.sendAlert(alertHandshakeFailure)
166 return errors.New("tls: no cipher suite supported by both client and server")
167 }
168 c.cipherSuite = hs.suite.id
169 hs.hello.cipherSuite = hs.suite.id
170 hs.transcript = hs.suite.hash.New()
171
172
173
174 var selectedGroup CurveID
175 var clientKeyShare *keyShare
176 GroupSelection:
177 for _, preferredGroup := range c.config.curvePreferences() {
178 for _, ks := range hs.clientHello.keyShares {
179 if ks.group == preferredGroup {
180 selectedGroup = ks.group
181 clientKeyShare = &ks
182 break GroupSelection
183 }
184 }
185 if selectedGroup != 0 {
186 continue
187 }
188 for _, group := range hs.clientHello.supportedCurves {
189 if group == preferredGroup {
190 selectedGroup = group
191 break
192 }
193 }
194 }
195 if selectedGroup == 0 {
196 c.sendAlert(alertHandshakeFailure)
197 return errors.New("tls: no ECDHE curve supported by both client and server")
198 }
199 if clientKeyShare == nil {
200 if err := hs.doHelloRetryRequest(selectedGroup); err != nil {
201 return err
202 }
203 clientKeyShare = &hs.clientHello.keyShares[0]
204 }
205
206 if _, ok := curveForCurveID(selectedGroup); selectedGroup != X25519 && !ok {
207 c.sendAlert(alertInternalError)
208 return errors.New("tls: CurvePreferences includes unsupported curve")
209 }
210 params, err := generateECDHEParameters(c.config.rand(), selectedGroup)
211 if err != nil {
212 c.sendAlert(alertInternalError)
213 return err
214 }
215 hs.hello.serverShare = keyShare{group: selectedGroup, data: params.PublicKey()}
216 hs.sharedKey = params.SharedKey(clientKeyShare.data)
217 if hs.sharedKey == nil {
218 c.sendAlert(alertIllegalParameter)
219 return errors.New("tls: invalid client key share")
220 }
221
222 c.serverName = hs.clientHello.serverName
223 return nil
224 }
225
226 func (hs *serverHandshakeStateTLS13) checkForResumption() error {
227 c := hs.c
228
229 if c.config.SessionTicketsDisabled {
230 return nil
231 }
232
233 modeOK := false
234 for _, mode := range hs.clientHello.pskModes {
235 if mode == pskModeDHE {
236 modeOK = true
237 break
238 }
239 }
240 if !modeOK {
241 return nil
242 }
243
244 if len(hs.clientHello.pskIdentities) != len(hs.clientHello.pskBinders) {
245 c.sendAlert(alertIllegalParameter)
246 return errors.New("tls: invalid or missing PSK binders")
247 }
248 if len(hs.clientHello.pskIdentities) == 0 {
249 return nil
250 }
251
252 for i, identity := range hs.clientHello.pskIdentities {
253 if i >= maxClientPSKIdentities {
254 break
255 }
256
257 plaintext, _ := c.decryptTicket(identity.label)
258 if plaintext == nil {
259 continue
260 }
261 sessionState := new(sessionStateTLS13)
262 if ok := sessionState.unmarshal(plaintext); !ok {
263 continue
264 }
265
266 createdAt := time.Unix(int64(sessionState.createdAt), 0)
267 if c.config.time().Sub(createdAt) > maxSessionTicketLifetime {
268 continue
269 }
270
271
272
273
274
275 pskSuite := cipherSuiteTLS13ByID(sessionState.cipherSuite)
276 if pskSuite == nil || pskSuite.hash != hs.suite.hash {
277 continue
278 }
279
280
281
282
283 sessionHasClientCerts := len(sessionState.certificate.Certificate) != 0
284 needClientCerts := requiresClientCert(c.config.ClientAuth)
285 if needClientCerts && !sessionHasClientCerts {
286 continue
287 }
288 if sessionHasClientCerts && c.config.ClientAuth == NoClientCert {
289 continue
290 }
291
292 psk := hs.suite.expandLabel(sessionState.resumptionSecret, "resumption",
293 nil, hs.suite.hash.Size())
294 hs.earlySecret = hs.suite.extract(psk, nil)
295 binderKey := hs.suite.deriveSecret(hs.earlySecret, resumptionBinderLabel, nil)
296
297 transcript := cloneHash(hs.transcript, hs.suite.hash)
298 if transcript == nil {
299 c.sendAlert(alertInternalError)
300 return errors.New("tls: internal error: failed to clone hash")
301 }
302 transcript.Write(hs.clientHello.marshalWithoutBinders())
303 pskBinder := hs.suite.finishedHash(binderKey, transcript)
304 if !hmac.Equal(hs.clientHello.pskBinders[i], pskBinder) {
305 c.sendAlert(alertDecryptError)
306 return errors.New("tls: invalid PSK binder")
307 }
308
309 if err := c.processCertsFromClient(sessionState.certificate); err != nil {
310 return err
311 }
312
313 hs.hello.selectedIdentityPresent = true
314 hs.hello.selectedIdentity = uint16(i)
315 hs.usingPSK = true
316 c.didResume = true
317 return nil
318 }
319
320 return nil
321 }
322
323
324
325
326 func cloneHash(in hash.Hash, h crypto.Hash) hash.Hash {
327
328 type binaryMarshaler interface {
329 MarshalBinary() (data []byte, err error)
330 UnmarshalBinary(data []byte) error
331 }
332 marshaler, ok := in.(binaryMarshaler)
333 if !ok {
334 return nil
335 }
336 state, err := marshaler.MarshalBinary()
337 if err != nil {
338 return nil
339 }
340 out := h.New()
341 unmarshaler, ok := out.(binaryMarshaler)
342 if !ok {
343 return nil
344 }
345 if err := unmarshaler.UnmarshalBinary(state); err != nil {
346 return nil
347 }
348 return out
349 }
350
351 func (hs *serverHandshakeStateTLS13) pickCertificate() error {
352 c := hs.c
353
354
355 if hs.usingPSK {
356 return nil
357 }
358
359
360
361
362
363
364
365
366 certificate, err := c.config.getCertificate(clientHelloInfo(c, hs.clientHello))
367 if err != nil {
368 c.sendAlert(alertInternalError)
369 return err
370 }
371 supportedAlgs := signatureSchemesForCertificate(c.vers, certificate)
372 if supportedAlgs == nil {
373 c.sendAlert(alertInternalError)
374 return unsupportedCertificateError(certificate)
375 }
376
377
378 for _, preferredAlg := range hs.clientHello.supportedSignatureAlgorithms {
379 if isSupportedSignatureAlgorithm(preferredAlg, supportedAlgs) {
380 hs.sigAlg = preferredAlg
381 break
382 }
383 }
384 if hs.sigAlg == 0 {
385
386
387 c.sendAlert(alertHandshakeFailure)
388 return errors.New("tls: client doesn't support selected certificate")
389 }
390 hs.cert = certificate
391
392 return nil
393 }
394
395
396
397 func (hs *serverHandshakeStateTLS13) sendDummyChangeCipherSpec() error {
398 if hs.sentDummyCCS {
399 return nil
400 }
401 hs.sentDummyCCS = true
402
403 _, err := hs.c.writeRecord(recordTypeChangeCipherSpec, []byte{1})
404 return err
405 }
406
407 func (hs *serverHandshakeStateTLS13) doHelloRetryRequest(selectedGroup CurveID) error {
408 c := hs.c
409
410
411
412 hs.transcript.Write(hs.clientHello.marshal())
413 chHash := hs.transcript.Sum(nil)
414 hs.transcript.Reset()
415 hs.transcript.Write([]byte{typeMessageHash, 0, 0, uint8(len(chHash))})
416 hs.transcript.Write(chHash)
417
418 helloRetryRequest := &serverHelloMsg{
419 vers: hs.hello.vers,
420 random: helloRetryRequestRandom,
421 sessionId: hs.hello.sessionId,
422 cipherSuite: hs.hello.cipherSuite,
423 compressionMethod: hs.hello.compressionMethod,
424 supportedVersion: hs.hello.supportedVersion,
425 selectedGroup: selectedGroup,
426 }
427
428 hs.transcript.Write(helloRetryRequest.marshal())
429 if _, err := c.writeRecord(recordTypeHandshake, helloRetryRequest.marshal()); err != nil {
430 return err
431 }
432
433 if err := hs.sendDummyChangeCipherSpec(); err != nil {
434 return err
435 }
436
437 msg, err := c.readHandshake()
438 if err != nil {
439 return err
440 }
441
442 clientHello, ok := msg.(*clientHelloMsg)
443 if !ok {
444 c.sendAlert(alertUnexpectedMessage)
445 return unexpectedMessageError(clientHello, msg)
446 }
447
448 if len(clientHello.keyShares) != 1 || clientHello.keyShares[0].group != selectedGroup {
449 c.sendAlert(alertIllegalParameter)
450 return errors.New("tls: client sent invalid key share in second ClientHello")
451 }
452
453 if clientHello.earlyData {
454 c.sendAlert(alertIllegalParameter)
455 return errors.New("tls: client indicated early data in second ClientHello")
456 }
457
458 if illegalClientHelloChange(clientHello, hs.clientHello) {
459 c.sendAlert(alertIllegalParameter)
460 return errors.New("tls: client illegally modified second ClientHello")
461 }
462
463 hs.clientHello = clientHello
464 return nil
465 }
466
467
468
469
470 func illegalClientHelloChange(ch, ch1 *clientHelloMsg) bool {
471 if len(ch.supportedVersions) != len(ch1.supportedVersions) ||
472 len(ch.cipherSuites) != len(ch1.cipherSuites) ||
473 len(ch.supportedCurves) != len(ch1.supportedCurves) ||
474 len(ch.supportedSignatureAlgorithms) != len(ch1.supportedSignatureAlgorithms) ||
475 len(ch.supportedSignatureAlgorithmsCert) != len(ch1.supportedSignatureAlgorithmsCert) ||
476 len(ch.alpnProtocols) != len(ch1.alpnProtocols) {
477 return true
478 }
479 for i := range ch.supportedVersions {
480 if ch.supportedVersions[i] != ch1.supportedVersions[i] {
481 return true
482 }
483 }
484 for i := range ch.cipherSuites {
485 if ch.cipherSuites[i] != ch1.cipherSuites[i] {
486 return true
487 }
488 }
489 for i := range ch.supportedCurves {
490 if ch.supportedCurves[i] != ch1.supportedCurves[i] {
491 return true
492 }
493 }
494 for i := range ch.supportedSignatureAlgorithms {
495 if ch.supportedSignatureAlgorithms[i] != ch1.supportedSignatureAlgorithms[i] {
496 return true
497 }
498 }
499 for i := range ch.supportedSignatureAlgorithmsCert {
500 if ch.supportedSignatureAlgorithmsCert[i] != ch1.supportedSignatureAlgorithmsCert[i] {
501 return true
502 }
503 }
504 for i := range ch.alpnProtocols {
505 if ch.alpnProtocols[i] != ch1.alpnProtocols[i] {
506 return true
507 }
508 }
509 return ch.vers != ch1.vers ||
510 !bytes.Equal(ch.random, ch1.random) ||
511 !bytes.Equal(ch.sessionId, ch1.sessionId) ||
512 !bytes.Equal(ch.compressionMethods, ch1.compressionMethods) ||
513 ch.nextProtoNeg != ch1.nextProtoNeg ||
514 ch.serverName != ch1.serverName ||
515 ch.ocspStapling != ch1.ocspStapling ||
516 !bytes.Equal(ch.supportedPoints, ch1.supportedPoints) ||
517 ch.ticketSupported != ch1.ticketSupported ||
518 !bytes.Equal(ch.sessionTicket, ch1.sessionTicket) ||
519 ch.secureRenegotiationSupported != ch1.secureRenegotiationSupported ||
520 !bytes.Equal(ch.secureRenegotiation, ch1.secureRenegotiation) ||
521 ch.scts != ch1.scts ||
522 !bytes.Equal(ch.cookie, ch1.cookie) ||
523 !bytes.Equal(ch.pskModes, ch1.pskModes)
524 }
525
526 func (hs *serverHandshakeStateTLS13) sendServerParameters() error {
527 c := hs.c
528
529 hs.transcript.Write(hs.clientHello.marshal())
530 hs.transcript.Write(hs.hello.marshal())
531 if _, err := c.writeRecord(recordTypeHandshake, hs.hello.marshal()); err != nil {
532 return err
533 }
534
535 if err := hs.sendDummyChangeCipherSpec(); err != nil {
536 return err
537 }
538
539 earlySecret := hs.earlySecret
540 if earlySecret == nil {
541 earlySecret = hs.suite.extract(nil, nil)
542 }
543 hs.handshakeSecret = hs.suite.extract(hs.sharedKey,
544 hs.suite.deriveSecret(earlySecret, "derived", nil))
545
546 clientSecret := hs.suite.deriveSecret(hs.handshakeSecret,
547 clientHandshakeTrafficLabel, hs.transcript)
548 c.in.setTrafficSecret(hs.suite, clientSecret)
549 serverSecret := hs.suite.deriveSecret(hs.handshakeSecret,
550 serverHandshakeTrafficLabel, hs.transcript)
551 c.out.setTrafficSecret(hs.suite, serverSecret)
552
553 err := c.config.writeKeyLog(keyLogLabelClientHandshake, hs.clientHello.random, clientSecret)
554 if err != nil {
555 c.sendAlert(alertInternalError)
556 return err
557 }
558 err = c.config.writeKeyLog(keyLogLabelServerHandshake, hs.clientHello.random, serverSecret)
559 if err != nil {
560 c.sendAlert(alertInternalError)
561 return err
562 }
563
564 encryptedExtensions := new(encryptedExtensionsMsg)
565
566 if len(hs.clientHello.alpnProtocols) > 0 {
567 if selectedProto, fallback := mutualProtocol(hs.clientHello.alpnProtocols, c.config.NextProtos); !fallback {
568 encryptedExtensions.alpnProtocol = selectedProto
569 c.clientProtocol = selectedProto
570 }
571 }
572
573 hs.transcript.Write(encryptedExtensions.marshal())
574 if _, err := c.writeRecord(recordTypeHandshake, encryptedExtensions.marshal()); err != nil {
575 return err
576 }
577
578 return nil
579 }
580
581 func (hs *serverHandshakeStateTLS13) requestClientCert() bool {
582 return hs.c.config.ClientAuth >= RequestClientCert && !hs.usingPSK
583 }
584
585 func (hs *serverHandshakeStateTLS13) sendServerCertificate() error {
586 c := hs.c
587
588
589 if hs.usingPSK {
590 return nil
591 }
592
593 if hs.requestClientCert() {
594
595 certReq := new(certificateRequestMsgTLS13)
596 certReq.ocspStapling = true
597 certReq.scts = true
598 certReq.supportedSignatureAlgorithms = supportedSignatureAlgorithms
599 if c.config.ClientCAs != nil {
600 certReq.certificateAuthorities = c.config.ClientCAs.Subjects()
601 }
602
603 hs.transcript.Write(certReq.marshal())
604 if _, err := c.writeRecord(recordTypeHandshake, certReq.marshal()); err != nil {
605 return err
606 }
607 }
608
609 certMsg := new(certificateMsgTLS13)
610
611 certMsg.certificate = *hs.cert
612 certMsg.scts = hs.clientHello.scts && len(hs.cert.SignedCertificateTimestamps) > 0
613 certMsg.ocspStapling = hs.clientHello.ocspStapling && len(hs.cert.OCSPStaple) > 0
614
615 hs.transcript.Write(certMsg.marshal())
616 if _, err := c.writeRecord(recordTypeHandshake, certMsg.marshal()); err != nil {
617 return err
618 }
619
620 certVerifyMsg := new(certificateVerifyMsg)
621 certVerifyMsg.hasSignatureAlgorithm = true
622 certVerifyMsg.signatureAlgorithm = hs.sigAlg
623
624 sigType := signatureFromSignatureScheme(hs.sigAlg)
625 sigHash, err := hashFromSignatureScheme(hs.sigAlg)
626 if sigType == 0 || err != nil {
627 return c.sendAlert(alertInternalError)
628 }
629
630 signed := signedMessage(sigHash, serverSignatureContext, hs.transcript)
631 signOpts := crypto.SignerOpts(sigHash)
632 if sigType == signatureRSAPSS {
633 signOpts = &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthEqualsHash, Hash: sigHash}
634 }
635 sig, err := hs.cert.PrivateKey.(crypto.Signer).Sign(c.config.rand(), signed, signOpts)
636 if err != nil {
637 public := hs.cert.PrivateKey.(crypto.Signer).Public()
638 if rsaKey, ok := public.(*rsa.PublicKey); ok && sigType == signatureRSAPSS &&
639 rsaKey.N.BitLen()/8 < sigHash.Size()*2+2 {
640 c.sendAlert(alertHandshakeFailure)
641 } else {
642 c.sendAlert(alertInternalError)
643 }
644 return errors.New("tls: failed to sign handshake: " + err.Error())
645 }
646 certVerifyMsg.signature = sig
647
648 hs.transcript.Write(certVerifyMsg.marshal())
649 if _, err := c.writeRecord(recordTypeHandshake, certVerifyMsg.marshal()); err != nil {
650 return err
651 }
652
653 return nil
654 }
655
656 func (hs *serverHandshakeStateTLS13) sendServerFinished() error {
657 c := hs.c
658
659 finished := &finishedMsg{
660 verifyData: hs.suite.finishedHash(c.out.trafficSecret, hs.transcript),
661 }
662
663 hs.transcript.Write(finished.marshal())
664 if _, err := c.writeRecord(recordTypeHandshake, finished.marshal()); err != nil {
665 return err
666 }
667
668
669
670 hs.masterSecret = hs.suite.extract(nil,
671 hs.suite.deriveSecret(hs.handshakeSecret, "derived", nil))
672
673 hs.trafficSecret = hs.suite.deriveSecret(hs.masterSecret,
674 clientApplicationTrafficLabel, hs.transcript)
675 serverSecret := hs.suite.deriveSecret(hs.masterSecret,
676 serverApplicationTrafficLabel, hs.transcript)
677 c.out.setTrafficSecret(hs.suite, serverSecret)
678
679 err := c.config.writeKeyLog(keyLogLabelClientTraffic, hs.clientHello.random, hs.trafficSecret)
680 if err != nil {
681 c.sendAlert(alertInternalError)
682 return err
683 }
684 err = c.config.writeKeyLog(keyLogLabelServerTraffic, hs.clientHello.random, serverSecret)
685 if err != nil {
686 c.sendAlert(alertInternalError)
687 return err
688 }
689
690 c.ekm = hs.suite.exportKeyingMaterial(hs.masterSecret, hs.transcript)
691
692
693
694
695 if !hs.requestClientCert() {
696 if err := hs.sendSessionTickets(); err != nil {
697 return err
698 }
699 }
700
701 return nil
702 }
703
704 func (hs *serverHandshakeStateTLS13) shouldSendSessionTickets() bool {
705 if hs.c.config.SessionTicketsDisabled {
706 return false
707 }
708
709
710 for _, pskMode := range hs.clientHello.pskModes {
711 if pskMode == pskModeDHE {
712 return true
713 }
714 }
715 return false
716 }
717
718 func (hs *serverHandshakeStateTLS13) sendSessionTickets() error {
719 c := hs.c
720
721 hs.clientFinished = hs.suite.finishedHash(c.in.trafficSecret, hs.transcript)
722 finishedMsg := &finishedMsg{
723 verifyData: hs.clientFinished,
724 }
725 hs.transcript.Write(finishedMsg.marshal())
726
727 if !hs.shouldSendSessionTickets() {
728 return nil
729 }
730
731 resumptionSecret := hs.suite.deriveSecret(hs.masterSecret,
732 resumptionLabel, hs.transcript)
733
734 m := new(newSessionTicketMsgTLS13)
735
736 var certsFromClient [][]byte
737 for _, cert := range c.peerCertificates {
738 certsFromClient = append(certsFromClient, cert.Raw)
739 }
740 state := sessionStateTLS13{
741 cipherSuite: hs.suite.id,
742 createdAt: uint64(c.config.time().Unix()),
743 resumptionSecret: resumptionSecret,
744 certificate: Certificate{
745 Certificate: certsFromClient,
746 OCSPStaple: c.ocspResponse,
747 SignedCertificateTimestamps: c.scts,
748 },
749 }
750 var err error
751 m.label, err = c.encryptTicket(state.marshal())
752 if err != nil {
753 return err
754 }
755 m.lifetime = uint32(maxSessionTicketLifetime / time.Second)
756
757 if _, err := c.writeRecord(recordTypeHandshake, m.marshal()); err != nil {
758 return err
759 }
760
761 return nil
762 }
763
764 func (hs *serverHandshakeStateTLS13) readClientCertificate() error {
765 c := hs.c
766
767 if !hs.requestClientCert() {
768 return nil
769 }
770
771
772
773
774 msg, err := c.readHandshake()
775 if err != nil {
776 return err
777 }
778
779 certMsg, ok := msg.(*certificateMsgTLS13)
780 if !ok {
781 c.sendAlert(alertUnexpectedMessage)
782 return unexpectedMessageError(certMsg, msg)
783 }
784 hs.transcript.Write(certMsg.marshal())
785
786 if err := c.processCertsFromClient(certMsg.certificate); err != nil {
787 return err
788 }
789
790 if len(certMsg.certificate.Certificate) != 0 {
791 msg, err = c.readHandshake()
792 if err != nil {
793 return err
794 }
795
796 certVerify, ok := msg.(*certificateVerifyMsg)
797 if !ok {
798 c.sendAlert(alertUnexpectedMessage)
799 return unexpectedMessageError(certVerify, msg)
800 }
801
802
803 if !isSupportedSignatureAlgorithm(certVerify.signatureAlgorithm, supportedSignatureAlgorithms) {
804 c.sendAlert(alertIllegalParameter)
805 return errors.New("tls: invalid certificate signature algorithm")
806 }
807 sigType := signatureFromSignatureScheme(certVerify.signatureAlgorithm)
808 sigHash, err := hashFromSignatureScheme(certVerify.signatureAlgorithm)
809 if sigType == 0 || err != nil {
810 c.sendAlert(alertInternalError)
811 return err
812 }
813 if sigType == signaturePKCS1v15 || sigHash == crypto.SHA1 {
814 c.sendAlert(alertIllegalParameter)
815 return errors.New("tls: invalid certificate signature algorithm")
816 }
817 signed := signedMessage(sigHash, clientSignatureContext, hs.transcript)
818 if err := verifyHandshakeSignature(sigType, c.peerCertificates[0].PublicKey,
819 sigHash, signed, certVerify.signature); err != nil {
820 c.sendAlert(alertDecryptError)
821 return errors.New("tls: invalid certificate signature")
822 }
823
824 hs.transcript.Write(certVerify.marshal())
825 }
826
827
828
829 if err := hs.sendSessionTickets(); err != nil {
830 return err
831 }
832
833 return nil
834 }
835
836 func (hs *serverHandshakeStateTLS13) readClientFinished() error {
837 c := hs.c
838
839 msg, err := c.readHandshake()
840 if err != nil {
841 return err
842 }
843
844 finished, ok := msg.(*finishedMsg)
845 if !ok {
846 c.sendAlert(alertUnexpectedMessage)
847 return unexpectedMessageError(finished, msg)
848 }
849
850 if !hmac.Equal(hs.clientFinished, finished.verifyData) {
851 c.sendAlert(alertDecryptError)
852 return errors.New("tls: invalid client finished hash")
853 }
854
855 c.in.setTrafficSecret(hs.suite, hs.trafficSecret)
856
857 return nil
858 }
859
View as plain text