MCPcopy Create free account
hub / github.com/XTLS/Go / processServerHello

Method processServerHello

handshake_client.go:684–748  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

682}
683
684func (hs *clientHandshakeState) processServerHello() (bool, error) {
685 c := hs.c
686
687 if err := hs.pickCipherSuite(); err != nil {
688 return false, err
689 }
690
691 if hs.serverHello.compressionMethod != compressionNone {
692 c.sendAlert(alertUnexpectedMessage)
693 return false, errors.New("tls: server selected unsupported compression format")
694 }
695
696 if c.handshakes == 0 && hs.serverHello.secureRenegotiationSupported {
697 c.secureRenegotiation = true
698 if len(hs.serverHello.secureRenegotiation) != 0 {
699 c.sendAlert(alertHandshakeFailure)
700 return false, errors.New("tls: initial handshake had non-empty renegotiation extension")
701 }
702 }
703
704 if c.handshakes > 0 && c.secureRenegotiation {
705 var expectedSecureRenegotiation [24]byte
706 copy(expectedSecureRenegotiation[:], c.clientFinished[:])
707 copy(expectedSecureRenegotiation[12:], c.serverFinished[:])
708 if !bytes.Equal(hs.serverHello.secureRenegotiation, expectedSecureRenegotiation[:]) {
709 c.sendAlert(alertHandshakeFailure)
710 return false, errors.New("tls: incorrect renegotiation extension contents")
711 }
712 }
713
714 if err := checkALPN(hs.hello.alpnProtocols, hs.serverHello.alpnProtocol); err != nil {
715 c.sendAlert(alertUnsupportedExtension)
716 return false, err
717 }
718 c.clientProtocol = hs.serverHello.alpnProtocol
719
720 c.scts = hs.serverHello.scts
721
722 if !hs.serverResumedSession() {
723 return false, nil
724 }
725
726 if hs.session.vers != c.vers {
727 c.sendAlert(alertHandshakeFailure)
728 return false, errors.New("tls: server resumed a session with a different version")
729 }
730
731 if hs.session.cipherSuite != hs.suite.id {
732 c.sendAlert(alertHandshakeFailure)
733 return false, errors.New("tls: server resumed a session with a different cipher suite")
734 }
735
736 // Restore masterSecret, peerCerts, and ocspResponse from previous state
737 hs.masterSecret = hs.session.masterSecret
738 c.peerCertificates = hs.session.serverCertificates
739 c.verifiedChains = hs.session.verifiedChains
740 c.ocspResponse = hs.session.ocspResponse
741 // Let the ServerHello SCTs override the session SCTs from the original

Callers 1

handshakeMethod · 0.95

Calls 4

pickCipherSuiteMethod · 0.95
serverResumedSessionMethod · 0.95
checkALPNFunction · 0.85
sendAlertMethod · 0.80

Tested by

no test coverage detected