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

Side by Side Diff: content/child/webcrypto/test/hmac_unittest.cc

Issue 670433005: Cleanup: Use default constructor for WebCryptoKey rather than createNull() factory method. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 2 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/logging.h" 5 #include "base/logging.h"
6 #include "base/stl_util.h" 6 #include "base/stl_util.h"
7 #include "content/child/webcrypto/algorithm_dispatch.h" 7 #include "content/child/webcrypto/algorithm_dispatch.h"
8 #include "content/child/webcrypto/crypto_data.h" 8 #include "content/child/webcrypto/crypto_data.h"
9 #include "content/child/webcrypto/status.h" 9 #include "content/child/webcrypto/status.h"
10 #include "content/child/webcrypto/test/test_helpers.h" 10 #include "content/child/webcrypto/test/test_helpers.h"
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 &signature_match)); 111 &signature_match));
112 EXPECT_FALSE(signature_match); 112 EXPECT_FALSE(signature_match);
113 } 113 }
114 } 114 }
115 115
116 TEST(WebCryptoHmacTest, GenerateKeyIsRandom) { 116 TEST(WebCryptoHmacTest, GenerateKeyIsRandom) {
117 // Generate a small sample of HMAC keys. 117 // Generate a small sample of HMAC keys.
118 std::vector<std::vector<uint8_t> > keys; 118 std::vector<std::vector<uint8_t> > keys;
119 for (int i = 0; i < 16; ++i) { 119 for (int i = 0; i < 16; ++i) {
120 std::vector<uint8_t> key_bytes; 120 std::vector<uint8_t> key_bytes;
121 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); 121 blink::WebCryptoKey key;
122 blink::WebCryptoAlgorithm algorithm = 122 blink::WebCryptoAlgorithm algorithm =
123 CreateHmacKeyGenAlgorithm(blink::WebCryptoAlgorithmIdSha1, 512); 123 CreateHmacKeyGenAlgorithm(blink::WebCryptoAlgorithmIdSha1, 512);
124 ASSERT_EQ(Status::Success(), GenerateSecretKey(algorithm, true, 0, &key)); 124 ASSERT_EQ(Status::Success(), GenerateSecretKey(algorithm, true, 0, &key));
125 EXPECT_FALSE(key.isNull()); 125 EXPECT_FALSE(key.isNull());
126 EXPECT_TRUE(key.handle()); 126 EXPECT_TRUE(key.handle());
127 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type()); 127 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type());
128 EXPECT_EQ(blink::WebCryptoAlgorithmIdHmac, key.algorithm().id()); 128 EXPECT_EQ(blink::WebCryptoAlgorithmIdHmac, key.algorithm().id());
129 EXPECT_EQ(blink::WebCryptoAlgorithmIdSha1, 129 EXPECT_EQ(blink::WebCryptoAlgorithmIdSha1,
130 key.algorithm().hmacParams()->hash().id()); 130 key.algorithm().hmacParams()->hash().id());
131 EXPECT_EQ(512u, key.algorithm().hmacParams()->lengthBits()); 131 EXPECT_EQ(512u, key.algorithm().hmacParams()->lengthBits());
132 132
133 std::vector<uint8_t> raw_key; 133 std::vector<uint8_t> raw_key;
134 ASSERT_EQ(Status::Success(), 134 ASSERT_EQ(Status::Success(),
135 ExportKey(blink::WebCryptoKeyFormatRaw, key, &raw_key)); 135 ExportKey(blink::WebCryptoKeyFormatRaw, key, &raw_key));
136 EXPECT_EQ(64U, raw_key.size()); 136 EXPECT_EQ(64U, raw_key.size());
137 keys.push_back(raw_key); 137 keys.push_back(raw_key);
138 } 138 }
139 // Ensure all entries in the key sample set are unique. This is a simplistic 139 // Ensure all entries in the key sample set are unique. This is a simplistic
140 // estimate of whether the generated keys appear random. 140 // estimate of whether the generated keys appear random.
141 EXPECT_FALSE(CopiesExist(keys)); 141 EXPECT_FALSE(CopiesExist(keys));
142 } 142 }
143 143
144 // If the key length is not provided, then the block size is used. 144 // If the key length is not provided, then the block size is used.
145 TEST(WebCryptoHmacTest, GenerateKeyNoLengthSha1) { 145 TEST(WebCryptoHmacTest, GenerateKeyNoLengthSha1) {
146 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); 146 blink::WebCryptoKey key;
147 blink::WebCryptoAlgorithm algorithm = 147 blink::WebCryptoAlgorithm algorithm =
148 CreateHmacKeyGenAlgorithm(blink::WebCryptoAlgorithmIdSha1, 0); 148 CreateHmacKeyGenAlgorithm(blink::WebCryptoAlgorithmIdSha1, 0);
149 ASSERT_EQ(Status::Success(), GenerateSecretKey(algorithm, true, 0, &key)); 149 ASSERT_EQ(Status::Success(), GenerateSecretKey(algorithm, true, 0, &key));
150 EXPECT_TRUE(key.handle()); 150 EXPECT_TRUE(key.handle());
151 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type()); 151 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type());
152 EXPECT_EQ(blink::WebCryptoAlgorithmIdHmac, key.algorithm().id()); 152 EXPECT_EQ(blink::WebCryptoAlgorithmIdHmac, key.algorithm().id());
153 EXPECT_EQ(blink::WebCryptoAlgorithmIdSha1, 153 EXPECT_EQ(blink::WebCryptoAlgorithmIdSha1,
154 key.algorithm().hmacParams()->hash().id()); 154 key.algorithm().hmacParams()->hash().id());
155 EXPECT_EQ(512u, key.algorithm().hmacParams()->lengthBits()); 155 EXPECT_EQ(512u, key.algorithm().hmacParams()->lengthBits());
156 std::vector<uint8_t> raw_key; 156 std::vector<uint8_t> raw_key;
157 ASSERT_EQ(Status::Success(), 157 ASSERT_EQ(Status::Success(),
158 ExportKey(blink::WebCryptoKeyFormatRaw, key, &raw_key)); 158 ExportKey(blink::WebCryptoKeyFormatRaw, key, &raw_key));
159 EXPECT_EQ(64U, raw_key.size()); 159 EXPECT_EQ(64U, raw_key.size());
160 } 160 }
161 161
162 // If the key length is not provided, then the block size is used. 162 // If the key length is not provided, then the block size is used.
163 TEST(WebCryptoHmacTest, GenerateKeyNoLengthSha512) { 163 TEST(WebCryptoHmacTest, GenerateKeyNoLengthSha512) {
164 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); 164 blink::WebCryptoKey key;
165 blink::WebCryptoAlgorithm algorithm = 165 blink::WebCryptoAlgorithm algorithm =
166 CreateHmacKeyGenAlgorithm(blink::WebCryptoAlgorithmIdSha512, 0); 166 CreateHmacKeyGenAlgorithm(blink::WebCryptoAlgorithmIdSha512, 0);
167 ASSERT_EQ(Status::Success(), GenerateSecretKey(algorithm, true, 0, &key)); 167 ASSERT_EQ(Status::Success(), GenerateSecretKey(algorithm, true, 0, &key));
168 EXPECT_EQ(blink::WebCryptoAlgorithmIdHmac, key.algorithm().id()); 168 EXPECT_EQ(blink::WebCryptoAlgorithmIdHmac, key.algorithm().id());
169 EXPECT_EQ(blink::WebCryptoAlgorithmIdSha512, 169 EXPECT_EQ(blink::WebCryptoAlgorithmIdSha512,
170 key.algorithm().hmacParams()->hash().id()); 170 key.algorithm().hmacParams()->hash().id());
171 EXPECT_EQ(1024u, key.algorithm().hmacParams()->lengthBits()); 171 EXPECT_EQ(1024u, key.algorithm().hmacParams()->lengthBits());
172 std::vector<uint8_t> raw_key; 172 std::vector<uint8_t> raw_key;
173 ASSERT_EQ(Status::Success(), 173 ASSERT_EQ(Status::Success(),
174 ExportKey(blink::WebCryptoKeyFormatRaw, key, &raw_key)); 174 ExportKey(blink::WebCryptoKeyFormatRaw, key, &raw_key));
175 EXPECT_EQ(128U, raw_key.size()); 175 EXPECT_EQ(128U, raw_key.size());
176 } 176 }
177 177
178 TEST(WebCryptoHmacTest, ImportKeyJwkKeyOpsSignVerify) { 178 TEST(WebCryptoHmacTest, ImportKeyJwkKeyOpsSignVerify) {
179 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); 179 blink::WebCryptoKey key;
180 base::DictionaryValue dict; 180 base::DictionaryValue dict;
181 dict.SetString("kty", "oct"); 181 dict.SetString("kty", "oct");
182 dict.SetString("k", "GADWrMRHwQfoNaXU5fZvTg=="); 182 dict.SetString("k", "GADWrMRHwQfoNaXU5fZvTg==");
183 base::ListValue* key_ops = new base::ListValue; 183 base::ListValue* key_ops = new base::ListValue;
184 dict.Set("key_ops", key_ops); // Takes ownership. 184 dict.Set("key_ops", key_ops); // Takes ownership.
185 185
186 key_ops->AppendString("sign"); 186 key_ops->AppendString("sign");
187 187
188 EXPECT_EQ(Status::Success(), 188 EXPECT_EQ(Status::Success(),
189 ImportKeyJwkFromDict( 189 ImportKeyJwkFromDict(
(...skipping 13 matching lines...) Expand all
203 CreateHmacImportAlgorithm(blink::WebCryptoAlgorithmIdSha256), 203 CreateHmacImportAlgorithm(blink::WebCryptoAlgorithmIdSha256),
204 false, 204 false,
205 blink::WebCryptoKeyUsageVerify, 205 blink::WebCryptoKeyUsageVerify,
206 &key)); 206 &key));
207 207
208 EXPECT_EQ(blink::WebCryptoKeyUsageVerify, key.usages()); 208 EXPECT_EQ(blink::WebCryptoKeyUsageVerify, key.usages());
209 } 209 }
210 210
211 // Test 'use' inconsistent with 'key_ops'. 211 // Test 'use' inconsistent with 'key_ops'.
212 TEST(WebCryptoHmacTest, ImportKeyJwkUseInconsisteWithKeyOps) { 212 TEST(WebCryptoHmacTest, ImportKeyJwkUseInconsisteWithKeyOps) {
213 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); 213 blink::WebCryptoKey key;
214 base::DictionaryValue dict; 214 base::DictionaryValue dict;
215 dict.SetString("kty", "oct"); 215 dict.SetString("kty", "oct");
216 dict.SetString("k", "GADWrMRHwQfoNaXU5fZvTg=="); 216 dict.SetString("k", "GADWrMRHwQfoNaXU5fZvTg==");
217 base::ListValue* key_ops = new base::ListValue; 217 base::ListValue* key_ops = new base::ListValue;
218 dict.Set("key_ops", key_ops); // Takes ownership. 218 dict.Set("key_ops", key_ops); // Takes ownership.
219 219
220 dict.SetString("alg", "HS256"); 220 dict.SetString("alg", "HS256");
221 dict.SetString("use", "sig"); 221 dict.SetString("use", "sig");
222 key_ops->AppendString("sign"); 222 key_ops->AppendString("sign");
223 key_ops->AppendString("verify"); 223 key_ops->AppendString("verify");
224 key_ops->AppendString("encrypt"); 224 key_ops->AppendString("encrypt");
225 EXPECT_EQ(Status::ErrorJwkUseAndKeyopsInconsistent(), 225 EXPECT_EQ(Status::ErrorJwkUseAndKeyopsInconsistent(),
226 ImportKeyJwkFromDict( 226 ImportKeyJwkFromDict(
227 dict, 227 dict,
228 CreateHmacImportAlgorithm(blink::WebCryptoAlgorithmIdSha256), 228 CreateHmacImportAlgorithm(blink::WebCryptoAlgorithmIdSha256),
229 false, 229 false,
230 blink::WebCryptoKeyUsageSign | blink::WebCryptoKeyUsageVerify, 230 blink::WebCryptoKeyUsageSign | blink::WebCryptoKeyUsageVerify,
231 &key)); 231 &key));
232 } 232 }
233 233
234 // Test JWK composite 'sig' use 234 // Test JWK composite 'sig' use
235 TEST(WebCryptoHmacTest, ImportKeyJwkUseSig) { 235 TEST(WebCryptoHmacTest, ImportKeyJwkUseSig) {
236 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); 236 blink::WebCryptoKey key;
237 base::DictionaryValue dict; 237 base::DictionaryValue dict;
238 dict.SetString("kty", "oct"); 238 dict.SetString("kty", "oct");
239 dict.SetString("k", "GADWrMRHwQfoNaXU5fZvTg=="); 239 dict.SetString("k", "GADWrMRHwQfoNaXU5fZvTg==");
240 240
241 dict.SetString("use", "sig"); 241 dict.SetString("use", "sig");
242 EXPECT_EQ(Status::Success(), 242 EXPECT_EQ(Status::Success(),
243 ImportKeyJwkFromDict( 243 ImportKeyJwkFromDict(
244 dict, 244 dict,
245 CreateHmacImportAlgorithm(blink::WebCryptoAlgorithmIdSha256), 245 CreateHmacImportAlgorithm(blink::WebCryptoAlgorithmIdSha256),
246 false, 246 false,
247 blink::WebCryptoKeyUsageSign | blink::WebCryptoKeyUsageVerify, 247 blink::WebCryptoKeyUsageSign | blink::WebCryptoKeyUsageVerify,
248 &key)); 248 &key));
249 249
250 EXPECT_EQ(blink::WebCryptoKeyUsageSign | blink::WebCryptoKeyUsageVerify, 250 EXPECT_EQ(blink::WebCryptoKeyUsageSign | blink::WebCryptoKeyUsageVerify,
251 key.usages()); 251 key.usages());
252 } 252 }
253 253
254 TEST(WebCryptoHmacTest, ImportJwkInputConsistency) { 254 TEST(WebCryptoHmacTest, ImportJwkInputConsistency) {
255 // The Web Crypto spec says that if a JWK value is present, but is 255 // The Web Crypto spec says that if a JWK value is present, but is
256 // inconsistent with the input value, the operation must fail. 256 // inconsistent with the input value, the operation must fail.
257 257
258 // Consistency rules when JWK value is not present: Inputs should be used. 258 // Consistency rules when JWK value is not present: Inputs should be used.
259 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); 259 blink::WebCryptoKey key;
260 bool extractable = false; 260 bool extractable = false;
261 blink::WebCryptoAlgorithm algorithm = 261 blink::WebCryptoAlgorithm algorithm =
262 CreateHmacImportAlgorithm(blink::WebCryptoAlgorithmIdSha256); 262 CreateHmacImportAlgorithm(blink::WebCryptoAlgorithmIdSha256);
263 blink::WebCryptoKeyUsageMask usage_mask = blink::WebCryptoKeyUsageVerify; 263 blink::WebCryptoKeyUsageMask usage_mask = blink::WebCryptoKeyUsageVerify;
264 base::DictionaryValue dict; 264 base::DictionaryValue dict;
265 dict.SetString("kty", "oct"); 265 dict.SetString("kty", "oct");
266 dict.SetString("k", "l3nZEgZCeX8XRwJdWyK3rGB8qwjhdY8vOkbIvh4lxTuMao9Y_--hdg"); 266 dict.SetString("k", "l3nZEgZCeX8XRwJdWyK3rGB8qwjhdY8vOkbIvh4lxTuMao9Y_--hdg");
267 std::vector<uint8_t> json_vec = MakeJsonVector(dict); 267 std::vector<uint8_t> json_vec = MakeJsonVector(dict);
268 EXPECT_EQ(Status::Success(), 268 EXPECT_EQ(Status::Success(),
269 ImportKey(blink::WebCryptoKeyFormatJwk, 269 ImportKey(blink::WebCryptoKeyFormatJwk,
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
401 // must be of the RSA family, or when kty = "oct" alg must be symmetric 401 // must be of the RSA family, or when kty = "oct" alg must be symmetric
402 // algorithm. 402 // algorithm.
403 403
404 // TODO(padolph): key_ops consistency tests 404 // TODO(padolph): key_ops consistency tests
405 } 405 }
406 406
407 TEST(WebCryptoHmacTest, ImportJwkHappy) { 407 TEST(WebCryptoHmacTest, ImportJwkHappy) {
408 // This test verifies the happy path of JWK import, including the application 408 // This test verifies the happy path of JWK import, including the application
409 // of the imported key material. 409 // of the imported key material.
410 410
411 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); 411 blink::WebCryptoKey key;
412 bool extractable = false; 412 bool extractable = false;
413 blink::WebCryptoAlgorithm algorithm = 413 blink::WebCryptoAlgorithm algorithm =
414 CreateHmacImportAlgorithm(blink::WebCryptoAlgorithmIdSha256); 414 CreateHmacImportAlgorithm(blink::WebCryptoAlgorithmIdSha256);
415 blink::WebCryptoKeyUsageMask usage_mask = blink::WebCryptoKeyUsageSign; 415 blink::WebCryptoKeyUsageMask usage_mask = blink::WebCryptoKeyUsageSign;
416 416
417 // Import a symmetric key JWK and HMAC-SHA256 sign() 417 // Import a symmetric key JWK and HMAC-SHA256 sign()
418 // Uses the first SHA256 test vector from the HMAC sample set above. 418 // Uses the first SHA256 test vector from the HMAC sample set above.
419 419
420 base::DictionaryValue dict; 420 base::DictionaryValue dict;
421 dict.SetString("kty", "oct"); 421 dict.SetString("kty", "oct");
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
481 CreateHmacImportAlgorithm(blink::WebCryptoAlgorithmIdSha512), 481 CreateHmacImportAlgorithm(blink::WebCryptoAlgorithmIdSha512),
482 0, 482 0,
483 "HS512"); 483 "HS512");
484 } 484 }
485 485
486 TEST(WebCryptoHmacTest, ExportJwkEmptyKey) { 486 TEST(WebCryptoHmacTest, ExportJwkEmptyKey) {
487 const blink::WebCryptoAlgorithm import_algorithm = 487 const blink::WebCryptoAlgorithm import_algorithm =
488 CreateHmacImportAlgorithm(blink::WebCryptoAlgorithmIdSha1); 488 CreateHmacImportAlgorithm(blink::WebCryptoAlgorithmIdSha1);
489 489
490 blink::WebCryptoKeyUsageMask usages = blink::WebCryptoKeyUsageSign; 490 blink::WebCryptoKeyUsageMask usages = blink::WebCryptoKeyUsageSign;
491 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); 491 blink::WebCryptoKey key;
492 492
493 // Import a zero-byte HMAC key. 493 // Import a zero-byte HMAC key.
494 const char key_data_hex[] = ""; 494 const char key_data_hex[] = "";
495 key = ImportSecretKeyFromRaw( 495 key = ImportSecretKeyFromRaw(
496 HexStringToBytes(key_data_hex), import_algorithm, usages); 496 HexStringToBytes(key_data_hex), import_algorithm, usages);
497 EXPECT_EQ(0u, key.algorithm().hmacParams()->lengthBits()); 497 EXPECT_EQ(0u, key.algorithm().hmacParams()->lengthBits());
498 498
499 // Export the key in JWK format and validate. 499 // Export the key in JWK format and validate.
500 std::vector<uint8_t> json; 500 std::vector<uint8_t> json;
501 ASSERT_EQ(Status::Success(), 501 ASSERT_EQ(Status::Success(),
(...skipping 18 matching lines...) Expand all
520 ExportKey(blink::WebCryptoKeyFormatRaw, key, &exported_key_data)); 520 ExportKey(blink::WebCryptoKeyFormatRaw, key, &exported_key_data));
521 521
522 EXPECT_EQ(0u, exported_key_data.size()); 522 EXPECT_EQ(0u, exported_key_data.size());
523 } 523 }
524 524
525 // Import a huge hmac key (UINT_MAX bytes). This will fail before actually 525 // Import a huge hmac key (UINT_MAX bytes). This will fail before actually
526 // reading the bytes, as the key is too large. 526 // reading the bytes, as the key is too large.
527 TEST(WebCryptoHmacTest, ImportRawKeyTooLarge) { 527 TEST(WebCryptoHmacTest, ImportRawKeyTooLarge) {
528 CryptoData big_data(NULL, UINT_MAX); // Invalid data of big length. 528 CryptoData big_data(NULL, UINT_MAX); // Invalid data of big length.
529 529
530 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); 530 blink::WebCryptoKey key;
531 EXPECT_EQ( 531 EXPECT_EQ(
532 Status::ErrorDataTooLarge(), 532 Status::ErrorDataTooLarge(),
533 ImportKey(blink::WebCryptoKeyFormatRaw, 533 ImportKey(blink::WebCryptoKeyFormatRaw,
534 CryptoData(big_data), 534 CryptoData(big_data),
535 CreateHmacImportAlgorithm(blink::WebCryptoAlgorithmIdSha1), 535 CreateHmacImportAlgorithm(blink::WebCryptoAlgorithmIdSha1),
536 true, 536 true,
537 blink::WebCryptoKeyUsageSign, 537 blink::WebCryptoKeyUsageSign,
538 &key)); 538 &key));
539 } 539 }
540 540
541 } // namespace 541 } // namespace
542 542
543 } // namespace webcrypto 543 } // namespace webcrypto
544 544
545 } // namespace content 545 } // namespace content
OLDNEW
« no previous file with comments | « content/child/webcrypto/test/aes_kw_unittest.cc ('k') | content/child/webcrypto/test/rsa_oaep_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698