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

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

Issue 1420793002: Fix crypto_server_test to pass with lower supported versions, and parameterize the tests by version. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@105517568
Patch Set: Created 5 years, 2 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <ostream> 5 #include <ostream>
6 #include <vector> 6 #include <vector>
7 7
8 #include "base/basictypes.h" 8 #include "base/basictypes.h"
9 #include "base/strings/string_number_conversions.h" 9 #include "base/strings/string_number_conversions.h"
10 #include "crypto/secure_hash.h" 10 #include "crypto/secure_hash.h"
(...skipping 30 matching lines...) Expand all
41 return &server_config_->strike_register_client_lock_; 41 return &server_config_->strike_register_client_lock_;
42 } 42 }
43 43
44 private: 44 private:
45 QuicCryptoServerConfig* server_config_; 45 QuicCryptoServerConfig* server_config_;
46 }; 46 };
47 47
48 // Run tests with both parities of 48 // Run tests with both parities of
49 // FLAGS_use_early_return_when_verifying_chlo. 49 // FLAGS_use_early_return_when_verifying_chlo.
50 struct TestParams { 50 struct TestParams {
51 explicit TestParams(bool use_early_return_when_verifying_chlo, 51 TestParams(bool use_early_return_when_verifying_chlo,
52 bool enable_stateless_rejects, 52 bool enable_stateless_rejects,
53 bool use_stateless_rejects) 53 bool use_stateless_rejects,
54 QuicVersionVector supported_versions)
54 : use_early_return_when_verifying_chlo( 55 : use_early_return_when_verifying_chlo(
55 use_early_return_when_verifying_chlo), 56 use_early_return_when_verifying_chlo),
56 enable_stateless_rejects(enable_stateless_rejects), 57 enable_stateless_rejects(enable_stateless_rejects),
57 use_stateless_rejects(use_stateless_rejects) {} 58 use_stateless_rejects(use_stateless_rejects),
59 supported_versions(supported_versions) {}
58 60
59 friend ostream& operator<<(ostream& os, const TestParams& p) { 61 friend ostream& operator<<(ostream& os, const TestParams& p) {
60 os << "{ use_early_return_when_verifying_chlo: " 62 os << "{ use_early_return_when_verifying_chlo: "
61 << p.use_early_return_when_verifying_chlo << endl; 63 << p.use_early_return_when_verifying_chlo << endl;
62 os << " enable_stateless_rejects: " << p.enable_stateless_rejects << endl; 64 os << " enable_stateless_rejects: " << p.enable_stateless_rejects << endl;
63 os << " use_stateless_rejects: " << p.use_stateless_rejects << " }"; 65 os << " use_stateless_rejects: " << p.use_stateless_rejects << endl;
66 os << " versions: " << QuicVersionVectorToString(p.supported_versions)
67 << " }";
64 return os; 68 return os;
65 } 69 }
66 70
67 bool use_early_return_when_verifying_chlo; 71 bool use_early_return_when_verifying_chlo;
68 // This only enables the stateless reject feature via the feature-flag. 72 // This only enables the stateless reject feature via the feature-flag.
69 // It does not force the crypto server to emit stateless rejects. 73 // It does not force the crypto server to emit stateless rejects.
70 bool enable_stateless_rejects; 74 bool enable_stateless_rejects;
71 // If true, this forces the server to send a stateless reject when 75 // If true, this forces the server to send a stateless reject when
72 // rejecting messages. This should be a no-op if 76 // rejecting messages. This should be a no-op if
73 // enable_stateless_rejects is false. 77 // enable_stateless_rejects is false.
74 bool use_stateless_rejects; 78 bool use_stateless_rejects;
79 // Versions supported by client and server.
80 QuicVersionVector supported_versions;
75 }; 81 };
76 82
77 // Constructs various test permutations. 83 // Constructs various test permutations.
78 vector<TestParams> GetTestParams() { 84 vector<TestParams> GetTestParams() {
79 vector<TestParams> params; 85 vector<TestParams> params;
80 static const bool kTrueFalse[] = {true, false}; 86 static const bool kTrueFalse[] = {true, false};
81 for (bool use_early_return : kTrueFalse) { 87 for (bool use_early_return : kTrueFalse) {
82 for (bool enable_stateless_rejects : kTrueFalse) { 88 for (bool enable_stateless_rejects : kTrueFalse) {
83 for (bool use_stateless_rejects : kTrueFalse) { 89 for (bool use_stateless_rejects : kTrueFalse) {
84 params.push_back(TestParams(use_early_return, enable_stateless_rejects, 90 // Start with all versions, remove highest on each iteration.
85 use_stateless_rejects)); 91 QuicVersionVector supported_versions = QuicSupportedVersions();
92 while (!supported_versions.empty()) {
93 params.push_back(
94 TestParams(use_early_return, enable_stateless_rejects,
95 use_stateless_rejects, supported_versions));
96 supported_versions.erase(supported_versions.begin());
97 }
86 } 98 }
87 } 99 }
88 } 100 }
89 return params; 101 return params;
90 } 102 }
91 103
92 class CryptoServerTest : public ::testing::TestWithParam<TestParams> { 104 class CryptoServerTest : public ::testing::TestWithParam<TestParams> {
93 public: 105 public:
94 CryptoServerTest() 106 CryptoServerTest()
95 : rand_(QuicRandom::GetInstance()), 107 : rand_(QuicRandom::GetInstance()),
96 client_address_(Loopback4(), 1234), 108 client_address_(Loopback4(), 1234),
97 config_(QuicCryptoServerConfig::TESTING, rand_) { 109 config_(QuicCryptoServerConfig::TESTING, rand_) {
98 #if defined(USE_OPENSSL) 110 #if defined(USE_OPENSSL)
99 config_.SetProofSource(CryptoTestUtils::ProofSourceForTesting()); 111 config_.SetProofSource(CryptoTestUtils::ProofSourceForTesting());
100 #else 112 #else
101 config_.SetProofSource(CryptoTestUtils::FakeProofSourceForTesting()); 113 config_.SetProofSource(CryptoTestUtils::FakeProofSourceForTesting());
102 #endif 114 #endif
103 supported_versions_ = QuicSupportedVersions(); 115 supported_versions_ = GetParam().supported_versions;
104 client_version_ = supported_versions_.front(); 116 client_version_ = supported_versions_.front();
105 client_version_string_ = 117 client_version_string_ =
106 QuicUtils::TagToString(QuicVersionToQuicTag(client_version_)); 118 QuicUtils::TagToString(QuicVersionToQuicTag(client_version_));
107 119
108 FLAGS_use_early_return_when_verifying_chlo = 120 FLAGS_use_early_return_when_verifying_chlo =
109 GetParam().use_early_return_when_verifying_chlo; 121 GetParam().use_early_return_when_verifying_chlo;
110 FLAGS_enable_quic_stateless_reject_support = 122 FLAGS_enable_quic_stateless_reject_support =
111 GetParam().enable_stateless_rejects; 123 GetParam().enable_stateless_rejects;
112 use_stateless_rejects_ = GetParam().use_stateless_rejects; 124 use_stateless_rejects_ = GetParam().use_stateless_rejects;
113 } 125 }
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 CryptoServerTest* test_; 209 CryptoServerTest* test_;
198 bool should_succeed_; 210 bool should_succeed_;
199 const char* error_substr_; 211 const char* error_substr_;
200 bool* called_; 212 bool* called_;
201 }; 213 };
202 214
203 void CheckServerHello(const CryptoHandshakeMessage& server_hello) { 215 void CheckServerHello(const CryptoHandshakeMessage& server_hello) {
204 const QuicTag* versions; 216 const QuicTag* versions;
205 size_t num_versions; 217 size_t num_versions;
206 server_hello.GetTaglist(kVER, &versions, &num_versions); 218 server_hello.GetTaglist(kVER, &versions, &num_versions);
207 ASSERT_EQ(QuicSupportedVersions().size(), num_versions); 219 ASSERT_EQ(supported_versions_.size(), num_versions);
208 for (size_t i = 0; i < num_versions; ++i) { 220 for (size_t i = 0; i < num_versions; ++i) {
209 EXPECT_EQ(QuicVersionToQuicTag(QuicSupportedVersions()[i]), versions[i]); 221 EXPECT_EQ(QuicVersionToQuicTag(supported_versions_[i]), versions[i]);
210 } 222 }
211 223
212 StringPiece address; 224 StringPiece address;
213 ASSERT_TRUE(server_hello.GetStringPiece(kCADR, &address)); 225 ASSERT_TRUE(server_hello.GetStringPiece(kCADR, &address));
214 QuicSocketAddressCoder decoder; 226 QuicSocketAddressCoder decoder;
215 ASSERT_TRUE(decoder.Decode(address.data(), address.size())); 227 ASSERT_TRUE(decoder.Decode(address.data(), address.size()));
216 EXPECT_EQ(client_address_.address(), decoder.ip()); 228 EXPECT_EQ(client_address_.address(), decoder.ip());
217 EXPECT_EQ(client_address_.port(), decoder.port()); 229 EXPECT_EQ(client_address_.port(), decoder.port());
218 } 230 }
219 231
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
424 "$padding", static_cast<int>(kClientHelloMinimumSize), 436 "$padding", static_cast<int>(kClientHelloMinimumSize),
425 nullptr); 437 nullptr);
426 // clang-format on 438 // clang-format on
427 439
428 ShouldSucceed(msg); 440 ShouldSucceed(msg);
429 StringPiece cert, proof; 441 StringPiece cert, proof;
430 EXPECT_TRUE(out_.GetStringPiece(kCertificateTag, &cert)); 442 EXPECT_TRUE(out_.GetStringPiece(kCertificateTag, &cert));
431 EXPECT_TRUE(out_.GetStringPiece(kPROF, &proof)); 443 EXPECT_TRUE(out_.GetStringPiece(kPROF, &proof));
432 EXPECT_NE(0u, cert.size()); 444 EXPECT_NE(0u, cert.size());
433 EXPECT_NE(0u, proof.size()); 445 EXPECT_NE(0u, proof.size());
434 if (client_version_ <= QUIC_VERSION_26) { 446 const HandshakeFailureReason kRejectReasons[] = {
435 const HandshakeFailureReason kRejectReasons[] = { 447 SERVER_CONFIG_INCHOATE_HELLO_FAILURE};
436 CLIENT_NONCE_INVALID_TIME_FAILURE}; 448 CheckRejectReasons(kRejectReasons, arraysize(kRejectReasons));
437 CheckRejectReasons(kRejectReasons, arraysize(kRejectReasons));
438 } else {
439 const HandshakeFailureReason kRejectReasons[] = {
440 SERVER_CONFIG_INCHOATE_HELLO_FAILURE};
441 CheckRejectReasons(kRejectReasons, arraysize(kRejectReasons));
442 }
443 } 449 }
444 450
445 TEST_P(CryptoServerTest, TooSmall) { 451 TEST_P(CryptoServerTest, TooSmall) {
446 // clang-format off 452 // clang-format off
447 ShouldFailMentioning("too small", CryptoTestUtils::Message( 453 ShouldFailMentioning("too small", CryptoTestUtils::Message(
448 "CHLO", 454 "CHLO",
449 "VER\0", client_version_string_.c_str(), 455 "VER\0", client_version_string_.c_str(),
450 nullptr)); 456 nullptr));
451 // clang-format on 457 // clang-format on
452 const HandshakeFailureReason kRejectReasons[] = { 458 const HandshakeFailureReason kRejectReasons[] = {
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
664 ASSERT_EQ(kSHLO, out_.tag()); 670 ASSERT_EQ(kSHLO, out_.tag());
665 CheckServerHello(out_); 671 CheckServerHello(out_);
666 672
667 ShouldSucceed(msg); 673 ShouldSucceed(msg);
668 // The message should accepted twice when replay protection is off. 674 // The message should accepted twice when replay protection is off.
669 ASSERT_EQ(kSHLO, out_.tag()); 675 ASSERT_EQ(kSHLO, out_.tag());
670 CheckServerHello(out_); 676 CheckServerHello(out_);
671 } 677 }
672 678
673 TEST_P(CryptoServerTest, RejectInvalidXlct) { 679 TEST_P(CryptoServerTest, RejectInvalidXlct) {
680 if (client_version_ <= QUIC_VERSION_25) {
681 // XLCT tag introduced in QUIC_VERSION_26.
682 return;
683 }
674 // clang-format off 684 // clang-format off
675 CryptoHandshakeMessage msg = CryptoTestUtils::Message( 685 CryptoHandshakeMessage msg = CryptoTestUtils::Message(
676 "CHLO", 686 "CHLO",
677 "AEAD", "AESG", 687 "AEAD", "AESG",
678 "KEXS", "C255", 688 "KEXS", "C255",
679 "SCID", scid_hex_.c_str(), 689 "SCID", scid_hex_.c_str(),
680 "#004b5453", srct_hex_.c_str(), 690 "#004b5453", srct_hex_.c_str(),
681 "PUBS", pub_hex_.c_str(), 691 "PUBS", pub_hex_.c_str(),
682 "NONC", nonce_hex_.c_str(), 692 "NONC", nonce_hex_.c_str(),
683 "VER\0", client_version_string_.c_str(), 693 "VER\0", client_version_string_.c_str(),
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
970 980
971 strike_register_client_->RunPendingVerifications(); 981 strike_register_client_->RunPendingVerifications();
972 ASSERT_TRUE(called); 982 ASSERT_TRUE(called);
973 EXPECT_EQ(0, strike_register_client_->PendingVerifications()); 983 EXPECT_EQ(0, strike_register_client_->PendingVerifications());
974 // The message should be rejected now. 984 // The message should be rejected now.
975 CheckRejectTag(); 985 CheckRejectTag();
976 } 986 }
977 987
978 } // namespace test 988 } // namespace test
979 } // namespace net 989 } // namespace net
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698