OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/quic/crypto/quic_crypto_client_config.h" | 5 #include "net/quic/crypto/quic_crypto_client_config.h" |
6 | 6 |
7 #include "base/metrics/histogram_macros.h" | 7 #include "base/metrics/histogram_macros.h" |
8 #include "base/metrics/sparse_histogram.h" | 8 #include "base/metrics/sparse_histogram.h" |
9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
(...skipping 755 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
766 QuicErrorCode QuicCryptoClientConfig::ProcessServerHello( | 766 QuicErrorCode QuicCryptoClientConfig::ProcessServerHello( |
767 const CryptoHandshakeMessage& server_hello, | 767 const CryptoHandshakeMessage& server_hello, |
768 QuicConnectionId connection_id, | 768 QuicConnectionId connection_id, |
769 QuicVersion version, | 769 QuicVersion version, |
770 const QuicVersionVector& negotiated_versions, | 770 const QuicVersionVector& negotiated_versions, |
771 CachedState* cached, | 771 CachedState* cached, |
772 QuicCryptoNegotiatedParameters* out_params, | 772 QuicCryptoNegotiatedParameters* out_params, |
773 string* error_details) { | 773 string* error_details) { |
774 DCHECK(error_details != nullptr); | 774 DCHECK(error_details != nullptr); |
775 | 775 |
776 if (server_hello.tag() != kSHLO) { | 776 QuicErrorCode valid = CryptoUtils::ValidateServerHello( |
777 *error_details = "Bad tag"; | 777 server_hello, negotiated_versions, error_details); |
778 return QUIC_INVALID_CRYPTO_MESSAGE_TYPE; | 778 if (valid != QUIC_NO_ERROR) { |
779 } | 779 return valid; |
780 | |
781 const QuicTag* supported_version_tags; | |
782 size_t num_supported_versions; | |
783 | |
784 if (server_hello.GetTaglist(kVER, &supported_version_tags, | |
785 &num_supported_versions) != QUIC_NO_ERROR) { | |
786 *error_details = "server hello missing version list"; | |
787 return QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER; | |
788 } | |
789 if (!negotiated_versions.empty()) { | |
790 bool mismatch = num_supported_versions != negotiated_versions.size(); | |
791 for (size_t i = 0; i < num_supported_versions && !mismatch; ++i) { | |
792 mismatch = QuicTagToQuicVersion(supported_version_tags[i]) != | |
793 negotiated_versions[i]; | |
794 } | |
795 // The server sent a list of supported versions, and the connection | |
796 // reports that there was a version negotiation during the handshake. | |
797 // Ensure that these two lists are identical. | |
798 if (mismatch) { | |
799 *error_details = "Downgrade attack detected"; | |
800 return QUIC_VERSION_NEGOTIATION_MISMATCH; | |
801 } | |
802 } | 780 } |
803 | 781 |
804 // Learn about updated source address tokens. | 782 // Learn about updated source address tokens. |
805 StringPiece token; | 783 StringPiece token; |
806 if (server_hello.GetStringPiece(kSourceAddressTokenTag, &token)) { | 784 if (server_hello.GetStringPiece(kSourceAddressTokenTag, &token)) { |
807 cached->set_source_address_token(token); | 785 cached->set_source_address_token(token); |
808 } | 786 } |
809 | 787 |
810 StringPiece shlo_nonce; | 788 StringPiece shlo_nonce; |
811 if (version > QUIC_VERSION_26 && | 789 if (version > QUIC_VERSION_26 && |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
942 } | 920 } |
943 | 921 |
944 // Update canonical version to point at the "most recent" entry. | 922 // Update canonical version to point at the "most recent" entry. |
945 canonical_server_map_[suffix_server_id] = server_id; | 923 canonical_server_map_[suffix_server_id] = server_id; |
946 | 924 |
947 server_state->InitializeFrom(*canonical_state); | 925 server_state->InitializeFrom(*canonical_state); |
948 return true; | 926 return true; |
949 } | 927 } |
950 | 928 |
951 } // namespace net | 929 } // namespace net |
OLD | NEW |