Source file src/pkg/crypto/tls/handshake_server.go
1
2
3
4
5 package tls
6
7 import (
8 "crypto"
9 "crypto/ecdsa"
10 "crypto/ed25519"
11 "crypto/rsa"
12 "crypto/subtle"
13 "crypto/x509"
14 "errors"
15 "fmt"
16 "io"
17 "sync/atomic"
18 )
19
20
21
22 type serverHandshakeState struct {
23 c *Conn
24 clientHello *clientHelloMsg
25 hello *serverHelloMsg
26 suite *cipherSuite
27 ecdhOk bool
28 ecSignOk bool
29 rsaDecryptOk bool
30 rsaSignOk bool
31 sessionState *sessionState
32 finishedHash finishedHash
33 masterSecret []byte
34 cert *Certificate
35 }
36
37
38 func (c *Conn) serverHandshake() error {
39
40
41 c.config.serverInitOnce.Do(func() { c.config.serverInit(nil) })
42
43 clientHello, err := c.readClientHello()
44 if err != nil {
45 return err
46 }
47
48 if c.vers == VersionTLS13 {
49 hs := serverHandshakeStateTLS13{
50 c: c,
51 clientHello: clientHello,
52 }
53 return hs.handshake()
54 }
55
56 hs := serverHandshakeState{
57 c: c,
58 clientHello: clientHello,
59 }
60 return hs.handshake()
61 }
62
63 func (hs *serverHandshakeState) handshake() error {
64 c := hs.c
65
66 if err := hs.processClientHello(); err != nil {
67 return err
68 }
69
70
71 c.buffering = true
72 if hs.checkForResumption() {
73
74 if err := hs.doResumeHandshake(); err != nil {
75 return err
76 }
77 if err := hs.establishKeys(); err != nil {
78 return err
79 }
80
81
82
83 if hs.hello.ticketSupported {
84 if err := hs.sendSessionTicket(); err != nil {
85 return err
86 }
87 }
88 if err := hs.sendFinished(c.serverFinished[:]); err != nil {
89 return err
90 }
91 if _, err := c.flush(); err != nil {
92 return err
93 }
94 c.clientFinishedIsFirst = false
95 if err := hs.readFinished(nil); err != nil {
96 return err
97 }
98 c.didResume = true
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 atomic.StoreUint32(&c.handshakeStatus, 1)
129
130 return nil
131 }
132
133
134 func (c *Conn) readClientHello() (*clientHelloMsg, error) {
135 msg, err := c.readHandshake()
136 if err != nil {
137 return nil, err
138 }
139 clientHello, ok := msg.(*clientHelloMsg)
140 if !ok {
141 c.sendAlert(alertUnexpectedMessage)
142 return nil, unexpectedMessageError(clientHello, msg)
143 }
144
145 if c.config.GetConfigForClient != nil {
146 chi := clientHelloInfo(c, clientHello)
147 if newConfig, err := c.config.GetConfigForClient(chi); err != nil {
148 c.sendAlert(alertInternalError)
149 return nil, err
150 } else if newConfig != nil {
151 newConfig.serverInitOnce.Do(func() { newConfig.serverInit(c.config) })
152 c.config = newConfig
153 }
154 }
155
156 clientVersions := clientHello.supportedVersions
157 if len(clientHello.supportedVersions) == 0 {
158 clientVersions = supportedVersionsFromMax(clientHello.vers)
159 }
160 c.vers, ok = c.config.mutualVersion(false, clientVersions)
161 if !ok {
162 c.sendAlert(alertProtocolVersion)
163 return nil, fmt.Errorf("tls: client offered only unsupported versions: %x", clientVersions)
164 }
165 c.haveVers = true
166 c.in.version = c.vers
167 c.out.version = c.vers
168
169 return clientHello, nil
170 }
171
172 func (hs *serverHandshakeState) processClientHello() error {
173 c := hs.c
174
175 hs.hello = new(serverHelloMsg)
176 hs.hello.vers = c.vers
177
178 supportedCurve := false
179 preferredCurves := c.config.curvePreferences()
180 Curves:
181 for _, curve := range hs.clientHello.supportedCurves {
182 for _, supported := range preferredCurves {
183 if supported == curve {
184 supportedCurve = true
185 break Curves
186 }
187 }
188 }
189
190 supportedPointFormat := false
191 for _, pointFormat := range hs.clientHello.supportedPoints {
192 if pointFormat == pointFormatUncompressed {
193 supportedPointFormat = true
194 break
195 }
196 }
197 hs.ecdhOk = supportedCurve && supportedPointFormat
198
199 foundCompression := false
200
201 for _, compression := range hs.clientHello.compressionMethods {
202 if compression == compressionNone {
203 foundCompression = true
204 break
205 }
206 }
207
208 if !foundCompression {
209 c.sendAlert(alertHandshakeFailure)
210 return errors.New("tls: client does not support uncompressed connections")
211 }
212
213 hs.hello.random = make([]byte, 32)
214 serverRandom := hs.hello.random
215
216 maxVers := c.config.maxSupportedVersion(false)
217 if maxVers >= VersionTLS12 && c.vers < maxVers {
218 if c.vers == VersionTLS12 {
219 copy(serverRandom[24:], downgradeCanaryTLS12)
220 } else {
221 copy(serverRandom[24:], downgradeCanaryTLS11)
222 }
223 serverRandom = serverRandom[:24]
224 }
225 _, err := io.ReadFull(c.config.rand(), serverRandom)
226 if err != nil {
227 c.sendAlert(alertInternalError)
228 return err
229 }
230
231 if len(hs.clientHello.secureRenegotiation) != 0 {
232 c.sendAlert(alertHandshakeFailure)
233 return errors.New("tls: initial handshake had non-empty renegotiation extension")
234 }
235
236 hs.hello.secureRenegotiationSupported = hs.clientHello.secureRenegotiationSupported
237 hs.hello.compressionMethod = compressionNone
238 if len(hs.clientHello.serverName) > 0 {
239 c.serverName = hs.clientHello.serverName
240 }
241
242 if len(hs.clientHello.alpnProtocols) > 0 {
243 if selectedProto, fallback := mutualProtocol(hs.clientHello.alpnProtocols, c.config.NextProtos); !fallback {
244 hs.hello.alpnProtocol = selectedProto
245 c.clientProtocol = selectedProto
246 }
247 } else {
248
249
250
251
252 if hs.clientHello.nextProtoNeg && len(c.config.NextProtos) > 0 {
253 hs.hello.nextProtoNeg = true
254 hs.hello.nextProtos = c.config.NextProtos
255 }
256 }
257
258 hs.cert, err = c.config.getCertificate(clientHelloInfo(c, hs.clientHello))
259 if err != nil {
260 c.sendAlert(alertInternalError)
261 return err
262 }
263 if hs.clientHello.scts {
264 hs.hello.scts = hs.cert.SignedCertificateTimestamps
265 }
266
267 if priv, ok := hs.cert.PrivateKey.(crypto.Signer); ok {
268 switch priv.Public().(type) {
269 case *ecdsa.PublicKey:
270 hs.ecSignOk = true
271 case ed25519.PublicKey:
272 hs.ecSignOk = true
273 case *rsa.PublicKey:
274 hs.rsaSignOk = true
275 default:
276 c.sendAlert(alertInternalError)
277 return fmt.Errorf("tls: unsupported signing key type (%T)", priv.Public())
278 }
279 }
280 if priv, ok := hs.cert.PrivateKey.(crypto.Decrypter); ok {
281 switch priv.Public().(type) {
282 case *rsa.PublicKey:
283 hs.rsaDecryptOk = true
284 default:
285 c.sendAlert(alertInternalError)
286 return fmt.Errorf("tls: unsupported decryption key type (%T)", priv.Public())
287 }
288 }
289
290 return nil
291 }
292
293 func (hs *serverHandshakeState) pickCipherSuite() error {
294 c := hs.c
295
296 var preferenceList, supportedList []uint16
297 if c.config.PreferServerCipherSuites {
298 preferenceList = c.config.cipherSuites()
299 supportedList = hs.clientHello.cipherSuites
300 } else {
301 preferenceList = hs.clientHello.cipherSuites
302 supportedList = c.config.cipherSuites()
303 }
304
305 for _, id := range preferenceList {
306 if hs.setCipherSuite(id, supportedList, c.vers) {
307 break
308 }
309 }
310
311 if hs.suite == nil {
312 c.sendAlert(alertHandshakeFailure)
313 return errors.New("tls: no cipher suite supported by both client and server")
314 }
315
316 for _, id := range hs.clientHello.cipherSuites {
317 if id == TLS_FALLBACK_SCSV {
318
319 if hs.clientHello.vers < c.config.maxSupportedVersion(false) {
320 c.sendAlert(alertInappropriateFallback)
321 return errors.New("tls: client using inappropriate protocol fallback")
322 }
323 break
324 }
325 }
326
327 return nil
328 }
329
330
331 func (hs *serverHandshakeState) checkForResumption() bool {
332 c := hs.c
333
334 if c.config.SessionTicketsDisabled {
335 return false
336 }
337
338 plaintext, usedOldKey := c.decryptTicket(hs.clientHello.sessionTicket)
339 if plaintext == nil {
340 return false
341 }
342 hs.sessionState = &sessionState{usedOldKey: usedOldKey}
343 ok := hs.sessionState.unmarshal(plaintext)
344 if !ok {
345 return false
346 }
347
348
349 if c.vers != hs.sessionState.vers {
350 return false
351 }
352
353 cipherSuiteOk := false
354
355 for _, id := range hs.clientHello.cipherSuites {
356 if id == hs.sessionState.cipherSuite {
357 cipherSuiteOk = true
358 break
359 }
360 }
361 if !cipherSuiteOk {
362 return false
363 }
364
365
366 if !hs.setCipherSuite(hs.sessionState.cipherSuite, c.config.cipherSuites(), hs.sessionState.vers) {
367 return false
368 }
369
370 sessionHasClientCerts := len(hs.sessionState.certificates) != 0
371 needClientCerts := requiresClientCert(c.config.ClientAuth)
372 if needClientCerts && !sessionHasClientCerts {
373 return false
374 }
375 if sessionHasClientCerts && c.config.ClientAuth == NoClientCert {
376 return false
377 }
378
379 return true
380 }
381
382 func (hs *serverHandshakeState) doResumeHandshake() error {
383 c := hs.c
384
385 hs.hello.cipherSuite = hs.suite.id
386
387
388 hs.hello.sessionId = hs.clientHello.sessionId
389 hs.hello.ticketSupported = hs.sessionState.usedOldKey
390 hs.finishedHash = newFinishedHash(c.vers, hs.suite)
391 hs.finishedHash.discardHandshakeBuffer()
392 hs.finishedHash.Write(hs.clientHello.marshal())
393 hs.finishedHash.Write(hs.hello.marshal())
394 if _, err := c.writeRecord(recordTypeHandshake, hs.hello.marshal()); err != nil {
395 return err
396 }
397
398 if err := c.processCertsFromClient(Certificate{
399 Certificate: hs.sessionState.certificates,
400 }); err != nil {
401 return err
402 }
403
404 hs.masterSecret = hs.sessionState.masterSecret
405
406 return nil
407 }
408
409 func (hs *serverHandshakeState) doFullHandshake() error {
410 c := hs.c
411
412 if hs.clientHello.ocspStapling && len(hs.cert.OCSPStaple) > 0 {
413 hs.hello.ocspStapling = true
414 }
415
416 hs.hello.ticketSupported = hs.clientHello.ticketSupported && !c.config.SessionTicketsDisabled
417 hs.hello.cipherSuite = hs.suite.id
418
419 hs.finishedHash = newFinishedHash(hs.c.vers, hs.suite)
420 if c.config.ClientAuth == NoClientCert {
421
422
423 hs.finishedHash.discardHandshakeBuffer()
424 }
425 hs.finishedHash.Write(hs.clientHello.marshal())
426 hs.finishedHash.Write(hs.hello.marshal())
427 if _, err := c.writeRecord(recordTypeHandshake, hs.hello.marshal()); err != nil {
428 return err
429 }
430
431 certMsg := new(certificateMsg)
432 certMsg.certificates = hs.cert.Certificate
433 hs.finishedHash.Write(certMsg.marshal())
434 if _, err := c.writeRecord(recordTypeHandshake, certMsg.marshal()); err != nil {
435 return err
436 }
437
438 if hs.hello.ocspStapling {
439 certStatus := new(certificateStatusMsg)
440 certStatus.response = hs.cert.OCSPStaple
441 hs.finishedHash.Write(certStatus.marshal())
442 if _, err := c.writeRecord(recordTypeHandshake, certStatus.marshal()); err != nil {
443 return err
444 }
445 }
446
447 keyAgreement := hs.suite.ka(c.vers)
448 skx, err := keyAgreement.generateServerKeyExchange(c.config, hs.cert, hs.clientHello, hs.hello)
449 if err != nil {
450 c.sendAlert(alertHandshakeFailure)
451 return err
452 }
453 if skx != nil {
454 hs.finishedHash.Write(skx.marshal())
455 if _, err := c.writeRecord(recordTypeHandshake, skx.marshal()); err != nil {
456 return err
457 }
458 }
459
460 var certReq *certificateRequestMsg
461 if c.config.ClientAuth >= RequestClientCert {
462
463 certReq = new(certificateRequestMsg)
464 certReq.certificateTypes = []byte{
465 byte(certTypeRSASign),
466 byte(certTypeECDSASign),
467 }
468 if c.vers >= VersionTLS12 {
469 certReq.hasSignatureAlgorithm = true
470 certReq.supportedSignatureAlgorithms = supportedSignatureAlgorithmsTLS12
471 }
472
473
474
475
476
477
478 if c.config.ClientCAs != nil {
479 certReq.certificateAuthorities = c.config.ClientCAs.Subjects()
480 }
481 hs.finishedHash.Write(certReq.marshal())
482 if _, err := c.writeRecord(recordTypeHandshake, certReq.marshal()); err != nil {
483 return err
484 }
485 }
486
487 helloDone := new(serverHelloDoneMsg)
488 hs.finishedHash.Write(helloDone.marshal())
489 if _, err := c.writeRecord(recordTypeHandshake, helloDone.marshal()); err != nil {
490 return err
491 }
492
493 if _, err := c.flush(); err != nil {
494 return err
495 }
496
497 var pub crypto.PublicKey
498
499 msg, err := c.readHandshake()
500 if err != nil {
501 return err
502 }
503
504
505
506 if c.config.ClientAuth >= RequestClientCert {
507 certMsg, ok := msg.(*certificateMsg)
508 if !ok {
509 c.sendAlert(alertUnexpectedMessage)
510 return unexpectedMessageError(certMsg, msg)
511 }
512 hs.finishedHash.Write(certMsg.marshal())
513
514 if err := c.processCertsFromClient(Certificate{
515 Certificate: certMsg.certificates,
516 }); err != nil {
517 return err
518 }
519 if len(certMsg.certificates) != 0 {
520 pub = c.peerCertificates[0].PublicKey
521 }
522
523 msg, err = c.readHandshake()
524 if err != nil {
525 return err
526 }
527 }
528
529
530 ckx, ok := msg.(*clientKeyExchangeMsg)
531 if !ok {
532 c.sendAlert(alertUnexpectedMessage)
533 return unexpectedMessageError(ckx, msg)
534 }
535 hs.finishedHash.Write(ckx.marshal())
536
537 preMasterSecret, err := keyAgreement.processClientKeyExchange(c.config, hs.cert, ckx, c.vers)
538 if err != nil {
539 c.sendAlert(alertHandshakeFailure)
540 return err
541 }
542 hs.masterSecret = masterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret, hs.clientHello.random, hs.hello.random)
543 if err := c.config.writeKeyLog(keyLogLabelTLS12, hs.clientHello.random, hs.masterSecret); err != nil {
544 c.sendAlert(alertInternalError)
545 return err
546 }
547
548
549
550
551
552
553
554 if len(c.peerCertificates) > 0 {
555 msg, err = c.readHandshake()
556 if err != nil {
557 return err
558 }
559 certVerify, ok := msg.(*certificateVerifyMsg)
560 if !ok {
561 c.sendAlert(alertUnexpectedMessage)
562 return unexpectedMessageError(certVerify, msg)
563 }
564
565
566 _, sigType, hashFunc, err := pickSignatureAlgorithm(pub, []SignatureScheme{certVerify.signatureAlgorithm}, certReq.supportedSignatureAlgorithms, c.vers)
567 if err != nil {
568 c.sendAlert(alertIllegalParameter)
569 return err
570 }
571
572 signed, err := hs.finishedHash.hashForClientCertificate(sigType, hashFunc, hs.masterSecret)
573 if err == nil {
574 err = verifyHandshakeSignature(sigType, pub, hashFunc, signed, certVerify.signature)
575 }
576 if err != nil {
577 c.sendAlert(alertBadCertificate)
578 return errors.New("tls: could not validate signature of connection nonces: " + err.Error())
579 }
580
581 hs.finishedHash.Write(certVerify.marshal())
582 }
583
584 hs.finishedHash.discardHandshakeBuffer()
585
586 return nil
587 }
588
589 func (hs *serverHandshakeState) establishKeys() error {
590 c := hs.c
591
592 clientMAC, serverMAC, clientKey, serverKey, clientIV, serverIV :=
593 keysFromMasterSecret(c.vers, hs.suite, hs.masterSecret, hs.clientHello.random, hs.hello.random, hs.suite.macLen, hs.suite.keyLen, hs.suite.ivLen)
594
595 var clientCipher, serverCipher interface{}
596 var clientHash, serverHash macFunction
597
598 if hs.suite.aead == nil {
599 clientCipher = hs.suite.cipher(clientKey, clientIV, true )
600 clientHash = hs.suite.mac(c.vers, clientMAC)
601 serverCipher = hs.suite.cipher(serverKey, serverIV, false )
602 serverHash = hs.suite.mac(c.vers, serverMAC)
603 } else {
604 clientCipher = hs.suite.aead(clientKey, clientIV)
605 serverCipher = hs.suite.aead(serverKey, serverIV)
606 }
607
608 c.in.prepareCipherSpec(c.vers, clientCipher, clientHash)
609 c.out.prepareCipherSpec(c.vers, serverCipher, serverHash)
610
611 return nil
612 }
613
614 func (hs *serverHandshakeState) readFinished(out []byte) error {
615 c := hs.c
616
617 if err := c.readChangeCipherSpec(); err != nil {
618 return err
619 }
620
621 if hs.hello.nextProtoNeg {
622 msg, err := c.readHandshake()
623 if err != nil {
624 return err
625 }
626 nextProto, ok := msg.(*nextProtoMsg)
627 if !ok {
628 c.sendAlert(alertUnexpectedMessage)
629 return unexpectedMessageError(nextProto, msg)
630 }
631 hs.finishedHash.Write(nextProto.marshal())
632 c.clientProtocol = nextProto.proto
633 }
634
635 msg, err := c.readHandshake()
636 if err != nil {
637 return err
638 }
639 clientFinished, ok := msg.(*finishedMsg)
640 if !ok {
641 c.sendAlert(alertUnexpectedMessage)
642 return unexpectedMessageError(clientFinished, msg)
643 }
644
645 verify := hs.finishedHash.clientSum(hs.masterSecret)
646 if len(verify) != len(clientFinished.verifyData) ||
647 subtle.ConstantTimeCompare(verify, clientFinished.verifyData) != 1 {
648 c.sendAlert(alertHandshakeFailure)
649 return errors.New("tls: client's Finished message is incorrect")
650 }
651
652 hs.finishedHash.Write(clientFinished.marshal())
653 copy(out, verify)
654 return nil
655 }
656
657 func (hs *serverHandshakeState) sendSessionTicket() error {
658 if !hs.hello.ticketSupported {
659 return nil
660 }
661
662 c := hs.c
663 m := new(newSessionTicketMsg)
664
665 var certsFromClient [][]byte
666 for _, cert := range c.peerCertificates {
667 certsFromClient = append(certsFromClient, cert.Raw)
668 }
669 state := sessionState{
670 vers: c.vers,
671 cipherSuite: hs.suite.id,
672 masterSecret: hs.masterSecret,
673 certificates: certsFromClient,
674 }
675 var err error
676 m.ticket, err = c.encryptTicket(state.marshal())
677 if err != nil {
678 return err
679 }
680
681 hs.finishedHash.Write(m.marshal())
682 if _, err := c.writeRecord(recordTypeHandshake, m.marshal()); err != nil {
683 return err
684 }
685
686 return nil
687 }
688
689 func (hs *serverHandshakeState) sendFinished(out []byte) error {
690 c := hs.c
691
692 if _, err := c.writeRecord(recordTypeChangeCipherSpec, []byte{1}); err != nil {
693 return err
694 }
695
696 finished := new(finishedMsg)
697 finished.verifyData = hs.finishedHash.serverSum(hs.masterSecret)
698 hs.finishedHash.Write(finished.marshal())
699 if _, err := c.writeRecord(recordTypeHandshake, finished.marshal()); err != nil {
700 return err
701 }
702
703 c.cipherSuite = hs.suite.id
704 copy(out, finished.verifyData)
705
706 return nil
707 }
708
709
710
711
712 func (c *Conn) processCertsFromClient(certificate Certificate) error {
713 certificates := certificate.Certificate
714 certs := make([]*x509.Certificate, len(certificates))
715 var err error
716 for i, asn1Data := range certificates {
717 if certs[i], err = x509.ParseCertificate(asn1Data); err != nil {
718 c.sendAlert(alertBadCertificate)
719 return errors.New("tls: failed to parse client certificate: " + err.Error())
720 }
721 }
722
723 if len(certs) == 0 && requiresClientCert(c.config.ClientAuth) {
724 c.sendAlert(alertBadCertificate)
725 return errors.New("tls: client didn't provide a certificate")
726 }
727
728 if c.config.ClientAuth >= VerifyClientCertIfGiven && len(certs) > 0 {
729 opts := x509.VerifyOptions{
730 Roots: c.config.ClientCAs,
731 CurrentTime: c.config.time(),
732 Intermediates: x509.NewCertPool(),
733 KeyUsages: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth},
734 }
735
736 for _, cert := range certs[1:] {
737 opts.Intermediates.AddCert(cert)
738 }
739
740 chains, err := certs[0].Verify(opts)
741 if err != nil {
742 c.sendAlert(alertBadCertificate)
743 return errors.New("tls: failed to verify client's certificate: " + err.Error())
744 }
745
746 c.verifiedChains = chains
747 }
748
749 if c.config.VerifyPeerCertificate != nil {
750 if err := c.config.VerifyPeerCertificate(certificates, c.verifiedChains); err != nil {
751 c.sendAlert(alertBadCertificate)
752 return err
753 }
754 }
755
756 if len(certs) == 0 {
757 return nil
758 }
759
760 switch certs[0].PublicKey.(type) {
761 case *ecdsa.PublicKey, *rsa.PublicKey, ed25519.PublicKey:
762 default:
763 c.sendAlert(alertUnsupportedCertificate)
764 return fmt.Errorf("tls: client's certificate contains an unsupported public key of type %T", certs[0].PublicKey)
765 }
766
767 c.peerCertificates = certs
768 c.ocspResponse = certificate.OCSPStaple
769 c.scts = certificate.SignedCertificateTimestamps
770 return nil
771 }
772
773
774
775
776 func (hs *serverHandshakeState) setCipherSuite(id uint16, supportedCipherSuites []uint16, version uint16) bool {
777 for _, supported := range supportedCipherSuites {
778 if id != supported {
779 continue
780 }
781 candidate := cipherSuiteByID(id)
782 if candidate == nil {
783 continue
784 }
785
786
787 if candidate.flags&suiteECDHE != 0 {
788 if !hs.ecdhOk {
789 continue
790 }
791 if candidate.flags&suiteECSign != 0 {
792 if !hs.ecSignOk {
793 continue
794 }
795 } else if !hs.rsaSignOk {
796 continue
797 }
798 } else if !hs.rsaDecryptOk {
799 continue
800 }
801 if version < VersionTLS12 && candidate.flags&suiteTLS12 != 0 {
802 continue
803 }
804 hs.suite = candidate
805 return true
806 }
807 return false
808 }
809
810 func clientHelloInfo(c *Conn, clientHello *clientHelloMsg) *ClientHelloInfo {
811 supportedVersions := clientHello.supportedVersions
812 if len(clientHello.supportedVersions) == 0 {
813 supportedVersions = supportedVersionsFromMax(clientHello.vers)
814 }
815
816 return &ClientHelloInfo{
817 CipherSuites: clientHello.cipherSuites,
818 ServerName: clientHello.serverName,
819 SupportedCurves: clientHello.supportedCurves,
820 SupportedPoints: clientHello.supportedPoints,
821 SignatureSchemes: clientHello.supportedSignatureAlgorithms,
822 SupportedProtos: clientHello.alpnProtocols,
823 SupportedVersions: supportedVersions,
824 Conn: c.conn,
825 }
826 }
827
View as plain text