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

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

Powered by Google App Engine
This is Rietveld 408576698