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/mock_random.h" | |
10 #include "net/quic/test_tools/quic_test_utils.h" | |
11 #include "testing/gtest/include/gtest/gtest.h" | |
12 | |
13 using std::string; | |
14 using std::vector; | |
15 | |
16 namespace net { | |
17 namespace test { | |
18 namespace { | |
19 | |
20 class TestProofVerifyDetails : public ProofVerifyDetails { | |
21 ~TestProofVerifyDetails() override {} | |
22 | |
23 // ProofVerifyDetails implementation | |
24 ProofVerifyDetails* Clone() const override { | |
25 return new TestProofVerifyDetails; | |
26 } | |
27 }; | |
28 | |
29 } // namespace | |
30 | |
31 TEST(QuicCryptoClientConfigTest, CachedState_IsEmpty) { | |
32 QuicCryptoClientConfig::CachedState state; | |
33 EXPECT_TRUE(state.IsEmpty()); | |
34 } | |
35 | |
36 TEST(QuicCryptoClientConfigTest, CachedState_IsComplete) { | |
37 QuicCryptoClientConfig::CachedState state; | |
38 EXPECT_FALSE(state.IsComplete(QuicWallTime::FromUNIXSeconds(0))); | |
39 } | |
40 | |
41 TEST(QuicCryptoClientConfigTest, CachedState_GenerationCounter) { | |
42 QuicCryptoClientConfig::CachedState state; | |
43 EXPECT_EQ(0u, state.generation_counter()); | |
44 state.SetProofInvalid(); | |
45 EXPECT_EQ(1u, state.generation_counter()); | |
46 } | |
47 | |
48 TEST(QuicCryptoClientConfigTest, CachedState_SetProofVerifyDetails) { | |
49 QuicCryptoClientConfig::CachedState state; | |
50 EXPECT_TRUE(state.proof_verify_details() == nullptr); | |
51 ProofVerifyDetails* details = new TestProofVerifyDetails; | |
52 state.SetProofVerifyDetails(details); | |
53 EXPECT_EQ(details, state.proof_verify_details()); | |
54 } | |
55 | |
56 TEST(QuicCryptoClientConfigTest, CachedState_InitializeFrom) { | |
57 QuicCryptoClientConfig::CachedState state; | |
58 QuicCryptoClientConfig::CachedState other; | |
59 state.set_source_address_token("TOKEN"); | |
60 // TODO(rch): Populate other fields of |state|. | |
61 other.InitializeFrom(state); | |
62 EXPECT_EQ(state.server_config(), other.server_config()); | |
63 EXPECT_EQ(state.source_address_token(), other.source_address_token()); | |
64 EXPECT_EQ(state.certs(), other.certs()); | |
65 EXPECT_EQ(1u, other.generation_counter()); | |
66 } | |
67 | |
68 TEST(QuicCryptoClientConfigTest, InchoateChlo) { | |
69 QuicCryptoClientConfig::CachedState state; | |
70 QuicCryptoClientConfig config; | |
71 QuicCryptoNegotiatedParameters params; | |
72 CryptoHandshakeMessage msg; | |
73 QuicServerId server_id("www.google.com", 80, false, PRIVACY_MODE_DISABLED); | |
74 config.FillInchoateClientHello(server_id, QuicVersionMax(), &state, | |
75 ¶ms, &msg); | |
76 | |
77 QuicTag cver; | |
78 EXPECT_EQ(QUIC_NO_ERROR, msg.GetUint32(kVER, &cver)); | |
79 EXPECT_EQ(QuicVersionToQuicTag(QuicVersionMax()), cver); | |
80 } | |
81 | |
82 TEST(QuicCryptoClientConfigTest, PreferAesGcm) { | |
83 QuicCryptoClientConfig config; | |
84 if (config.aead.size() > 1) | |
85 EXPECT_NE(kAESG, config.aead[0]); | |
86 config.PreferAesGcm(); | |
87 EXPECT_EQ(kAESG, config.aead[0]); | |
88 } | |
89 | |
90 TEST(QuicCryptoClientConfigTest, InchoateChloSecure) { | |
91 QuicCryptoClientConfig::CachedState state; | |
92 QuicCryptoClientConfig config; | |
93 QuicCryptoNegotiatedParameters params; | |
94 CryptoHandshakeMessage msg; | |
95 QuicServerId server_id("www.google.com", 443, true, PRIVACY_MODE_DISABLED); | |
96 config.FillInchoateClientHello(server_id, QuicVersionMax(), &state, | |
97 ¶ms, &msg); | |
98 | |
99 QuicTag pdmd; | |
100 EXPECT_EQ(QUIC_NO_ERROR, msg.GetUint32(kPDMD, &pdmd)); | |
101 EXPECT_EQ(kX509, pdmd); | |
102 } | |
103 | |
104 TEST(QuicCryptoClientConfigTest, InchoateChloSecureNoEcdsa) { | |
105 QuicCryptoClientConfig::CachedState state; | |
106 QuicCryptoClientConfig config; | |
107 config.DisableEcdsa(); | |
108 QuicCryptoNegotiatedParameters params; | |
109 CryptoHandshakeMessage msg; | |
110 QuicServerId server_id("www.google.com", 443, true, PRIVACY_MODE_DISABLED); | |
111 config.FillInchoateClientHello(server_id, QuicVersionMax(), &state, | |
112 ¶ms, &msg); | |
113 | |
114 QuicTag pdmd; | |
115 EXPECT_EQ(QUIC_NO_ERROR, msg.GetUint32(kPDMD, &pdmd)); | |
116 EXPECT_EQ(kX59R, pdmd); | |
117 } | |
118 | |
119 TEST(QuicCryptoClientConfigTest, FillClientHello) { | |
120 QuicCryptoClientConfig::CachedState state; | |
121 QuicCryptoClientConfig config; | |
122 QuicCryptoNegotiatedParameters params; | |
123 QuicConnectionId kConnectionId = 1234; | |
124 string error_details; | |
125 MockRandom rand; | |
126 CryptoHandshakeMessage chlo; | |
127 QuicServerId server_id("www.google.com", 80, false, PRIVACY_MODE_DISABLED); | |
128 config.FillClientHello(server_id, | |
129 kConnectionId, | |
130 QuicVersionMax(), | |
131 &state, | |
132 QuicWallTime::Zero(), | |
133 &rand, | |
134 nullptr, // channel_id_key | |
135 ¶ms, | |
136 &chlo, | |
137 &error_details); | |
138 | |
139 // Verify that certain QuicTags have been set correctly in the CHLO. | |
140 QuicTag cver; | |
141 EXPECT_EQ(QUIC_NO_ERROR, chlo.GetUint32(kVER, &cver)); | |
142 EXPECT_EQ(QuicVersionToQuicTag(QuicVersionMax()), cver); | |
143 } | |
144 | |
145 TEST(QuicCryptoClientConfigTest, ProcessServerDowngradeAttack) { | |
146 QuicVersionVector supported_versions = QuicSupportedVersions(); | |
147 if (supported_versions.size() == 1) { | |
148 // No downgrade attack is possible if the client only supports one version. | |
149 return; | |
150 } | |
151 QuicTagVector supported_version_tags; | |
152 for (size_t i = supported_versions.size(); i > 0; --i) { | |
153 supported_version_tags.push_back( | |
154 QuicVersionToQuicTag(supported_versions[i - 1])); | |
155 } | |
156 CryptoHandshakeMessage msg; | |
157 msg.set_tag(kSHLO); | |
158 msg.SetVector(kVER, supported_version_tags); | |
159 | |
160 QuicCryptoClientConfig::CachedState cached; | |
161 QuicCryptoNegotiatedParameters out_params; | |
162 string error; | |
163 QuicCryptoClientConfig config; | |
164 EXPECT_EQ(QUIC_VERSION_NEGOTIATION_MISMATCH, | |
165 config.ProcessServerHello(msg, 0, supported_versions, | |
166 &cached, &out_params, &error)); | |
167 EXPECT_EQ("Downgrade attack detected", error); | |
168 } | |
169 | |
170 TEST(QuicCryptoClientConfigTest, InitializeFrom) { | |
171 QuicCryptoClientConfig config; | |
172 QuicServerId canonical_server_id("www.google.com", 80, false, | |
173 PRIVACY_MODE_DISABLED); | |
174 QuicCryptoClientConfig::CachedState* state = | |
175 config.LookupOrCreate(canonical_server_id); | |
176 // TODO(rch): Populate other fields of |state|. | |
177 state->set_source_address_token("TOKEN"); | |
178 state->SetProofValid(); | |
179 | |
180 QuicServerId other_server_id("mail.google.com", 80, false, | |
181 PRIVACY_MODE_DISABLED); | |
182 config.InitializeFrom(other_server_id, canonical_server_id, &config); | |
183 QuicCryptoClientConfig::CachedState* other = | |
184 config.LookupOrCreate(other_server_id); | |
185 | |
186 EXPECT_EQ(state->server_config(), other->server_config()); | |
187 EXPECT_EQ(state->source_address_token(), other->source_address_token()); | |
188 EXPECT_EQ(state->certs(), other->certs()); | |
189 EXPECT_EQ(1u, other->generation_counter()); | |
190 } | |
191 | |
192 TEST(QuicCryptoClientConfigTest, Canonical) { | |
193 QuicCryptoClientConfig config; | |
194 config.AddCanonicalSuffix(".google.com"); | |
195 QuicServerId canonical_id1("www.google.com", 80, false, | |
196 PRIVACY_MODE_DISABLED); | |
197 QuicServerId canonical_id2("mail.google.com", 80, false, | |
198 PRIVACY_MODE_DISABLED); | |
199 QuicCryptoClientConfig::CachedState* state = | |
200 config.LookupOrCreate(canonical_id1); | |
201 // TODO(rch): Populate other fields of |state|. | |
202 state->set_source_address_token("TOKEN"); | |
203 state->SetProofValid(); | |
204 | |
205 QuicCryptoClientConfig::CachedState* other = | |
206 config.LookupOrCreate(canonical_id2); | |
207 | |
208 EXPECT_TRUE(state->IsEmpty()); | |
209 EXPECT_EQ(state->server_config(), other->server_config()); | |
210 EXPECT_EQ(state->source_address_token(), other->source_address_token()); | |
211 EXPECT_EQ(state->certs(), other->certs()); | |
212 EXPECT_EQ(1u, other->generation_counter()); | |
213 | |
214 QuicServerId different_id("mail.google.org", 80, false, | |
215 PRIVACY_MODE_DISABLED); | |
216 EXPECT_TRUE(config.LookupOrCreate(different_id)->IsEmpty()); | |
217 } | |
218 | |
219 TEST(QuicCryptoClientConfigTest, CanonicalNotUsedIfNotValid) { | |
220 QuicCryptoClientConfig config; | |
221 config.AddCanonicalSuffix(".google.com"); | |
222 QuicServerId canonical_id1("www.google.com", 80, false, | |
223 PRIVACY_MODE_DISABLED); | |
224 QuicServerId canonical_id2("mail.google.com", 80, false, | |
225 PRIVACY_MODE_DISABLED); | |
226 QuicCryptoClientConfig::CachedState* state = | |
227 config.LookupOrCreate(canonical_id1); | |
228 // TODO(rch): Populate other fields of |state|. | |
229 state->set_source_address_token("TOKEN"); | |
230 | |
231 // Do not set the proof as valid, and check that it is not used | |
232 // as a canonical entry. | |
233 EXPECT_TRUE(config.LookupOrCreate(canonical_id2)->IsEmpty()); | |
234 } | |
235 | |
236 TEST(QuicCryptoClientConfigTest, ClearCachedStates) { | |
237 QuicCryptoClientConfig config; | |
238 QuicServerId server_id("www.google.com", 80, false, PRIVACY_MODE_DISABLED); | |
239 QuicCryptoClientConfig::CachedState* state = config.LookupOrCreate(server_id); | |
240 // TODO(rch): Populate other fields of |state|. | |
241 vector<string> certs(1); | |
242 certs[0] = "Hello Cert"; | |
243 state->SetProof(certs, "signature"); | |
244 state->set_source_address_token("TOKEN"); | |
245 state->SetProofValid(); | |
246 EXPECT_EQ(1u, state->generation_counter()); | |
247 | |
248 // Verify LookupOrCreate returns the same data. | |
249 QuicCryptoClientConfig::CachedState* other = config.LookupOrCreate(server_id); | |
250 | |
251 EXPECT_EQ(state, other); | |
252 EXPECT_EQ(1u, other->generation_counter()); | |
253 | |
254 // Clear the cached states. | |
255 config.ClearCachedStates(); | |
256 | |
257 // Verify LookupOrCreate doesn't have any data. | |
258 QuicCryptoClientConfig::CachedState* cleared_cache = | |
259 config.LookupOrCreate(server_id); | |
260 | |
261 EXPECT_EQ(state, cleared_cache); | |
262 EXPECT_FALSE(cleared_cache->proof_valid()); | |
263 EXPECT_TRUE(cleared_cache->server_config().empty()); | |
264 EXPECT_TRUE(cleared_cache->certs().empty()); | |
265 EXPECT_TRUE(cleared_cache->signature().empty()); | |
266 EXPECT_EQ(2u, cleared_cache->generation_counter()); | |
267 } | |
268 | |
269 } // namespace test | |
270 } // namespace net | |
OLD | NEW |