Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(45)

Side by Side Diff: net/quic/core/crypto/crypto_server_test.cc

Issue 2626443002: Fix QUIC crash when ProofSource::GetProof fails (Closed)
Patch Set: Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 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 <algorithm> 5 #include <algorithm>
6 #include <cstdint> 6 #include <cstdint>
7 #include <memory> 7 #include <memory>
8 #include <ostream> 8 #include <ostream>
9 #include <vector> 9 #include <vector>
10 10
11 #include "crypto/secure_hash.h" 11 #include "crypto/secure_hash.h"
12 #include "net/quic/core/crypto/cert_compressor.h" 12 #include "net/quic/core/crypto/cert_compressor.h"
13 #include "net/quic/core/crypto/common_cert_set.h" 13 #include "net/quic/core/crypto/common_cert_set.h"
14 #include "net/quic/core/crypto/crypto_handshake.h" 14 #include "net/quic/core/crypto/crypto_handshake.h"
15 #include "net/quic/core/crypto/crypto_server_config_protobuf.h" 15 #include "net/quic/core/crypto/crypto_server_config_protobuf.h"
16 #include "net/quic/core/crypto/crypto_utils.h" 16 #include "net/quic/core/crypto/crypto_utils.h"
17 #include "net/quic/core/crypto/proof_source.h" 17 #include "net/quic/core/crypto/proof_source.h"
18 #include "net/quic/core/crypto/quic_crypto_server_config.h" 18 #include "net/quic/core/crypto/quic_crypto_server_config.h"
19 #include "net/quic/core/crypto/quic_random.h" 19 #include "net/quic/core/crypto/quic_random.h"
20 #include "net/quic/core/quic_flags.h" 20 #include "net/quic/core/quic_flags.h"
21 #include "net/quic/core/quic_socket_address_coder.h" 21 #include "net/quic/core/quic_socket_address_coder.h"
22 #include "net/quic/core/quic_utils.h" 22 #include "net/quic/core/quic_utils.h"
23 #include "net/quic/platform/api/quic_text_utils.h" 23 #include "net/quic/platform/api/quic_text_utils.h"
24 #include "net/quic/test_tools/crypto_test_utils.h" 24 #include "net/quic/test_tools/crypto_test_utils.h"
25 #include "net/quic/test_tools/delayed_verify_strike_register_client.h" 25 #include "net/quic/test_tools/delayed_verify_strike_register_client.h"
26 #include "net/quic/test_tools/failing_proof_source.h"
26 #include "net/quic/test_tools/mock_clock.h" 27 #include "net/quic/test_tools/mock_clock.h"
27 #include "net/quic/test_tools/mock_random.h" 28 #include "net/quic/test_tools/mock_random.h"
28 #include "net/quic/test_tools/quic_crypto_server_config_peer.h" 29 #include "net/quic/test_tools/quic_crypto_server_config_peer.h"
29 #include "net/quic/test_tools/quic_test_utils.h" 30 #include "net/quic/test_tools/quic_test_utils.h"
30 #include "testing/gtest/include/gtest/gtest.h" 31 #include "testing/gtest/include/gtest/gtest.h"
31 32
32 using base::StringPiece; 33 using base::StringPiece;
33 using std::string; 34 using std::string;
34 35
35 namespace net { 36 namespace net {
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 } 101 }
101 102
102 class CryptoServerTest : public ::testing::TestWithParam<TestParams> { 103 class CryptoServerTest : public ::testing::TestWithParam<TestParams> {
103 public: 104 public:
104 CryptoServerTest() 105 CryptoServerTest()
105 : rand_(QuicRandom::GetInstance()), 106 : rand_(QuicRandom::GetInstance()),
106 client_address_(QuicIpAddress::Loopback4(), 1234), 107 client_address_(QuicIpAddress::Loopback4(), 1234),
107 config_(QuicCryptoServerConfig::TESTING, 108 config_(QuicCryptoServerConfig::TESTING,
108 rand_, 109 rand_,
109 CryptoTestUtils::ProofSourceForTesting()), 110 CryptoTestUtils::ProofSourceForTesting()),
111 peer_(&config_),
110 compressed_certs_cache_( 112 compressed_certs_cache_(
111 QuicCompressedCertsCache::kQuicCompressedCertsCacheSize), 113 QuicCompressedCertsCache::kQuicCompressedCertsCacheSize),
112 params_(new QuicCryptoNegotiatedParameters), 114 params_(new QuicCryptoNegotiatedParameters),
113 signed_config_(new QuicSignedServerConfig), 115 signed_config_(new QuicSignedServerConfig),
114 chlo_packet_size_(kDefaultMaxPacketSize) { 116 chlo_packet_size_(kDefaultMaxPacketSize) {
115 supported_versions_ = GetParam().supported_versions; 117 supported_versions_ = GetParam().supported_versions;
116 config_.set_enable_serving_sct(true); 118 config_.set_enable_serving_sct(true);
117 119
118 client_version_ = supported_versions_.front(); 120 client_version_ = supported_versions_.front();
119 client_version_string_ = 121 client_version_string_ =
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
392 protected: 394 protected:
393 QuicFlagSaver flags_; // Save/restore all QUIC flag values. 395 QuicFlagSaver flags_; // Save/restore all QUIC flag values.
394 QuicRandom* const rand_; 396 QuicRandom* const rand_;
395 MockRandom rand_for_id_generation_; 397 MockRandom rand_for_id_generation_;
396 MockClock clock_; 398 MockClock clock_;
397 QuicSocketAddress client_address_; 399 QuicSocketAddress client_address_;
398 QuicVersionVector supported_versions_; 400 QuicVersionVector supported_versions_;
399 QuicVersion client_version_; 401 QuicVersion client_version_;
400 string client_version_string_; 402 string client_version_string_;
401 QuicCryptoServerConfig config_; 403 QuicCryptoServerConfig config_;
404 QuicCryptoServerConfigPeer peer_;
402 QuicCompressedCertsCache compressed_certs_cache_; 405 QuicCompressedCertsCache compressed_certs_cache_;
403 QuicCryptoServerConfig::ConfigOptions config_options_; 406 QuicCryptoServerConfig::ConfigOptions config_options_;
404 QuicReferenceCountedPointer<QuicCryptoNegotiatedParameters> params_; 407 QuicReferenceCountedPointer<QuicCryptoNegotiatedParameters> params_;
405 QuicReferenceCountedPointer<QuicSignedServerConfig> signed_config_; 408 QuicReferenceCountedPointer<QuicSignedServerConfig> signed_config_;
406 CryptoHandshakeMessage out_; 409 CryptoHandshakeMessage out_;
407 uint8_t orbit_[kOrbitSize]; 410 uint8_t orbit_[kOrbitSize];
408 bool use_stateless_rejects_; 411 bool use_stateless_rejects_;
409 size_t chlo_packet_size_; 412 size_t chlo_packet_size_;
410 413
411 // These strings contain hex escaped values from the server suitable for using 414 // These strings contain hex escaped values from the server suitable for using
(...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after
989 // and cause ProcessClientHello to exit early (and generate a REJ message). 992 // and cause ProcessClientHello to exit early (and generate a REJ message).
990 config_.set_replay_protection(false); 993 config_.set_replay_protection(false);
991 994
992 ShouldSucceed(msg); 995 ShouldSucceed(msg);
993 EXPECT_EQ(kSHLO, out_.tag()); 996 EXPECT_EQ(kSHLO, out_.tag());
994 997
995 StringPiece nonce; 998 StringPiece nonce;
996 EXPECT_TRUE(out_.GetStringPiece(kServerNonceTag, &nonce)); 999 EXPECT_TRUE(out_.GetStringPiece(kServerNonceTag, &nonce));
997 } 1000 }
998 1001
1002 TEST_P(CryptoServerTest, ProofSourceFailure) {
1003 // Install a ProofSource which will unconditionally fail
1004 peer_.ResetProofSource(std::unique_ptr<ProofSource>(new FailingProofSource));
1005
1006 // clang-format off
1007 CryptoHandshakeMessage msg = CryptoTestUtils::Message(
1008 "CHLO",
1009 "AEAD", "AESG",
1010 "KEXS", "C255",
1011 "SCID", scid_hex_.c_str(),
1012 "PUBS", pub_hex_.c_str(),
1013 "NONC", nonce_hex_.c_str(),
1014 "PDMD", "X509",
1015 "VER\0", client_version_string_.c_str(),
1016 "$padding", static_cast<int>(kClientHelloMinimumSize),
1017 nullptr);
1018 // clang-format on
1019
1020 // Just ensure that we don't crash as occurred in b/33916924.
1021 ShouldFailMentioning("", msg);
1022 }
1023
999 TEST(CryptoServerConfigGenerationTest, Determinism) { 1024 TEST(CryptoServerConfigGenerationTest, Determinism) {
1000 // Test that using a deterministic PRNG causes the server-config to be 1025 // Test that using a deterministic PRNG causes the server-config to be
1001 // deterministic. 1026 // deterministic.
1002 1027
1003 MockRandom rand_a, rand_b; 1028 MockRandom rand_a, rand_b;
1004 const QuicCryptoServerConfig::ConfigOptions options; 1029 const QuicCryptoServerConfig::ConfigOptions options;
1005 MockClock clock; 1030 MockClock clock;
1006 1031
1007 QuicCryptoServerConfig a(QuicCryptoServerConfig::TESTING, &rand_a, 1032 QuicCryptoServerConfig a(QuicCryptoServerConfig::TESTING, &rand_a,
1008 CryptoTestUtils::ProofSourceForTesting()); 1033 CryptoTestUtils::ProofSourceForTesting());
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
1147 // QuicCryptoServerConfig::EvaluateClientHello will leave info.unique as false 1172 // QuicCryptoServerConfig::EvaluateClientHello will leave info.unique as false
1148 // and cause ProcessClientHello to exit early (and generate a REJ message). 1173 // and cause ProcessClientHello to exit early (and generate a REJ message).
1149 config_.set_replay_protection(false); 1174 config_.set_replay_protection(false);
1150 1175
1151 ShouldSucceed(msg); 1176 ShouldSucceed(msg);
1152 EXPECT_EQ(kSHLO, out_.tag()); 1177 EXPECT_EQ(kSHLO, out_.tag());
1153 } 1178 }
1154 1179
1155 } // namespace test 1180 } // namespace test
1156 } // namespace net 1181 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698