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

Side by Side Diff: crypto/signature_verifier_unittest.cc

Issue 1679873005: Switch SignatureVerifier to taking an algorithm enum. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix iOS build Created 4 years, 9 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 | « crypto/signature_verifier_openssl.cc ('k') | extensions/browser/verified_contents.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "crypto/signature_verifier.h" 5 #include "crypto/signature_verifier.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include "base/macros.h" 10 #include "base/macros.h"
11 #include "base/numerics/safe_conversions.h" 11 #include "base/numerics/safe_conversions.h"
12 #include "testing/gtest/include/gtest/gtest.h" 12 #include "testing/gtest/include/gtest/gtest.h"
13 13
14 TEST(SignatureVerifierTest, BasicTest) { 14 TEST(SignatureVerifierTest, BasicTest) {
15 // The input data in this test comes from real certificates. 15 // The input data in this test comes from real certificates.
16 // 16 //
17 // tbs_certificate ("to-be-signed certificate", the part of a certificate 17 // tbs_certificate ("to-be-signed certificate", the part of a certificate that
18 // that is signed), signature_algorithm, and algorithm come from the 18 // is signed), signature, and algorithm come from the certificate of
19 // certificate of bugs.webkit.org. 19 // bugs.webkit.org.
20 // 20 //
21 // public_key_info comes from the certificate of the issuer, Go Daddy Secure 21 // public_key_info comes from the certificate of the issuer, Go Daddy Secure
22 // Certification Authority. 22 // Certification Authority.
23 // 23 //
24 // The bytes in the array initializers are formatted to expose the DER 24 // The bytes in the array initializers are formatted to expose the DER
25 // encoding of the ASN.1 structures. 25 // encoding of the ASN.1 structures.
26 26
27 // The data that is signed is the following ASN.1 structure: 27 // The data that is signed is the following ASN.1 structure:
28 // TBSCertificate ::= SEQUENCE { 28 // TBSCertificate ::= SEQUENCE {
29 // ... -- omitted, not important 29 // ... -- omitted, not important
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x48, 109 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x48,
110 0xdf, 0x60, 0x32, 0xcc, 0x89, 0x01, 0xb6, 0xdc, 0x2f, 0xe3, 0x73, 0xb5, 110 0xdf, 0x60, 0x32, 0xcc, 0x89, 0x01, 0xb6, 0xdc, 0x2f, 0xe3, 0x73, 0xb5,
111 0x9c, 0x16, 0x58, 0x32, 0x68, 0xa9, 0xc3, 0x30, 0x1f, 0x06, 0x03, 0x55, 111 0x9c, 0x16, 0x58, 0x32, 0x68, 0xa9, 0xc3, 0x30, 0x1f, 0x06, 0x03, 0x55,
112 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xfd, 0xac, 0x61, 0x32, 112 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xfd, 0xac, 0x61, 0x32,
113 0x93, 0x6c, 0x45, 0xd6, 0xe2, 0xee, 0x85, 0x5f, 0x9a, 0xba, 0xe7, 0x76, 113 0x93, 0x6c, 0x45, 0xd6, 0xe2, 0xee, 0x85, 0x5f, 0x9a, 0xba, 0xe7, 0x76,
114 0x99, 0x68, 0xcc, 0xe7, 0x30, 0x23, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04, 114 0x99, 0x68, 0xcc, 0xe7, 0x30, 0x23, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04,
115 0x1c, 0x30, 0x1a, 0x82, 0x0c, 0x2a, 0x2e, 0x77, 0x65, 0x62, 0x6b, 0x69, 115 0x1c, 0x30, 0x1a, 0x82, 0x0c, 0x2a, 0x2e, 0x77, 0x65, 0x62, 0x6b, 0x69,
116 0x74, 0x2e, 0x6f, 0x72, 0x67, 0x82, 0x0a, 0x77, 0x65, 0x62, 0x6b, 0x69, 116 0x74, 0x2e, 0x6f, 0x72, 0x67, 0x82, 0x0a, 0x77, 0x65, 0x62, 0x6b, 0x69,
117 0x74, 0x2e, 0x6f, 0x72, 0x67}; 117 0x74, 0x2e, 0x6f, 0x72, 0x67};
118 118
119 // The signature algorithm is specified as the following ASN.1 structure:
120 // AlgorithmIdentifier ::= SEQUENCE {
121 // algorithm OBJECT IDENTIFIER,
122 // parameters ANY DEFINED BY algorithm OPTIONAL }
123 //
124 const uint8_t signature_algorithm[15] = {
125 0x30, 0x0d, // a SEQUENCE of length 13 (0xd)
126 0x06, 0x09, // an OBJECT IDENTIFIER of length 9
127 // 1.2.840.113549.1.1.5 - sha1WithRSAEncryption
128 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05,
129 0x00, // a NULL of length 0
130 };
131
132 // RSA signature, a big integer in the big-endian byte order. 119 // RSA signature, a big integer in the big-endian byte order.
133 const uint8_t signature[256] = { 120 const uint8_t signature[256] = {
134 0x1e, 0x6a, 0xe7, 0xe0, 0x4f, 0xe7, 0x4d, 0xd0, 0x69, 0x7c, 0xf8, 0x8f, 121 0x1e, 0x6a, 0xe7, 0xe0, 0x4f, 0xe7, 0x4d, 0xd0, 0x69, 0x7c, 0xf8, 0x8f,
135 0x99, 0xb4, 0x18, 0x95, 0x36, 0x24, 0x0f, 0x0e, 0xa3, 0xea, 0x34, 0x37, 122 0x99, 0xb4, 0x18, 0x95, 0x36, 0x24, 0x0f, 0x0e, 0xa3, 0xea, 0x34, 0x37,
136 0xf4, 0x7d, 0xd5, 0x92, 0x35, 0x53, 0x72, 0x76, 0x3f, 0x69, 0xf0, 0x82, 123 0xf4, 0x7d, 0xd5, 0x92, 0x35, 0x53, 0x72, 0x76, 0x3f, 0x69, 0xf0, 0x82,
137 0x56, 0xe3, 0x94, 0x7a, 0x1d, 0x1a, 0x81, 0xaf, 0x9f, 0xc7, 0x43, 0x01, 124 0x56, 0xe3, 0x94, 0x7a, 0x1d, 0x1a, 0x81, 0xaf, 0x9f, 0xc7, 0x43, 0x01,
138 0x64, 0xd3, 0x7c, 0x0d, 0xc8, 0x11, 0x4e, 0x4a, 0xe6, 0x1a, 0xc3, 0x01, 125 0x64, 0xd3, 0x7c, 0x0d, 0xc8, 0x11, 0x4e, 0x4a, 0xe6, 0x1a, 0xc3, 0x01,
139 0x74, 0xe8, 0x35, 0x87, 0x5c, 0x61, 0xaa, 0x8a, 0x46, 0x06, 0xbe, 0x98, 126 0x74, 0xe8, 0x35, 0x87, 0x5c, 0x61, 0xaa, 0x8a, 0x46, 0x06, 0xbe, 0x98,
140 0x95, 0x24, 0x9e, 0x01, 0xe3, 0xe6, 0xa0, 0x98, 0xee, 0x36, 0x44, 0x56, 127 0x95, 0x24, 0x9e, 0x01, 0xe3, 0xe6, 0xa0, 0x98, 0xee, 0x36, 0x44, 0x56,
141 0x8d, 0x23, 0x9c, 0x65, 0xea, 0x55, 0x6a, 0xdf, 0x66, 0xee, 0x45, 0xe8, 128 0x8d, 0x23, 0x9c, 0x65, 0xea, 0x55, 0x6a, 0xdf, 0x66, 0xee, 0x45, 0xe8,
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
195 0xa3, 0x3f, 0x84, 0x0d, 0x4f, 182 0xa3, 0x3f, 0x84, 0x0d, 0x4f,
196 // public exponent 183 // public exponent
197 0x02, 0x03, // an INTEGER of length 3 184 0x02, 0x03, // an INTEGER of length 3
198 0x01, 0x00, 0x01}; 185 0x01, 0x00, 0x01};
199 186
200 // We use the signature verifier to perform four signature verification 187 // We use the signature verifier to perform four signature verification
201 // tests. 188 // tests.
202 crypto::SignatureVerifier verifier; 189 crypto::SignatureVerifier verifier;
203 bool ok; 190 bool ok;
204 191
205 // Test 1: feed all of the data to the verifier at once (a single 192 // Test 1: feed all of the data to the verifier at once (a single
206 // VerifyUpdate call). 193 // VerifyUpdate call).
207 ok = verifier.VerifyInit(signature_algorithm, 194 ok = verifier.VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA1, signature,
208 sizeof(signature_algorithm), 195 sizeof(signature), public_key_info,
209 signature, sizeof(signature), 196 sizeof(public_key_info));
210 public_key_info, sizeof(public_key_info));
211 EXPECT_TRUE(ok); 197 EXPECT_TRUE(ok);
212 verifier.VerifyUpdate(tbs_certificate, sizeof(tbs_certificate)); 198 verifier.VerifyUpdate(tbs_certificate, sizeof(tbs_certificate));
213 ok = verifier.VerifyFinal(); 199 ok = verifier.VerifyFinal();
214 EXPECT_TRUE(ok); 200 EXPECT_TRUE(ok);
215 201
216 // Test 2: feed the data to the verifier in three parts (three VerifyUpdate 202 // Test 2: feed the data to the verifier in three parts (three VerifyUpdate
217 // calls). 203 // calls).
218 ok = verifier.VerifyInit(signature_algorithm, 204 ok = verifier.VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA1, signature,
219 sizeof(signature_algorithm), 205 sizeof(signature), public_key_info,
220 signature, sizeof(signature), 206 sizeof(public_key_info));
221 public_key_info, sizeof(public_key_info));
222 EXPECT_TRUE(ok); 207 EXPECT_TRUE(ok);
223 verifier.VerifyUpdate(tbs_certificate, 256); 208 verifier.VerifyUpdate(tbs_certificate, 256);
224 verifier.VerifyUpdate(tbs_certificate + 256, 256); 209 verifier.VerifyUpdate(tbs_certificate + 256, 256);
225 verifier.VerifyUpdate(tbs_certificate + 512, sizeof(tbs_certificate) - 512); 210 verifier.VerifyUpdate(tbs_certificate + 512, sizeof(tbs_certificate) - 512);
226 ok = verifier.VerifyFinal(); 211 ok = verifier.VerifyFinal();
227 EXPECT_TRUE(ok); 212 EXPECT_TRUE(ok);
228 213
229 // Test 3: verify the signature with incorrect data. 214 // Test 3: verify the signature with incorrect data.
230 uint8_t bad_tbs_certificate[sizeof(tbs_certificate)]; 215 uint8_t bad_tbs_certificate[sizeof(tbs_certificate)];
231 memcpy(bad_tbs_certificate, tbs_certificate, sizeof(tbs_certificate)); 216 memcpy(bad_tbs_certificate, tbs_certificate, sizeof(tbs_certificate));
232 bad_tbs_certificate[10] += 1; // Corrupt one byte of the data. 217 bad_tbs_certificate[10] += 1; // Corrupt one byte of the data.
233 ok = verifier.VerifyInit(signature_algorithm, 218 ok = verifier.VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA1, signature,
234 sizeof(signature_algorithm), 219 sizeof(signature), public_key_info,
235 signature, sizeof(signature), 220 sizeof(public_key_info));
236 public_key_info, sizeof(public_key_info));
237 EXPECT_TRUE(ok); 221 EXPECT_TRUE(ok);
238 verifier.VerifyUpdate(bad_tbs_certificate, sizeof(bad_tbs_certificate)); 222 verifier.VerifyUpdate(bad_tbs_certificate, sizeof(bad_tbs_certificate));
239 ok = verifier.VerifyFinal(); 223 ok = verifier.VerifyFinal();
240 EXPECT_FALSE(ok); 224 EXPECT_FALSE(ok);
241 225
242 // Test 4: verify a bad signature. 226 // Test 4: verify a bad signature.
243 uint8_t bad_signature[sizeof(signature)]; 227 uint8_t bad_signature[sizeof(signature)];
244 memcpy(bad_signature, signature, sizeof(signature)); 228 memcpy(bad_signature, signature, sizeof(signature));
245 bad_signature[10] += 1; // Corrupt one byte of the signature. 229 bad_signature[10] += 1; // Corrupt one byte of the signature.
246 ok = verifier.VerifyInit(signature_algorithm, 230 ok = verifier.VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA1,
247 sizeof(signature_algorithm),
248 bad_signature, sizeof(bad_signature), 231 bad_signature, sizeof(bad_signature),
249 public_key_info, sizeof(public_key_info)); 232 public_key_info, sizeof(public_key_info));
250 233
251 // A crypto library (e.g., NSS) may detect that the signature is corrupted 234 // A crypto library (e.g., NSS) may detect that the signature is corrupted
252 // and cause VerifyInit to return false, so it is fine for 'ok' to be false. 235 // and cause VerifyInit to return false, so it is fine for 'ok' to be false.
253 if (ok) { 236 if (ok) {
254 verifier.VerifyUpdate(tbs_certificate, sizeof(tbs_certificate)); 237 verifier.VerifyUpdate(tbs_certificate, sizeof(tbs_certificate));
255 ok = verifier.VerifyFinal(); 238 ok = verifier.VerifyFinal();
256 EXPECT_FALSE(ok); 239 EXPECT_FALSE(ok);
257 } 240 }
258 241
259 // Test 5: import an invalid key. 242 // Test 5: import an invalid key.
260 uint8_t bad_public_key_info[sizeof(public_key_info)]; 243 uint8_t bad_public_key_info[sizeof(public_key_info)];
261 memcpy(bad_public_key_info, public_key_info, sizeof(public_key_info)); 244 memcpy(bad_public_key_info, public_key_info, sizeof(public_key_info));
262 bad_public_key_info[0] += 1; // Corrupt part of the SPKI syntax. 245 bad_public_key_info[0] += 1; // Corrupt part of the SPKI syntax.
263 ok = verifier.VerifyInit(signature_algorithm, 246 ok = verifier.VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA1, signature,
264 sizeof(signature_algorithm), 247 sizeof(signature), bad_public_key_info,
265 signature, sizeof(signature), 248 sizeof(bad_public_key_info));
266 bad_public_key_info, sizeof(bad_public_key_info));
267 EXPECT_FALSE(ok); 249 EXPECT_FALSE(ok);
268 250
269 // Test 6: import a key with extra data. 251 // Test 6: import a key with extra data.
270 uint8_t long_public_key_info[sizeof(public_key_info) + 5]; 252 uint8_t long_public_key_info[sizeof(public_key_info) + 5];
271 memset(long_public_key_info, 0, sizeof(long_public_key_info)); 253 memset(long_public_key_info, 0, sizeof(long_public_key_info));
272 memcpy(long_public_key_info, public_key_info, sizeof(public_key_info)); 254 memcpy(long_public_key_info, public_key_info, sizeof(public_key_info));
273 ok = verifier.VerifyInit(signature_algorithm, 255 ok = verifier.VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA1, signature,
274 sizeof(signature_algorithm), 256 sizeof(signature), long_public_key_info,
275 signature, sizeof(signature), 257 sizeof(long_public_key_info));
276 long_public_key_info, sizeof(long_public_key_info));
277 EXPECT_FALSE(ok); 258 EXPECT_FALSE(ok);
278 } 259 }
279 260
280 ////////////////////////////////////////////////////////////////////// 261 //////////////////////////////////////////////////////////////////////
281 // 262 //
282 // RSA-PSS signature verification known answer test 263 // RSA-PSS signature verification known answer test
283 // 264 //
284 ////////////////////////////////////////////////////////////////////// 265 //////////////////////////////////////////////////////////////////////
285 266
286 // The following RSA-PSS signature test vectors come from the pss-vect.txt 267 // The following RSA-PSS signature test vectors come from the pss-vect.txt
(...skipping 728 matching lines...) Expand 10 before | Expand all | Expand 10 after
1015 } 996 }
1016 997
1017 static bool EncodeRSAPublicKey(const std::vector<uint8_t>& modulus_n, 998 static bool EncodeRSAPublicKey(const std::vector<uint8_t>& modulus_n,
1018 const std::vector<uint8_t>& public_exponent_e, 999 const std::vector<uint8_t>& public_exponent_e,
1019 std::vector<uint8_t>* public_key_info) { 1000 std::vector<uint8_t>* public_key_info) {
1020 // The public key is specified as the following ASN.1 structure: 1001 // The public key is specified as the following ASN.1 structure:
1021 // SubjectPublicKeyInfo ::= SEQUENCE { 1002 // SubjectPublicKeyInfo ::= SEQUENCE {
1022 // algorithm AlgorithmIdentifier, 1003 // algorithm AlgorithmIdentifier,
1023 // subjectPublicKey BIT STRING } 1004 // subjectPublicKey BIT STRING }
1024 // 1005 //
1025 // The signature algorithm is specified as the following ASN.1 structure: 1006 // The algorithm is specified as the following ASN.1 structure:
1026 // AlgorithmIdentifier ::= SEQUENCE { 1007 // AlgorithmIdentifier ::= SEQUENCE {
1027 // algorithm OBJECT IDENTIFIER, 1008 // algorithm OBJECT IDENTIFIER,
1028 // parameters ANY DEFINED BY algorithm OPTIONAL } 1009 // parameters ANY DEFINED BY algorithm OPTIONAL }
1029 // 1010 //
1030 // An RSA public key is specified as the following ASN.1 structure: 1011 // An RSA public key is specified as the following ASN.1 structure:
1031 // RSAPublicKey ::= SEQUENCE { 1012 // RSAPublicKey ::= SEQUENCE {
1032 // modulus INTEGER, -- n 1013 // modulus INTEGER, -- n
1033 // publicExponent INTEGER -- e 1014 // publicExponent INTEGER -- e
1034 // } 1015 // }
1035 static const uint8_t kIntegerTag = 0x02; 1016 static const uint8_t kIntegerTag = 0x02;
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
1154 &public_key_info[0], 1135 &public_key_info[0],
1155 public_key_info.size()); 1136 public_key_info.size());
1156 signature[0] -= 1; 1137 signature[0] -= 1;
1157 ASSERT_TRUE(ok); 1138 ASSERT_TRUE(ok);
1158 verifier.VerifyUpdate(&message[0], message.size()); 1139 verifier.VerifyUpdate(&message[0], message.size());
1159 ok = verifier.VerifyFinal(); 1140 ok = verifier.VerifyFinal();
1160 EXPECT_FALSE(ok); 1141 EXPECT_FALSE(ok);
1161 } 1142 }
1162 } 1143 }
1163 } 1144 }
OLDNEW
« no previous file with comments | « crypto/signature_verifier_openssl.cc ('k') | extensions/browser/verified_contents.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698