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

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

Issue 17385010: OpenSSL/NSS implementation of ProofVerfifier. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merged wtc's changes from TOT Created 7 years, 5 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 | Annotate | Revision Log
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 "base/files/file_path.h"
6 #include "net/base/net_errors.h"
7 #include "net/base/test_completion_callback.h"
8 #include "net/base/test_data_directory.h"
9 #include "net/cert/x509_certificate.h"
5 #include "net/quic/crypto/proof_source.h" 10 #include "net/quic/crypto/proof_source.h"
6 #include "net/quic/crypto/proof_verifier.h" 11 #include "net/quic/crypto/proof_verifier.h"
7 #include "net/quic/test_tools/crypto_test_utils.h" 12 #include "net/quic/test_tools/crypto_test_utils.h"
13 #include "net/test/cert_test_util.h"
8 #include "testing/gtest/include/gtest/gtest.h" 14 #include "testing/gtest/include/gtest/gtest.h"
9 15
10 using std::string; 16 using std::string;
11 using std::vector; 17 using std::vector;
12 18
13 namespace net { 19 namespace net {
14 namespace test { 20 namespace test {
15 21
16 TEST(Proof, Verify) { 22 TEST(Proof, Verify) {
17 // TODO(rtenneti): Enable testing of ProofVerifier. 23 // TODO(rtenneti): Enable testing of ProofVerifier.
18 #if 0 24 #if 0
19 scoped_ptr<ProofSource> source(CryptoTestUtils::ProofSourceForTesting()); 25 scoped_ptr<ProofSource> source(CryptoTestUtils::ProofSourceForTesting());
20 scoped_ptr<ProofVerifier> verifier( 26 scoped_ptr<ProofVerifier> verifier(
21 CryptoTestUtils::ProofVerifierForTesting()); 27 CryptoTestUtils::ProofVerifierForTesting());
22 28
23 const string server_config = "server config bytes"; 29 const string server_config = "server config bytes";
24 const string hostname = "test.example.com"; 30 const string hostname = "test.example.com";
25 const vector<string>* certs; 31 const vector<string>* certs;
26 const vector<string>* first_certs; 32 const vector<string>* first_certs;
27 string error_details, signature, first_signature; 33 string signature, first_signature;
28 34
29 ASSERT_TRUE(source->GetProof(hostname, server_config, &first_certs, 35 ASSERT_TRUE(source->GetProof(hostname, server_config, &first_certs,
30 &first_signature)); 36 &first_signature));
31 ASSERT_TRUE(source->GetProof(hostname, server_config, &certs, &signature)); 37 ASSERT_TRUE(source->GetProof(hostname, server_config, &certs, &signature));
32 38
33 // Check that the proof source is caching correctly: 39 // Check that the proof source is caching correctly:
34 ASSERT_EQ(first_certs, certs); 40 ASSERT_EQ(first_certs, certs);
35 ASSERT_EQ(signature, first_signature); 41 ASSERT_EQ(signature, first_signature);
36 42
37 ASSERT_TRUE(verifier->VerifyProof(hostname, server_config, *certs, signature, 43 int rv;
38 &error_details)); 44 TestCompletionCallback callback;
39 ASSERT_FALSE(verifier->VerifyProof("foo.com", server_config, *certs, 45 rv = verifier->VerifyProof(hostname, server_config, *certs, signature,
40 signature, &error_details)); 46 callback.callback());
41 ASSERT_FALSE( 47 if (rv == ERR_IO_PENDING)
42 verifier->VerifyProof(hostname, server_config.substr(1, string::npos), 48 rv = callback.WaitForResult();
43 *certs, signature, &error_details)); 49 ASSERT_EQ(OK, rv);
50 ASSERT_EQ("", verifier->error_details());
51
52 rv = verifier->VerifyProof("foo.com", server_config, *certs,
53 signature, callback.callback());
54 if (rv == ERR_IO_PENDING)
55 rv = callback.WaitForResult();
56 ASSERT_EQ(ERR_FAILED, rv);
57 ASSERT_NE("", verifier->error_details());
58
59 rv = verifier->VerifyProof(hostname, server_config.substr(1, string::npos),
60 *certs, signature, callback.callback());
61 if (rv == ERR_IO_PENDING)
62 rv = callback.WaitForResult();
63 ASSERT_EQ(ERR_FAILED, rv);
64 ASSERT_NE("", verifier->error_details());
65
44 const string corrupt_signature = "1" + signature; 66 const string corrupt_signature = "1" + signature;
45 ASSERT_FALSE(verifier->VerifyProof(hostname, server_config, *certs, 67 rv = verifier->VerifyProof(hostname, server_config, *certs,
46 corrupt_signature, &error_details)); 68 corrupt_signature, callback.callback());
69 if (rv == ERR_IO_PENDING)
70 rv = callback.WaitForResult();
71 ASSERT_EQ(ERR_FAILED, rv);
72 ASSERT_NE("", verifier->error_details());
47 73
48 vector<string> wrong_certs; 74 vector<string> wrong_certs;
49 for (size_t i = 1; i < certs->size(); i++) { 75 for (size_t i = 1; i < certs->size(); i++) {
50 wrong_certs.push_back((*certs)[i]); 76 wrong_certs.push_back((*certs)[i]);
51 } 77 }
52 ASSERT_FALSE(verifier->VerifyProof("foo.com", server_config, wrong_certs, 78 rv = verifier->VerifyProof("foo.com", server_config, wrong_certs,
53 signature, &error_details)); 79 signature, callback.callback());
80 if (rv == ERR_IO_PENDING)
81 rv = callback.WaitForResult();
82 ASSERT_EQ(ERR_FAILED, rv);
83 ASSERT_NE("", verifier->error_details());
54 #endif // 0 84 #endif // 0
55 } 85 }
56 86
87 static string PEMCertFileToDER(const string& file_name) {
88 base::FilePath certs_dir = GetTestCertsDirectory();
89 scoped_refptr<X509Certificate> cert =
90 ImportCertFromFile(certs_dir, file_name);
91 CHECK_NE(static_cast<X509Certificate*>(NULL), cert);
92
93 string der_bytes;
94 CHECK(X509Certificate::GetDEREncoded(cert->os_cert_handle(), &der_bytes));
95 return der_bytes;
96 }
97
98 // A known answer test that allows us to test ProofVerifier without a working
99 // ProofSource.
100 TEST(Proof, VerifyRSAKnownAnswerTest) {
101 // These sample signatures were generated by running the Proof.Verify test
102 // and dumping the bytes of the |signature| output of ProofSource::GetProof().
103 #if 0
104 // sLen = hLen
105 static const unsigned char signature_data_0[] = {
106 0x9e, 0xe6, 0x74, 0x3b, 0x8f, 0xb8, 0x66, 0x77, 0x57, 0x09,
107 0x8a, 0x04, 0xe9, 0xf0, 0x7c, 0x91, 0xa9, 0x5c, 0xe9, 0xdf,
108 0x12, 0x4d, 0x23, 0x82, 0x8c, 0x29, 0x72, 0x7f, 0xc2, 0x20,
109 0xa7, 0xb3, 0xe5, 0xbc, 0xcf, 0x3c, 0x0d, 0x8f, 0xae, 0x46,
110 0x6a, 0xb9, 0xee, 0x0c, 0xe1, 0x13, 0x21, 0xc0, 0x7e, 0x45,
111 0x24, 0x24, 0x4b, 0x72, 0x43, 0x5e, 0xc4, 0x0d, 0xdf, 0x6c,
112 0xd8, 0xaa, 0x35, 0x97, 0x05, 0x40, 0x76, 0xd3, 0x2c, 0xee,
113 0x82, 0x16, 0x6a, 0x43, 0xf9, 0xa2, 0xd0, 0x41, 0x3c, 0xed,
114 0x3f, 0x40, 0x10, 0x95, 0xc7, 0xa9, 0x1f, 0x04, 0xdb, 0xd5,
115 0x98, 0x9f, 0xe2, 0xbf, 0x77, 0x3d, 0xc9, 0x9a, 0xaf, 0xf7,
116 0xef, 0x63, 0x0b, 0x7d, 0xc8, 0x37, 0xda, 0x37, 0x23, 0x88,
117 0x78, 0xc8, 0x8b, 0xf5, 0xb9, 0x36, 0x5d, 0x72, 0x1f, 0xfc,
118 0x14, 0xff, 0xa7, 0x81, 0x27, 0x49, 0xae, 0xe1,
119 };
120 static const unsigned char signature_data_1[] = {
121 0x5e, 0xc2, 0xab, 0x6b, 0x16, 0xe6, 0x55, 0xf3, 0x16, 0x46,
122 0x35, 0xdc, 0xcc, 0xde, 0xd0, 0xbd, 0x6c, 0x66, 0xb2, 0x3d,
123 0xd3, 0x14, 0x78, 0xed, 0x47, 0x55, 0xfb, 0xdb, 0xe1, 0x7d,
124 0xbf, 0x31, 0xf6, 0xf4, 0x10, 0x4c, 0x8d, 0x22, 0x17, 0xaa,
125 0xe1, 0x85, 0xc7, 0x96, 0x4c, 0x42, 0xfb, 0xf4, 0x63, 0x53,
126 0x8a, 0x79, 0x01, 0x63, 0x48, 0xa8, 0x3a, 0xbc, 0xc9, 0xd2,
127 0xf5, 0xec, 0xe9, 0x09, 0x71, 0xaf, 0xce, 0x34, 0x56, 0xe5,
128 0x00, 0xbe, 0xee, 0x3c, 0x1c, 0xc4, 0xa0, 0x07, 0xd5, 0x77,
129 0xb8, 0x83, 0x57, 0x7d, 0x1a, 0xc9, 0xd0, 0xc0, 0x59, 0x9a,
130 0x88, 0x19, 0x3f, 0xb9, 0xf0, 0x45, 0x37, 0xc3, 0x00, 0x8b,
131 0xb3, 0x89, 0xf4, 0x89, 0x07, 0xa9, 0xc3, 0x26, 0xbf, 0x81,
132 0xaf, 0x6b, 0x47, 0xbc, 0x16, 0x55, 0x37, 0x0a, 0xbe, 0x0e,
133 0xc5, 0x75, 0x3f, 0x3d, 0x8e, 0xe8, 0x44, 0xe3,
134 };
135 static const unsigned char signature_data_2[] = {
136 0x8e, 0x5c, 0x78, 0x63, 0x74, 0x99, 0x2e, 0x96, 0xc0, 0x14,
137 0x8d, 0xb5, 0x13, 0x74, 0xa3, 0xa4, 0xe0, 0x43, 0x3e, 0x85,
138 0xba, 0x8f, 0x3c, 0x5e, 0x14, 0x64, 0x0e, 0x5e, 0xff, 0x89,
139 0x88, 0x8a, 0x65, 0xe2, 0xa2, 0x79, 0xe4, 0xe9, 0x3a, 0x7f,
140 0xf6, 0x9d, 0x3d, 0xe2, 0xb0, 0x8a, 0x35, 0x55, 0xed, 0x21,
141 0xee, 0x20, 0xd8, 0x8a, 0x60, 0x47, 0xca, 0x52, 0x54, 0x91,
142 0x99, 0x69, 0x8d, 0x16, 0x34, 0x69, 0xe1, 0x46, 0x56, 0x67,
143 0x5f, 0x50, 0xf0, 0x94, 0xe7, 0x8b, 0xf2, 0x6a, 0x73, 0x0f,
144 0x30, 0x30, 0xde, 0x59, 0xdc, 0xc7, 0xfe, 0xb6, 0x83, 0xe1,
145 0x86, 0x1d, 0x88, 0xd3, 0x2f, 0x2f, 0x74, 0x68, 0xbd, 0x6c,
146 0xd1, 0x46, 0x76, 0x06, 0xa9, 0xd4, 0x03, 0x3f, 0xda, 0x7d,
147 0xa7, 0xff, 0x48, 0xe4, 0xb4, 0x42, 0x06, 0xac, 0x19, 0x12,
148 0xe6, 0x05, 0xae, 0xbe, 0x29, 0x94, 0x8f, 0x99,
149 };
150 #else
151 // sLen = special value -2 used by OpenSSL.
152 static const unsigned char signature_data_0[] = {
153 0x4c, 0x68, 0x3c, 0xc2, 0x1f, 0x31, 0x73, 0xa5, 0x29, 0xd3,
154 0x56, 0x75, 0xb1, 0xbf, 0xbd, 0x31, 0x17, 0xfb, 0x2e, 0x24,
155 0xb3, 0xc4, 0x0d, 0xfa, 0x56, 0xb8, 0x65, 0x94, 0x12, 0x38,
156 0x6e, 0xff, 0xb3, 0x10, 0x2e, 0xf8, 0x5c, 0xc1, 0x21, 0x9d,
157 0x29, 0x0c, 0x3a, 0x0a, 0x1a, 0xbf, 0x6b, 0x1c, 0x63, 0x77,
158 0xf7, 0x86, 0xd3, 0xa4, 0x36, 0xf2, 0xb1, 0x6f, 0xac, 0xc3,
159 0x23, 0x8d, 0xda, 0xe6, 0xd5, 0x83, 0xba, 0xdf, 0x28, 0x3e,
160 0x7f, 0x4e, 0x79, 0xfc, 0xba, 0xdb, 0xf7, 0xd0, 0x4b, 0xad,
161 0x79, 0xd0, 0xeb, 0xcf, 0xfa, 0x6e, 0x84, 0x44, 0x7a, 0x26,
162 0xb1, 0x29, 0xa3, 0x08, 0xa8, 0x63, 0xfd, 0xed, 0x85, 0xff,
163 0x9a, 0xe6, 0x79, 0x8b, 0xb6, 0x81, 0x13, 0x2c, 0xde, 0xe2,
164 0xd8, 0x31, 0x29, 0xa4, 0xe0, 0x1b, 0x75, 0x2d, 0x8a, 0xf8,
165 0x27, 0x55, 0xbc, 0xc7, 0x3b, 0x1e, 0xc1, 0x42,
166 };
167 static const unsigned char signature_data_1[] = {
168 0xbb, 0xd1, 0x17, 0x43, 0xf3, 0x42, 0x16, 0xe9, 0xf9, 0x76,
169 0xe6, 0xe3, 0xaa, 0x50, 0x47, 0x5f, 0x93, 0xb6, 0x7d, 0x35,
170 0x03, 0x49, 0x0a, 0x07, 0x61, 0xd5, 0xf1, 0x9c, 0x6b, 0xaf,
171 0xaa, 0xd7, 0x64, 0xe4, 0x0a, 0x0c, 0xab, 0x97, 0xfb, 0x4e,
172 0x5c, 0x14, 0x08, 0xf6, 0xb9, 0xa9, 0x1d, 0xa9, 0xf8, 0x6d,
173 0xb0, 0x2b, 0x2a, 0x0e, 0xc4, 0xd0, 0xd2, 0xe9, 0x96, 0x4f,
174 0x44, 0x70, 0x90, 0x46, 0xb9, 0xd5, 0x89, 0x72, 0xb9, 0xa8,
175 0xe4, 0xfb, 0x88, 0xbc, 0x69, 0x7f, 0xc9, 0xdc, 0x84, 0x87,
176 0x18, 0x21, 0x9b, 0xde, 0x22, 0x33, 0xde, 0x16, 0x3f, 0xe6,
177 0xfd, 0x27, 0x56, 0xd3, 0xa4, 0x97, 0x91, 0x65, 0x1a, 0xe7,
178 0x5e, 0x80, 0x9a, 0xbf, 0xbf, 0x1a, 0x29, 0x8a, 0xbe, 0xa2,
179 0x8c, 0x9c, 0x23, 0xf4, 0xcb, 0xba, 0x79, 0x31, 0x28, 0xab,
180 0x77, 0x94, 0x92, 0xb2, 0xc2, 0x35, 0xb2, 0xfa,
181 };
182 static const unsigned char signature_data_2[] = {
183 0x7e, 0x17, 0x01, 0xcb, 0x76, 0x9e, 0x9f, 0xce, 0xeb, 0x66,
184 0x3e, 0xaa, 0xc9, 0x36, 0x5b, 0x7e, 0x48, 0x25, 0x99, 0xf8,
185 0x0d, 0xe1, 0xa8, 0x48, 0x93, 0x3c, 0xe8, 0x97, 0x2e, 0x98,
186 0xd6, 0x73, 0x0f, 0xd0, 0x74, 0x9c, 0x17, 0xef, 0xee, 0xf8,
187 0x0e, 0x2a, 0x27, 0x3f, 0xc6, 0x55, 0xc6, 0xb9, 0xfe, 0x17,
188 0xcc, 0xeb, 0x5d, 0xa1, 0xdc, 0xbd, 0x64, 0xd9, 0x5e, 0xec,
189 0x57, 0x9d, 0xc3, 0xdc, 0x11, 0xbf, 0x23, 0x02, 0x58, 0xc4,
190 0xf1, 0x18, 0xc1, 0x6f, 0x3f, 0xef, 0x18, 0x4d, 0xa6, 0x1e,
191 0xe8, 0x25, 0x32, 0x8f, 0x92, 0x1e, 0xad, 0xbc, 0xbe, 0xde,
192 0x83, 0x2a, 0x92, 0xd5, 0x59, 0x6f, 0xe4, 0x95, 0x6f, 0xe6,
193 0xb1, 0xf9, 0xaf, 0x3f, 0xdb, 0x69, 0x6f, 0xae, 0xa6, 0x36,
194 0xd2, 0x50, 0x81, 0x78, 0x41, 0x13, 0x2c, 0x65, 0x9c, 0x9e,
195 0xf4, 0xd2, 0xd5, 0x58, 0x5b, 0x8b, 0x87, 0xcf,
196 };
197 #endif
198
199 scoped_ptr<ProofVerifier> verifier(
200 CryptoTestUtils::ProofVerifierForTesting());
201
202 const string server_config = "server config bytes";
203 const string hostname = "test.example.com";
204
205 vector<string> certs(2);
206 certs[0] = PEMCertFileToDER("test.example.com.crt");
207 certs[1] = PEMCertFileToDER("intermediate.crt");
208
209 // Signatures are nondeterministic, so we test multiple signatures on the
210 // same server_config.
211 vector<string> signatures(3);
212 signatures[0].assign(reinterpret_cast<const char*>(signature_data_0),
213 sizeof(signature_data_0));
214 signatures[1].assign(reinterpret_cast<const char*>(signature_data_1),
215 sizeof(signature_data_1));
216 signatures[2].assign(reinterpret_cast<const char*>(signature_data_2),
217 sizeof(signature_data_2));
218
219 for (size_t i = 0; i < signatures.size(); i++) {
220 const string& signature = signatures[i];
221 int rv;
222 TestCompletionCallback callback;
223 rv = verifier->VerifyProof(hostname, server_config, certs, signature,
224 callback.callback());
225 if (rv == ERR_IO_PENDING)
226 rv = callback.WaitForResult();
227 ASSERT_EQ(OK, rv);
228 ASSERT_EQ("", verifier->error_details());
229 rv = verifier->VerifyProof("foo.com", server_config, certs, signature,
230 callback.callback());
231 if (rv == ERR_IO_PENDING)
232 rv = callback.WaitForResult();
233 ASSERT_EQ(ERR_FAILED, rv);
234 ASSERT_NE("", verifier->error_details());
235 rv = verifier->VerifyProof(hostname, server_config.substr(1, string::npos),
236 certs, signature, callback.callback());
237 if (rv == ERR_IO_PENDING)
238 rv = callback.WaitForResult();
239 ASSERT_EQ(ERR_FAILED, rv);
240 ASSERT_NE("", verifier->error_details());
241
242 const string corrupt_signature = "1" + signature;
243 rv = verifier->VerifyProof(hostname, server_config, certs,
244 corrupt_signature, callback.callback());
245 if (rv == ERR_IO_PENDING)
246 rv = callback.WaitForResult();
247 ASSERT_EQ(ERR_FAILED, rv);
248 ASSERT_NE("", verifier->error_details());
249
250 vector<string> wrong_certs;
251 for (size_t i = 1; i < certs.size(); i++) {
252 wrong_certs.push_back(certs[i]);
253 }
254 rv = verifier->VerifyProof("foo.com", server_config, wrong_certs, signature,
255 callback.callback());
256 if (rv == ERR_IO_PENDING)
257 rv = callback.WaitForResult();
258 ASSERT_EQ(ERR_FAILED, rv);
259 ASSERT_NE("", verifier->error_details());
260 }
261 }
262
263 #if 0
264 // TODO(rtenneti): enable ECDSA based tests.
265 // A known answer test that allows us to test ProofVerifier without a working
266 // ProofSource.
267 TEST(Proof, VerifyECDSAKnownAnswerTest) {
268 // These sample signatures were generated by running the Proof.Verify test
269 // (modified to use ECDSA for signing proofs) and dumping the bytes of the
270 // |signature| output of ProofSource::GetProof().
271 static const unsigned char signature_data_0[] = {
272 0x30, 0x45, 0x02, 0x20, 0x15, 0xb7, 0x9f, 0xe3, 0xd9, 0x7a,
273 0x3c, 0x3b, 0x18, 0xb0, 0xdb, 0x60, 0x23, 0x56, 0xa0, 0x06,
274 0x4e, 0x70, 0xa3, 0xf7, 0x4b, 0xe5, 0x0d, 0x69, 0xf0, 0x35,
275 0x8c, 0xae, 0xb5, 0x54, 0x32, 0xe9, 0x02, 0x21, 0x00, 0xf7,
276 0xe3, 0x06, 0x99, 0x16, 0x56, 0x7e, 0xab, 0x33, 0x53, 0x0d,
277 0xde, 0xbe, 0xef, 0x6d, 0xb0, 0xc7, 0xa6, 0x63, 0xaf, 0x8d,
278 0xab, 0x34, 0xa9, 0xc0, 0x63, 0x88, 0x47, 0x17, 0x4c, 0x4c,
279 0x04,
280 };
281 static const unsigned char signature_data_1[] = {
282 0x30, 0x44, 0x02, 0x20, 0x69, 0x60, 0x55, 0xbb, 0x11, 0x93,
283 0x6a, 0xdc, 0x9b, 0x61, 0x2c, 0x60, 0x19, 0xbc, 0x15, 0x55,
284 0xcf, 0xf2, 0x8e, 0x2e, 0x27, 0x0b, 0x69, 0xef, 0x33, 0x25,
285 0x1e, 0x5d, 0x8c, 0x00, 0x11, 0xef, 0x02, 0x20, 0x0c, 0x26,
286 0xfe, 0x0b, 0x06, 0x8f, 0xe8, 0xe2, 0x02, 0x63, 0xe5, 0x43,
287 0x0d, 0xc9, 0x80, 0x4d, 0xe9, 0x6f, 0x6e, 0x18, 0xdb, 0xb0,
288 0x04, 0x2a, 0x45, 0x37, 0x1a, 0x60, 0x0e, 0xc6, 0xc4, 0x8f,
289 };
290 static const unsigned char signature_data_2[] = {
291 0x30, 0x45, 0x02, 0x21, 0x00, 0xd5, 0x43, 0x36, 0x60, 0x50,
292 0xce, 0xe0, 0x00, 0x51, 0x02, 0x84, 0x95, 0x51, 0x47, 0xaf,
293 0xe4, 0xf9, 0xe1, 0x23, 0xae, 0x21, 0xb4, 0x98, 0xd1, 0xa3,
294 0x5f, 0x3b, 0xf3, 0x6a, 0x65, 0x44, 0x6b, 0x02, 0x20, 0x30,
295 0x7e, 0xb4, 0xea, 0xf0, 0xda, 0xdb, 0xbd, 0x38, 0xb9, 0x7a,
296 0x5d, 0x12, 0x04, 0x0e, 0xc2, 0xf0, 0xb1, 0x0e, 0x25, 0xf8,
297 0x0a, 0x27, 0xa3, 0x16, 0x94, 0xac, 0x1e, 0xb8, 0x6e, 0x00,
298 0x05,
299 };
300
301 scoped_ptr<ProofVerifier> verifier(
302 CryptoTestUtils::ProofVerifierForTesting());
303
304 const string server_config = "server config bytes";
305 const string hostname = "test.example.com";
306
307 vector<string> certs(2);
308 certs[0] = PEMCertFileToDER("test_ecc.example.com.crt");
309 certs[1] = PEMCertFileToDER("intermediate.crt");
310
311 // Signatures are nondeterministic, so we test multiple signatures on the
312 // same server_config.
313 vector<string> signatures(3);
314 signatures[0].assign(reinterpret_cast<const char*>(signature_data_0),
315 sizeof(signature_data_0));
316 signatures[1].assign(reinterpret_cast<const char*>(signature_data_1),
317 sizeof(signature_data_1));
318 signatures[2].assign(reinterpret_cast<const char*>(signature_data_2),
319 sizeof(signature_data_2));
320
321 for (size_t i = 0; i < signatures.size(); i++) {
322 const string& signature = signatures[i];
323 TestCompletionCallback callback;
324 rv = verifier->VerifyProof(hostname, server_config, certs, signature,
325 callback.callback());
326 if (rv == ERR_IO_PENDING)
327 rv = callback.WaitForResult();
328 ASSERT_EQ(OK, rv);
329 ASSERT_EQ("", verifier->error_details());
330
331 rv = verifier->VerifyProof("foo.com", server_config, certs,
332 signature, callback.callback());
333 if (rv == ERR_IO_PENDING)
334 rv = callback.WaitForResult();
335 ASSERT_EQ(ERR_FAILED, rv);
336 ASSERT_NE("", verifier->error_details());
337
338 rv = verifier->VerifyProof(hostname, server_config.substr(1, string::npos),
339 certs, signature, callback.callback());
340 if (rv == ERR_IO_PENDING)
341 rv = callback.WaitForResult();
342 ASSERT_EQ(ERR_FAILED, rv);
343 ASSERT_NE("", verifier->error_details());
344
345 const string corrupt_signature = "1" + signature;
346 rv = verifier->VerifyProof(hostname, server_config, certs,
347 corrupt_signature, callback.callback());
348 if (rv == ERR_IO_PENDING)
349 rv = callback.WaitForResult();
350 ASSERT_EQ(ERR_FAILED, rv);
351 ASSERT_NE("", verifier->error_details());
352
353 vector<string> wrong_certs;
354 for (size_t i = 1; i < certs.size(); i++) {
355 wrong_certs.push_back(certs[i]);
356 }
357 rv = verifier->VerifyProof("foo.com", server_config, wrong_certs, signature,
358 callback.callback());
359 if (rv == ERR_IO_PENDING)
360 rv = callback.WaitForResult();
361 ASSERT_EQ(ERR_FAILED, rv);
362 ASSERT_NE("", verifier->error_details());
363 }
364 }
365 #endif
366
57 } // namespace test 367 } // namespace test
58 } // namespace net 368 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698