| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "net/quic/crypto/quic_crypto_client_config.h" | |
| 6 | |
| 7 #include "net/quic/crypto/proof_verifier.h" | |
| 8 #include "net/quic/quic_server_id.h" | |
| 9 #include "net/quic/test_tools/crypto_test_utils.h" | |
| 10 #include "net/quic/test_tools/mock_random.h" | |
| 11 #include "net/quic/test_tools/quic_test_utils.h" | |
| 12 #include "testing/gtest/include/gtest/gtest.h" | |
| 13 | |
| 14 using std::string; | |
| 15 using std::vector; | |
| 16 | |
| 17 namespace net { | |
| 18 namespace test { | |
| 19 namespace { | |
| 20 | |
| 21 class TestProofVerifyDetails : public ProofVerifyDetails { | |
| 22 ~TestProofVerifyDetails() override {} | |
| 23 | |
| 24 // ProofVerifyDetails implementation | |
| 25 ProofVerifyDetails* Clone() const override { | |
| 26 return new TestProofVerifyDetails; | |
| 27 } | |
| 28 }; | |
| 29 | |
| 30 } // namespace | |
| 31 | |
| 32 TEST(QuicCryptoClientConfigTest, CachedState_IsEmpty) { | |
| 33 QuicCryptoClientConfig::CachedState state; | |
| 34 EXPECT_TRUE(state.IsEmpty()); | |
| 35 } | |
| 36 | |
| 37 TEST(QuicCryptoClientConfigTest, CachedState_IsComplete) { | |
| 38 QuicCryptoClientConfig::CachedState state; | |
| 39 EXPECT_FALSE(state.IsComplete(QuicWallTime::FromUNIXSeconds(0))); | |
| 40 } | |
| 41 | |
| 42 TEST(QuicCryptoClientConfigTest, CachedState_GenerationCounter) { | |
| 43 QuicCryptoClientConfig::CachedState state; | |
| 44 EXPECT_EQ(0u, state.generation_counter()); | |
| 45 state.SetProofInvalid(); | |
| 46 EXPECT_EQ(1u, state.generation_counter()); | |
| 47 } | |
| 48 | |
| 49 TEST(QuicCryptoClientConfigTest, CachedState_SetProofVerifyDetails) { | |
| 50 QuicCryptoClientConfig::CachedState state; | |
| 51 EXPECT_TRUE(state.proof_verify_details() == nullptr); | |
| 52 ProofVerifyDetails* details = new TestProofVerifyDetails; | |
| 53 state.SetProofVerifyDetails(details); | |
| 54 EXPECT_EQ(details, state.proof_verify_details()); | |
| 55 } | |
| 56 | |
| 57 TEST(QuicCryptoClientConfigTest, CachedState_ServerDesignatedConnectionId) { | |
| 58 QuicCryptoClientConfig::CachedState state; | |
| 59 EXPECT_FALSE(state.has_server_designated_connection_id()); | |
| 60 | |
| 61 QuicConnectionId connection_id = 1234; | |
| 62 state.add_server_designated_connection_id(connection_id); | |
| 63 EXPECT_TRUE(state.has_server_designated_connection_id()); | |
| 64 EXPECT_EQ(connection_id, state.GetNextServerDesignatedConnectionId()); | |
| 65 EXPECT_FALSE(state.has_server_designated_connection_id()); | |
| 66 | |
| 67 // Allow the ID to be set multiple times. It's unusual that this would | |
| 68 // happen, but not impossible. | |
| 69 ++connection_id; | |
| 70 state.add_server_designated_connection_id(connection_id); | |
| 71 EXPECT_TRUE(state.has_server_designated_connection_id()); | |
| 72 EXPECT_EQ(connection_id, state.GetNextServerDesignatedConnectionId()); | |
| 73 ++connection_id; | |
| 74 state.add_server_designated_connection_id(connection_id); | |
| 75 EXPECT_EQ(connection_id, state.GetNextServerDesignatedConnectionId()); | |
| 76 EXPECT_FALSE(state.has_server_designated_connection_id()); | |
| 77 | |
| 78 // Test FIFO behavior. | |
| 79 const QuicConnectionId first_cid = 0xdeadbeef; | |
| 80 const QuicConnectionId second_cid = 0xfeedbead; | |
| 81 state.add_server_designated_connection_id(first_cid); | |
| 82 state.add_server_designated_connection_id(second_cid); | |
| 83 EXPECT_TRUE(state.has_server_designated_connection_id()); | |
| 84 EXPECT_EQ(first_cid, state.GetNextServerDesignatedConnectionId()); | |
| 85 EXPECT_EQ(second_cid, state.GetNextServerDesignatedConnectionId()); | |
| 86 } | |
| 87 | |
| 88 TEST(QuicCryptoClientConfigTest, CachedState_ServerIdConsumedBeforeSet) { | |
| 89 QuicCryptoClientConfig::CachedState state; | |
| 90 EXPECT_FALSE(state.has_server_designated_connection_id()); | |
| 91 #if GTEST_HAS_DEATH_TEST && !defined(NDEBUG) | |
| 92 EXPECT_DEBUG_DEATH(state.GetNextServerDesignatedConnectionId(), | |
| 93 "Attempting to consume a connection id " | |
| 94 "that was never designated."); | |
| 95 #endif // GTEST_HAS_DEATH_TEST && !defined(NDEBUG) | |
| 96 } | |
| 97 | |
| 98 TEST(QuicCryptoClientConfigTest, CachedState_ServerNonce) { | |
| 99 QuicCryptoClientConfig::CachedState state; | |
| 100 EXPECT_FALSE(state.has_server_nonce()); | |
| 101 | |
| 102 string server_nonce = "nonce_1"; | |
| 103 state.add_server_nonce(server_nonce); | |
| 104 EXPECT_TRUE(state.has_server_nonce()); | |
| 105 EXPECT_EQ(server_nonce, state.GetNextServerNonce()); | |
| 106 EXPECT_FALSE(state.has_server_nonce()); | |
| 107 | |
| 108 // Allow the ID to be set multiple times. It's unusual that this would | |
| 109 // happen, but not impossible. | |
| 110 server_nonce = "nonce_2"; | |
| 111 state.add_server_nonce(server_nonce); | |
| 112 EXPECT_TRUE(state.has_server_nonce()); | |
| 113 EXPECT_EQ(server_nonce, state.GetNextServerNonce()); | |
| 114 server_nonce = "nonce_3"; | |
| 115 state.add_server_nonce(server_nonce); | |
| 116 EXPECT_EQ(server_nonce, state.GetNextServerNonce()); | |
| 117 EXPECT_FALSE(state.has_server_nonce()); | |
| 118 | |
| 119 // Test FIFO behavior. | |
| 120 const string first_nonce = "first_nonce"; | |
| 121 const string second_nonce = "second_nonce"; | |
| 122 state.add_server_nonce(first_nonce); | |
| 123 state.add_server_nonce(second_nonce); | |
| 124 EXPECT_TRUE(state.has_server_nonce()); | |
| 125 EXPECT_EQ(first_nonce, state.GetNextServerNonce()); | |
| 126 EXPECT_EQ(second_nonce, state.GetNextServerNonce()); | |
| 127 } | |
| 128 | |
| 129 TEST(QuicCryptoClientConfigTest, CachedState_ServerNonceConsumedBeforeSet) { | |
| 130 QuicCryptoClientConfig::CachedState state; | |
| 131 EXPECT_FALSE(state.has_server_nonce()); | |
| 132 #if GTEST_HAS_DEATH_TEST && !defined(NDEBUG) | |
| 133 EXPECT_DEBUG_DEATH(state.GetNextServerNonce(), | |
| 134 "Attempting to consume a server nonce " | |
| 135 "that was never designated."); | |
| 136 #endif // GTEST_HAS_DEATH_TEST && !defined(NDEBUG) | |
| 137 } | |
| 138 | |
| 139 TEST(QuicCryptoClientConfigTest, CachedState_InitializeFrom) { | |
| 140 QuicCryptoClientConfig::CachedState state; | |
| 141 QuicCryptoClientConfig::CachedState other; | |
| 142 state.set_source_address_token("TOKEN"); | |
| 143 // TODO(rch): Populate other fields of |state|. | |
| 144 other.InitializeFrom(state); | |
| 145 EXPECT_EQ(state.server_config(), other.server_config()); | |
| 146 EXPECT_EQ(state.source_address_token(), other.source_address_token()); | |
| 147 EXPECT_EQ(state.certs(), other.certs()); | |
| 148 EXPECT_EQ(1u, other.generation_counter()); | |
| 149 EXPECT_FALSE(state.has_server_designated_connection_id()); | |
| 150 EXPECT_FALSE(state.has_server_nonce()); | |
| 151 } | |
| 152 | |
| 153 TEST(QuicCryptoClientConfigTest, InchoateChlo) { | |
| 154 QuicCryptoClientConfig::CachedState state; | |
| 155 QuicCryptoClientConfig config(CryptoTestUtils::ProofVerifierForTesting()); | |
| 156 QuicCryptoNegotiatedParameters params; | |
| 157 CryptoHandshakeMessage msg; | |
| 158 QuicServerId server_id("www.google.com", 443, PRIVACY_MODE_DISABLED); | |
| 159 MockRandom rand; | |
| 160 config.FillInchoateClientHello(server_id, QuicVersionMax(), &state, &rand, | |
| 161 /* demand_x509_proof= */ true, ¶ms, &msg); | |
| 162 | |
| 163 QuicTag cver; | |
| 164 EXPECT_EQ(QUIC_NO_ERROR, msg.GetUint32(kVER, &cver)); | |
| 165 EXPECT_EQ(QuicVersionToQuicTag(QuicVersionMax()), cver); | |
| 166 StringPiece proof_nonce; | |
| 167 EXPECT_TRUE(msg.GetStringPiece(kNONP, &proof_nonce)); | |
| 168 EXPECT_EQ(string(32, 'r'), proof_nonce); | |
| 169 } | |
| 170 | |
| 171 TEST(QuicCryptoClientConfigTest, PreferAesGcm) { | |
| 172 QuicCryptoClientConfig config(CryptoTestUtils::ProofVerifierForTesting()); | |
| 173 if (config.aead.size() > 1) | |
| 174 EXPECT_NE(kAESG, config.aead[0]); | |
| 175 config.PreferAesGcm(); | |
| 176 EXPECT_EQ(kAESG, config.aead[0]); | |
| 177 } | |
| 178 | |
| 179 TEST(QuicCryptoClientConfigTest, InchoateChloSecure) { | |
| 180 QuicCryptoClientConfig::CachedState state; | |
| 181 QuicCryptoClientConfig config(CryptoTestUtils::ProofVerifierForTesting()); | |
| 182 QuicCryptoNegotiatedParameters params; | |
| 183 CryptoHandshakeMessage msg; | |
| 184 QuicServerId server_id("www.google.com", 443, PRIVACY_MODE_DISABLED); | |
| 185 MockRandom rand; | |
| 186 config.FillInchoateClientHello(server_id, QuicVersionMax(), &state, &rand, | |
| 187 /* demand_x509_proof= */ true, ¶ms, &msg); | |
| 188 | |
| 189 QuicTag pdmd; | |
| 190 EXPECT_EQ(QUIC_NO_ERROR, msg.GetUint32(kPDMD, &pdmd)); | |
| 191 EXPECT_EQ(kX509, pdmd); | |
| 192 StringPiece scid; | |
| 193 EXPECT_FALSE(msg.GetStringPiece(kSCID, &scid)); | |
| 194 } | |
| 195 | |
| 196 TEST(QuicCryptoClientConfigTest, InchoateChloSecureWithSCID) { | |
| 197 QuicCryptoClientConfig::CachedState state; | |
| 198 CryptoHandshakeMessage scfg; | |
| 199 scfg.set_tag(kSCFG); | |
| 200 uint64_t future = 1; | |
| 201 scfg.SetValue(kEXPY, future); | |
| 202 scfg.SetStringPiece(kSCID, "12345678"); | |
| 203 string details; | |
| 204 state.SetServerConfig(scfg.GetSerialized().AsStringPiece(), | |
| 205 QuicWallTime::FromUNIXSeconds(0), &details); | |
| 206 | |
| 207 QuicCryptoClientConfig config(CryptoTestUtils::ProofVerifierForTesting()); | |
| 208 QuicCryptoNegotiatedParameters params; | |
| 209 CryptoHandshakeMessage msg; | |
| 210 QuicServerId server_id("www.google.com", 443, PRIVACY_MODE_DISABLED); | |
| 211 MockRandom rand; | |
| 212 config.FillInchoateClientHello(server_id, QuicVersionMax(), &state, &rand, | |
| 213 /* demand_x509_proof= */ true, ¶ms, &msg); | |
| 214 | |
| 215 StringPiece scid; | |
| 216 EXPECT_TRUE(msg.GetStringPiece(kSCID, &scid)); | |
| 217 EXPECT_EQ("12345678", scid); | |
| 218 } | |
| 219 | |
| 220 TEST(QuicCryptoClientConfigTest, InchoateChloSecureNoEcdsa) { | |
| 221 QuicCryptoClientConfig::CachedState state; | |
| 222 QuicCryptoClientConfig config(CryptoTestUtils::ProofVerifierForTesting()); | |
| 223 config.DisableEcdsa(); | |
| 224 QuicCryptoNegotiatedParameters params; | |
| 225 CryptoHandshakeMessage msg; | |
| 226 QuicServerId server_id("www.google.com", 443, PRIVACY_MODE_DISABLED); | |
| 227 MockRandom rand; | |
| 228 config.FillInchoateClientHello(server_id, QuicVersionMax(), &state, &rand, | |
| 229 /* demand_x509_proof= */ true, ¶ms, &msg); | |
| 230 | |
| 231 QuicTag pdmd; | |
| 232 EXPECT_EQ(QUIC_NO_ERROR, msg.GetUint32(kPDMD, &pdmd)); | |
| 233 EXPECT_EQ(kX59R, pdmd); | |
| 234 } | |
| 235 | |
| 236 TEST(QuicCryptoClientConfigTest, FillClientHello) { | |
| 237 QuicCryptoClientConfig::CachedState state; | |
| 238 QuicCryptoClientConfig config(CryptoTestUtils::ProofVerifierForTesting()); | |
| 239 QuicCryptoNegotiatedParameters params; | |
| 240 QuicConnectionId kConnectionId = 1234; | |
| 241 string error_details; | |
| 242 MockRandom rand; | |
| 243 CryptoHandshakeMessage chlo; | |
| 244 QuicServerId server_id("www.google.com", 443, PRIVACY_MODE_DISABLED); | |
| 245 config.FillClientHello(server_id, kConnectionId, QuicVersionMax(), | |
| 246 QuicVersionMax(), &state, QuicWallTime::Zero(), &rand, | |
| 247 nullptr, // channel_id_key | |
| 248 ¶ms, &chlo, &error_details); | |
| 249 | |
| 250 // Verify that certain QuicTags have been set correctly in the CHLO. | |
| 251 QuicTag cver; | |
| 252 EXPECT_EQ(QUIC_NO_ERROR, chlo.GetUint32(kVER, &cver)); | |
| 253 EXPECT_EQ(QuicVersionToQuicTag(QuicVersionMax()), cver); | |
| 254 } | |
| 255 | |
| 256 TEST(QuicCryptoClientConfigTest, ProcessServerDowngradeAttack) { | |
| 257 QuicVersionVector supported_versions = QuicSupportedVersions(); | |
| 258 if (supported_versions.size() == 1) { | |
| 259 // No downgrade attack is possible if the client only supports one version. | |
| 260 return; | |
| 261 } | |
| 262 QuicTagVector supported_version_tags; | |
| 263 for (size_t i = supported_versions.size(); i > 0; --i) { | |
| 264 supported_version_tags.push_back( | |
| 265 QuicVersionToQuicTag(supported_versions[i - 1])); | |
| 266 } | |
| 267 CryptoHandshakeMessage msg; | |
| 268 msg.set_tag(kSHLO); | |
| 269 msg.SetVector(kVER, supported_version_tags); | |
| 270 | |
| 271 QuicCryptoClientConfig::CachedState cached; | |
| 272 QuicCryptoNegotiatedParameters out_params; | |
| 273 string error; | |
| 274 QuicCryptoClientConfig config(CryptoTestUtils::ProofVerifierForTesting()); | |
| 275 EXPECT_EQ(QUIC_VERSION_NEGOTIATION_MISMATCH, | |
| 276 config.ProcessServerHello(msg, 0, supported_versions.front(), | |
| 277 supported_versions, &cached, &out_params, | |
| 278 &error)); | |
| 279 EXPECT_EQ("Downgrade attack detected", error); | |
| 280 } | |
| 281 | |
| 282 TEST(QuicCryptoClientConfigTest, InitializeFrom) { | |
| 283 QuicCryptoClientConfig config(CryptoTestUtils::ProofVerifierForTesting()); | |
| 284 QuicServerId canonical_server_id("www.google.com", 443, | |
| 285 PRIVACY_MODE_DISABLED); | |
| 286 QuicCryptoClientConfig::CachedState* state = | |
| 287 config.LookupOrCreate(canonical_server_id); | |
| 288 // TODO(rch): Populate other fields of |state|. | |
| 289 state->set_source_address_token("TOKEN"); | |
| 290 state->SetProofValid(); | |
| 291 | |
| 292 QuicServerId other_server_id("mail.google.com", 443, PRIVACY_MODE_DISABLED); | |
| 293 config.InitializeFrom(other_server_id, canonical_server_id, &config); | |
| 294 QuicCryptoClientConfig::CachedState* other = | |
| 295 config.LookupOrCreate(other_server_id); | |
| 296 | |
| 297 EXPECT_EQ(state->server_config(), other->server_config()); | |
| 298 EXPECT_EQ(state->source_address_token(), other->source_address_token()); | |
| 299 EXPECT_EQ(state->certs(), other->certs()); | |
| 300 EXPECT_EQ(1u, other->generation_counter()); | |
| 301 } | |
| 302 | |
| 303 TEST(QuicCryptoClientConfigTest, Canonical) { | |
| 304 QuicCryptoClientConfig config(CryptoTestUtils::ProofVerifierForTesting()); | |
| 305 config.AddCanonicalSuffix(".google.com"); | |
| 306 QuicServerId canonical_id1("www.google.com", 443, PRIVACY_MODE_DISABLED); | |
| 307 QuicServerId canonical_id2("mail.google.com", 443, PRIVACY_MODE_DISABLED); | |
| 308 QuicCryptoClientConfig::CachedState* state = | |
| 309 config.LookupOrCreate(canonical_id1); | |
| 310 // TODO(rch): Populate other fields of |state|. | |
| 311 state->set_source_address_token("TOKEN"); | |
| 312 state->SetProofValid(); | |
| 313 | |
| 314 QuicCryptoClientConfig::CachedState* other = | |
| 315 config.LookupOrCreate(canonical_id2); | |
| 316 | |
| 317 EXPECT_TRUE(state->IsEmpty()); | |
| 318 EXPECT_EQ(state->server_config(), other->server_config()); | |
| 319 EXPECT_EQ(state->source_address_token(), other->source_address_token()); | |
| 320 EXPECT_EQ(state->certs(), other->certs()); | |
| 321 EXPECT_EQ(1u, other->generation_counter()); | |
| 322 | |
| 323 QuicServerId different_id("mail.google.org", 443, PRIVACY_MODE_DISABLED); | |
| 324 EXPECT_TRUE(config.LookupOrCreate(different_id)->IsEmpty()); | |
| 325 } | |
| 326 | |
| 327 TEST(QuicCryptoClientConfigTest, CanonicalNotUsedIfNotValid) { | |
| 328 QuicCryptoClientConfig config(CryptoTestUtils::ProofVerifierForTesting()); | |
| 329 config.AddCanonicalSuffix(".google.com"); | |
| 330 QuicServerId canonical_id1("www.google.com", 443, PRIVACY_MODE_DISABLED); | |
| 331 QuicServerId canonical_id2("mail.google.com", 443, PRIVACY_MODE_DISABLED); | |
| 332 QuicCryptoClientConfig::CachedState* state = | |
| 333 config.LookupOrCreate(canonical_id1); | |
| 334 // TODO(rch): Populate other fields of |state|. | |
| 335 state->set_source_address_token("TOKEN"); | |
| 336 | |
| 337 // Do not set the proof as valid, and check that it is not used | |
| 338 // as a canonical entry. | |
| 339 EXPECT_TRUE(config.LookupOrCreate(canonical_id2)->IsEmpty()); | |
| 340 } | |
| 341 | |
| 342 TEST(QuicCryptoClientConfigTest, ClearCachedStates) { | |
| 343 QuicCryptoClientConfig config(CryptoTestUtils::ProofVerifierForTesting()); | |
| 344 QuicServerId server_id("www.google.com", 443, PRIVACY_MODE_DISABLED); | |
| 345 QuicCryptoClientConfig::CachedState* state = config.LookupOrCreate(server_id); | |
| 346 // TODO(rch): Populate other fields of |state|. | |
| 347 vector<string> certs(1); | |
| 348 certs[0] = "Hello Cert"; | |
| 349 state->SetProof(certs, "cert_sct", "chlo_hash", "signature"); | |
| 350 state->set_source_address_token("TOKEN"); | |
| 351 state->SetProofValid(); | |
| 352 EXPECT_EQ(1u, state->generation_counter()); | |
| 353 | |
| 354 // Verify LookupOrCreate returns the same data. | |
| 355 QuicCryptoClientConfig::CachedState* other = config.LookupOrCreate(server_id); | |
| 356 | |
| 357 EXPECT_EQ(state, other); | |
| 358 EXPECT_EQ(1u, other->generation_counter()); | |
| 359 | |
| 360 // Clear the cached states. | |
| 361 config.ClearCachedStates(); | |
| 362 | |
| 363 // Verify LookupOrCreate doesn't have any data. | |
| 364 QuicCryptoClientConfig::CachedState* cleared_cache = | |
| 365 config.LookupOrCreate(server_id); | |
| 366 | |
| 367 EXPECT_EQ(state, cleared_cache); | |
| 368 EXPECT_FALSE(cleared_cache->proof_valid()); | |
| 369 EXPECT_TRUE(cleared_cache->server_config().empty()); | |
| 370 EXPECT_TRUE(cleared_cache->certs().empty()); | |
| 371 EXPECT_TRUE(cleared_cache->cert_sct().empty()); | |
| 372 EXPECT_TRUE(cleared_cache->signature().empty()); | |
| 373 EXPECT_EQ(2u, cleared_cache->generation_counter()); | |
| 374 } | |
| 375 | |
| 376 TEST(QuicCryptoClientConfigTest, ProcessReject) { | |
| 377 CryptoHandshakeMessage rej; | |
| 378 CryptoTestUtils::FillInDummyReject(&rej, /* stateless */ false); | |
| 379 | |
| 380 // Now process the rejection. | |
| 381 QuicCryptoClientConfig::CachedState cached; | |
| 382 QuicCryptoNegotiatedParameters out_params; | |
| 383 string error; | |
| 384 QuicCryptoClientConfig config(CryptoTestUtils::ProofVerifierForTesting()); | |
| 385 EXPECT_EQ(QUIC_NO_ERROR, | |
| 386 config.ProcessRejection(rej, QuicWallTime::FromUNIXSeconds(0), | |
| 387 QuicSupportedVersions().front(), "", | |
| 388 &cached, &out_params, &error)); | |
| 389 EXPECT_FALSE(cached.has_server_designated_connection_id()); | |
| 390 EXPECT_FALSE(cached.has_server_nonce()); | |
| 391 } | |
| 392 | |
| 393 TEST(QuicCryptoClientConfigTest, ProcessStatelessReject) { | |
| 394 // Create a dummy reject message and mark it as stateless. | |
| 395 CryptoHandshakeMessage rej; | |
| 396 CryptoTestUtils::FillInDummyReject(&rej, /* stateless */ true); | |
| 397 const QuicConnectionId kConnectionId = 0xdeadbeef; | |
| 398 const string server_nonce = "SERVER_NONCE"; | |
| 399 rej.SetValue(kRCID, kConnectionId); | |
| 400 rej.SetStringPiece(kServerNonceTag, server_nonce); | |
| 401 | |
| 402 // Now process the rejection. | |
| 403 QuicCryptoClientConfig::CachedState cached; | |
| 404 QuicCryptoNegotiatedParameters out_params; | |
| 405 string error; | |
| 406 QuicCryptoClientConfig config(CryptoTestUtils::ProofVerifierForTesting()); | |
| 407 EXPECT_EQ(QUIC_NO_ERROR, | |
| 408 config.ProcessRejection(rej, QuicWallTime::FromUNIXSeconds(0), | |
| 409 QuicSupportedVersions().front(), "", | |
| 410 &cached, &out_params, &error)); | |
| 411 EXPECT_TRUE(cached.has_server_designated_connection_id()); | |
| 412 EXPECT_EQ(kConnectionId, cached.GetNextServerDesignatedConnectionId()); | |
| 413 EXPECT_EQ(server_nonce, cached.GetNextServerNonce()); | |
| 414 } | |
| 415 | |
| 416 TEST(QuicCryptoClientConfigTest, BadlyFormattedStatelessReject) { | |
| 417 // Create a dummy reject message and mark it as stateless. Do not | |
| 418 // add an server-designated connection-id. | |
| 419 CryptoHandshakeMessage rej; | |
| 420 CryptoTestUtils::FillInDummyReject(&rej, /* stateless */ true); | |
| 421 | |
| 422 // Now process the rejection. | |
| 423 QuicCryptoClientConfig::CachedState cached; | |
| 424 QuicCryptoNegotiatedParameters out_params; | |
| 425 string error; | |
| 426 QuicCryptoClientConfig config(CryptoTestUtils::ProofVerifierForTesting()); | |
| 427 EXPECT_EQ(QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND, | |
| 428 config.ProcessRejection(rej, QuicWallTime::FromUNIXSeconds(0), | |
| 429 QuicSupportedVersions().front(), "", | |
| 430 &cached, &out_params, &error)); | |
| 431 EXPECT_FALSE(cached.has_server_designated_connection_id()); | |
| 432 EXPECT_EQ("Missing kRCID", error); | |
| 433 } | |
| 434 | |
| 435 TEST(QuicCryptoClientConfigTest, ServerNonceinSHLO) { | |
| 436 // Test that the server must include a nonce in the SHLO. | |
| 437 CryptoHandshakeMessage msg; | |
| 438 msg.set_tag(kSHLO); | |
| 439 // Choose the latest version. | |
| 440 QuicVersionVector supported_versions; | |
| 441 QuicVersion version = QuicSupportedVersions().front(); | |
| 442 supported_versions.push_back(version); | |
| 443 QuicTagVector versions; | |
| 444 versions.push_back(QuicVersionToQuicTag(version)); | |
| 445 msg.SetVector(kVER, versions); | |
| 446 | |
| 447 QuicCryptoClientConfig config(CryptoTestUtils::ProofVerifierForTesting()); | |
| 448 QuicCryptoClientConfig::CachedState cached; | |
| 449 QuicCryptoNegotiatedParameters out_params; | |
| 450 string error_details; | |
| 451 EXPECT_EQ(QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER, | |
| 452 config.ProcessServerHello(msg, 0, version, supported_versions, | |
| 453 &cached, &out_params, &error_details)); | |
| 454 EXPECT_EQ("server hello missing server nonce", error_details); | |
| 455 } | |
| 456 | |
| 457 } // namespace test | |
| 458 } // namespace net | |
| OLD | NEW |