| OLD | NEW |
| 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 |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 class CryptoServerTest : public ::testing::TestWithParam<TestParams> { | 105 class CryptoServerTest : public ::testing::TestWithParam<TestParams> { |
| 106 public: | 106 public: |
| 107 CryptoServerTest() | 107 CryptoServerTest() |
| 108 : rand_(QuicRandom::GetInstance()), | 108 : rand_(QuicRandom::GetInstance()), |
| 109 client_address_(Loopback4(), 1234), | 109 client_address_(Loopback4(), 1234), |
| 110 config_(QuicCryptoServerConfig::TESTING, | 110 config_(QuicCryptoServerConfig::TESTING, |
| 111 rand_, | 111 rand_, |
| 112 CryptoTestUtils::ProofSourceForTesting()), | 112 CryptoTestUtils::ProofSourceForTesting()), |
| 113 compressed_certs_cache_( | 113 compressed_certs_cache_( |
| 114 QuicCompressedCertsCache::kQuicCompressedCertsCacheSize), | 114 QuicCompressedCertsCache::kQuicCompressedCertsCacheSize), |
| 115 params_(new QuicCryptoNegotiatedParameters), |
| 116 crypto_proof_(new QuicCryptoProof), |
| 115 chlo_packet_size_(kDefaultMaxPacketSize) { | 117 chlo_packet_size_(kDefaultMaxPacketSize) { |
| 116 supported_versions_ = GetParam().supported_versions; | 118 supported_versions_ = GetParam().supported_versions; |
| 117 config_.set_enable_serving_sct(true); | 119 config_.set_enable_serving_sct(true); |
| 118 | 120 |
| 119 client_version_ = supported_versions_.front(); | 121 client_version_ = supported_versions_.front(); |
| 120 client_version_string_ = | 122 client_version_string_ = |
| 121 QuicUtils::TagToString(QuicVersionToQuicTag(client_version_)); | 123 QuicUtils::TagToString(QuicVersionToQuicTag(client_version_)); |
| 122 | 124 |
| 123 FLAGS_quic_require_handshake_confirmation_pre33 = false; | 125 FLAGS_quic_require_handshake_confirmation_pre33 = false; |
| 124 FLAGS_enable_quic_stateless_reject_support = | 126 FLAGS_enable_quic_stateless_reject_support = |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 175 srct_hex_ = "#" + QuicUtils::HexEncode(srct); | 177 srct_hex_ = "#" + QuicUtils::HexEncode(srct); |
| 176 | 178 |
| 177 StringPiece scfg; | 179 StringPiece scfg; |
| 178 ASSERT_TRUE(out_.GetStringPiece(kSCFG, &scfg)); | 180 ASSERT_TRUE(out_.GetStringPiece(kSCFG, &scfg)); |
| 179 server_config_.reset(CryptoFramer::ParseMessage(scfg)); | 181 server_config_.reset(CryptoFramer::ParseMessage(scfg)); |
| 180 | 182 |
| 181 StringPiece scid; | 183 StringPiece scid; |
| 182 ASSERT_TRUE(server_config_->GetStringPiece(kSCID, &scid)); | 184 ASSERT_TRUE(server_config_->GetStringPiece(kSCID, &scid)); |
| 183 scid_hex_ = "#" + QuicUtils::HexEncode(scid); | 185 scid_hex_ = "#" + QuicUtils::HexEncode(scid); |
| 184 | 186 |
| 185 crypto_proof_ = QuicCryptoProof(); | 187 crypto_proof_ = scoped_refptr<QuicCryptoProof>(new QuicCryptoProof()); |
| 186 DCHECK(crypto_proof_.chain.get() == nullptr); | 188 DCHECK(crypto_proof_->chain.get() == nullptr); |
| 187 } | 189 } |
| 188 | 190 |
| 189 // Helper used to accept the result of ValidateClientHello and pass | 191 // Helper used to accept the result of ValidateClientHello and pass |
| 190 // it on to ProcessClientHello. | 192 // it on to ProcessClientHello. |
| 191 class ValidateCallback : public ValidateClientHelloResultCallback { | 193 class ValidateCallback : public ValidateClientHelloResultCallback { |
| 192 public: | 194 public: |
| 193 ValidateCallback(CryptoServerTest* test, | 195 ValidateCallback(CryptoServerTest* test, |
| 194 bool should_succeed, | 196 bool should_succeed, |
| 195 const char* error_substr, | 197 const char* error_substr, |
| 196 bool* called) | 198 bool* called) |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 240 ASSERT_TRUE(decoder.Decode(address.data(), address.size())); | 242 ASSERT_TRUE(decoder.Decode(address.data(), address.size())); |
| 241 EXPECT_EQ(client_address_.address(), decoder.ip()); | 243 EXPECT_EQ(client_address_.address(), decoder.ip()); |
| 242 EXPECT_EQ(client_address_.port(), decoder.port()); | 244 EXPECT_EQ(client_address_.port(), decoder.port()); |
| 243 } | 245 } |
| 244 | 246 |
| 245 void ShouldSucceed(const CryptoHandshakeMessage& message) { | 247 void ShouldSucceed(const CryptoHandshakeMessage& message) { |
| 246 bool called = false; | 248 bool called = false; |
| 247 IPAddress server_ip; | 249 IPAddress server_ip; |
| 248 config_.ValidateClientHello( | 250 config_.ValidateClientHello( |
| 249 message, client_address_.address(), server_ip, | 251 message, client_address_.address(), server_ip, |
| 250 supported_versions_.front(), &clock_, &crypto_proof_, | 252 supported_versions_.front(), &clock_, crypto_proof_, |
| 251 std::unique_ptr<ValidateCallback>( | 253 std::unique_ptr<ValidateCallback>( |
| 252 new ValidateCallback(this, true, "", &called))); | 254 new ValidateCallback(this, true, "", &called))); |
| 253 EXPECT_TRUE(called); | 255 EXPECT_TRUE(called); |
| 254 } | 256 } |
| 255 | 257 |
| 256 void ShouldFailMentioning(const char* error_substr, | 258 void ShouldFailMentioning(const char* error_substr, |
| 257 const CryptoHandshakeMessage& message) { | 259 const CryptoHandshakeMessage& message) { |
| 258 bool called = false; | 260 bool called = false; |
| 259 ShouldFailMentioning(error_substr, message, &called); | 261 ShouldFailMentioning(error_substr, message, &called); |
| 260 EXPECT_TRUE(called); | 262 EXPECT_TRUE(called); |
| 261 } | 263 } |
| 262 | 264 |
| 263 void ShouldFailMentioning(const char* error_substr, | 265 void ShouldFailMentioning(const char* error_substr, |
| 264 const CryptoHandshakeMessage& message, | 266 const CryptoHandshakeMessage& message, |
| 265 bool* called) { | 267 bool* called) { |
| 266 IPAddress server_ip; | 268 IPAddress server_ip; |
| 267 config_.ValidateClientHello( | 269 config_.ValidateClientHello( |
| 268 message, client_address_.address(), server_ip, | 270 message, client_address_.address(), server_ip, |
| 269 supported_versions_.front(), &clock_, &crypto_proof_, | 271 supported_versions_.front(), &clock_, crypto_proof_, |
| 270 std::unique_ptr<ValidateCallback>( | 272 std::unique_ptr<ValidateCallback>( |
| 271 new ValidateCallback(this, false, error_substr, called))); | 273 new ValidateCallback(this, false, error_substr, called))); |
| 272 } | 274 } |
| 273 | 275 |
| 274 class ProcessCallback : public ProcessClientHelloResultCallback { | 276 class ProcessCallback : public ProcessClientHelloResultCallback { |
| 275 public: | 277 public: |
| 276 ProcessCallback(scoped_refptr<ValidateCallback::Result> result, | 278 ProcessCallback(scoped_refptr<ValidateCallback::Result> result, |
| 277 bool should_succeed, | 279 bool should_succeed, |
| 278 const char* error_substr, | 280 const char* error_substr, |
| 279 bool* called, | 281 bool* called, |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 320 bool should_succeed, | 322 bool should_succeed, |
| 321 const char* error_substr) { | 323 const char* error_substr) { |
| 322 IPAddress server_ip; | 324 IPAddress server_ip; |
| 323 QuicConnectionId server_designated_connection_id = | 325 QuicConnectionId server_designated_connection_id = |
| 324 rand_for_id_generation_.RandUint64(); | 326 rand_for_id_generation_.RandUint64(); |
| 325 bool called; | 327 bool called; |
| 326 config_.ProcessClientHello( | 328 config_.ProcessClientHello( |
| 327 result, /*reject_only=*/false, /*connection_id=*/1, server_ip, | 329 result, /*reject_only=*/false, /*connection_id=*/1, server_ip, |
| 328 client_address_, supported_versions_.front(), supported_versions_, | 330 client_address_, supported_versions_.front(), supported_versions_, |
| 329 use_stateless_rejects_, server_designated_connection_id, &clock_, rand_, | 331 use_stateless_rejects_, server_designated_connection_id, &clock_, rand_, |
| 330 &compressed_certs_cache_, ¶ms_, &crypto_proof_, | 332 &compressed_certs_cache_, params_, crypto_proof_, |
| 331 /*total_framing_overhead=*/50, chlo_packet_size_, | 333 /*total_framing_overhead=*/50, chlo_packet_size_, |
| 332 std::unique_ptr<ProcessCallback>(new ProcessCallback( | 334 std::unique_ptr<ProcessCallback>(new ProcessCallback( |
| 333 result, should_succeed, error_substr, &called, &out_))); | 335 result, should_succeed, error_substr, &called, &out_))); |
| 334 EXPECT_TRUE(called); | 336 EXPECT_TRUE(called); |
| 335 } | 337 } |
| 336 | 338 |
| 337 string GenerateNonce() { | 339 string GenerateNonce() { |
| 338 string nonce; | 340 string nonce; |
| 339 CryptoUtils::GenerateNonce( | 341 CryptoUtils::GenerateNonce( |
| 340 clock_.WallNow(), rand_, | 342 clock_.WallNow(), rand_, |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 400 QuicRandom* const rand_; | 402 QuicRandom* const rand_; |
| 401 MockRandom rand_for_id_generation_; | 403 MockRandom rand_for_id_generation_; |
| 402 MockClock clock_; | 404 MockClock clock_; |
| 403 IPEndPoint client_address_; | 405 IPEndPoint client_address_; |
| 404 QuicVersionVector supported_versions_; | 406 QuicVersionVector supported_versions_; |
| 405 QuicVersion client_version_; | 407 QuicVersion client_version_; |
| 406 string client_version_string_; | 408 string client_version_string_; |
| 407 QuicCryptoServerConfig config_; | 409 QuicCryptoServerConfig config_; |
| 408 QuicCompressedCertsCache compressed_certs_cache_; | 410 QuicCompressedCertsCache compressed_certs_cache_; |
| 409 QuicCryptoServerConfig::ConfigOptions config_options_; | 411 QuicCryptoServerConfig::ConfigOptions config_options_; |
| 410 QuicCryptoNegotiatedParameters params_; | 412 scoped_refptr<QuicCryptoNegotiatedParameters> params_; |
| 411 QuicCryptoProof crypto_proof_; | 413 scoped_refptr<QuicCryptoProof> crypto_proof_; |
| 412 CryptoHandshakeMessage out_; | 414 CryptoHandshakeMessage out_; |
| 413 uint8_t orbit_[kOrbitSize]; | 415 uint8_t orbit_[kOrbitSize]; |
| 414 bool use_stateless_rejects_; | 416 bool use_stateless_rejects_; |
| 415 size_t chlo_packet_size_; | 417 size_t chlo_packet_size_; |
| 416 | 418 |
| 417 // These strings contain hex escaped values from the server suitable for using | 419 // These strings contain hex escaped values from the server suitable for using |
| 418 // when constructing client hello messages. | 420 // when constructing client hello messages. |
| 419 string nonce_hex_, pub_hex_, srct_hex_, scid_hex_; | 421 string nonce_hex_, pub_hex_, srct_hex_, scid_hex_; |
| 420 std::unique_ptr<CryptoHandshakeMessage> server_config_; | 422 std::unique_ptr<CryptoHandshakeMessage> server_config_; |
| 421 }; | 423 }; |
| (...skipping 788 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1210 nullptr); | 1212 nullptr); |
| 1211 // clang-format on | 1213 // clang-format on |
| 1212 | 1214 |
| 1213 // Clear the message tag. | 1215 // Clear the message tag. |
| 1214 out_.set_tag(0); | 1216 out_.set_tag(0); |
| 1215 | 1217 |
| 1216 bool called = false; | 1218 bool called = false; |
| 1217 IPAddress server_ip; | 1219 IPAddress server_ip; |
| 1218 config_.ValidateClientHello( | 1220 config_.ValidateClientHello( |
| 1219 msg, client_address_.address(), server_ip, client_version_, &clock_, | 1221 msg, client_address_.address(), server_ip, client_version_, &clock_, |
| 1220 &crypto_proof_, std::unique_ptr<ValidateCallback>( | 1222 crypto_proof_, std::unique_ptr<ValidateCallback>( |
| 1221 new ValidateCallback(this, true, "", &called))); | 1223 new ValidateCallback(this, true, "", &called))); |
| 1222 // The verification request was queued. | 1224 // The verification request was queued. |
| 1223 ASSERT_FALSE(called); | 1225 ASSERT_FALSE(called); |
| 1224 EXPECT_EQ(0u, out_.tag()); | 1226 EXPECT_EQ(0u, out_.tag()); |
| 1225 EXPECT_EQ(1, strike_register_client_->PendingVerifications()); | 1227 EXPECT_EQ(1, strike_register_client_->PendingVerifications()); |
| 1226 | 1228 |
| 1227 // Continue processing the verification request. | 1229 // Continue processing the verification request. |
| 1228 strike_register_client_->RunPendingVerifications(); | 1230 strike_register_client_->RunPendingVerifications(); |
| 1229 ASSERT_TRUE(called); | 1231 ASSERT_TRUE(called); |
| 1230 EXPECT_EQ(0, strike_register_client_->PendingVerifications()); | 1232 EXPECT_EQ(0, strike_register_client_->PendingVerifications()); |
| 1231 // The message should be accepted now. | 1233 // The message should be accepted now. |
| 1232 EXPECT_EQ(kSHLO, out_.tag()); | 1234 EXPECT_EQ(kSHLO, out_.tag()); |
| 1233 | 1235 |
| 1234 // Rejected if replayed. | 1236 // Rejected if replayed. |
| 1235 config_.ValidateClientHello( | 1237 config_.ValidateClientHello( |
| 1236 msg, client_address_.address(), server_ip, client_version_, &clock_, | 1238 msg, client_address_.address(), server_ip, client_version_, &clock_, |
| 1237 &crypto_proof_, std::unique_ptr<ValidateCallback>( | 1239 crypto_proof_, std::unique_ptr<ValidateCallback>( |
| 1238 new ValidateCallback(this, true, "", &called))); | 1240 new ValidateCallback(this, true, "", &called))); |
| 1239 // The verification request was queued. | 1241 // The verification request was queued. |
| 1240 ASSERT_FALSE(called); | 1242 ASSERT_FALSE(called); |
| 1241 EXPECT_EQ(1, strike_register_client_->PendingVerifications()); | 1243 EXPECT_EQ(1, strike_register_client_->PendingVerifications()); |
| 1242 | 1244 |
| 1243 strike_register_client_->RunPendingVerifications(); | 1245 strike_register_client_->RunPendingVerifications(); |
| 1244 ASSERT_TRUE(called); | 1246 ASSERT_TRUE(called); |
| 1245 EXPECT_EQ(0, strike_register_client_->PendingVerifications()); | 1247 EXPECT_EQ(0, strike_register_client_->PendingVerifications()); |
| 1246 // The message should be rejected now. | 1248 // The message should be rejected now. |
| 1247 CheckRejectTag(); | 1249 CheckRejectTag(); |
| 1248 } | 1250 } |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1279 EXPECT_EQ(0, strike_register_client_->PendingVerifications()); | 1281 EXPECT_EQ(0, strike_register_client_->PendingVerifications()); |
| 1280 } else { | 1282 } else { |
| 1281 // version 33. | 1283 // version 33. |
| 1282 ASSERT_EQ(kSHLO, out_.tag()); | 1284 ASSERT_EQ(kSHLO, out_.tag()); |
| 1283 CheckServerHello(out_); | 1285 CheckServerHello(out_); |
| 1284 } | 1286 } |
| 1285 } | 1287 } |
| 1286 | 1288 |
| 1287 } // namespace test | 1289 } // namespace test |
| 1288 } // namespace net | 1290 } // namespace net |
| OLD | NEW |