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

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

Issue 2193073003: Move shared files in net/quic/ into net/quic/core/ (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: io_thread_unittest.cc Created 4 years, 4 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 | « net/quic/crypto/proof_source.cc ('k') | net/quic/crypto/proof_verifier.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include <memory>
6
7 #include "base/files/file_path.h"
8 #include "net/base/ip_endpoint.h"
9 #include "net/base/net_errors.h"
10 #include "net/base/test_completion_callback.h"
11 #include "net/cert/cert_status_flags.h"
12 #include "net/cert/cert_verify_result.h"
13 #include "net/cert/x509_certificate.h"
14 #include "net/quic/crypto/proof_source.h"
15 #include "net/quic/crypto/proof_verifier.h"
16 #include "net/quic/test_tools/crypto_test_utils.h"
17 #include "net/test/cert_test_util.h"
18 #include "net/test/test_data_directory.h"
19 #include "testing/gtest/include/gtest/gtest.h"
20
21 using std::string;
22 using std::vector;
23
24 namespace net {
25 namespace test {
26 namespace {
27
28 // TestProofVerifierCallback is a simple callback for a ProofVerifier that
29 // signals a TestCompletionCallback when called and stores the results from the
30 // ProofVerifier in pointers passed to the constructor.
31 class TestProofVerifierCallback : public ProofVerifierCallback {
32 public:
33 TestProofVerifierCallback(TestCompletionCallback* comp_callback,
34 bool* ok,
35 string* error_details)
36 : comp_callback_(comp_callback), ok_(ok), error_details_(error_details) {}
37
38 void Run(bool ok,
39 const string& error_details,
40 std::unique_ptr<ProofVerifyDetails>* details) override {
41 *ok_ = ok;
42 *error_details_ = error_details;
43
44 comp_callback_->callback().Run(0);
45 }
46
47 private:
48 TestCompletionCallback* const comp_callback_;
49 bool* const ok_;
50 string* const error_details_;
51 };
52
53 // RunVerification runs |verifier->VerifyProof| and asserts that the result
54 // matches |expected_ok|.
55 void RunVerification(ProofVerifier* verifier,
56 const string& hostname,
57 const uint16_t port,
58 const string& server_config,
59 QuicVersion quic_version,
60 StringPiece chlo_hash,
61 const vector<string>& certs,
62 const string& proof,
63 bool expected_ok) {
64 std::unique_ptr<ProofVerifyDetails> details;
65 TestCompletionCallback comp_callback;
66 bool ok;
67 string error_details;
68 std::unique_ptr<ProofVerifyContext> verify_context(
69 CryptoTestUtils::ProofVerifyContextForTesting());
70 std::unique_ptr<TestProofVerifierCallback> callback(
71 new TestProofVerifierCallback(&comp_callback, &ok, &error_details));
72
73 QuicAsyncStatus status = verifier->VerifyProof(
74 hostname, port, server_config, quic_version, chlo_hash, certs, "", proof,
75 verify_context.get(), &error_details, &details, std::move(callback));
76
77 switch (status) {
78 case QUIC_FAILURE:
79 ASSERT_FALSE(expected_ok);
80 ASSERT_NE("", error_details);
81 return;
82 case QUIC_SUCCESS:
83 ASSERT_TRUE(expected_ok);
84 ASSERT_EQ("", error_details);
85 return;
86 case QUIC_PENDING:
87 comp_callback.WaitForResult();
88 ASSERT_EQ(expected_ok, ok);
89 break;
90 }
91 }
92
93 // Reads the certificate named "quic_" + |file_name| in the test data directory.
94 // The certificate must be PEM encoded. Returns the DER-encoded certificate.
95 string LoadTestCert(const string& file_name) {
96 base::FilePath certs_dir = GetTestCertsDirectory();
97 scoped_refptr<X509Certificate> cert =
98 ImportCertFromFile(certs_dir, "quic_" + file_name);
99 CHECK_NE(static_cast<X509Certificate*>(nullptr), cert.get());
100
101 string der_bytes;
102 CHECK(X509Certificate::GetDEREncoded(cert->os_cert_handle(), &der_bytes));
103 return der_bytes;
104 }
105
106 class TestCallback : public ProofSource::Callback {
107 public:
108 explicit TestCallback(bool* called,
109 bool* ok,
110 scoped_refptr<ProofSource::Chain>* chain,
111 string* signature,
112 string* leaf_cert_sct)
113 : called_(called),
114 ok_(ok),
115 chain_(chain),
116 signature_(signature),
117 leaf_cert_sct_(leaf_cert_sct) {}
118
119 void Run(bool ok,
120 const scoped_refptr<ProofSource::Chain>& chain,
121 const string& signature,
122 const string& leaf_cert_sct,
123 std::unique_ptr<ProofSource::Details> /* details */) override {
124 *ok_ = ok;
125 *chain_ = chain;
126 *signature_ = signature;
127 *leaf_cert_sct_ = leaf_cert_sct;
128 *called_ = true;
129 }
130
131 private:
132 bool* called_;
133 bool* ok_;
134 scoped_refptr<ProofSource::Chain>* chain_;
135 string* signature_;
136 string* leaf_cert_sct_;
137 };
138
139 class ProofTest : public ::testing::TestWithParam<QuicVersion> {};
140
141 } // namespace
142
143 INSTANTIATE_TEST_CASE_P(QuicVersion,
144 ProofTest,
145 ::testing::ValuesIn(QuicSupportedVersions()));
146
147 // TODO(rtenneti): Enable testing of ProofVerifier. See http://crbug.com/514468.
148 TEST_P(ProofTest, DISABLED_Verify) {
149 std::unique_ptr<ProofSource> source(CryptoTestUtils::ProofSourceForTesting());
150 std::unique_ptr<ProofVerifier> verifier(
151 CryptoTestUtils::ProofVerifierForTesting());
152
153 const string server_config = "server config bytes";
154 const string hostname = "test.example.com";
155 const uint16_t port = 8443;
156 const string first_chlo_hash = "first chlo hash bytes";
157 const string second_chlo_hash = "first chlo hash bytes";
158 const QuicVersion quic_version = GetParam();
159
160 scoped_refptr<ProofSource::Chain> chain;
161 scoped_refptr<ProofSource::Chain> first_chain;
162 string error_details, signature, first_signature, first_cert_sct, cert_sct;
163 IPAddress server_ip;
164
165 ASSERT_TRUE(source->GetProof(
166 server_ip, hostname, server_config, quic_version, first_chlo_hash,
167 false /* no ECDSA */, &first_chain, &first_signature, &first_cert_sct));
168 ASSERT_TRUE(source->GetProof(server_ip, hostname, server_config, quic_version,
169 second_chlo_hash, false /* no ECDSA */, &chain,
170 &signature, &cert_sct));
171
172 // Check that the proof source is caching correctly:
173 ASSERT_EQ(first_chain->certs, chain->certs);
174 if (GetParam() < QUIC_VERSION_31) {
175 ASSERT_EQ(signature, first_signature);
176 } else {
177 // QUIC 31 includes the CHLO hash.
178 ASSERT_NE(signature, first_signature);
179 }
180 ASSERT_EQ(first_cert_sct, cert_sct);
181
182 RunVerification(verifier.get(), hostname, port, server_config, quic_version,
183 first_chlo_hash, chain->certs, signature, true);
184
185 RunVerification(verifier.get(), "foo.com", port, server_config, quic_version,
186 first_chlo_hash, chain->certs, signature, false);
187
188 RunVerification(verifier.get(), server_config.substr(1, string::npos), port,
189 server_config, quic_version, first_chlo_hash, chain->certs,
190 signature, false);
191
192 const string corrupt_signature = "1" + signature;
193 RunVerification(verifier.get(), hostname, port, server_config, quic_version,
194 first_chlo_hash, chain->certs, corrupt_signature, false);
195
196 vector<string> wrong_certs;
197 for (size_t i = 1; i < chain->certs.size(); i++) {
198 wrong_certs.push_back(chain->certs[i]);
199 }
200
201 RunVerification(verifier.get(), "foo.com", port, server_config, quic_version,
202 first_chlo_hash, wrong_certs, corrupt_signature, false);
203 }
204
205 TEST_P(ProofTest, VerifySourceAsync) {
206 std::unique_ptr<ProofSource> source(CryptoTestUtils::ProofSourceForTesting());
207
208 const string server_config = "server config bytes";
209 const string hostname = "test.example.com";
210 const string first_chlo_hash = "first chlo hash bytes";
211 const string second_chlo_hash = "first chlo hash bytes";
212 const QuicVersion quic_version = GetParam();
213 IPAddress server_ip;
214
215 // Call synchronous version
216 scoped_refptr<ProofSource::Chain> expected_chain;
217 string expected_signature;
218 string expected_leaf_cert_sct;
219 ASSERT_TRUE(source->GetProof(server_ip, hostname, server_config, quic_version,
220 first_chlo_hash, false /* no ECDSA */,
221 &expected_chain, &expected_signature,
222 &expected_leaf_cert_sct));
223
224 // Call asynchronous version and compare results
225 bool called = false;
226 bool ok;
227 scoped_refptr<ProofSource::Chain> chain;
228 string signature;
229 string leaf_cert_sct;
230 std::unique_ptr<ProofSource::Callback> cb(
231 new TestCallback(&called, &ok, &chain, &signature, &leaf_cert_sct));
232 source->GetProof(server_ip, hostname, server_config, quic_version,
233 first_chlo_hash, false /* no ECDSA */, std::move(cb));
234 // TODO(gredner): whan GetProof really invokes the callback asynchronously,
235 // figure out what to do here.
236 ASSERT_TRUE(called);
237 ASSERT_TRUE(ok);
238 EXPECT_THAT(chain->certs, ::testing::ContainerEq(expected_chain->certs));
239 EXPECT_EQ(leaf_cert_sct, expected_leaf_cert_sct);
240 }
241
242 TEST_P(ProofTest, UseAfterFree) {
243 std::unique_ptr<ProofSource> source(CryptoTestUtils::ProofSourceForTesting());
244
245 const string server_config = "server config bytes";
246 const string hostname = "test.example.com";
247 const string chlo_hash = "proof nonce bytes";
248 scoped_refptr<ProofSource::Chain> chain;
249 string error_details, signature, cert_sct;
250 IPAddress server_ip;
251
252 ASSERT_TRUE(source->GetProof(server_ip, hostname, server_config, GetParam(),
253 chlo_hash, false /* no ECDSA */, &chain,
254 &signature, &cert_sct));
255
256 // Make sure we can safely access results after deleting where they came from.
257 EXPECT_FALSE(chain->HasOneRef());
258 source = nullptr;
259 EXPECT_TRUE(chain->HasOneRef());
260
261 EXPECT_FALSE(chain->certs.empty());
262 for (const string& cert : chain->certs) {
263 EXPECT_FALSE(cert.empty());
264 }
265 }
266
267 // A known answer test that allows us to test ProofVerifier without a working
268 // ProofSource.
269 TEST_P(ProofTest, VerifyRSAKnownAnswerTest) {
270 if (GetParam() > QUIC_VERSION_30) {
271 return;
272 }
273 // These sample signatures were generated by running the Proof.Verify test
274 // and dumping the bytes of the |signature| output of ProofSource::GetProof().
275 static const unsigned char signature_data_0[] = {
276 0x31, 0xd5, 0xfb, 0x40, 0x30, 0x75, 0xd2, 0x7d, 0x61, 0xf9, 0xd7, 0x54,
277 0x30, 0x06, 0xaf, 0x54, 0x0d, 0xb0, 0x0a, 0xda, 0x63, 0xca, 0x7e, 0x9e,
278 0xce, 0xba, 0x10, 0x05, 0x1b, 0xa6, 0x7f, 0xef, 0x2b, 0xa3, 0xff, 0x3c,
279 0xbb, 0x9a, 0xe4, 0xbf, 0xb8, 0x0c, 0xc1, 0xbd, 0xed, 0xc2, 0x90, 0x68,
280 0xeb, 0x45, 0x48, 0xea, 0x3c, 0x95, 0xf8, 0xa2, 0xb9, 0xe7, 0x62, 0x29,
281 0x00, 0xc3, 0x18, 0xb4, 0x16, 0x6f, 0x5e, 0xb0, 0xc1, 0x26, 0xc0, 0x4b,
282 0x84, 0xf5, 0x97, 0xfc, 0x17, 0xf9, 0x1c, 0x43, 0xb8, 0xf2, 0x3f, 0x38,
283 0x32, 0xad, 0x36, 0x52, 0x2c, 0x26, 0x92, 0x7a, 0xea, 0x2c, 0xa2, 0xf4,
284 0x28, 0x2f, 0x19, 0x4d, 0x1f, 0x11, 0x46, 0x82, 0xd0, 0xc4, 0x86, 0x56,
285 0x5c, 0x97, 0x9e, 0xc6, 0x37, 0x8e, 0xaf, 0x9d, 0x69, 0xe9, 0x4f, 0x5a,
286 0x6d, 0x70, 0x75, 0xc7, 0x41, 0x95, 0x68, 0x53, 0x94, 0xca, 0x31, 0x63,
287 0x61, 0x9f, 0xb8, 0x8c, 0x3b, 0x75, 0x36, 0x8b, 0x69, 0xa2, 0x35, 0xc0,
288 0x4b, 0x77, 0x55, 0x08, 0xc2, 0xb4, 0x56, 0xd2, 0x81, 0xce, 0x9e, 0x25,
289 0xdb, 0x50, 0x74, 0xb3, 0x8a, 0xd9, 0x20, 0x42, 0x3f, 0x85, 0x2d, 0xaa,
290 0xfd, 0x66, 0xfa, 0xd6, 0x95, 0x55, 0x6b, 0x63, 0x63, 0x04, 0xf8, 0x6c,
291 0x3e, 0x08, 0x22, 0x39, 0xb9, 0x9a, 0xe0, 0xd7, 0x01, 0xff, 0xeb, 0x8a,
292 0xb9, 0xe2, 0x34, 0xa5, 0xa0, 0x51, 0xe9, 0xbe, 0x15, 0x12, 0xbf, 0xbe,
293 0x64, 0x3d, 0x3f, 0x98, 0xce, 0xc1, 0xa6, 0x33, 0x32, 0xd3, 0x5c, 0xa8,
294 0x39, 0x93, 0xdc, 0x1c, 0xb9, 0xab, 0x3c, 0x80, 0x62, 0xb3, 0x76, 0x21,
295 0xdf, 0x47, 0x1e, 0xa9, 0x0e, 0x5e, 0x8a, 0xbe, 0x66, 0x5b, 0x7c, 0x21,
296 0xfa, 0x78, 0x2d, 0xd1, 0x1d, 0x5c, 0x35, 0x8a, 0x34, 0xb2, 0x1a, 0xc2,
297 0xc4, 0x4b, 0x53, 0x54,
298 };
299 static const unsigned char signature_data_1[] = {
300 0x01, 0x7b, 0x52, 0x35, 0xe3, 0x51, 0xdd, 0xf1, 0x67, 0x8d, 0x31, 0x5e,
301 0xa3, 0x75, 0x1f, 0x68, 0x6c, 0xdd, 0x41, 0x7a, 0x18, 0x25, 0xe0, 0x12,
302 0x6e, 0x84, 0x46, 0x5e, 0xb2, 0x98, 0xd7, 0x84, 0xe1, 0x62, 0xe0, 0xc1,
303 0xc4, 0xd7, 0x4f, 0x4f, 0x80, 0xc1, 0x92, 0xd6, 0x02, 0xaf, 0xca, 0x28,
304 0x9f, 0xe0, 0xf3, 0x74, 0xd7, 0xf1, 0x44, 0x67, 0x59, 0x27, 0xc8, 0xc2,
305 0x8b, 0xd4, 0xe5, 0x4a, 0x07, 0xfd, 0x00, 0xd6, 0x8a, 0xbf, 0x8b, 0xcd,
306 0x6a, 0xe0, 0x1d, 0xf6, 0x4b, 0x68, 0x0f, 0xcf, 0xb9, 0xd0, 0xa1, 0xbc,
307 0x2e, 0xcf, 0x7c, 0x03, 0x47, 0x11, 0xe4, 0x4c, 0xbc, 0x1b, 0x6b, 0xa5,
308 0x2a, 0x82, 0x86, 0xa4, 0x7f, 0x1d, 0x85, 0x64, 0x21, 0x10, 0xd2, 0xb2,
309 0xa0, 0x31, 0xa2, 0x78, 0xe6, 0xf2, 0xea, 0x96, 0x38, 0x8c, 0x9a, 0xe1,
310 0x01, 0xab, 0x8e, 0x95, 0x66, 0xc8, 0xe5, 0xcc, 0x80, 0xa3, 0xbd, 0x16,
311 0xa7, 0x79, 0x19, 0x39, 0x61, 0x3d, 0xff, 0x37, 0xca, 0x9f, 0x97, 0x05,
312 0xc7, 0xcb, 0xf0, 0xea, 0xaf, 0x64, 0x07, 0xc0, 0xed, 0x2a, 0x98, 0xa4,
313 0xaf, 0x04, 0x6f, 0xf2, 0xc9, 0xb2, 0x73, 0x9a, 0x56, 0x85, 0x43, 0x64,
314 0x5f, 0xaa, 0xb7, 0xff, 0x31, 0x4c, 0x2e, 0x6c, 0x17, 0xcf, 0xe5, 0xbe,
315 0x7f, 0x7e, 0xad, 0xf5, 0x6f, 0x84, 0x50, 0x20, 0x29, 0xb3, 0x57, 0xe7,
316 0xb1, 0xdc, 0x2c, 0x95, 0x48, 0xfe, 0xb0, 0xc1, 0x92, 0xda, 0xc5, 0x58,
317 0x95, 0xb0, 0x1a, 0x3a, 0x05, 0x71, 0x3c, 0x6d, 0x20, 0x01, 0x4c, 0xa9,
318 0xe4, 0x38, 0x08, 0x65, 0xb4, 0xbd, 0x86, 0x76, 0xbd, 0xad, 0x25, 0x06,
319 0x74, 0x0b, 0xca, 0x95, 0x27, 0x0c, 0x13, 0x08, 0x7e, 0x30, 0xcf, 0xf6,
320 0xb5, 0xc1, 0x2a, 0x08, 0xfc, 0x4b, 0xc6, 0xb5, 0x2f, 0x23, 0x27, 0x32,
321 0x89, 0xdb, 0x0e, 0x4a,
322 };
323 static const unsigned char signature_data_2[] = {
324 0x6d, 0x7d, 0x22, 0x8c, 0x85, 0xc4, 0x8a, 0x80, 0x05, 0xe4, 0x3c, 0xaf,
325 0x10, 0x3b, 0xe3, 0x51, 0xb1, 0x86, 0x52, 0x63, 0xb6, 0x17, 0x33, 0xbd,
326 0x1b, 0x1e, 0xc4, 0x50, 0x10, 0xfc, 0xcc, 0xea, 0x6b, 0x11, 0xeb, 0x6d,
327 0x5e, 0x00, 0xe7, 0xf3, 0x67, 0x99, 0x74, 0x53, 0x12, 0x8f, 0xe4, 0x3e,
328 0x20, 0x17, 0x8e, 0x83, 0xe6, 0xdc, 0x83, 0x91, 0x0e, 0xf3, 0x69, 0x22,
329 0x95, 0x14, 0xdf, 0xc1, 0xda, 0xb5, 0xdb, 0x6a, 0x1a, 0xb4, 0x4f, 0x26,
330 0xd0, 0x32, 0x1d, 0x73, 0x95, 0x1f, 0x39, 0x1d, 0x00, 0xcb, 0xc3, 0x92,
331 0x49, 0x53, 0xcb, 0x5c, 0x36, 0x70, 0x19, 0xd9, 0x64, 0x36, 0xda, 0xfb,
332 0x20, 0xe5, 0x47, 0xd9, 0x08, 0xc6, 0x5a, 0x9e, 0x87, 0x1a, 0xdb, 0x11,
333 0x7b, 0x17, 0xfc, 0x53, 0x7b, 0xc1, 0xa0, 0xc0, 0x33, 0xcf, 0x96, 0xba,
334 0x03, 0x79, 0x8e, 0xc6, 0x05, 0xd2, 0xb7, 0xa2, 0xe2, 0xc1, 0x67, 0xb7,
335 0x6a, 0xeb, 0xb1, 0x40, 0xbb, 0x7d, 0x57, 0xcb, 0xc2, 0x60, 0x9f, 0xf1,
336 0x72, 0xe5, 0xad, 0xce, 0x95, 0x45, 0x7c, 0xbc, 0x75, 0x81, 0x45, 0x19,
337 0xe1, 0xa7, 0x2f, 0x05, 0x52, 0xeb, 0xed, 0xdd, 0x19, 0xd9, 0x1a, 0xc9,
338 0x5a, 0x06, 0x8e, 0x29, 0x54, 0xb5, 0x4f, 0x80, 0xaa, 0x36, 0x36, 0xc0,
339 0xff, 0x64, 0xac, 0xe8, 0x0f, 0x99, 0x35, 0x5e, 0xc6, 0x72, 0x1f, 0x8c,
340 0xc4, 0x2b, 0x7d, 0xc1, 0xfb, 0xf0, 0x12, 0x61, 0xb1, 0x18, 0x65, 0xdd,
341 0xc2, 0x38, 0x92, 0xba, 0x84, 0xf8, 0xc8, 0x5e, 0x17, 0x63, 0xe0, 0x9c,
342 0x2c, 0xe6, 0x70, 0x71, 0xdc, 0xe5, 0xc1, 0xea, 0xb3, 0x9a, 0xb6, 0x91,
343 0xdc, 0xc5, 0x56, 0x84, 0x8a, 0x31, 0x31, 0x23, 0x61, 0x94, 0x7e, 0x01,
344 0x22, 0x49, 0xf3, 0xcb, 0x0e, 0x31, 0x03, 0x04, 0x1b, 0x14, 0x43, 0x7c,
345 0xad, 0x42, 0xe5, 0x55,
346 };
347
348 std::unique_ptr<ProofVerifier> verifier(
349 CryptoTestUtils::RealProofVerifierForTesting());
350
351 const string server_config = "server config bytes";
352 const string hostname = "test.example.com";
353 const uint16_t port = 8443;
354 const string chlo_hash = "proof nonce bytes";
355 const QuicVersion quic_version = GetParam();
356
357 vector<string> certs(2);
358 certs[0] = LoadTestCert("test.example.com.crt");
359 certs[1] = LoadTestCert("intermediate.crt");
360
361 // Signatures are nondeterministic, so we test multiple signatures on the
362 // same server_config.
363 vector<string> signatures(3);
364 signatures[0].assign(reinterpret_cast<const char*>(signature_data_0),
365 sizeof(signature_data_0));
366 signatures[1].assign(reinterpret_cast<const char*>(signature_data_1),
367 sizeof(signature_data_1));
368 signatures[2].assign(reinterpret_cast<const char*>(signature_data_2),
369 sizeof(signature_data_2));
370
371 for (size_t i = 0; i < signatures.size(); i++) {
372 const string& signature = signatures[i];
373
374 RunVerification(verifier.get(), hostname, port, server_config, quic_version,
375 chlo_hash, certs, signature, true);
376 RunVerification(verifier.get(), "foo.com", port, server_config,
377 quic_version, chlo_hash, certs, signature, false);
378 RunVerification(verifier.get(), hostname, port,
379 server_config.substr(1, string::npos), quic_version,
380 chlo_hash, certs, signature, false);
381
382 const string corrupt_signature = "1" + signature;
383 RunVerification(verifier.get(), hostname, port, server_config, quic_version,
384 chlo_hash, certs, corrupt_signature, false);
385
386 vector<string> wrong_certs;
387 for (size_t i = 1; i < certs.size(); i++) {
388 wrong_certs.push_back(certs[i]);
389 }
390 RunVerification(verifier.get(), hostname, port, server_config, quic_version,
391 chlo_hash, wrong_certs, signature, false);
392 }
393 }
394
395 // A known answer test that allows us to test ProofVerifier without a working
396 // ProofSource.
397 TEST_P(ProofTest, VerifyECDSAKnownAnswerTest) {
398 if (GetParam() > QUIC_VERSION_30) {
399 return;
400 }
401
402 // These sample signatures were generated by running the Proof.Verify test
403 // (modified to use ECDSA for signing proofs) and dumping the bytes of the
404 // |signature| output of ProofSource::GetProof().
405 static const unsigned char signature_data_0[] = {
406 0x30, 0x45, 0x02, 0x21, 0x00, 0x89, 0xc4, 0x7d, 0x08, 0xd1, 0x49, 0x19,
407 0x6c, 0xd1, 0x7c, 0xb9, 0x25, 0xe0, 0xe3, 0xbd, 0x6a, 0x5c, 0xd7, 0xaa,
408 0x0c, 0xdc, 0x4f, 0x8e, 0xeb, 0xde, 0xbf, 0x32, 0xf8, 0xd1, 0x84, 0x95,
409 0x97, 0x02, 0x20, 0x29, 0x3d, 0x49, 0x22, 0x73, 0xed, 0x8b, 0xde, 0x3d,
410 0xc2, 0xa4, 0x20, 0xcc, 0xe7, 0xc8, 0x2a, 0x85, 0x20, 0x9b, 0x5b, 0xda,
411 0xcd, 0x58, 0x23, 0xbe, 0x89, 0x73, 0x31, 0x87, 0x51, 0xd1, 0x01,
412 };
413 static const unsigned char signature_data_1[] = {
414 0x30, 0x46, 0x02, 0x21, 0x00, 0xec, 0xdf, 0x69, 0xc8, 0x24, 0x59, 0x93,
415 0xda, 0x49, 0xee, 0x37, 0x28, 0xaf, 0xeb, 0x0e, 0x2f, 0x80, 0x17, 0x4b,
416 0x3b, 0xf6, 0x54, 0xcd, 0x3b, 0x86, 0xc5, 0x98, 0x0d, 0xff, 0xc6, 0xb1,
417 0xe7, 0x02, 0x21, 0x00, 0xe1, 0x36, 0x8c, 0xc0, 0xf4, 0x50, 0x5f, 0xba,
418 0xfb, 0xe2, 0xff, 0x1d, 0x5d, 0x64, 0xe4, 0x07, 0xbb, 0x5a, 0x4b, 0x19,
419 0xb6, 0x39, 0x7a, 0xc4, 0x12, 0xc6, 0xe5, 0x42, 0xc8, 0x78, 0x33, 0xcd,
420 };
421 static const unsigned char signature_data_2[] = {
422 0x30, 0x45, 0x02, 0x20, 0x09, 0x51, 0xe9, 0xde, 0xdb, 0x01, 0xfd, 0xb4,
423 0xd8, 0x20, 0xbb, 0xad, 0x41, 0xe3, 0xaa, 0xe7, 0xa3, 0xc3, 0x32, 0x10,
424 0x9d, 0xfa, 0x37, 0xce, 0x17, 0xd1, 0x29, 0xf9, 0xd4, 0x1d, 0x0d, 0x19,
425 0x02, 0x21, 0x00, 0xc6, 0x20, 0xd4, 0x28, 0xf9, 0x70, 0xb5, 0xb4, 0xff,
426 0x4a, 0x35, 0xba, 0xa0, 0xf2, 0x8e, 0x00, 0xf7, 0xcb, 0x43, 0xaf, 0x2d,
427 0x1f, 0xce, 0x92, 0x05, 0xca, 0x29, 0xfe, 0xd2, 0x8f, 0xd9, 0x31,
428 };
429
430 std::unique_ptr<ProofVerifier> verifier(
431 CryptoTestUtils::RealProofVerifierForTesting());
432
433 const string server_config = "server config bytes";
434 const string hostname = "test.example.com";
435 const uint16_t port = 8443;
436 const string chlo_hash = "chlo_hash nonce bytes";
437 const QuicVersion quic_version = GetParam();
438
439 vector<string> certs(2);
440 certs[0] = LoadTestCert("test_ecc.example.com.crt");
441 certs[1] = LoadTestCert("intermediate.crt");
442
443 // Signatures are nondeterministic, so we test multiple signatures on the
444 // same server_config.
445 vector<string> signatures(3);
446 signatures[0].assign(reinterpret_cast<const char*>(signature_data_0),
447 sizeof(signature_data_0));
448 signatures[1].assign(reinterpret_cast<const char*>(signature_data_1),
449 sizeof(signature_data_1));
450 signatures[2].assign(reinterpret_cast<const char*>(signature_data_2),
451 sizeof(signature_data_2));
452
453 for (size_t i = 0; i < signatures.size(); i++) {
454 const string& signature = signatures[i];
455
456 RunVerification(verifier.get(), hostname, port, server_config, quic_version,
457 chlo_hash, certs, signature, true);
458 RunVerification(verifier.get(), "foo.com", port, server_config,
459 quic_version, chlo_hash, certs, signature, false);
460 RunVerification(verifier.get(), hostname, port,
461 server_config.substr(1, string::npos), quic_version,
462 chlo_hash, certs, signature, false);
463
464 // An ECDSA signature is DER-encoded. Corrupt the last byte so that the
465 // signature can still be DER-decoded correctly.
466 string corrupt_signature = signature;
467 corrupt_signature.back()++;
468 RunVerification(verifier.get(), hostname, port, server_config, quic_version,
469 chlo_hash, certs, corrupt_signature, false);
470
471 // Prepending a "1" makes the DER invalid.
472 const string bad_der_signature1 = "1" + signature;
473 RunVerification(verifier.get(), hostname, port, server_config, quic_version,
474 chlo_hash, certs, bad_der_signature1, false);
475
476 vector<string> wrong_certs;
477 for (size_t i = 1; i < certs.size(); i++) {
478 wrong_certs.push_back(certs[i]);
479 }
480 RunVerification(verifier.get(), hostname, port, server_config, quic_version,
481 chlo_hash, wrong_certs, signature, false);
482 }
483 }
484
485 } // namespace test
486 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/crypto/proof_source.cc ('k') | net/quic/crypto/proof_verifier.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698