()
| 682 | } |
| 683 | |
| 684 | func (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 |
no test coverage detected