OLD | NEW |
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 <algorithm> | 5 #include <algorithm> |
6 #include <string> | 6 #include <string> |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 } | 96 } |
97 | 97 |
98 namespace { | 98 namespace { |
99 | 99 |
100 // ----------------------------------------------------------------------------- | 100 // ----------------------------------------------------------------------------- |
101 | 101 |
102 // TODO(eroman): For Linux builds using system NSS, AES-GCM support is a | 102 // TODO(eroman): For Linux builds using system NSS, AES-GCM support is a |
103 // runtime dependency. Test it by trying to import a key. | 103 // runtime dependency. Test it by trying to import a key. |
104 // TODO(padolph): Consider caching the result of the import key test. | 104 // TODO(padolph): Consider caching the result of the import key test. |
105 bool SupportsAesGcm() { | 105 bool SupportsAesGcm() { |
106 std::vector<uint8> key_raw(16, 0); | 106 std::vector<uint8_t> key_raw(16, 0); |
107 | 107 |
108 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | 108 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
109 Status status = ImportKey(blink::WebCryptoKeyFormatRaw, | 109 Status status = ImportKey(blink::WebCryptoKeyFormatRaw, |
110 CryptoData(key_raw), | 110 CryptoData(key_raw), |
111 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesGcm), | 111 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesGcm), |
112 true, | 112 true, |
113 blink::WebCryptoKeyUsageEncrypt, | 113 blink::WebCryptoKeyUsageEncrypt, |
114 &key); | 114 &key); |
115 | 115 |
116 if (status.IsError()) | 116 if (status.IsError()) |
(...skipping 26 matching lines...) Expand all Loading... |
143 return false; | 143 return false; |
144 } | 144 } |
145 #endif | 145 #endif |
146 return true; | 146 return true; |
147 } | 147 } |
148 | 148 |
149 blink::WebCryptoAlgorithm CreateRsaHashedKeyGenAlgorithm( | 149 blink::WebCryptoAlgorithm CreateRsaHashedKeyGenAlgorithm( |
150 blink::WebCryptoAlgorithmId algorithm_id, | 150 blink::WebCryptoAlgorithmId algorithm_id, |
151 const blink::WebCryptoAlgorithmId hash_id, | 151 const blink::WebCryptoAlgorithmId hash_id, |
152 unsigned int modulus_length, | 152 unsigned int modulus_length, |
153 const std::vector<uint8>& public_exponent) { | 153 const std::vector<uint8_t>& public_exponent) { |
154 DCHECK(algorithm_id == blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5 || | 154 DCHECK(algorithm_id == blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5 || |
155 algorithm_id == blink::WebCryptoAlgorithmIdRsaOaep); | 155 algorithm_id == blink::WebCryptoAlgorithmIdRsaOaep); |
156 DCHECK(blink::WebCryptoAlgorithm::isHash(hash_id)); | 156 DCHECK(blink::WebCryptoAlgorithm::isHash(hash_id)); |
157 return blink::WebCryptoAlgorithm::adoptParamsAndCreate( | 157 return blink::WebCryptoAlgorithm::adoptParamsAndCreate( |
158 algorithm_id, | 158 algorithm_id, |
159 new blink::WebCryptoRsaHashedKeyGenParams( | 159 new blink::WebCryptoRsaHashedKeyGenParams( |
160 CreateAlgorithm(hash_id), | 160 CreateAlgorithm(hash_id), |
161 modulus_length, | 161 modulus_length, |
162 webcrypto::Uint8VectorStart(public_exponent), | 162 webcrypto::Uint8VectorStart(public_exponent), |
163 public_exponent.size())); | 163 public_exponent.size())); |
164 } | 164 } |
165 | 165 |
166 // Creates an RSA-OAEP algorithm | 166 // Creates an RSA-OAEP algorithm |
167 blink::WebCryptoAlgorithm CreateRsaOaepAlgorithm( | 167 blink::WebCryptoAlgorithm CreateRsaOaepAlgorithm( |
168 const std::vector<uint8>& label) { | 168 const std::vector<uint8_t>& label) { |
169 return blink::WebCryptoAlgorithm::adoptParamsAndCreate( | 169 return blink::WebCryptoAlgorithm::adoptParamsAndCreate( |
170 blink::WebCryptoAlgorithmIdRsaOaep, | 170 blink::WebCryptoAlgorithmIdRsaOaep, |
171 new blink::WebCryptoRsaOaepParams( | 171 new blink::WebCryptoRsaOaepParams( |
172 !label.empty(), Uint8VectorStart(label), label.size())); | 172 !label.empty(), Uint8VectorStart(label), label.size())); |
173 } | 173 } |
174 | 174 |
175 // Creates an AES-CBC algorithm. | 175 // Creates an AES-CBC algorithm. |
176 blink::WebCryptoAlgorithm CreateAesCbcAlgorithm(const std::vector<uint8>& iv) { | 176 blink::WebCryptoAlgorithm CreateAesCbcAlgorithm( |
| 177 const std::vector<uint8_t>& iv) { |
177 return blink::WebCryptoAlgorithm::adoptParamsAndCreate( | 178 return blink::WebCryptoAlgorithm::adoptParamsAndCreate( |
178 blink::WebCryptoAlgorithmIdAesCbc, | 179 blink::WebCryptoAlgorithmIdAesCbc, |
179 new blink::WebCryptoAesCbcParams(Uint8VectorStart(iv), iv.size())); | 180 new blink::WebCryptoAesCbcParams(Uint8VectorStart(iv), iv.size())); |
180 } | 181 } |
181 | 182 |
182 // Creates an AES-GCM algorithm. | 183 // Creates an AES-GCM algorithm. |
183 blink::WebCryptoAlgorithm CreateAesGcmAlgorithm( | 184 blink::WebCryptoAlgorithm CreateAesGcmAlgorithm( |
184 const std::vector<uint8>& iv, | 185 const std::vector<uint8_t>& iv, |
185 const std::vector<uint8>& additional_data, | 186 const std::vector<uint8_t>& additional_data, |
186 unsigned int tag_length_bits) { | 187 unsigned int tag_length_bits) { |
187 EXPECT_TRUE(SupportsAesGcm()); | 188 EXPECT_TRUE(SupportsAesGcm()); |
188 return blink::WebCryptoAlgorithm::adoptParamsAndCreate( | 189 return blink::WebCryptoAlgorithm::adoptParamsAndCreate( |
189 blink::WebCryptoAlgorithmIdAesGcm, | 190 blink::WebCryptoAlgorithmIdAesGcm, |
190 new blink::WebCryptoAesGcmParams(Uint8VectorStart(iv), | 191 new blink::WebCryptoAesGcmParams(Uint8VectorStart(iv), |
191 iv.size(), | 192 iv.size(), |
192 true, | 193 true, |
193 Uint8VectorStart(additional_data), | 194 Uint8VectorStart(additional_data), |
194 additional_data.size(), | 195 additional_data.size(), |
195 true, | 196 true, |
(...skipping 11 matching lines...) Expand all Loading... |
207 return blink::WebCryptoAlgorithm::adoptParamsAndCreate( | 208 return blink::WebCryptoAlgorithm::adoptParamsAndCreate( |
208 blink::WebCryptoAlgorithmIdHmac, | 209 blink::WebCryptoAlgorithmIdHmac, |
209 new blink::WebCryptoHmacKeyGenParams( | 210 new blink::WebCryptoHmacKeyGenParams( |
210 CreateAlgorithm(hash_id), (key_length_bits != 0), key_length_bits)); | 211 CreateAlgorithm(hash_id), (key_length_bits != 0), key_length_bits)); |
211 } | 212 } |
212 | 213 |
213 // Returns a slightly modified version of the input vector. | 214 // Returns a slightly modified version of the input vector. |
214 // | 215 // |
215 // - For non-empty inputs a single bit is inverted. | 216 // - For non-empty inputs a single bit is inverted. |
216 // - For empty inputs, a byte is added. | 217 // - For empty inputs, a byte is added. |
217 std::vector<uint8> Corrupted(const std::vector<uint8>& input) { | 218 std::vector<uint8_t> Corrupted(const std::vector<uint8_t>& input) { |
218 std::vector<uint8> corrupted_data(input); | 219 std::vector<uint8_t> corrupted_data(input); |
219 if (corrupted_data.empty()) | 220 if (corrupted_data.empty()) |
220 corrupted_data.push_back(0); | 221 corrupted_data.push_back(0); |
221 corrupted_data[corrupted_data.size() / 2] ^= 0x01; | 222 corrupted_data[corrupted_data.size() / 2] ^= 0x01; |
222 return corrupted_data; | 223 return corrupted_data; |
223 } | 224 } |
224 | 225 |
225 std::vector<uint8> HexStringToBytes(const std::string& hex) { | 226 std::vector<uint8_t> HexStringToBytes(const std::string& hex) { |
226 std::vector<uint8> bytes; | 227 std::vector<uint8_t> bytes; |
227 base::HexStringToBytes(hex, &bytes); | 228 base::HexStringToBytes(hex, &bytes); |
228 return bytes; | 229 return bytes; |
229 } | 230 } |
230 | 231 |
231 std::vector<uint8> MakeJsonVector(const std::string& json_string) { | 232 std::vector<uint8_t> MakeJsonVector(const std::string& json_string) { |
232 return std::vector<uint8>(json_string.begin(), json_string.end()); | 233 return std::vector<uint8_t>(json_string.begin(), json_string.end()); |
233 } | 234 } |
234 | 235 |
235 std::vector<uint8> MakeJsonVector(const base::DictionaryValue& dict) { | 236 std::vector<uint8_t> MakeJsonVector(const base::DictionaryValue& dict) { |
236 std::string json; | 237 std::string json; |
237 base::JSONWriter::Write(&dict, &json); | 238 base::JSONWriter::Write(&dict, &json); |
238 return MakeJsonVector(json); | 239 return MakeJsonVector(json); |
239 } | 240 } |
240 | 241 |
241 // ---------------------------------------------------------------- | 242 // ---------------------------------------------------------------- |
242 // Helpers for working with JSON data files for test expectations. | 243 // Helpers for working with JSON data files for test expectations. |
243 // ---------------------------------------------------------------- | 244 // ---------------------------------------------------------------- |
244 | 245 |
245 // Reads a file in "src/content/test/data/webcrypto" to a base::Value. | 246 // Reads a file in "src/content/test/data/webcrypto" to a base::Value. |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 ignore_result(json.release()); | 293 ignore_result(json.release()); |
293 | 294 |
294 return ::testing::AssertionSuccess(); | 295 return ::testing::AssertionSuccess(); |
295 } | 296 } |
296 | 297 |
297 // Read a string property from the dictionary with path |property_name| | 298 // Read a string property from the dictionary with path |property_name| |
298 // (which can include periods for nested dictionaries). Interprets the | 299 // (which can include periods for nested dictionaries). Interprets the |
299 // string as a hex encoded string and converts it to a bytes list. | 300 // string as a hex encoded string and converts it to a bytes list. |
300 // | 301 // |
301 // Returns empty vector on failure. | 302 // Returns empty vector on failure. |
302 std::vector<uint8> GetBytesFromHexString(base::DictionaryValue* dict, | 303 std::vector<uint8_t> GetBytesFromHexString(base::DictionaryValue* dict, |
303 const char* property_name) { | 304 const char* property_name) { |
304 std::string hex_string; | 305 std::string hex_string; |
305 if (!dict->GetString(property_name, &hex_string)) { | 306 if (!dict->GetString(property_name, &hex_string)) { |
306 EXPECT_TRUE(false) << "Couldn't get string property: " << property_name; | 307 EXPECT_TRUE(false) << "Couldn't get string property: " << property_name; |
307 return std::vector<uint8>(); | 308 return std::vector<uint8_t>(); |
308 } | 309 } |
309 | 310 |
310 return HexStringToBytes(hex_string); | 311 return HexStringToBytes(hex_string); |
311 } | 312 } |
312 | 313 |
313 // Reads a string property with path "property_name" and converts it to a | 314 // Reads a string property with path "property_name" and converts it to a |
314 // WebCryptoAlgorith. Returns null algorithm on failure. | 315 // WebCryptoAlgorith. Returns null algorithm on failure. |
315 blink::WebCryptoAlgorithm GetDigestAlgorithm(base::DictionaryValue* dict, | 316 blink::WebCryptoAlgorithm GetDigestAlgorithm(base::DictionaryValue* dict, |
316 const char* property_name) { | 317 const char* property_name) { |
317 std::string algorithm_name; | 318 std::string algorithm_name; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
361 "n", | 362 "n", |
362 "qLOyhK-OtQs4cDSoYPFGxJGfMYdjzWxVmMiuSBGh4KvEx-CwgtaTpef87Wdc9GaFEncsDLxk" | 363 "qLOyhK-OtQs4cDSoYPFGxJGfMYdjzWxVmMiuSBGh4KvEx-CwgtaTpef87Wdc9GaFEncsDLxk" |
363 "p0LGxjD1M8jMcvYq6DPEC_JYQumEu3i9v5fAEH1VvbZi9cTg-rmEXLUUjvc5LdOq_5OuHmtm" | 364 "p0LGxjD1M8jMcvYq6DPEC_JYQumEu3i9v5fAEH1VvbZi9cTg-rmEXLUUjvc5LdOq_5OuHmtm" |
364 "e7PUJHYW1PW6ENTP0ibeiNOfFvs"); | 365 "e7PUJHYW1PW6ENTP0ibeiNOfFvs"); |
365 dict->SetString("e", "AQAB"); | 366 dict->SetString("e", "AQAB"); |
366 } | 367 } |
367 | 368 |
368 // Returns true if any of the vectors in the input list have identical content. | 369 // Returns true if any of the vectors in the input list have identical content. |
369 // Dumb O(n^2) implementation but should be fast enough for the input sizes that | 370 // Dumb O(n^2) implementation but should be fast enough for the input sizes that |
370 // are used. | 371 // are used. |
371 bool CopiesExist(const std::vector<std::vector<uint8> >& bufs) { | 372 bool CopiesExist(const std::vector<std::vector<uint8_t> >& bufs) { |
372 for (size_t i = 0; i < bufs.size(); ++i) { | 373 for (size_t i = 0; i < bufs.size(); ++i) { |
373 for (size_t j = i + 1; j < bufs.size(); ++j) { | 374 for (size_t j = i + 1; j < bufs.size(); ++j) { |
374 if (CryptoData(bufs[i]) == CryptoData(bufs[j])) | 375 if (CryptoData(bufs[i]) == CryptoData(bufs[j])) |
375 return true; | 376 return true; |
376 } | 377 } |
377 } | 378 } |
378 return false; | 379 return false; |
379 } | 380 } |
380 | 381 |
381 blink::WebCryptoAlgorithm CreateAesKeyGenAlgorithm( | 382 blink::WebCryptoAlgorithm CreateAesKeyGenAlgorithm( |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
445 "FFEDB162B4C0F283A12A88A394DFF526AB7291CBB307CEABFCE0B1DFD5CD9508096D5B2B" | 446 "FFEDB162B4C0F283A12A88A394DFF526AB7291CBB307CEABFCE0B1DFD5CD9508096D5B2B" |
446 "8B6DF5D671EF6377C0921CB23C270A70E2598E6FF89D19F105ACC2D3F0CB35F29280E138" | 447 "8B6DF5D671EF6377C0921CB23C270A70E2598E6FF89D19F105ACC2D3F0CB35F29280E138" |
447 "6B6F64C4EF22E1E1F20D0CE8CFFB2249BD9A2137"; | 448 "6B6F64C4EF22E1E1F20D0CE8CFFB2249BD9A2137"; |
448 const char* const kPublicKeyExponentHex = "010001"; | 449 const char* const kPublicKeyExponentHex = "010001"; |
449 | 450 |
450 // TODO(eroman): Remove unnecessary test fixture. | 451 // TODO(eroman): Remove unnecessary test fixture. |
451 class SharedCryptoTest : public testing::Test { | 452 class SharedCryptoTest : public testing::Test { |
452 }; | 453 }; |
453 | 454 |
454 blink::WebCryptoKey ImportSecretKeyFromRaw( | 455 blink::WebCryptoKey ImportSecretKeyFromRaw( |
455 const std::vector<uint8>& key_raw, | 456 const std::vector<uint8_t>& key_raw, |
456 const blink::WebCryptoAlgorithm& algorithm, | 457 const blink::WebCryptoAlgorithm& algorithm, |
457 blink::WebCryptoKeyUsageMask usage) { | 458 blink::WebCryptoKeyUsageMask usage) { |
458 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | 459 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
459 bool extractable = true; | 460 bool extractable = true; |
460 EXPECT_EQ(Status::Success(), | 461 EXPECT_EQ(Status::Success(), |
461 ImportKey(blink::WebCryptoKeyFormatRaw, | 462 ImportKey(blink::WebCryptoKeyFormatRaw, |
462 CryptoData(key_raw), | 463 CryptoData(key_raw), |
463 algorithm, | 464 algorithm, |
464 extractable, | 465 extractable, |
465 usage, | 466 usage, |
466 &key)); | 467 &key)); |
467 | 468 |
468 EXPECT_FALSE(key.isNull()); | 469 EXPECT_FALSE(key.isNull()); |
469 EXPECT_TRUE(key.handle()); | 470 EXPECT_TRUE(key.handle()); |
470 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type()); | 471 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type()); |
471 EXPECT_EQ(algorithm.id(), key.algorithm().id()); | 472 EXPECT_EQ(algorithm.id(), key.algorithm().id()); |
472 EXPECT_EQ(extractable, key.extractable()); | 473 EXPECT_EQ(extractable, key.extractable()); |
473 EXPECT_EQ(usage, key.usages()); | 474 EXPECT_EQ(usage, key.usages()); |
474 return key; | 475 return key; |
475 } | 476 } |
476 | 477 |
477 void ImportRsaKeyPair(const std::vector<uint8>& spki_der, | 478 void ImportRsaKeyPair(const std::vector<uint8_t>& spki_der, |
478 const std::vector<uint8>& pkcs8_der, | 479 const std::vector<uint8_t>& pkcs8_der, |
479 const blink::WebCryptoAlgorithm& algorithm, | 480 const blink::WebCryptoAlgorithm& algorithm, |
480 bool extractable, | 481 bool extractable, |
481 blink::WebCryptoKeyUsageMask public_key_usage_mask, | 482 blink::WebCryptoKeyUsageMask public_key_usage_mask, |
482 blink::WebCryptoKeyUsageMask private_key_usage_mask, | 483 blink::WebCryptoKeyUsageMask private_key_usage_mask, |
483 blink::WebCryptoKey* public_key, | 484 blink::WebCryptoKey* public_key, |
484 blink::WebCryptoKey* private_key) { | 485 blink::WebCryptoKey* private_key) { |
485 ASSERT_EQ(Status::Success(), | 486 ASSERT_EQ(Status::Success(), |
486 ImportKey(blink::WebCryptoKeyFormatSpki, | 487 ImportKey(blink::WebCryptoKeyFormatSpki, |
487 CryptoData(spki_der), | 488 CryptoData(spki_der), |
488 algorithm, | 489 algorithm, |
(...skipping 16 matching lines...) Expand all Loading... |
505 private_key)); | 506 private_key)); |
506 EXPECT_FALSE(private_key->isNull()); | 507 EXPECT_FALSE(private_key->isNull()); |
507 EXPECT_TRUE(private_key->handle()); | 508 EXPECT_TRUE(private_key->handle()); |
508 EXPECT_EQ(blink::WebCryptoKeyTypePrivate, private_key->type()); | 509 EXPECT_EQ(blink::WebCryptoKeyTypePrivate, private_key->type()); |
509 EXPECT_EQ(algorithm.id(), private_key->algorithm().id()); | 510 EXPECT_EQ(algorithm.id(), private_key->algorithm().id()); |
510 EXPECT_EQ(extractable, private_key->extractable()); | 511 EXPECT_EQ(extractable, private_key->extractable()); |
511 EXPECT_EQ(private_key_usage_mask, private_key->usages()); | 512 EXPECT_EQ(private_key_usage_mask, private_key->usages()); |
512 } | 513 } |
513 | 514 |
514 Status AesGcmEncrypt(const blink::WebCryptoKey& key, | 515 Status AesGcmEncrypt(const blink::WebCryptoKey& key, |
515 const std::vector<uint8>& iv, | 516 const std::vector<uint8_t>& iv, |
516 const std::vector<uint8>& additional_data, | 517 const std::vector<uint8_t>& additional_data, |
517 unsigned int tag_length_bits, | 518 unsigned int tag_length_bits, |
518 const std::vector<uint8>& plain_text, | 519 const std::vector<uint8_t>& plain_text, |
519 std::vector<uint8>* cipher_text, | 520 std::vector<uint8_t>* cipher_text, |
520 std::vector<uint8>* authentication_tag) { | 521 std::vector<uint8_t>* authentication_tag) { |
521 EXPECT_TRUE(SupportsAesGcm()); | 522 EXPECT_TRUE(SupportsAesGcm()); |
522 blink::WebCryptoAlgorithm algorithm = | 523 blink::WebCryptoAlgorithm algorithm = |
523 CreateAesGcmAlgorithm(iv, additional_data, tag_length_bits); | 524 CreateAesGcmAlgorithm(iv, additional_data, tag_length_bits); |
524 | 525 |
525 std::vector<uint8> output; | 526 std::vector<uint8_t> output; |
526 Status status = Encrypt(algorithm, key, CryptoData(plain_text), &output); | 527 Status status = Encrypt(algorithm, key, CryptoData(plain_text), &output); |
527 if (status.IsError()) | 528 if (status.IsError()) |
528 return status; | 529 return status; |
529 | 530 |
530 if ((tag_length_bits % 8) != 0) { | 531 if ((tag_length_bits % 8) != 0) { |
531 EXPECT_TRUE(false) << "Encrypt should have failed."; | 532 EXPECT_TRUE(false) << "Encrypt should have failed."; |
532 return Status::OperationError(); | 533 return Status::OperationError(); |
533 } | 534 } |
534 | 535 |
535 size_t tag_length_bytes = tag_length_bits / 8; | 536 size_t tag_length_bytes = tag_length_bits / 8; |
536 | 537 |
537 if (tag_length_bytes > output.size()) { | 538 if (tag_length_bytes > output.size()) { |
538 EXPECT_TRUE(false) << "tag length is larger than output"; | 539 EXPECT_TRUE(false) << "tag length is larger than output"; |
539 return Status::OperationError(); | 540 return Status::OperationError(); |
540 } | 541 } |
541 | 542 |
542 // The encryption result is cipher text with authentication tag appended. | 543 // The encryption result is cipher text with authentication tag appended. |
543 cipher_text->assign(output.begin(), | 544 cipher_text->assign(output.begin(), |
544 output.begin() + (output.size() - tag_length_bytes)); | 545 output.begin() + (output.size() - tag_length_bytes)); |
545 authentication_tag->assign(output.begin() + cipher_text->size(), | 546 authentication_tag->assign(output.begin() + cipher_text->size(), |
546 output.end()); | 547 output.end()); |
547 | 548 |
548 return Status::Success(); | 549 return Status::Success(); |
549 } | 550 } |
550 | 551 |
551 Status AesGcmDecrypt(const blink::WebCryptoKey& key, | 552 Status AesGcmDecrypt(const blink::WebCryptoKey& key, |
552 const std::vector<uint8>& iv, | 553 const std::vector<uint8_t>& iv, |
553 const std::vector<uint8>& additional_data, | 554 const std::vector<uint8_t>& additional_data, |
554 unsigned int tag_length_bits, | 555 unsigned int tag_length_bits, |
555 const std::vector<uint8>& cipher_text, | 556 const std::vector<uint8_t>& cipher_text, |
556 const std::vector<uint8>& authentication_tag, | 557 const std::vector<uint8_t>& authentication_tag, |
557 std::vector<uint8>* plain_text) { | 558 std::vector<uint8_t>* plain_text) { |
558 EXPECT_TRUE(SupportsAesGcm()); | 559 EXPECT_TRUE(SupportsAesGcm()); |
559 blink::WebCryptoAlgorithm algorithm = | 560 blink::WebCryptoAlgorithm algorithm = |
560 CreateAesGcmAlgorithm(iv, additional_data, tag_length_bits); | 561 CreateAesGcmAlgorithm(iv, additional_data, tag_length_bits); |
561 | 562 |
562 // Join cipher text and authentication tag. | 563 // Join cipher text and authentication tag. |
563 std::vector<uint8> cipher_text_with_tag; | 564 std::vector<uint8_t> cipher_text_with_tag; |
564 cipher_text_with_tag.reserve(cipher_text.size() + authentication_tag.size()); | 565 cipher_text_with_tag.reserve(cipher_text.size() + authentication_tag.size()); |
565 cipher_text_with_tag.insert( | 566 cipher_text_with_tag.insert( |
566 cipher_text_with_tag.end(), cipher_text.begin(), cipher_text.end()); | 567 cipher_text_with_tag.end(), cipher_text.begin(), cipher_text.end()); |
567 cipher_text_with_tag.insert(cipher_text_with_tag.end(), | 568 cipher_text_with_tag.insert(cipher_text_with_tag.end(), |
568 authentication_tag.begin(), | 569 authentication_tag.begin(), |
569 authentication_tag.end()); | 570 authentication_tag.end()); |
570 | 571 |
571 return Decrypt(algorithm, key, CryptoData(cipher_text_with_tag), plain_text); | 572 return Decrypt(algorithm, key, CryptoData(cipher_text_with_tag), plain_text); |
572 } | 573 } |
573 | 574 |
(...skipping 17 matching lines...) Expand all Loading... |
591 blink::WebCryptoKey* key) { | 592 blink::WebCryptoKey* key) { |
592 return ImportKeyJwk(CryptoData(MakeJsonVector(dict)), | 593 return ImportKeyJwk(CryptoData(MakeJsonVector(dict)), |
593 algorithm, | 594 algorithm, |
594 extractable, | 595 extractable, |
595 usage_mask, | 596 usage_mask, |
596 key); | 597 key); |
597 } | 598 } |
598 | 599 |
599 // Parses a vector of JSON into a dictionary. | 600 // Parses a vector of JSON into a dictionary. |
600 scoped_ptr<base::DictionaryValue> GetJwkDictionary( | 601 scoped_ptr<base::DictionaryValue> GetJwkDictionary( |
601 const std::vector<uint8>& json) { | 602 const std::vector<uint8_t>& json) { |
602 base::StringPiece json_string( | 603 base::StringPiece json_string( |
603 reinterpret_cast<const char*>(Uint8VectorStart(json)), json.size()); | 604 reinterpret_cast<const char*>(Uint8VectorStart(json)), json.size()); |
604 base::Value* value = base::JSONReader::Read(json_string); | 605 base::Value* value = base::JSONReader::Read(json_string); |
605 EXPECT_TRUE(value); | 606 EXPECT_TRUE(value); |
606 base::DictionaryValue* dict_value = NULL; | 607 base::DictionaryValue* dict_value = NULL; |
607 value->GetAsDictionary(&dict_value); | 608 value->GetAsDictionary(&dict_value); |
608 return scoped_ptr<base::DictionaryValue>(dict_value); | 609 return scoped_ptr<base::DictionaryValue>(dict_value); |
609 } | 610 } |
610 | 611 |
611 // Verifies the input dictionary contains the expected values. Exact matches are | 612 // Verifies the input dictionary contains the expected values. Exact matches are |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
653 return ::testing::AssertionFailure() | 654 return ::testing::AssertionFailure() |
654 << "Expected 'key_ops' mask to be " << use_mask_expected | 655 << "Expected 'key_ops' mask to be " << use_mask_expected |
655 << " but found " << key_ops_mask << " (" << value_string << ")"; | 656 << " but found " << key_ops_mask << " (" << value_string << ")"; |
656 | 657 |
657 return ::testing::AssertionSuccess(); | 658 return ::testing::AssertionSuccess(); |
658 } | 659 } |
659 | 660 |
660 // Verifies that the JSON in the input vector contains the provided | 661 // Verifies that the JSON in the input vector contains the provided |
661 // expected values. Exact matches are required on the fields examined. | 662 // expected values. Exact matches are required on the fields examined. |
662 ::testing::AssertionResult VerifySecretJwk( | 663 ::testing::AssertionResult VerifySecretJwk( |
663 const std::vector<uint8>& json, | 664 const std::vector<uint8_t>& json, |
664 const std::string& alg_expected, | 665 const std::string& alg_expected, |
665 const std::string& k_expected_hex, | 666 const std::string& k_expected_hex, |
666 blink::WebCryptoKeyUsageMask use_mask_expected) { | 667 blink::WebCryptoKeyUsageMask use_mask_expected) { |
667 scoped_ptr<base::DictionaryValue> dict = GetJwkDictionary(json); | 668 scoped_ptr<base::DictionaryValue> dict = GetJwkDictionary(json); |
668 if (!dict.get() || dict->empty()) | 669 if (!dict.get() || dict->empty()) |
669 return ::testing::AssertionFailure() << "JSON parsing failed"; | 670 return ::testing::AssertionFailure() << "JSON parsing failed"; |
670 | 671 |
671 // ---- k | 672 // ---- k |
672 std::string value_string; | 673 std::string value_string; |
673 if (!dict->GetString("k", &value_string)) | 674 if (!dict->GetString("k", &value_string)) |
674 return ::testing::AssertionFailure() << "Missing 'k'"; | 675 return ::testing::AssertionFailure() << "Missing 'k'"; |
675 std::string k_value; | 676 std::string k_value; |
676 if (!webcrypto::Base64DecodeUrlSafe(value_string, &k_value)) | 677 if (!webcrypto::Base64DecodeUrlSafe(value_string, &k_value)) |
677 return ::testing::AssertionFailure() << "Base64DecodeUrlSafe(k) failed"; | 678 return ::testing::AssertionFailure() << "Base64DecodeUrlSafe(k) failed"; |
678 if (!LowerCaseEqualsASCII(base::HexEncode(k_value.data(), k_value.size()), | 679 if (!LowerCaseEqualsASCII(base::HexEncode(k_value.data(), k_value.size()), |
679 k_expected_hex.c_str())) { | 680 k_expected_hex.c_str())) { |
680 return ::testing::AssertionFailure() << "Expected 'k' to be " | 681 return ::testing::AssertionFailure() << "Expected 'k' to be " |
681 << k_expected_hex | 682 << k_expected_hex |
682 << " but found something different"; | 683 << " but found something different"; |
683 } | 684 } |
684 | 685 |
685 return VerifyJwk(dict, "oct", alg_expected, use_mask_expected); | 686 return VerifyJwk(dict, "oct", alg_expected, use_mask_expected); |
686 } | 687 } |
687 | 688 |
688 // Verifies that the JSON in the input vector contains the provided | 689 // Verifies that the JSON in the input vector contains the provided |
689 // expected values. Exact matches are required on the fields examined. | 690 // expected values. Exact matches are required on the fields examined. |
690 ::testing::AssertionResult VerifyPublicJwk( | 691 ::testing::AssertionResult VerifyPublicJwk( |
691 const std::vector<uint8>& json, | 692 const std::vector<uint8_t>& json, |
692 const std::string& alg_expected, | 693 const std::string& alg_expected, |
693 const std::string& n_expected_hex, | 694 const std::string& n_expected_hex, |
694 const std::string& e_expected_hex, | 695 const std::string& e_expected_hex, |
695 blink::WebCryptoKeyUsageMask use_mask_expected) { | 696 blink::WebCryptoKeyUsageMask use_mask_expected) { |
696 scoped_ptr<base::DictionaryValue> dict = GetJwkDictionary(json); | 697 scoped_ptr<base::DictionaryValue> dict = GetJwkDictionary(json); |
697 if (!dict.get() || dict->empty()) | 698 if (!dict.get() || dict->empty()) |
698 return ::testing::AssertionFailure() << "JSON parsing failed"; | 699 return ::testing::AssertionFailure() << "JSON parsing failed"; |
699 | 700 |
700 // ---- n | 701 // ---- n |
701 std::string value_string; | 702 std::string value_string; |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
793 scoped_ptr<base::ListValue> tests; | 794 scoped_ptr<base::ListValue> tests; |
794 ASSERT_TRUE(ReadJsonTestFileToList("digest.json", &tests)); | 795 ASSERT_TRUE(ReadJsonTestFileToList("digest.json", &tests)); |
795 | 796 |
796 for (size_t test_index = 0; test_index < tests->GetSize(); ++test_index) { | 797 for (size_t test_index = 0; test_index < tests->GetSize(); ++test_index) { |
797 SCOPED_TRACE(test_index); | 798 SCOPED_TRACE(test_index); |
798 base::DictionaryValue* test; | 799 base::DictionaryValue* test; |
799 ASSERT_TRUE(tests->GetDictionary(test_index, &test)); | 800 ASSERT_TRUE(tests->GetDictionary(test_index, &test)); |
800 | 801 |
801 blink::WebCryptoAlgorithm test_algorithm = | 802 blink::WebCryptoAlgorithm test_algorithm = |
802 GetDigestAlgorithm(test, "algorithm"); | 803 GetDigestAlgorithm(test, "algorithm"); |
803 std::vector<uint8> test_input = GetBytesFromHexString(test, "input"); | 804 std::vector<uint8_t> test_input = GetBytesFromHexString(test, "input"); |
804 std::vector<uint8> test_output = GetBytesFromHexString(test, "output"); | 805 std::vector<uint8_t> test_output = GetBytesFromHexString(test, "output"); |
805 | 806 |
806 std::vector<uint8> output; | 807 std::vector<uint8_t> output; |
807 ASSERT_EQ(Status::Success(), | 808 ASSERT_EQ(Status::Success(), |
808 Digest(test_algorithm, CryptoData(test_input), &output)); | 809 Digest(test_algorithm, CryptoData(test_input), &output)); |
809 EXPECT_BYTES_EQ(test_output, output); | 810 EXPECT_BYTES_EQ(test_output, output); |
810 } | 811 } |
811 } | 812 } |
812 | 813 |
813 TEST_F(SharedCryptoTest, DigestSampleSetsInChunks) { | 814 TEST_F(SharedCryptoTest, DigestSampleSetsInChunks) { |
814 scoped_ptr<base::ListValue> tests; | 815 scoped_ptr<base::ListValue> tests; |
815 ASSERT_TRUE(ReadJsonTestFileToList("digest.json", &tests)); | 816 ASSERT_TRUE(ReadJsonTestFileToList("digest.json", &tests)); |
816 | 817 |
817 for (size_t test_index = 0; test_index < tests->GetSize(); ++test_index) { | 818 for (size_t test_index = 0; test_index < tests->GetSize(); ++test_index) { |
818 SCOPED_TRACE(test_index); | 819 SCOPED_TRACE(test_index); |
819 base::DictionaryValue* test; | 820 base::DictionaryValue* test; |
820 ASSERT_TRUE(tests->GetDictionary(test_index, &test)); | 821 ASSERT_TRUE(tests->GetDictionary(test_index, &test)); |
821 | 822 |
822 blink::WebCryptoAlgorithm test_algorithm = | 823 blink::WebCryptoAlgorithm test_algorithm = |
823 GetDigestAlgorithm(test, "algorithm"); | 824 GetDigestAlgorithm(test, "algorithm"); |
824 std::vector<uint8> test_input = GetBytesFromHexString(test, "input"); | 825 std::vector<uint8_t> test_input = GetBytesFromHexString(test, "input"); |
825 std::vector<uint8> test_output = GetBytesFromHexString(test, "output"); | 826 std::vector<uint8_t> test_output = GetBytesFromHexString(test, "output"); |
826 | 827 |
827 // Test the chunk version of the digest functions. Test with 129 byte chunks | 828 // Test the chunk version of the digest functions. Test with 129 byte chunks |
828 // because the SHA-512 chunk size is 128 bytes. | 829 // because the SHA-512 chunk size is 128 bytes. |
829 unsigned char* output; | 830 unsigned char* output; |
830 unsigned int output_length; | 831 unsigned int output_length; |
831 static const size_t kChunkSizeBytes = 129; | 832 static const size_t kChunkSizeBytes = 129; |
832 size_t length = test_input.size(); | 833 size_t length = test_input.size(); |
833 scoped_ptr<blink::WebCryptoDigestor> digestor( | 834 scoped_ptr<blink::WebCryptoDigestor> digestor( |
834 CreateDigestor(test_algorithm.id())); | 835 CreateDigestor(test_algorithm.id())); |
835 std::vector<uint8>::iterator begin = test_input.begin(); | 836 std::vector<uint8_t>::iterator begin = test_input.begin(); |
836 size_t chunk_index = 0; | 837 size_t chunk_index = 0; |
837 while (begin != test_input.end()) { | 838 while (begin != test_input.end()) { |
838 size_t chunk_length = std::min(kChunkSizeBytes, length - chunk_index); | 839 size_t chunk_length = std::min(kChunkSizeBytes, length - chunk_index); |
839 std::vector<uint8> chunk(begin, begin + chunk_length); | 840 std::vector<uint8_t> chunk(begin, begin + chunk_length); |
840 ASSERT_TRUE(chunk.size() > 0); | 841 ASSERT_TRUE(chunk.size() > 0); |
841 EXPECT_TRUE(digestor->consume(&chunk.front(), chunk.size())); | 842 EXPECT_TRUE(digestor->consume(&chunk.front(), chunk.size())); |
842 chunk_index = chunk_index + chunk_length; | 843 chunk_index = chunk_index + chunk_length; |
843 begin = begin + chunk_length; | 844 begin = begin + chunk_length; |
844 } | 845 } |
845 EXPECT_TRUE(digestor->finish(output, output_length)); | 846 EXPECT_TRUE(digestor->finish(output, output_length)); |
846 EXPECT_BYTES_EQ(test_output, CryptoData(output, output_length)); | 847 EXPECT_BYTES_EQ(test_output, CryptoData(output, output_length)); |
847 } | 848 } |
848 } | 849 } |
849 | 850 |
850 TEST_F(SharedCryptoTest, HMACSampleSets) { | 851 TEST_F(SharedCryptoTest, HMACSampleSets) { |
851 scoped_ptr<base::ListValue> tests; | 852 scoped_ptr<base::ListValue> tests; |
852 ASSERT_TRUE(ReadJsonTestFileToList("hmac.json", &tests)); | 853 ASSERT_TRUE(ReadJsonTestFileToList("hmac.json", &tests)); |
853 // TODO(padolph): Missing known answer tests for HMAC SHA384, and SHA512. | 854 // TODO(padolph): Missing known answer tests for HMAC SHA384, and SHA512. |
854 for (size_t test_index = 0; test_index < tests->GetSize(); ++test_index) { | 855 for (size_t test_index = 0; test_index < tests->GetSize(); ++test_index) { |
855 SCOPED_TRACE(test_index); | 856 SCOPED_TRACE(test_index); |
856 base::DictionaryValue* test; | 857 base::DictionaryValue* test; |
857 ASSERT_TRUE(tests->GetDictionary(test_index, &test)); | 858 ASSERT_TRUE(tests->GetDictionary(test_index, &test)); |
858 | 859 |
859 blink::WebCryptoAlgorithm test_hash = GetDigestAlgorithm(test, "hash"); | 860 blink::WebCryptoAlgorithm test_hash = GetDigestAlgorithm(test, "hash"); |
860 const std::vector<uint8> test_key = GetBytesFromHexString(test, "key"); | 861 const std::vector<uint8_t> test_key = GetBytesFromHexString(test, "key"); |
861 const std::vector<uint8> test_message = | 862 const std::vector<uint8_t> test_message = |
862 GetBytesFromHexString(test, "message"); | 863 GetBytesFromHexString(test, "message"); |
863 const std::vector<uint8> test_mac = GetBytesFromHexString(test, "mac"); | 864 const std::vector<uint8_t> test_mac = GetBytesFromHexString(test, "mac"); |
864 | 865 |
865 blink::WebCryptoAlgorithm algorithm = | 866 blink::WebCryptoAlgorithm algorithm = |
866 CreateAlgorithm(blink::WebCryptoAlgorithmIdHmac); | 867 CreateAlgorithm(blink::WebCryptoAlgorithmIdHmac); |
867 | 868 |
868 blink::WebCryptoAlgorithm import_algorithm = | 869 blink::WebCryptoAlgorithm import_algorithm = |
869 CreateHmacImportAlgorithm(test_hash.id()); | 870 CreateHmacImportAlgorithm(test_hash.id()); |
870 | 871 |
871 blink::WebCryptoKey key = ImportSecretKeyFromRaw( | 872 blink::WebCryptoKey key = ImportSecretKeyFromRaw( |
872 test_key, | 873 test_key, |
873 import_algorithm, | 874 import_algorithm, |
874 blink::WebCryptoKeyUsageSign | blink::WebCryptoKeyUsageVerify); | 875 blink::WebCryptoKeyUsageSign | blink::WebCryptoKeyUsageVerify); |
875 | 876 |
876 EXPECT_EQ(test_hash.id(), key.algorithm().hmacParams()->hash().id()); | 877 EXPECT_EQ(test_hash.id(), key.algorithm().hmacParams()->hash().id()); |
877 EXPECT_EQ(test_key.size() * 8, key.algorithm().hmacParams()->lengthBits()); | 878 EXPECT_EQ(test_key.size() * 8, key.algorithm().hmacParams()->lengthBits()); |
878 | 879 |
879 // Verify exported raw key is identical to the imported data | 880 // Verify exported raw key is identical to the imported data |
880 std::vector<uint8> raw_key; | 881 std::vector<uint8_t> raw_key; |
881 EXPECT_EQ(Status::Success(), | 882 EXPECT_EQ(Status::Success(), |
882 ExportKey(blink::WebCryptoKeyFormatRaw, key, &raw_key)); | 883 ExportKey(blink::WebCryptoKeyFormatRaw, key, &raw_key)); |
883 EXPECT_BYTES_EQ(test_key, raw_key); | 884 EXPECT_BYTES_EQ(test_key, raw_key); |
884 | 885 |
885 std::vector<uint8> output; | 886 std::vector<uint8_t> output; |
886 | 887 |
887 ASSERT_EQ(Status::Success(), | 888 ASSERT_EQ(Status::Success(), |
888 Sign(algorithm, key, CryptoData(test_message), &output)); | 889 Sign(algorithm, key, CryptoData(test_message), &output)); |
889 | 890 |
890 EXPECT_BYTES_EQ(test_mac, output); | 891 EXPECT_BYTES_EQ(test_mac, output); |
891 | 892 |
892 bool signature_match = false; | 893 bool signature_match = false; |
893 EXPECT_EQ(Status::Success(), | 894 EXPECT_EQ(Status::Success(), |
894 Verify(algorithm, | 895 Verify(algorithm, |
895 key, | 896 key, |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
929 } | 930 } |
930 | 931 |
931 TEST_F(SharedCryptoTest, AesCbcFailures) { | 932 TEST_F(SharedCryptoTest, AesCbcFailures) { |
932 const std::string key_hex = "2b7e151628aed2a6abf7158809cf4f3c"; | 933 const std::string key_hex = "2b7e151628aed2a6abf7158809cf4f3c"; |
933 blink::WebCryptoKey key = ImportSecretKeyFromRaw( | 934 blink::WebCryptoKey key = ImportSecretKeyFromRaw( |
934 HexStringToBytes(key_hex), | 935 HexStringToBytes(key_hex), |
935 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc), | 936 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc), |
936 blink::WebCryptoKeyUsageEncrypt | blink::WebCryptoKeyUsageDecrypt); | 937 blink::WebCryptoKeyUsageEncrypt | blink::WebCryptoKeyUsageDecrypt); |
937 | 938 |
938 // Verify exported raw key is identical to the imported data | 939 // Verify exported raw key is identical to the imported data |
939 std::vector<uint8> raw_key; | 940 std::vector<uint8_t> raw_key; |
940 EXPECT_EQ(Status::Success(), | 941 EXPECT_EQ(Status::Success(), |
941 ExportKey(blink::WebCryptoKeyFormatRaw, key, &raw_key)); | 942 ExportKey(blink::WebCryptoKeyFormatRaw, key, &raw_key)); |
942 EXPECT_BYTES_EQ_HEX(key_hex, raw_key); | 943 EXPECT_BYTES_EQ_HEX(key_hex, raw_key); |
943 | 944 |
944 std::vector<uint8> output; | 945 std::vector<uint8_t> output; |
945 | 946 |
946 // Use an invalid |iv| (fewer than 16 bytes) | 947 // Use an invalid |iv| (fewer than 16 bytes) |
947 { | 948 { |
948 std::vector<uint8> input(32); | 949 std::vector<uint8_t> input(32); |
949 std::vector<uint8> iv; | 950 std::vector<uint8_t> iv; |
950 EXPECT_EQ(Status::ErrorIncorrectSizeAesCbcIv(), | 951 EXPECT_EQ(Status::ErrorIncorrectSizeAesCbcIv(), |
951 Encrypt(webcrypto::CreateAesCbcAlgorithm(iv), | 952 Encrypt(webcrypto::CreateAesCbcAlgorithm(iv), |
952 key, | 953 key, |
953 CryptoData(input), | 954 CryptoData(input), |
954 &output)); | 955 &output)); |
955 EXPECT_EQ(Status::ErrorIncorrectSizeAesCbcIv(), | 956 EXPECT_EQ(Status::ErrorIncorrectSizeAesCbcIv(), |
956 Decrypt(webcrypto::CreateAesCbcAlgorithm(iv), | 957 Decrypt(webcrypto::CreateAesCbcAlgorithm(iv), |
957 key, | 958 key, |
958 CryptoData(input), | 959 CryptoData(input), |
959 &output)); | 960 &output)); |
960 } | 961 } |
961 | 962 |
962 // Use an invalid |iv| (more than 16 bytes) | 963 // Use an invalid |iv| (more than 16 bytes) |
963 { | 964 { |
964 std::vector<uint8> input(32); | 965 std::vector<uint8_t> input(32); |
965 std::vector<uint8> iv(17); | 966 std::vector<uint8_t> iv(17); |
966 EXPECT_EQ(Status::ErrorIncorrectSizeAesCbcIv(), | 967 EXPECT_EQ(Status::ErrorIncorrectSizeAesCbcIv(), |
967 Encrypt(webcrypto::CreateAesCbcAlgorithm(iv), | 968 Encrypt(webcrypto::CreateAesCbcAlgorithm(iv), |
968 key, | 969 key, |
969 CryptoData(input), | 970 CryptoData(input), |
970 &output)); | 971 &output)); |
971 EXPECT_EQ(Status::ErrorIncorrectSizeAesCbcIv(), | 972 EXPECT_EQ(Status::ErrorIncorrectSizeAesCbcIv(), |
972 Decrypt(webcrypto::CreateAesCbcAlgorithm(iv), | 973 Decrypt(webcrypto::CreateAesCbcAlgorithm(iv), |
973 key, | 974 key, |
974 CryptoData(input), | 975 CryptoData(input), |
975 &output)); | 976 &output)); |
976 } | 977 } |
977 | 978 |
978 // Give an input that is too large (would cause integer overflow when | 979 // Give an input that is too large (would cause integer overflow when |
979 // narrowing to an int). | 980 // narrowing to an int). |
980 { | 981 { |
981 std::vector<uint8> iv(16); | 982 std::vector<uint8_t> iv(16); |
982 | 983 |
983 // Pretend the input is large. Don't pass data pointer as NULL in case that | 984 // Pretend the input is large. Don't pass data pointer as NULL in case that |
984 // is special cased; the implementation shouldn't actually dereference the | 985 // is special cased; the implementation shouldn't actually dereference the |
985 // data. | 986 // data. |
986 CryptoData input(&iv[0], INT_MAX - 3); | 987 CryptoData input(&iv[0], INT_MAX - 3); |
987 | 988 |
988 EXPECT_EQ(Status::ErrorDataTooLarge(), | 989 EXPECT_EQ(Status::ErrorDataTooLarge(), |
989 Encrypt(CreateAesCbcAlgorithm(iv), key, input, &output)); | 990 Encrypt(CreateAesCbcAlgorithm(iv), key, input, &output)); |
990 EXPECT_EQ(Status::ErrorDataTooLarge(), | 991 EXPECT_EQ(Status::ErrorDataTooLarge(), |
991 Decrypt(CreateAesCbcAlgorithm(iv), key, input, &output)); | 992 Decrypt(CreateAesCbcAlgorithm(iv), key, input, &output)); |
992 } | 993 } |
993 | 994 |
994 // Fail importing the key (too few bytes specified) | 995 // Fail importing the key (too few bytes specified) |
995 { | 996 { |
996 std::vector<uint8> key_raw(1); | 997 std::vector<uint8_t> key_raw(1); |
997 std::vector<uint8> iv(16); | 998 std::vector<uint8_t> iv(16); |
998 | 999 |
999 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | 1000 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
1000 EXPECT_EQ(Status::ErrorImportAesKeyLength(), | 1001 EXPECT_EQ(Status::ErrorImportAesKeyLength(), |
1001 ImportKey(blink::WebCryptoKeyFormatRaw, | 1002 ImportKey(blink::WebCryptoKeyFormatRaw, |
1002 CryptoData(key_raw), | 1003 CryptoData(key_raw), |
1003 CreateAesCbcAlgorithm(iv), | 1004 CreateAesCbcAlgorithm(iv), |
1004 true, | 1005 true, |
1005 blink::WebCryptoKeyUsageEncrypt, | 1006 blink::WebCryptoKeyUsageEncrypt, |
1006 &key)); | 1007 &key)); |
1007 } | 1008 } |
(...skipping 19 matching lines...) Expand all Loading... |
1027 | 1028 |
1028 TEST_F(SharedCryptoTest, MAYBE(AesCbcSampleSets)) { | 1029 TEST_F(SharedCryptoTest, MAYBE(AesCbcSampleSets)) { |
1029 scoped_ptr<base::ListValue> tests; | 1030 scoped_ptr<base::ListValue> tests; |
1030 ASSERT_TRUE(ReadJsonTestFileToList("aes_cbc.json", &tests)); | 1031 ASSERT_TRUE(ReadJsonTestFileToList("aes_cbc.json", &tests)); |
1031 | 1032 |
1032 for (size_t test_index = 0; test_index < tests->GetSize(); ++test_index) { | 1033 for (size_t test_index = 0; test_index < tests->GetSize(); ++test_index) { |
1033 SCOPED_TRACE(test_index); | 1034 SCOPED_TRACE(test_index); |
1034 base::DictionaryValue* test; | 1035 base::DictionaryValue* test; |
1035 ASSERT_TRUE(tests->GetDictionary(test_index, &test)); | 1036 ASSERT_TRUE(tests->GetDictionary(test_index, &test)); |
1036 | 1037 |
1037 std::vector<uint8> test_key = GetBytesFromHexString(test, "key"); | 1038 std::vector<uint8_t> test_key = GetBytesFromHexString(test, "key"); |
1038 std::vector<uint8> test_iv = GetBytesFromHexString(test, "iv"); | 1039 std::vector<uint8_t> test_iv = GetBytesFromHexString(test, "iv"); |
1039 std::vector<uint8> test_plain_text = | 1040 std::vector<uint8_t> test_plain_text = |
1040 GetBytesFromHexString(test, "plain_text"); | 1041 GetBytesFromHexString(test, "plain_text"); |
1041 std::vector<uint8> test_cipher_text = | 1042 std::vector<uint8_t> test_cipher_text = |
1042 GetBytesFromHexString(test, "cipher_text"); | 1043 GetBytesFromHexString(test, "cipher_text"); |
1043 | 1044 |
1044 blink::WebCryptoKey key = ImportSecretKeyFromRaw( | 1045 blink::WebCryptoKey key = ImportSecretKeyFromRaw( |
1045 test_key, | 1046 test_key, |
1046 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc), | 1047 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc), |
1047 blink::WebCryptoKeyUsageEncrypt | blink::WebCryptoKeyUsageDecrypt); | 1048 blink::WebCryptoKeyUsageEncrypt | blink::WebCryptoKeyUsageDecrypt); |
1048 | 1049 |
1049 EXPECT_EQ(test_key.size() * 8, key.algorithm().aesParams()->lengthBits()); | 1050 EXPECT_EQ(test_key.size() * 8, key.algorithm().aesParams()->lengthBits()); |
1050 | 1051 |
1051 // Verify exported raw key is identical to the imported data | 1052 // Verify exported raw key is identical to the imported data |
1052 std::vector<uint8> raw_key; | 1053 std::vector<uint8_t> raw_key; |
1053 EXPECT_EQ(Status::Success(), | 1054 EXPECT_EQ(Status::Success(), |
1054 ExportKey(blink::WebCryptoKeyFormatRaw, key, &raw_key)); | 1055 ExportKey(blink::WebCryptoKeyFormatRaw, key, &raw_key)); |
1055 EXPECT_BYTES_EQ(test_key, raw_key); | 1056 EXPECT_BYTES_EQ(test_key, raw_key); |
1056 | 1057 |
1057 std::vector<uint8> output; | 1058 std::vector<uint8_t> output; |
1058 | 1059 |
1059 // Test encryption. | 1060 // Test encryption. |
1060 EXPECT_EQ(Status::Success(), | 1061 EXPECT_EQ(Status::Success(), |
1061 Encrypt(webcrypto::CreateAesCbcAlgorithm(test_iv), | 1062 Encrypt(webcrypto::CreateAesCbcAlgorithm(test_iv), |
1062 key, | 1063 key, |
1063 CryptoData(test_plain_text), | 1064 CryptoData(test_plain_text), |
1064 &output)); | 1065 &output)); |
1065 EXPECT_BYTES_EQ(test_cipher_text, output); | 1066 EXPECT_BYTES_EQ(test_cipher_text, output); |
1066 | 1067 |
1067 // Test decryption. | 1068 // Test decryption. |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1103 // allowed key length. | 1104 // allowed key length. |
1104 std::vector<blink::WebCryptoAlgorithm> algorithm; | 1105 std::vector<blink::WebCryptoAlgorithm> algorithm; |
1105 const unsigned short kKeyLength[] = {128, 256}; | 1106 const unsigned short kKeyLength[] = {128, 256}; |
1106 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kKeyLength); ++i) { | 1107 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kKeyLength); ++i) { |
1107 algorithm.push_back(CreateAesCbcKeyGenAlgorithm(kKeyLength[i])); | 1108 algorithm.push_back(CreateAesCbcKeyGenAlgorithm(kKeyLength[i])); |
1108 algorithm.push_back(CreateAesKwKeyGenAlgorithm(kKeyLength[i])); | 1109 algorithm.push_back(CreateAesKwKeyGenAlgorithm(kKeyLength[i])); |
1109 if (SupportsAesGcm()) | 1110 if (SupportsAesGcm()) |
1110 algorithm.push_back(CreateAesGcmKeyGenAlgorithm(kKeyLength[i])); | 1111 algorithm.push_back(CreateAesGcmKeyGenAlgorithm(kKeyLength[i])); |
1111 } | 1112 } |
1112 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | 1113 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
1113 std::vector<std::vector<uint8> > keys; | 1114 std::vector<std::vector<uint8_t> > keys; |
1114 std::vector<uint8> key_bytes; | 1115 std::vector<uint8_t> key_bytes; |
1115 for (size_t i = 0; i < algorithm.size(); ++i) { | 1116 for (size_t i = 0; i < algorithm.size(); ++i) { |
1116 SCOPED_TRACE(i); | 1117 SCOPED_TRACE(i); |
1117 // Generate a small sample of keys. | 1118 // Generate a small sample of keys. |
1118 keys.clear(); | 1119 keys.clear(); |
1119 for (int j = 0; j < 16; ++j) { | 1120 for (int j = 0; j < 16; ++j) { |
1120 ASSERT_EQ(Status::Success(), | 1121 ASSERT_EQ(Status::Success(), |
1121 GenerateSecretKey(algorithm[i], true, 0, &key)); | 1122 GenerateSecretKey(algorithm[i], true, 0, &key)); |
1122 EXPECT_TRUE(key.handle()); | 1123 EXPECT_TRUE(key.handle()); |
1123 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type()); | 1124 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type()); |
1124 ASSERT_EQ(Status::Success(), | 1125 ASSERT_EQ(Status::Success(), |
(...skipping 22 matching lines...) Expand all Loading... |
1147 if (SupportsAesGcm()) { | 1148 if (SupportsAesGcm()) { |
1148 EXPECT_EQ(Status::ErrorGenerateKeyLength(), | 1149 EXPECT_EQ(Status::ErrorGenerateKeyLength(), |
1149 GenerateSecretKey( | 1150 GenerateSecretKey( |
1150 CreateAesGcmKeyGenAlgorithm(kKeyLen[i]), true, 0, &key)); | 1151 CreateAesGcmKeyGenAlgorithm(kKeyLen[i]), true, 0, &key)); |
1151 } | 1152 } |
1152 } | 1153 } |
1153 } | 1154 } |
1154 | 1155 |
1155 TEST_F(SharedCryptoTest, MAYBE(GenerateKeyHmac)) { | 1156 TEST_F(SharedCryptoTest, MAYBE(GenerateKeyHmac)) { |
1156 // Generate a small sample of HMAC keys. | 1157 // Generate a small sample of HMAC keys. |
1157 std::vector<std::vector<uint8> > keys; | 1158 std::vector<std::vector<uint8_t> > keys; |
1158 for (int i = 0; i < 16; ++i) { | 1159 for (int i = 0; i < 16; ++i) { |
1159 std::vector<uint8> key_bytes; | 1160 std::vector<uint8_t> key_bytes; |
1160 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | 1161 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
1161 blink::WebCryptoAlgorithm algorithm = | 1162 blink::WebCryptoAlgorithm algorithm = |
1162 CreateHmacKeyGenAlgorithm(blink::WebCryptoAlgorithmIdSha1, 512); | 1163 CreateHmacKeyGenAlgorithm(blink::WebCryptoAlgorithmIdSha1, 512); |
1163 ASSERT_EQ(Status::Success(), GenerateSecretKey(algorithm, true, 0, &key)); | 1164 ASSERT_EQ(Status::Success(), GenerateSecretKey(algorithm, true, 0, &key)); |
1164 EXPECT_FALSE(key.isNull()); | 1165 EXPECT_FALSE(key.isNull()); |
1165 EXPECT_TRUE(key.handle()); | 1166 EXPECT_TRUE(key.handle()); |
1166 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type()); | 1167 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type()); |
1167 EXPECT_EQ(blink::WebCryptoAlgorithmIdHmac, key.algorithm().id()); | 1168 EXPECT_EQ(blink::WebCryptoAlgorithmIdHmac, key.algorithm().id()); |
1168 EXPECT_EQ(blink::WebCryptoAlgorithmIdSha1, | 1169 EXPECT_EQ(blink::WebCryptoAlgorithmIdSha1, |
1169 key.algorithm().hmacParams()->hash().id()); | 1170 key.algorithm().hmacParams()->hash().id()); |
1170 EXPECT_EQ(512u, key.algorithm().hmacParams()->lengthBits()); | 1171 EXPECT_EQ(512u, key.algorithm().hmacParams()->lengthBits()); |
1171 | 1172 |
1172 std::vector<uint8> raw_key; | 1173 std::vector<uint8_t> raw_key; |
1173 ASSERT_EQ(Status::Success(), | 1174 ASSERT_EQ(Status::Success(), |
1174 ExportKey(blink::WebCryptoKeyFormatRaw, key, &raw_key)); | 1175 ExportKey(blink::WebCryptoKeyFormatRaw, key, &raw_key)); |
1175 EXPECT_EQ(64U, raw_key.size()); | 1176 EXPECT_EQ(64U, raw_key.size()); |
1176 keys.push_back(raw_key); | 1177 keys.push_back(raw_key); |
1177 } | 1178 } |
1178 // Ensure all entries in the key sample set are unique. This is a simplistic | 1179 // Ensure all entries in the key sample set are unique. This is a simplistic |
1179 // estimate of whether the generated keys appear random. | 1180 // estimate of whether the generated keys appear random. |
1180 EXPECT_FALSE(CopiesExist(keys)); | 1181 EXPECT_FALSE(CopiesExist(keys)); |
1181 } | 1182 } |
1182 | 1183 |
1183 // If the key length is not provided, then the block size is used. | 1184 // If the key length is not provided, then the block size is used. |
1184 TEST_F(SharedCryptoTest, MAYBE(GenerateKeyHmacNoLength)) { | 1185 TEST_F(SharedCryptoTest, MAYBE(GenerateKeyHmacNoLength)) { |
1185 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | 1186 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
1186 blink::WebCryptoAlgorithm algorithm = | 1187 blink::WebCryptoAlgorithm algorithm = |
1187 CreateHmacKeyGenAlgorithm(blink::WebCryptoAlgorithmIdSha1, 0); | 1188 CreateHmacKeyGenAlgorithm(blink::WebCryptoAlgorithmIdSha1, 0); |
1188 ASSERT_EQ(Status::Success(), GenerateSecretKey(algorithm, true, 0, &key)); | 1189 ASSERT_EQ(Status::Success(), GenerateSecretKey(algorithm, true, 0, &key)); |
1189 EXPECT_TRUE(key.handle()); | 1190 EXPECT_TRUE(key.handle()); |
1190 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type()); | 1191 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type()); |
1191 EXPECT_EQ(blink::WebCryptoAlgorithmIdHmac, key.algorithm().id()); | 1192 EXPECT_EQ(blink::WebCryptoAlgorithmIdHmac, key.algorithm().id()); |
1192 EXPECT_EQ(blink::WebCryptoAlgorithmIdSha1, | 1193 EXPECT_EQ(blink::WebCryptoAlgorithmIdSha1, |
1193 key.algorithm().hmacParams()->hash().id()); | 1194 key.algorithm().hmacParams()->hash().id()); |
1194 EXPECT_EQ(512u, key.algorithm().hmacParams()->lengthBits()); | 1195 EXPECT_EQ(512u, key.algorithm().hmacParams()->lengthBits()); |
1195 std::vector<uint8> raw_key; | 1196 std::vector<uint8_t> raw_key; |
1196 ASSERT_EQ(Status::Success(), | 1197 ASSERT_EQ(Status::Success(), |
1197 ExportKey(blink::WebCryptoKeyFormatRaw, key, &raw_key)); | 1198 ExportKey(blink::WebCryptoKeyFormatRaw, key, &raw_key)); |
1198 EXPECT_EQ(64U, raw_key.size()); | 1199 EXPECT_EQ(64U, raw_key.size()); |
1199 | 1200 |
1200 // The block size for HMAC SHA-512 is larger. | 1201 // The block size for HMAC SHA-512 is larger. |
1201 algorithm = CreateHmacKeyGenAlgorithm(blink::WebCryptoAlgorithmIdSha512, 0); | 1202 algorithm = CreateHmacKeyGenAlgorithm(blink::WebCryptoAlgorithmIdSha512, 0); |
1202 ASSERT_EQ(Status::Success(), GenerateSecretKey(algorithm, true, 0, &key)); | 1203 ASSERT_EQ(Status::Success(), GenerateSecretKey(algorithm, true, 0, &key)); |
1203 EXPECT_EQ(blink::WebCryptoAlgorithmIdHmac, key.algorithm().id()); | 1204 EXPECT_EQ(blink::WebCryptoAlgorithmIdHmac, key.algorithm().id()); |
1204 EXPECT_EQ(blink::WebCryptoAlgorithmIdSha512, | 1205 EXPECT_EQ(blink::WebCryptoAlgorithmIdSha512, |
1205 key.algorithm().hmacParams()->hash().id()); | 1206 key.algorithm().hmacParams()->hash().id()); |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1361 EXPECT_EQ(Status::Success(), | 1362 EXPECT_EQ(Status::Success(), |
1362 ImportKeyJwkFromDict(dict, algorithm, false, usage_mask, &key)); | 1363 ImportKeyJwkFromDict(dict, algorithm, false, usage_mask, &key)); |
1363 | 1364 |
1364 // Fail on empty JSON. | 1365 // Fail on empty JSON. |
1365 EXPECT_EQ( | 1366 EXPECT_EQ( |
1366 Status::ErrorImportEmptyKeyData(), | 1367 Status::ErrorImportEmptyKeyData(), |
1367 ImportKeyJwk( | 1368 ImportKeyJwk( |
1368 CryptoData(MakeJsonVector("")), algorithm, false, usage_mask, &key)); | 1369 CryptoData(MakeJsonVector("")), algorithm, false, usage_mask, &key)); |
1369 | 1370 |
1370 // Fail on invalid JSON. | 1371 // Fail on invalid JSON. |
1371 const std::vector<uint8> bad_json_vec = MakeJsonVector( | 1372 const std::vector<uint8_t> bad_json_vec = MakeJsonVector( |
1372 "{" | 1373 "{" |
1373 "\"kty\" : \"oct\"," | 1374 "\"kty\" : \"oct\"," |
1374 "\"alg\" : \"HS256\"," | 1375 "\"alg\" : \"HS256\"," |
1375 "\"use\" : "); | 1376 "\"use\" : "); |
1376 EXPECT_EQ(Status::ErrorJwkNotDictionary(), | 1377 EXPECT_EQ(Status::ErrorJwkNotDictionary(), |
1377 ImportKeyJwk( | 1378 ImportKeyJwk( |
1378 CryptoData(bad_json_vec), algorithm, false, usage_mask, &key)); | 1379 CryptoData(bad_json_vec), algorithm, false, usage_mask, &key)); |
1379 | 1380 |
1380 // Fail on JWK alg present but incorrect (expecting A128CBC). | 1381 // Fail on JWK alg present but incorrect (expecting A128CBC). |
1381 dict.SetString("alg", "A127CBC"); | 1382 dict.SetString("alg", "A127CBC"); |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1591 blink::WebCryptoKey public_key = blink::WebCryptoKey::createNull(); | 1592 blink::WebCryptoKey public_key = blink::WebCryptoKey::createNull(); |
1592 ASSERT_EQ(Status::Success(), | 1593 ASSERT_EQ(Status::Success(), |
1593 ImportKey(blink::WebCryptoKeyFormatSpki, | 1594 ImportKey(blink::WebCryptoKeyFormatSpki, |
1594 CryptoData(HexStringToBytes(kPublicKeySpkiDerHex)), | 1595 CryptoData(HexStringToBytes(kPublicKeySpkiDerHex)), |
1595 test.algorithm, | 1596 test.algorithm, |
1596 true, | 1597 true, |
1597 test.usage, | 1598 test.usage, |
1598 &public_key)); | 1599 &public_key)); |
1599 | 1600 |
1600 // Export the public key as JWK and verify its contents | 1601 // Export the public key as JWK and verify its contents |
1601 std::vector<uint8> jwk; | 1602 std::vector<uint8_t> jwk; |
1602 ASSERT_EQ(Status::Success(), | 1603 ASSERT_EQ(Status::Success(), |
1603 ExportKey(blink::WebCryptoKeyFormatJwk, public_key, &jwk)); | 1604 ExportKey(blink::WebCryptoKeyFormatJwk, public_key, &jwk)); |
1604 EXPECT_TRUE(VerifyPublicJwk(jwk, | 1605 EXPECT_TRUE(VerifyPublicJwk(jwk, |
1605 test.jwk_alg, | 1606 test.jwk_alg, |
1606 kPublicKeyModulusHex, | 1607 kPublicKeyModulusHex, |
1607 kPublicKeyExponentHex, | 1608 kPublicKeyExponentHex, |
1608 test.usage)); | 1609 test.usage)); |
1609 | 1610 |
1610 // Import the JWK back in to create a new key | 1611 // Import the JWK back in to create a new key |
1611 blink::WebCryptoKey public_key2 = blink::WebCryptoKey::createNull(); | 1612 blink::WebCryptoKey public_key2 = blink::WebCryptoKey::createNull(); |
1612 ASSERT_EQ( | 1613 ASSERT_EQ( |
1613 Status::Success(), | 1614 Status::Success(), |
1614 ImportKeyJwk( | 1615 ImportKeyJwk( |
1615 CryptoData(jwk), test.algorithm, true, test.usage, &public_key2)); | 1616 CryptoData(jwk), test.algorithm, true, test.usage, &public_key2)); |
1616 ASSERT_TRUE(public_key2.handle()); | 1617 ASSERT_TRUE(public_key2.handle()); |
1617 EXPECT_EQ(blink::WebCryptoKeyTypePublic, public_key2.type()); | 1618 EXPECT_EQ(blink::WebCryptoKeyTypePublic, public_key2.type()); |
1618 EXPECT_TRUE(public_key2.extractable()); | 1619 EXPECT_TRUE(public_key2.extractable()); |
1619 EXPECT_EQ(test.algorithm.id(), public_key2.algorithm().id()); | 1620 EXPECT_EQ(test.algorithm.id(), public_key2.algorithm().id()); |
1620 | 1621 |
1621 // Only perform SPKI consistency test for RSA-SSA as its | 1622 // Only perform SPKI consistency test for RSA-SSA as its |
1622 // export format is the same as kPublicKeySpkiDerHex | 1623 // export format is the same as kPublicKeySpkiDerHex |
1623 if (test.algorithm.id() == blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5) { | 1624 if (test.algorithm.id() == blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5) { |
1624 // Export the new key as spki and compare to the original. | 1625 // Export the new key as spki and compare to the original. |
1625 std::vector<uint8> spki; | 1626 std::vector<uint8_t> spki; |
1626 ASSERT_EQ(Status::Success(), | 1627 ASSERT_EQ(Status::Success(), |
1627 ExportKey(blink::WebCryptoKeyFormatSpki, public_key2, &spki)); | 1628 ExportKey(blink::WebCryptoKeyFormatSpki, public_key2, &spki)); |
1628 EXPECT_BYTES_EQ_HEX(kPublicKeySpkiDerHex, CryptoData(spki)); | 1629 EXPECT_BYTES_EQ_HEX(kPublicKeySpkiDerHex, CryptoData(spki)); |
1629 } | 1630 } |
1630 } | 1631 } |
1631 } | 1632 } |
1632 | 1633 |
1633 TEST_F(SharedCryptoTest, MAYBE(ImportJwkRsaFailures)) { | 1634 TEST_F(SharedCryptoTest, MAYBE(ImportJwkRsaFailures)) { |
1634 base::DictionaryValue dict; | 1635 base::DictionaryValue dict; |
1635 RestoreJwkRsaDictionary(&dict); | 1636 RestoreJwkRsaDictionary(&dict); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1684 | 1685 |
1685 // Consistency rules when JWK value is not present: Inputs should be used. | 1686 // Consistency rules when JWK value is not present: Inputs should be used. |
1686 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | 1687 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
1687 bool extractable = false; | 1688 bool extractable = false; |
1688 blink::WebCryptoAlgorithm algorithm = | 1689 blink::WebCryptoAlgorithm algorithm = |
1689 CreateHmacImportAlgorithm(blink::WebCryptoAlgorithmIdSha256); | 1690 CreateHmacImportAlgorithm(blink::WebCryptoAlgorithmIdSha256); |
1690 blink::WebCryptoKeyUsageMask usage_mask = blink::WebCryptoKeyUsageVerify; | 1691 blink::WebCryptoKeyUsageMask usage_mask = blink::WebCryptoKeyUsageVerify; |
1691 base::DictionaryValue dict; | 1692 base::DictionaryValue dict; |
1692 dict.SetString("kty", "oct"); | 1693 dict.SetString("kty", "oct"); |
1693 dict.SetString("k", "l3nZEgZCeX8XRwJdWyK3rGB8qwjhdY8vOkbIvh4lxTuMao9Y_--hdg"); | 1694 dict.SetString("k", "l3nZEgZCeX8XRwJdWyK3rGB8qwjhdY8vOkbIvh4lxTuMao9Y_--hdg"); |
1694 std::vector<uint8> json_vec = MakeJsonVector(dict); | 1695 std::vector<uint8_t> json_vec = MakeJsonVector(dict); |
1695 EXPECT_EQ( | 1696 EXPECT_EQ( |
1696 Status::Success(), | 1697 Status::Success(), |
1697 ImportKeyJwk( | 1698 ImportKeyJwk( |
1698 CryptoData(json_vec), algorithm, extractable, usage_mask, &key)); | 1699 CryptoData(json_vec), algorithm, extractable, usage_mask, &key)); |
1699 EXPECT_TRUE(key.handle()); | 1700 EXPECT_TRUE(key.handle()); |
1700 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type()); | 1701 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type()); |
1701 EXPECT_EQ(extractable, key.extractable()); | 1702 EXPECT_EQ(extractable, key.extractable()); |
1702 EXPECT_EQ(blink::WebCryptoAlgorithmIdHmac, key.algorithm().id()); | 1703 EXPECT_EQ(blink::WebCryptoAlgorithmIdHmac, key.algorithm().id()); |
1703 EXPECT_EQ(blink::WebCryptoAlgorithmIdSha256, | 1704 EXPECT_EQ(blink::WebCryptoAlgorithmIdSha256, |
1704 key.algorithm().hmacParams()->hash().id()); | 1705 key.algorithm().hmacParams()->hash().id()); |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1831 dict.SetBoolean("ext", false); | 1832 dict.SetBoolean("ext", false); |
1832 dict.SetString("k", "l3nZEgZCeX8XRwJdWyK3rGB8qwjhdY8vOkbIvh4lxTuMao9Y_--hdg"); | 1833 dict.SetString("k", "l3nZEgZCeX8XRwJdWyK3rGB8qwjhdY8vOkbIvh4lxTuMao9Y_--hdg"); |
1833 | 1834 |
1834 ASSERT_EQ( | 1835 ASSERT_EQ( |
1835 Status::Success(), | 1836 Status::Success(), |
1836 ImportKeyJwkFromDict(dict, algorithm, extractable, usage_mask, &key)); | 1837 ImportKeyJwkFromDict(dict, algorithm, extractable, usage_mask, &key)); |
1837 | 1838 |
1838 EXPECT_EQ(blink::WebCryptoAlgorithmIdSha256, | 1839 EXPECT_EQ(blink::WebCryptoAlgorithmIdSha256, |
1839 key.algorithm().hmacParams()->hash().id()); | 1840 key.algorithm().hmacParams()->hash().id()); |
1840 | 1841 |
1841 const std::vector<uint8> message_raw = HexStringToBytes( | 1842 const std::vector<uint8_t> message_raw = HexStringToBytes( |
1842 "b1689c2591eaf3c9e66070f8a77954ffb81749f1b00346f9dfe0b2ee905dcc288baf4a" | 1843 "b1689c2591eaf3c9e66070f8a77954ffb81749f1b00346f9dfe0b2ee905dcc288baf4a" |
1843 "92de3f4001dd9f44c468c3d07d6c6ee82faceafc97c2fc0fc0601719d2dcd0aa2aec92" | 1844 "92de3f4001dd9f44c468c3d07d6c6ee82faceafc97c2fc0fc0601719d2dcd0aa2aec92" |
1844 "d1b0ae933c65eb06a03c9c935c2bad0459810241347ab87e9f11adb30415424c6c7f5f" | 1845 "d1b0ae933c65eb06a03c9c935c2bad0459810241347ab87e9f11adb30415424c6c7f5f" |
1845 "22a003b8ab8de54f6ded0e3ab9245fa79568451dfa258e"); | 1846 "22a003b8ab8de54f6ded0e3ab9245fa79568451dfa258e"); |
1846 | 1847 |
1847 std::vector<uint8> output; | 1848 std::vector<uint8_t> output; |
1848 | 1849 |
1849 ASSERT_EQ(Status::Success(), | 1850 ASSERT_EQ(Status::Success(), |
1850 Sign(CreateAlgorithm(blink::WebCryptoAlgorithmIdHmac), | 1851 Sign(CreateAlgorithm(blink::WebCryptoAlgorithmIdHmac), |
1851 key, | 1852 key, |
1852 CryptoData(message_raw), | 1853 CryptoData(message_raw), |
1853 &output)); | 1854 &output)); |
1854 | 1855 |
1855 const std::string mac_raw = | 1856 const std::string mac_raw = |
1856 "769f00d3e6a6cc1fb426a14a4f76c6462e6149726e0dee0ec0cf97a16605ac8b"; | 1857 "769f00d3e6a6cc1fb426a14a4f76c6462e6149726e0dee0ec0cf97a16605ac8b"; |
1857 | 1858 |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1928 blink::WebCryptoKeyUsageEncrypt | blink::WebCryptoKeyUsageDecrypt | | 1929 blink::WebCryptoKeyUsageEncrypt | blink::WebCryptoKeyUsageDecrypt | |
1929 blink::WebCryptoKeyUsageWrapKey | blink::WebCryptoKeyUsageUnwrapKey, | 1930 blink::WebCryptoKeyUsageWrapKey | blink::WebCryptoKeyUsageUnwrapKey, |
1930 "A256CBC"}, | 1931 "A256CBC"}, |
1931 // Zero usage value | 1932 // Zero usage value |
1932 {key_hex_512, hmac_sha_512_alg, 0, "HS512"}, | 1933 {key_hex_512, hmac_sha_512_alg, 0, "HS512"}, |
1933 }; | 1934 }; |
1934 | 1935 |
1935 // Round-trip import/export each key. | 1936 // Round-trip import/export each key. |
1936 | 1937 |
1937 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | 1938 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
1938 std::vector<uint8> json; | 1939 std::vector<uint8_t> json; |
1939 for (size_t test_index = 0; test_index < ARRAYSIZE_UNSAFE(kTests); | 1940 for (size_t test_index = 0; test_index < ARRAYSIZE_UNSAFE(kTests); |
1940 ++test_index) { | 1941 ++test_index) { |
1941 SCOPED_TRACE(test_index); | 1942 SCOPED_TRACE(test_index); |
1942 const TestCase& test = kTests[test_index]; | 1943 const TestCase& test = kTests[test_index]; |
1943 | 1944 |
1944 // Skip AES-GCM tests where not supported. | 1945 // Skip AES-GCM tests where not supported. |
1945 if (test.algorithm.id() == blink::WebCryptoAlgorithmIdAesGcm && | 1946 if (test.algorithm.id() == blink::WebCryptoAlgorithmIdAesGcm && |
1946 !SupportsAesGcm()) { | 1947 !SupportsAesGcm()) { |
1947 continue; | 1948 continue; |
1948 } | 1949 } |
(...skipping 11 matching lines...) Expand all Loading... |
1960 ASSERT_EQ( | 1961 ASSERT_EQ( |
1961 Status::Success(), | 1962 Status::Success(), |
1962 ImportKeyJwk(CryptoData(json), test.algorithm, true, test.usage, &key)); | 1963 ImportKeyJwk(CryptoData(json), test.algorithm, true, test.usage, &key)); |
1963 EXPECT_TRUE(key.handle()); | 1964 EXPECT_TRUE(key.handle()); |
1964 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type()); | 1965 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type()); |
1965 EXPECT_EQ(test.algorithm.id(), key.algorithm().id()); | 1966 EXPECT_EQ(test.algorithm.id(), key.algorithm().id()); |
1966 EXPECT_EQ(true, key.extractable()); | 1967 EXPECT_EQ(true, key.extractable()); |
1967 EXPECT_EQ(test.usage, key.usages()); | 1968 EXPECT_EQ(test.usage, key.usages()); |
1968 | 1969 |
1969 // Export the key in raw format and compare to the original. | 1970 // Export the key in raw format and compare to the original. |
1970 std::vector<uint8> key_raw_out; | 1971 std::vector<uint8_t> key_raw_out; |
1971 ASSERT_EQ(Status::Success(), | 1972 ASSERT_EQ(Status::Success(), |
1972 ExportKey(blink::WebCryptoKeyFormatRaw, key, &key_raw_out)); | 1973 ExportKey(blink::WebCryptoKeyFormatRaw, key, &key_raw_out)); |
1973 EXPECT_BYTES_EQ_HEX(test.key_hex, key_raw_out); | 1974 EXPECT_BYTES_EQ_HEX(test.key_hex, key_raw_out); |
1974 } | 1975 } |
1975 } | 1976 } |
1976 | 1977 |
1977 TEST_F(SharedCryptoTest, MAYBE(ExportJwkEmptySymmetricKey)) { | 1978 TEST_F(SharedCryptoTest, MAYBE(ExportJwkEmptySymmetricKey)) { |
1978 const blink::WebCryptoAlgorithm import_algorithm = | 1979 const blink::WebCryptoAlgorithm import_algorithm = |
1979 webcrypto::CreateHmacImportAlgorithm(blink::WebCryptoAlgorithmIdSha1); | 1980 webcrypto::CreateHmacImportAlgorithm(blink::WebCryptoAlgorithmIdSha1); |
1980 | 1981 |
1981 blink::WebCryptoKeyUsageMask usages = blink::WebCryptoKeyUsageSign; | 1982 blink::WebCryptoKeyUsageMask usages = blink::WebCryptoKeyUsageSign; |
1982 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | 1983 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
1983 | 1984 |
1984 // Import a zero-byte HMAC key. | 1985 // Import a zero-byte HMAC key. |
1985 const char key_data_hex[] = ""; | 1986 const char key_data_hex[] = ""; |
1986 key = ImportSecretKeyFromRaw( | 1987 key = ImportSecretKeyFromRaw( |
1987 HexStringToBytes(key_data_hex), import_algorithm, usages); | 1988 HexStringToBytes(key_data_hex), import_algorithm, usages); |
1988 EXPECT_EQ(0u, key.algorithm().hmacParams()->lengthBits()); | 1989 EXPECT_EQ(0u, key.algorithm().hmacParams()->lengthBits()); |
1989 | 1990 |
1990 // Export the key in JWK format and validate. | 1991 // Export the key in JWK format and validate. |
1991 std::vector<uint8> json; | 1992 std::vector<uint8_t> json; |
1992 ASSERT_EQ(Status::Success(), | 1993 ASSERT_EQ(Status::Success(), |
1993 ExportKey(blink::WebCryptoKeyFormatJwk, key, &json)); | 1994 ExportKey(blink::WebCryptoKeyFormatJwk, key, &json)); |
1994 EXPECT_TRUE(VerifySecretJwk(json, "HS1", key_data_hex, usages)); | 1995 EXPECT_TRUE(VerifySecretJwk(json, "HS1", key_data_hex, usages)); |
1995 | 1996 |
1996 // Now try re-importing the JWK key. | 1997 // Now try re-importing the JWK key. |
1997 key = blink::WebCryptoKey::createNull(); | 1998 key = blink::WebCryptoKey::createNull(); |
1998 EXPECT_EQ(Status::Success(), | 1999 EXPECT_EQ(Status::Success(), |
1999 ImportKey(blink::WebCryptoKeyFormatJwk, | 2000 ImportKey(blink::WebCryptoKeyFormatJwk, |
2000 CryptoData(json), | 2001 CryptoData(json), |
2001 import_algorithm, | 2002 import_algorithm, |
2002 true, | 2003 true, |
2003 usages, | 2004 usages, |
2004 &key)); | 2005 &key)); |
2005 | 2006 |
2006 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type()); | 2007 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type()); |
2007 EXPECT_EQ(0u, key.algorithm().hmacParams()->lengthBits()); | 2008 EXPECT_EQ(0u, key.algorithm().hmacParams()->lengthBits()); |
2008 | 2009 |
2009 std::vector<uint8> exported_key_data; | 2010 std::vector<uint8_t> exported_key_data; |
2010 EXPECT_EQ(Status::Success(), | 2011 EXPECT_EQ(Status::Success(), |
2011 ExportKey(blink::WebCryptoKeyFormatRaw, key, &exported_key_data)); | 2012 ExportKey(blink::WebCryptoKeyFormatRaw, key, &exported_key_data)); |
2012 | 2013 |
2013 EXPECT_EQ(0u, exported_key_data.size()); | 2014 EXPECT_EQ(0u, exported_key_data.size()); |
2014 } | 2015 } |
2015 | 2016 |
2016 TEST_F(SharedCryptoTest, MAYBE(ImportExportSpki)) { | 2017 TEST_F(SharedCryptoTest, MAYBE(ImportExportSpki)) { |
2017 if (!SupportsRsaKeyImport()) | 2018 if (!SupportsRsaKeyImport()) |
2018 return; | 2019 return; |
2019 | 2020 |
(...skipping 15 matching lines...) Expand all Loading... |
2035 EXPECT_EQ(kModulusLengthBits, | 2036 EXPECT_EQ(kModulusLengthBits, |
2036 key.algorithm().rsaHashedParams()->modulusLengthBits()); | 2037 key.algorithm().rsaHashedParams()->modulusLengthBits()); |
2037 EXPECT_BYTES_EQ_HEX( | 2038 EXPECT_BYTES_EQ_HEX( |
2038 "010001", | 2039 "010001", |
2039 CryptoData(key.algorithm().rsaHashedParams()->publicExponent())); | 2040 CryptoData(key.algorithm().rsaHashedParams()->publicExponent())); |
2040 | 2041 |
2041 // Failing case: Empty SPKI data | 2042 // Failing case: Empty SPKI data |
2042 EXPECT_EQ( | 2043 EXPECT_EQ( |
2043 Status::ErrorImportEmptyKeyData(), | 2044 Status::ErrorImportEmptyKeyData(), |
2044 ImportKey(blink::WebCryptoKeyFormatSpki, | 2045 ImportKey(blink::WebCryptoKeyFormatSpki, |
2045 CryptoData(std::vector<uint8>()), | 2046 CryptoData(std::vector<uint8_t>()), |
2046 CreateAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5), | 2047 CreateAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5), |
2047 true, | 2048 true, |
2048 blink::WebCryptoKeyUsageVerify, | 2049 blink::WebCryptoKeyUsageVerify, |
2049 &key)); | 2050 &key)); |
2050 | 2051 |
2051 // Failing case: Bad DER encoding. | 2052 // Failing case: Bad DER encoding. |
2052 EXPECT_EQ( | 2053 EXPECT_EQ( |
2053 Status::DataError(), | 2054 Status::DataError(), |
2054 ImportKey(blink::WebCryptoKeyFormatSpki, | 2055 ImportKey(blink::WebCryptoKeyFormatSpki, |
2055 CryptoData(HexStringToBytes("618333c4cb")), | 2056 CryptoData(HexStringToBytes("618333c4cb")), |
2056 CreateAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5), | 2057 CreateAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5), |
2057 true, | 2058 true, |
2058 blink::WebCryptoKeyUsageVerify, | 2059 blink::WebCryptoKeyUsageVerify, |
2059 &key)); | 2060 &key)); |
2060 | 2061 |
2061 // Failing case: Import RSA key but provide an inconsistent input algorithm. | 2062 // Failing case: Import RSA key but provide an inconsistent input algorithm. |
2062 EXPECT_EQ(Status::ErrorUnsupportedImportKeyFormat(), | 2063 EXPECT_EQ(Status::ErrorUnsupportedImportKeyFormat(), |
2063 ImportKey(blink::WebCryptoKeyFormatSpki, | 2064 ImportKey(blink::WebCryptoKeyFormatSpki, |
2064 CryptoData(HexStringToBytes(kPublicKeySpkiDerHex)), | 2065 CryptoData(HexStringToBytes(kPublicKeySpkiDerHex)), |
2065 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc), | 2066 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc), |
2066 true, | 2067 true, |
2067 blink::WebCryptoKeyUsageEncrypt, | 2068 blink::WebCryptoKeyUsageEncrypt, |
2068 &key)); | 2069 &key)); |
2069 | 2070 |
2070 // Passing case: Export a previously imported RSA public key in SPKI format | 2071 // Passing case: Export a previously imported RSA public key in SPKI format |
2071 // and compare to original data. | 2072 // and compare to original data. |
2072 std::vector<uint8> output; | 2073 std::vector<uint8_t> output; |
2073 ASSERT_EQ(Status::Success(), | 2074 ASSERT_EQ(Status::Success(), |
2074 ExportKey(blink::WebCryptoKeyFormatSpki, key, &output)); | 2075 ExportKey(blink::WebCryptoKeyFormatSpki, key, &output)); |
2075 EXPECT_BYTES_EQ_HEX(kPublicKeySpkiDerHex, output); | 2076 EXPECT_BYTES_EQ_HEX(kPublicKeySpkiDerHex, output); |
2076 | 2077 |
2077 // Failing case: Try to export a previously imported RSA public key in raw | 2078 // Failing case: Try to export a previously imported RSA public key in raw |
2078 // format (not allowed for a public key). | 2079 // format (not allowed for a public key). |
2079 EXPECT_EQ(Status::ErrorUnsupportedExportKeyFormat(), | 2080 EXPECT_EQ(Status::ErrorUnsupportedExportKeyFormat(), |
2080 ExportKey(blink::WebCryptoKeyFormatRaw, key, &output)); | 2081 ExportKey(blink::WebCryptoKeyFormatRaw, key, &output)); |
2081 | 2082 |
2082 // Failing case: Try to export a non-extractable key | 2083 // Failing case: Try to export a non-extractable key |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2122 EXPECT_TRUE(key.extractable()); | 2123 EXPECT_TRUE(key.extractable()); |
2123 EXPECT_EQ(blink::WebCryptoKeyUsageSign, key.usages()); | 2124 EXPECT_EQ(blink::WebCryptoKeyUsageSign, key.usages()); |
2124 EXPECT_EQ(blink::WebCryptoAlgorithmIdSha1, | 2125 EXPECT_EQ(blink::WebCryptoAlgorithmIdSha1, |
2125 key.algorithm().rsaHashedParams()->hash().id()); | 2126 key.algorithm().rsaHashedParams()->hash().id()); |
2126 EXPECT_EQ(kModulusLengthBits, | 2127 EXPECT_EQ(kModulusLengthBits, |
2127 key.algorithm().rsaHashedParams()->modulusLengthBits()); | 2128 key.algorithm().rsaHashedParams()->modulusLengthBits()); |
2128 EXPECT_BYTES_EQ_HEX( | 2129 EXPECT_BYTES_EQ_HEX( |
2129 "010001", | 2130 "010001", |
2130 CryptoData(key.algorithm().rsaHashedParams()->publicExponent())); | 2131 CryptoData(key.algorithm().rsaHashedParams()->publicExponent())); |
2131 | 2132 |
2132 std::vector<uint8> exported_key; | 2133 std::vector<uint8_t> exported_key; |
2133 ASSERT_EQ(Status::Success(), | 2134 ASSERT_EQ(Status::Success(), |
2134 ExportKey(blink::WebCryptoKeyFormatPkcs8, key, &exported_key)); | 2135 ExportKey(blink::WebCryptoKeyFormatPkcs8, key, &exported_key)); |
2135 EXPECT_BYTES_EQ_HEX(kPrivateKeyPkcs8DerHex, exported_key); | 2136 EXPECT_BYTES_EQ_HEX(kPrivateKeyPkcs8DerHex, exported_key); |
2136 | 2137 |
2137 // Failing case: Empty PKCS#8 data | 2138 // Failing case: Empty PKCS#8 data |
2138 EXPECT_EQ(Status::ErrorImportEmptyKeyData(), | 2139 EXPECT_EQ(Status::ErrorImportEmptyKeyData(), |
2139 ImportKey(blink::WebCryptoKeyFormatPkcs8, | 2140 ImportKey(blink::WebCryptoKeyFormatPkcs8, |
2140 CryptoData(std::vector<uint8>()), | 2141 CryptoData(std::vector<uint8_t>()), |
2141 CreateRsaHashedImportAlgorithm( | 2142 CreateRsaHashedImportAlgorithm( |
2142 blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, | 2143 blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, |
2143 blink::WebCryptoAlgorithmIdSha1), | 2144 blink::WebCryptoAlgorithmIdSha1), |
2144 true, | 2145 true, |
2145 blink::WebCryptoKeyUsageSign, | 2146 blink::WebCryptoKeyUsageSign, |
2146 &key)); | 2147 &key)); |
2147 | 2148 |
2148 // Failing case: Bad DER encoding. | 2149 // Failing case: Bad DER encoding. |
2149 EXPECT_EQ( | 2150 EXPECT_EQ( |
2150 Status::DataError(), | 2151 Status::DataError(), |
(...skipping 29 matching lines...) Expand all Loading... |
2180 ASSERT_EQ(Status::Success(), | 2181 ASSERT_EQ(Status::Success(), |
2181 ImportKey(blink::WebCryptoKeyFormatPkcs8, | 2182 ImportKey(blink::WebCryptoKeyFormatPkcs8, |
2182 CryptoData(HexStringToBytes(kPrivateKeyPkcs8DerHex)), | 2183 CryptoData(HexStringToBytes(kPrivateKeyPkcs8DerHex)), |
2183 CreateRsaHashedImportAlgorithm( | 2184 CreateRsaHashedImportAlgorithm( |
2184 blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, | 2185 blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, |
2185 blink::WebCryptoAlgorithmIdSha1), | 2186 blink::WebCryptoAlgorithmIdSha1), |
2186 true, | 2187 true, |
2187 blink::WebCryptoKeyUsageSign, | 2188 blink::WebCryptoKeyUsageSign, |
2188 &key)); | 2189 &key)); |
2189 | 2190 |
2190 std::vector<uint8> exported_key_jwk; | 2191 std::vector<uint8_t> exported_key_jwk; |
2191 ASSERT_EQ(Status::Success(), | 2192 ASSERT_EQ(Status::Success(), |
2192 ExportKey(blink::WebCryptoKeyFormatJwk, key, &exported_key_jwk)); | 2193 ExportKey(blink::WebCryptoKeyFormatJwk, key, &exported_key_jwk)); |
2193 | 2194 |
2194 // All of the optional parameters (p, q, dp, dq, qi) should be present in the | 2195 // All of the optional parameters (p, q, dp, dq, qi) should be present in the |
2195 // output. | 2196 // output. |
2196 const char* expected_jwk = | 2197 const char* expected_jwk = |
2197 "{\"alg\":\"RS1\",\"d\":\"M6UEKpCyfU9UUcqbu9C0R3GhAa-IQ0Cu-YhfKku-" | 2198 "{\"alg\":\"RS1\",\"d\":\"M6UEKpCyfU9UUcqbu9C0R3GhAa-IQ0Cu-YhfKku-" |
2198 "kuiUpySsPFaMj5eFOtB8AmbIxqPKCSnx6PESMYhEKfxNmuVf7olqEM5wfD7X5zTkRyejlXRQ" | 2199 "kuiUpySsPFaMj5eFOtB8AmbIxqPKCSnx6PESMYhEKfxNmuVf7olqEM5wfD7X5zTkRyejlXRQ" |
2199 "GlMmgxCcKrrKuig8MbS9L1PD7jfjUs7jT55QO9gMBiKtecbc7og1R8ajsyU\",\"dp\":" | 2200 "GlMmgxCcKrrKuig8MbS9L1PD7jfjUs7jT55QO9gMBiKtecbc7og1R8ajsyU\",\"dp\":" |
2200 "\"KPoTk4ZVvh-" | 2201 "\"KPoTk4ZVvh-" |
(...skipping 16 matching lines...) Expand all Loading... |
2217 ASSERT_EQ(Status::Success(), | 2218 ASSERT_EQ(Status::Success(), |
2218 ImportKey(blink::WebCryptoKeyFormatJwk, | 2219 ImportKey(blink::WebCryptoKeyFormatJwk, |
2219 CryptoData(exported_key_jwk), | 2220 CryptoData(exported_key_jwk), |
2220 CreateRsaHashedImportAlgorithm( | 2221 CreateRsaHashedImportAlgorithm( |
2221 blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, | 2222 blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, |
2222 blink::WebCryptoAlgorithmIdSha1), | 2223 blink::WebCryptoAlgorithmIdSha1), |
2223 true, | 2224 true, |
2224 blink::WebCryptoKeyUsageSign, | 2225 blink::WebCryptoKeyUsageSign, |
2225 &key)); | 2226 &key)); |
2226 | 2227 |
2227 std::vector<uint8> exported_key_pkcs8; | 2228 std::vector<uint8_t> exported_key_pkcs8; |
2228 ASSERT_EQ( | 2229 ASSERT_EQ( |
2229 Status::Success(), | 2230 Status::Success(), |
2230 ExportKey(blink::WebCryptoKeyFormatPkcs8, key, &exported_key_pkcs8)); | 2231 ExportKey(blink::WebCryptoKeyFormatPkcs8, key, &exported_key_pkcs8)); |
2231 | 2232 |
2232 ASSERT_EQ(CryptoData(HexStringToBytes(kPrivateKeyPkcs8DerHex)), | 2233 ASSERT_EQ(CryptoData(HexStringToBytes(kPrivateKeyPkcs8DerHex)), |
2233 CryptoData(exported_key_pkcs8)); | 2234 CryptoData(exported_key_pkcs8)); |
2234 } | 2235 } |
2235 | 2236 |
2236 // Tests importing multiple RSA private keys from JWK, and then exporting to | 2237 // Tests importing multiple RSA private keys from JWK, and then exporting to |
2237 // PKCS8. | 2238 // PKCS8. |
(...skipping 19 matching lines...) Expand all Loading... |
2257 base::DictionaryValue* key_values; | 2258 base::DictionaryValue* key_values; |
2258 ASSERT_TRUE(key_list->GetDictionary(key_index, &key_values)); | 2259 ASSERT_TRUE(key_list->GetDictionary(key_index, &key_values)); |
2259 | 2260 |
2260 // Get the JWK representation of the key. | 2261 // Get the JWK representation of the key. |
2261 base::DictionaryValue* key_jwk; | 2262 base::DictionaryValue* key_jwk; |
2262 ASSERT_TRUE(key_values->GetDictionary("jwk", &key_jwk)); | 2263 ASSERT_TRUE(key_values->GetDictionary("jwk", &key_jwk)); |
2263 | 2264 |
2264 // Get the PKCS8 representation of the key. | 2265 // Get the PKCS8 representation of the key. |
2265 std::string pkcs8_hex_string; | 2266 std::string pkcs8_hex_string; |
2266 ASSERT_TRUE(key_values->GetString("pkcs8", &pkcs8_hex_string)); | 2267 ASSERT_TRUE(key_values->GetString("pkcs8", &pkcs8_hex_string)); |
2267 std::vector<uint8> pkcs8_bytes = HexStringToBytes(pkcs8_hex_string); | 2268 std::vector<uint8_t> pkcs8_bytes = HexStringToBytes(pkcs8_hex_string); |
2268 | 2269 |
2269 // Get the modulus length for the key. | 2270 // Get the modulus length for the key. |
2270 int modulus_length_bits = 0; | 2271 int modulus_length_bits = 0; |
2271 ASSERT_TRUE(key_values->GetInteger("modulusLength", &modulus_length_bits)); | 2272 ASSERT_TRUE(key_values->GetInteger("modulusLength", &modulus_length_bits)); |
2272 | 2273 |
2273 blink::WebCryptoKey private_key = blink::WebCryptoKey::createNull(); | 2274 blink::WebCryptoKey private_key = blink::WebCryptoKey::createNull(); |
2274 | 2275 |
2275 // Import the key from JWK. | 2276 // Import the key from JWK. |
2276 ASSERT_EQ( | 2277 ASSERT_EQ( |
2277 Status::Success(), | 2278 Status::Success(), |
2278 ImportKeyJwkFromDict(*key_jwk, | 2279 ImportKeyJwkFromDict(*key_jwk, |
2279 CreateRsaHashedImportAlgorithm( | 2280 CreateRsaHashedImportAlgorithm( |
2280 blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, | 2281 blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, |
2281 blink::WebCryptoAlgorithmIdSha256), | 2282 blink::WebCryptoAlgorithmIdSha256), |
2282 true, | 2283 true, |
2283 blink::WebCryptoKeyUsageSign, | 2284 blink::WebCryptoKeyUsageSign, |
2284 &private_key)); | 2285 &private_key)); |
2285 | 2286 |
2286 live_keys.push_back(private_key); | 2287 live_keys.push_back(private_key); |
2287 | 2288 |
2288 EXPECT_EQ( | 2289 EXPECT_EQ( |
2289 modulus_length_bits, | 2290 modulus_length_bits, |
2290 static_cast<int>( | 2291 static_cast<int>( |
2291 private_key.algorithm().rsaHashedParams()->modulusLengthBits())); | 2292 private_key.algorithm().rsaHashedParams()->modulusLengthBits())); |
2292 | 2293 |
2293 // Export to PKCS8 and verify that it matches expectation. | 2294 // Export to PKCS8 and verify that it matches expectation. |
2294 std::vector<uint8> exported_key_pkcs8; | 2295 std::vector<uint8_t> exported_key_pkcs8; |
2295 ASSERT_EQ( | 2296 ASSERT_EQ( |
2296 Status::Success(), | 2297 Status::Success(), |
2297 ExportKey( | 2298 ExportKey( |
2298 blink::WebCryptoKeyFormatPkcs8, private_key, &exported_key_pkcs8)); | 2299 blink::WebCryptoKeyFormatPkcs8, private_key, &exported_key_pkcs8)); |
2299 | 2300 |
2300 EXPECT_BYTES_EQ(pkcs8_bytes, exported_key_pkcs8); | 2301 EXPECT_BYTES_EQ(pkcs8_bytes, exported_key_pkcs8); |
2301 } | 2302 } |
2302 } | 2303 } |
2303 | 2304 |
2304 // Import an RSA private key using JWK. Next import a JWK containing the same | 2305 // Import an RSA private key using JWK. Next import a JWK containing the same |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2439 blink::WebCryptoKeyUsageSign, | 2440 blink::WebCryptoKeyUsageSign, |
2440 &key)); | 2441 &key)); |
2441 | 2442 |
2442 } | 2443 } |
2443 | 2444 |
2444 TEST_F(SharedCryptoTest, MAYBE(GenerateKeyPairRsa)) { | 2445 TEST_F(SharedCryptoTest, MAYBE(GenerateKeyPairRsa)) { |
2445 // Note: using unrealistic short key lengths here to avoid bogging down tests. | 2446 // Note: using unrealistic short key lengths here to avoid bogging down tests. |
2446 | 2447 |
2447 // Successful WebCryptoAlgorithmIdRsaSsaPkcs1v1_5 key generation (sha256) | 2448 // Successful WebCryptoAlgorithmIdRsaSsaPkcs1v1_5 key generation (sha256) |
2448 const unsigned int modulus_length = 256; | 2449 const unsigned int modulus_length = 256; |
2449 const std::vector<uint8> public_exponent = HexStringToBytes("010001"); | 2450 const std::vector<uint8_t> public_exponent = HexStringToBytes("010001"); |
2450 blink::WebCryptoAlgorithm algorithm = | 2451 blink::WebCryptoAlgorithm algorithm = |
2451 CreateRsaHashedKeyGenAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, | 2452 CreateRsaHashedKeyGenAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, |
2452 blink::WebCryptoAlgorithmIdSha256, | 2453 blink::WebCryptoAlgorithmIdSha256, |
2453 modulus_length, | 2454 modulus_length, |
2454 public_exponent); | 2455 public_exponent); |
2455 bool extractable = true; | 2456 bool extractable = true; |
2456 const blink::WebCryptoKeyUsageMask usage_mask = 0; | 2457 const blink::WebCryptoKeyUsageMask usage_mask = 0; |
2457 blink::WebCryptoKey public_key = blink::WebCryptoKey::createNull(); | 2458 blink::WebCryptoKey public_key = blink::WebCryptoKey::createNull(); |
2458 blink::WebCryptoKey private_key = blink::WebCryptoKey::createNull(); | 2459 blink::WebCryptoKey private_key = blink::WebCryptoKey::createNull(); |
2459 | 2460 |
(...skipping 12 matching lines...) Expand all Loading... |
2472 public_key.algorithm().rsaHashedParams()->hash().id()); | 2473 public_key.algorithm().rsaHashedParams()->hash().id()); |
2473 EXPECT_EQ(blink::WebCryptoAlgorithmIdSha256, | 2474 EXPECT_EQ(blink::WebCryptoAlgorithmIdSha256, |
2474 private_key.algorithm().rsaHashedParams()->hash().id()); | 2475 private_key.algorithm().rsaHashedParams()->hash().id()); |
2475 EXPECT_TRUE(public_key.extractable()); | 2476 EXPECT_TRUE(public_key.extractable()); |
2476 EXPECT_EQ(extractable, private_key.extractable()); | 2477 EXPECT_EQ(extractable, private_key.extractable()); |
2477 EXPECT_EQ(usage_mask, public_key.usages()); | 2478 EXPECT_EQ(usage_mask, public_key.usages()); |
2478 EXPECT_EQ(usage_mask, private_key.usages()); | 2479 EXPECT_EQ(usage_mask, private_key.usages()); |
2479 | 2480 |
2480 // Try exporting the generated key pair, and then re-importing to verify that | 2481 // Try exporting the generated key pair, and then re-importing to verify that |
2481 // the exported data was valid. | 2482 // the exported data was valid. |
2482 std::vector<uint8> public_key_spki; | 2483 std::vector<uint8_t> public_key_spki; |
2483 EXPECT_EQ( | 2484 EXPECT_EQ( |
2484 Status::Success(), | 2485 Status::Success(), |
2485 ExportKey(blink::WebCryptoKeyFormatSpki, public_key, &public_key_spki)); | 2486 ExportKey(blink::WebCryptoKeyFormatSpki, public_key, &public_key_spki)); |
2486 | 2487 |
2487 if (SupportsRsaKeyImport()) { | 2488 if (SupportsRsaKeyImport()) { |
2488 public_key = blink::WebCryptoKey::createNull(); | 2489 public_key = blink::WebCryptoKey::createNull(); |
2489 EXPECT_EQ(Status::Success(), | 2490 EXPECT_EQ(Status::Success(), |
2490 ImportKey(blink::WebCryptoKeyFormatSpki, | 2491 ImportKey(blink::WebCryptoKeyFormatSpki, |
2491 CryptoData(public_key_spki), | 2492 CryptoData(public_key_spki), |
2492 CreateRsaHashedImportAlgorithm( | 2493 CreateRsaHashedImportAlgorithm( |
2493 blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, | 2494 blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, |
2494 blink::WebCryptoAlgorithmIdSha256), | 2495 blink::WebCryptoAlgorithmIdSha256), |
2495 true, | 2496 true, |
2496 usage_mask, | 2497 usage_mask, |
2497 &public_key)); | 2498 &public_key)); |
2498 EXPECT_EQ(modulus_length, | 2499 EXPECT_EQ(modulus_length, |
2499 public_key.algorithm().rsaHashedParams()->modulusLengthBits()); | 2500 public_key.algorithm().rsaHashedParams()->modulusLengthBits()); |
2500 | 2501 |
2501 std::vector<uint8> private_key_pkcs8; | 2502 std::vector<uint8_t> private_key_pkcs8; |
2502 EXPECT_EQ( | 2503 EXPECT_EQ( |
2503 Status::Success(), | 2504 Status::Success(), |
2504 ExportKey( | 2505 ExportKey( |
2505 blink::WebCryptoKeyFormatPkcs8, private_key, &private_key_pkcs8)); | 2506 blink::WebCryptoKeyFormatPkcs8, private_key, &private_key_pkcs8)); |
2506 private_key = blink::WebCryptoKey::createNull(); | 2507 private_key = blink::WebCryptoKey::createNull(); |
2507 EXPECT_EQ(Status::Success(), | 2508 EXPECT_EQ(Status::Success(), |
2508 ImportKey(blink::WebCryptoKeyFormatPkcs8, | 2509 ImportKey(blink::WebCryptoKeyFormatPkcs8, |
2509 CryptoData(private_key_pkcs8), | 2510 CryptoData(private_key_pkcs8), |
2510 CreateRsaHashedImportAlgorithm( | 2511 CreateRsaHashedImportAlgorithm( |
2511 blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, | 2512 blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, |
(...skipping 10 matching lines...) Expand all Loading... |
2522 CreateRsaHashedKeyGenAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, | 2523 CreateRsaHashedKeyGenAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, |
2523 blink::WebCryptoAlgorithmIdSha256, | 2524 blink::WebCryptoAlgorithmIdSha256, |
2524 0, | 2525 0, |
2525 public_exponent); | 2526 public_exponent); |
2526 EXPECT_EQ(Status::ErrorGenerateRsaZeroModulus(), | 2527 EXPECT_EQ(Status::ErrorGenerateRsaZeroModulus(), |
2527 GenerateKeyPair( | 2528 GenerateKeyPair( |
2528 algorithm, extractable, usage_mask, &public_key, &private_key)); | 2529 algorithm, extractable, usage_mask, &public_key, &private_key)); |
2529 | 2530 |
2530 // Fail with bad exponent: larger than unsigned long. | 2531 // Fail with bad exponent: larger than unsigned long. |
2531 unsigned int exponent_length = sizeof(unsigned long) + 1; // NOLINT | 2532 unsigned int exponent_length = sizeof(unsigned long) + 1; // NOLINT |
2532 const std::vector<uint8> long_exponent(exponent_length, 0x01); | 2533 const std::vector<uint8_t> long_exponent(exponent_length, 0x01); |
2533 algorithm = | 2534 algorithm = |
2534 CreateRsaHashedKeyGenAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, | 2535 CreateRsaHashedKeyGenAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, |
2535 blink::WebCryptoAlgorithmIdSha256, | 2536 blink::WebCryptoAlgorithmIdSha256, |
2536 modulus_length, | 2537 modulus_length, |
2537 long_exponent); | 2538 long_exponent); |
2538 EXPECT_EQ(Status::ErrorGenerateKeyPublicExponent(), | 2539 EXPECT_EQ(Status::ErrorGenerateKeyPublicExponent(), |
2539 GenerateKeyPair( | 2540 GenerateKeyPair( |
2540 algorithm, extractable, usage_mask, &public_key, &private_key)); | 2541 algorithm, extractable, usage_mask, &public_key, &private_key)); |
2541 | 2542 |
2542 // Fail with bad exponent: empty. | 2543 // Fail with bad exponent: empty. |
2543 const std::vector<uint8> empty_exponent; | 2544 const std::vector<uint8_t> empty_exponent; |
2544 algorithm = | 2545 algorithm = |
2545 CreateRsaHashedKeyGenAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, | 2546 CreateRsaHashedKeyGenAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, |
2546 blink::WebCryptoAlgorithmIdSha256, | 2547 blink::WebCryptoAlgorithmIdSha256, |
2547 modulus_length, | 2548 modulus_length, |
2548 empty_exponent); | 2549 empty_exponent); |
2549 EXPECT_EQ(Status::ErrorGenerateKeyPublicExponent(), | 2550 EXPECT_EQ(Status::ErrorGenerateKeyPublicExponent(), |
2550 GenerateKeyPair( | 2551 GenerateKeyPair( |
2551 algorithm, extractable, usage_mask, &public_key, &private_key)); | 2552 algorithm, extractable, usage_mask, &public_key, &private_key)); |
2552 | 2553 |
2553 // Fail with bad exponent: all zeros. | 2554 // Fail with bad exponent: all zeros. |
2554 std::vector<uint8> exponent_with_leading_zeros(15, 0x00); | 2555 std::vector<uint8_t> exponent_with_leading_zeros(15, 0x00); |
2555 algorithm = | 2556 algorithm = |
2556 CreateRsaHashedKeyGenAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, | 2557 CreateRsaHashedKeyGenAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, |
2557 blink::WebCryptoAlgorithmIdSha256, | 2558 blink::WebCryptoAlgorithmIdSha256, |
2558 modulus_length, | 2559 modulus_length, |
2559 exponent_with_leading_zeros); | 2560 exponent_with_leading_zeros); |
2560 EXPECT_EQ(Status::ErrorGenerateKeyPublicExponent(), | 2561 EXPECT_EQ(Status::ErrorGenerateKeyPublicExponent(), |
2561 GenerateKeyPair( | 2562 GenerateKeyPair( |
2562 algorithm, extractable, usage_mask, &public_key, &private_key)); | 2563 algorithm, extractable, usage_mask, &public_key, &private_key)); |
2563 | 2564 |
2564 // Key generation success using exponent with leading zeros. | 2565 // Key generation success using exponent with leading zeros. |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2605 private_key.algorithm().rsaHashedParams()->hash().id()); | 2606 private_key.algorithm().rsaHashedParams()->hash().id()); |
2606 // Even though "extractable" was set to false, the public key remains | 2607 // Even though "extractable" was set to false, the public key remains |
2607 // extractable. | 2608 // extractable. |
2608 EXPECT_TRUE(public_key.extractable()); | 2609 EXPECT_TRUE(public_key.extractable()); |
2609 EXPECT_FALSE(private_key.extractable()); | 2610 EXPECT_FALSE(private_key.extractable()); |
2610 EXPECT_EQ(usage_mask, public_key.usages()); | 2611 EXPECT_EQ(usage_mask, public_key.usages()); |
2611 EXPECT_EQ(usage_mask, private_key.usages()); | 2612 EXPECT_EQ(usage_mask, private_key.usages()); |
2612 | 2613 |
2613 // Exporting a private key as SPKI format doesn't make sense. However this | 2614 // Exporting a private key as SPKI format doesn't make sense. However this |
2614 // will first fail because the key is not extractable. | 2615 // will first fail because the key is not extractable. |
2615 std::vector<uint8> output; | 2616 std::vector<uint8_t> output; |
2616 EXPECT_EQ(Status::ErrorKeyNotExtractable(), | 2617 EXPECT_EQ(Status::ErrorKeyNotExtractable(), |
2617 ExportKey(blink::WebCryptoKeyFormatSpki, private_key, &output)); | 2618 ExportKey(blink::WebCryptoKeyFormatSpki, private_key, &output)); |
2618 | 2619 |
2619 // Re-generate an extractable private_key and try to export it as SPKI format. | 2620 // Re-generate an extractable private_key and try to export it as SPKI format. |
2620 // This should fail since spki is for public keys. | 2621 // This should fail since spki is for public keys. |
2621 EXPECT_EQ( | 2622 EXPECT_EQ( |
2622 Status::Success(), | 2623 Status::Success(), |
2623 GenerateKeyPair(algorithm, true, usage_mask, &public_key, &private_key)); | 2624 GenerateKeyPair(algorithm, true, usage_mask, &public_key, &private_key)); |
2624 EXPECT_EQ(Status::ErrorUnexpectedKeyType(), | 2625 EXPECT_EQ(Status::ErrorUnexpectedKeyType(), |
2625 ExportKey(blink::WebCryptoKeyFormatSpki, private_key, &output)); | 2626 ExportKey(blink::WebCryptoKeyFormatSpki, private_key, &output)); |
2626 } | 2627 } |
2627 | 2628 |
2628 TEST_F(SharedCryptoTest, MAYBE(GenerateKeyPairRsaBadModulusLength)) { | 2629 TEST_F(SharedCryptoTest, MAYBE(GenerateKeyPairRsaBadModulusLength)) { |
2629 const unsigned int kBadModulus[] = { | 2630 const unsigned int kBadModulus[] = { |
2630 0, | 2631 0, |
2631 255, // Not a multiple of 8. | 2632 255, // Not a multiple of 8. |
2632 1023, // Not a multiple of 8. | 2633 1023, // Not a multiple of 8. |
2633 0xFFFFFFFF, // Cannot fit in a signed int. | 2634 0xFFFFFFFF, // Cannot fit in a signed int. |
2634 16384 + 8, // 16384 is the maxmimum length that NSS succeeds for. | 2635 16384 + 8, // 16384 is the maxmimum length that NSS succeeds for. |
2635 }; | 2636 }; |
2636 | 2637 |
2637 const std::vector<uint8> public_exponent = HexStringToBytes("010001"); | 2638 const std::vector<uint8_t> public_exponent = HexStringToBytes("010001"); |
2638 | 2639 |
2639 for (size_t i = 0; i < arraysize(kBadModulus); ++i) { | 2640 for (size_t i = 0; i < arraysize(kBadModulus); ++i) { |
2640 const unsigned int modulus_length = kBadModulus[i]; | 2641 const unsigned int modulus_length = kBadModulus[i]; |
2641 blink::WebCryptoAlgorithm algorithm = CreateRsaHashedKeyGenAlgorithm( | 2642 blink::WebCryptoAlgorithm algorithm = CreateRsaHashedKeyGenAlgorithm( |
2642 blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, | 2643 blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, |
2643 blink::WebCryptoAlgorithmIdSha256, | 2644 blink::WebCryptoAlgorithmIdSha256, |
2644 modulus_length, | 2645 modulus_length, |
2645 public_exponent); | 2646 public_exponent); |
2646 bool extractable = true; | 2647 bool extractable = true; |
2647 const blink::WebCryptoKeyUsageMask usage_mask = 0; | 2648 const blink::WebCryptoKeyUsageMask usage_mask = 0; |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2703 import_algorithm, | 2704 import_algorithm, |
2704 false, | 2705 false, |
2705 blink::WebCryptoKeyUsageVerify, | 2706 blink::WebCryptoKeyUsageVerify, |
2706 blink::WebCryptoKeyUsageSign, | 2707 blink::WebCryptoKeyUsageSign, |
2707 &public_key, | 2708 &public_key, |
2708 &private_key)); | 2709 &private_key)); |
2709 | 2710 |
2710 blink::WebCryptoAlgorithm algorithm = | 2711 blink::WebCryptoAlgorithm algorithm = |
2711 CreateAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5); | 2712 CreateAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5); |
2712 | 2713 |
2713 std::vector<uint8> signature; | 2714 std::vector<uint8_t> signature; |
2714 bool signature_match; | 2715 bool signature_match; |
2715 | 2716 |
2716 // Compute a signature. | 2717 // Compute a signature. |
2717 const std::vector<uint8> data = HexStringToBytes("010203040506070809"); | 2718 const std::vector<uint8_t> data = HexStringToBytes("010203040506070809"); |
2718 ASSERT_EQ(Status::Success(), | 2719 ASSERT_EQ(Status::Success(), |
2719 Sign(algorithm, private_key, CryptoData(data), &signature)); | 2720 Sign(algorithm, private_key, CryptoData(data), &signature)); |
2720 | 2721 |
2721 // Ensure truncated signature does not verify by passing one less byte. | 2722 // Ensure truncated signature does not verify by passing one less byte. |
2722 EXPECT_EQ( | 2723 EXPECT_EQ( |
2723 Status::Success(), | 2724 Status::Success(), |
2724 Verify(algorithm, | 2725 Verify(algorithm, |
2725 public_key, | 2726 public_key, |
2726 CryptoData(Uint8VectorStart(signature), signature.size() - 1), | 2727 CryptoData(Uint8VectorStart(signature), signature.size() - 1), |
2727 CryptoData(data), | 2728 CryptoData(data), |
2728 &signature_match)); | 2729 &signature_match)); |
2729 EXPECT_FALSE(signature_match); | 2730 EXPECT_FALSE(signature_match); |
2730 | 2731 |
2731 // Ensure truncated signature does not verify by passing no bytes. | 2732 // Ensure truncated signature does not verify by passing no bytes. |
2732 EXPECT_EQ(Status::Success(), | 2733 EXPECT_EQ(Status::Success(), |
2733 Verify(algorithm, | 2734 Verify(algorithm, |
2734 public_key, | 2735 public_key, |
2735 CryptoData(), | 2736 CryptoData(), |
2736 CryptoData(data), | 2737 CryptoData(data), |
2737 &signature_match)); | 2738 &signature_match)); |
2738 EXPECT_FALSE(signature_match); | 2739 EXPECT_FALSE(signature_match); |
2739 | 2740 |
2740 // Ensure corrupted signature does not verify. | 2741 // Ensure corrupted signature does not verify. |
2741 std::vector<uint8> corrupt_sig = signature; | 2742 std::vector<uint8_t> corrupt_sig = signature; |
2742 corrupt_sig[corrupt_sig.size() / 2] ^= 0x1; | 2743 corrupt_sig[corrupt_sig.size() / 2] ^= 0x1; |
2743 EXPECT_EQ(Status::Success(), | 2744 EXPECT_EQ(Status::Success(), |
2744 Verify(algorithm, | 2745 Verify(algorithm, |
2745 public_key, | 2746 public_key, |
2746 CryptoData(corrupt_sig), | 2747 CryptoData(corrupt_sig), |
2747 CryptoData(data), | 2748 CryptoData(data), |
2748 &signature_match)); | 2749 &signature_match)); |
2749 EXPECT_FALSE(signature_match); | 2750 EXPECT_FALSE(signature_match); |
2750 | 2751 |
2751 // Ensure signatures that are greater than the modulus size fail. | 2752 // Ensure signatures that are greater than the modulus size fail. |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2839 false, | 2840 false, |
2840 blink::WebCryptoKeyUsageVerify, | 2841 blink::WebCryptoKeyUsageVerify, |
2841 blink::WebCryptoKeyUsageSign, | 2842 blink::WebCryptoKeyUsageSign, |
2842 &public_key, | 2843 &public_key, |
2843 &private_key)); | 2844 &private_key)); |
2844 | 2845 |
2845 blink::WebCryptoAlgorithm algorithm = | 2846 blink::WebCryptoAlgorithm algorithm = |
2846 CreateAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5); | 2847 CreateAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5); |
2847 | 2848 |
2848 // Validate the signatures are computed and verified as expected. | 2849 // Validate the signatures are computed and verified as expected. |
2849 std::vector<uint8> signature; | 2850 std::vector<uint8_t> signature; |
2850 for (size_t test_index = 0; test_index < tests->GetSize(); ++test_index) { | 2851 for (size_t test_index = 0; test_index < tests->GetSize(); ++test_index) { |
2851 SCOPED_TRACE(test_index); | 2852 SCOPED_TRACE(test_index); |
2852 | 2853 |
2853 base::DictionaryValue* test; | 2854 base::DictionaryValue* test; |
2854 ASSERT_TRUE(tests->GetDictionary(test_index, &test)); | 2855 ASSERT_TRUE(tests->GetDictionary(test_index, &test)); |
2855 | 2856 |
2856 std::vector<uint8> test_message = | 2857 std::vector<uint8_t> test_message = |
2857 GetBytesFromHexString(test, "message_hex"); | 2858 GetBytesFromHexString(test, "message_hex"); |
2858 std::vector<uint8> test_signature = | 2859 std::vector<uint8_t> test_signature = |
2859 GetBytesFromHexString(test, "signature_hex"); | 2860 GetBytesFromHexString(test, "signature_hex"); |
2860 | 2861 |
2861 signature.clear(); | 2862 signature.clear(); |
2862 ASSERT_EQ( | 2863 ASSERT_EQ( |
2863 Status::Success(), | 2864 Status::Success(), |
2864 Sign(algorithm, private_key, CryptoData(test_message), &signature)); | 2865 Sign(algorithm, private_key, CryptoData(test_message), &signature)); |
2865 EXPECT_BYTES_EQ(test_signature, signature); | 2866 EXPECT_BYTES_EQ(test_signature, signature); |
2866 | 2867 |
2867 bool is_match = false; | 2868 bool is_match = false; |
2868 ASSERT_EQ(Status::Success(), | 2869 ASSERT_EQ(Status::Success(), |
(...skipping 13 matching lines...) Expand all Loading... |
2882 | 2883 |
2883 // Import a 128-bit Key Encryption Key (KEK) | 2884 // Import a 128-bit Key Encryption Key (KEK) |
2884 std::string key_raw_hex_in = "025a8cf3f08b4f6c5f33bbc76a471939"; | 2885 std::string key_raw_hex_in = "025a8cf3f08b4f6c5f33bbc76a471939"; |
2885 ASSERT_EQ(Status::Success(), | 2886 ASSERT_EQ(Status::Success(), |
2886 ImportKey(blink::WebCryptoKeyFormatRaw, | 2887 ImportKey(blink::WebCryptoKeyFormatRaw, |
2887 CryptoData(HexStringToBytes(key_raw_hex_in)), | 2888 CryptoData(HexStringToBytes(key_raw_hex_in)), |
2888 algorithm, | 2889 algorithm, |
2889 true, | 2890 true, |
2890 blink::WebCryptoKeyUsageWrapKey, | 2891 blink::WebCryptoKeyUsageWrapKey, |
2891 &key)); | 2892 &key)); |
2892 std::vector<uint8> key_raw_out; | 2893 std::vector<uint8_t> key_raw_out; |
2893 EXPECT_EQ(Status::Success(), | 2894 EXPECT_EQ(Status::Success(), |
2894 ExportKey(blink::WebCryptoKeyFormatRaw, key, &key_raw_out)); | 2895 ExportKey(blink::WebCryptoKeyFormatRaw, key, &key_raw_out)); |
2895 EXPECT_BYTES_EQ_HEX(key_raw_hex_in, key_raw_out); | 2896 EXPECT_BYTES_EQ_HEX(key_raw_hex_in, key_raw_out); |
2896 | 2897 |
2897 // Import a 192-bit KEK | 2898 // Import a 192-bit KEK |
2898 key_raw_hex_in = "c0192c6466b2370decbb62b2cfef4384544ffeb4d2fbc103"; | 2899 key_raw_hex_in = "c0192c6466b2370decbb62b2cfef4384544ffeb4d2fbc103"; |
2899 ASSERT_EQ(Status::ErrorAes192BitUnsupported(), | 2900 ASSERT_EQ(Status::ErrorAes192BitUnsupported(), |
2900 ImportKey(blink::WebCryptoKeyFormatRaw, | 2901 ImportKey(blink::WebCryptoKeyFormatRaw, |
2901 CryptoData(HexStringToBytes(key_raw_hex_in)), | 2902 CryptoData(HexStringToBytes(key_raw_hex_in)), |
2902 algorithm, | 2903 algorithm, |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2958 blink::WebCryptoKeyUsageWrapKey, | 2959 blink::WebCryptoKeyUsageWrapKey, |
2959 &key)); | 2960 &key)); |
2960 } | 2961 } |
2961 | 2962 |
2962 TEST_F(SharedCryptoTest, MAYBE(UnwrapFailures)) { | 2963 TEST_F(SharedCryptoTest, MAYBE(UnwrapFailures)) { |
2963 // This test exercises the code path common to all unwrap operations. | 2964 // This test exercises the code path common to all unwrap operations. |
2964 scoped_ptr<base::ListValue> tests; | 2965 scoped_ptr<base::ListValue> tests; |
2965 ASSERT_TRUE(ReadJsonTestFileToList("aes_kw.json", &tests)); | 2966 ASSERT_TRUE(ReadJsonTestFileToList("aes_kw.json", &tests)); |
2966 base::DictionaryValue* test; | 2967 base::DictionaryValue* test; |
2967 ASSERT_TRUE(tests->GetDictionary(0, &test)); | 2968 ASSERT_TRUE(tests->GetDictionary(0, &test)); |
2968 const std::vector<uint8> test_kek = GetBytesFromHexString(test, "kek"); | 2969 const std::vector<uint8_t> test_kek = GetBytesFromHexString(test, "kek"); |
2969 const std::vector<uint8> test_ciphertext = | 2970 const std::vector<uint8_t> test_ciphertext = |
2970 GetBytesFromHexString(test, "ciphertext"); | 2971 GetBytesFromHexString(test, "ciphertext"); |
2971 | 2972 |
2972 blink::WebCryptoKey unwrapped_key = blink::WebCryptoKey::createNull(); | 2973 blink::WebCryptoKey unwrapped_key = blink::WebCryptoKey::createNull(); |
2973 | 2974 |
2974 // Using a wrapping algorithm that does not match the wrapping key algorithm | 2975 // Using a wrapping algorithm that does not match the wrapping key algorithm |
2975 // should fail. | 2976 // should fail. |
2976 blink::WebCryptoKey wrapping_key = ImportSecretKeyFromRaw( | 2977 blink::WebCryptoKey wrapping_key = ImportSecretKeyFromRaw( |
2977 test_kek, | 2978 test_kek, |
2978 webcrypto::CreateAlgorithm(blink::WebCryptoAlgorithmIdAesKw), | 2979 webcrypto::CreateAlgorithm(blink::WebCryptoAlgorithmIdAesKw), |
2979 blink::WebCryptoKeyUsageUnwrapKey); | 2980 blink::WebCryptoKeyUsageUnwrapKey); |
(...skipping 10 matching lines...) Expand all Loading... |
2990 } | 2991 } |
2991 | 2992 |
2992 TEST_F(SharedCryptoTest, MAYBE(AesKwRawSymkeyWrapUnwrapKnownAnswer)) { | 2993 TEST_F(SharedCryptoTest, MAYBE(AesKwRawSymkeyWrapUnwrapKnownAnswer)) { |
2993 scoped_ptr<base::ListValue> tests; | 2994 scoped_ptr<base::ListValue> tests; |
2994 ASSERT_TRUE(ReadJsonTestFileToList("aes_kw.json", &tests)); | 2995 ASSERT_TRUE(ReadJsonTestFileToList("aes_kw.json", &tests)); |
2995 | 2996 |
2996 for (size_t test_index = 0; test_index < tests->GetSize(); ++test_index) { | 2997 for (size_t test_index = 0; test_index < tests->GetSize(); ++test_index) { |
2997 SCOPED_TRACE(test_index); | 2998 SCOPED_TRACE(test_index); |
2998 base::DictionaryValue* test; | 2999 base::DictionaryValue* test; |
2999 ASSERT_TRUE(tests->GetDictionary(test_index, &test)); | 3000 ASSERT_TRUE(tests->GetDictionary(test_index, &test)); |
3000 const std::vector<uint8> test_kek = GetBytesFromHexString(test, "kek"); | 3001 const std::vector<uint8_t> test_kek = GetBytesFromHexString(test, "kek"); |
3001 const std::vector<uint8> test_key = GetBytesFromHexString(test, "key"); | 3002 const std::vector<uint8_t> test_key = GetBytesFromHexString(test, "key"); |
3002 const std::vector<uint8> test_ciphertext = | 3003 const std::vector<uint8_t> test_ciphertext = |
3003 GetBytesFromHexString(test, "ciphertext"); | 3004 GetBytesFromHexString(test, "ciphertext"); |
3004 const blink::WebCryptoAlgorithm wrapping_algorithm = | 3005 const blink::WebCryptoAlgorithm wrapping_algorithm = |
3005 webcrypto::CreateAlgorithm(blink::WebCryptoAlgorithmIdAesKw); | 3006 webcrypto::CreateAlgorithm(blink::WebCryptoAlgorithmIdAesKw); |
3006 | 3007 |
3007 // Import the wrapping key. | 3008 // Import the wrapping key. |
3008 blink::WebCryptoKey wrapping_key = ImportSecretKeyFromRaw( | 3009 blink::WebCryptoKey wrapping_key = ImportSecretKeyFromRaw( |
3009 test_kek, | 3010 test_kek, |
3010 wrapping_algorithm, | 3011 wrapping_algorithm, |
3011 blink::WebCryptoKeyUsageWrapKey | blink::WebCryptoKeyUsageUnwrapKey); | 3012 blink::WebCryptoKeyUsageWrapKey | blink::WebCryptoKeyUsageUnwrapKey); |
3012 | 3013 |
3013 // Import the key to be wrapped. | 3014 // Import the key to be wrapped. |
3014 blink::WebCryptoKey key = ImportSecretKeyFromRaw( | 3015 blink::WebCryptoKey key = ImportSecretKeyFromRaw( |
3015 test_key, | 3016 test_key, |
3016 CreateHmacImportAlgorithm(blink::WebCryptoAlgorithmIdSha1), | 3017 CreateHmacImportAlgorithm(blink::WebCryptoAlgorithmIdSha1), |
3017 blink::WebCryptoKeyUsageSign); | 3018 blink::WebCryptoKeyUsageSign); |
3018 | 3019 |
3019 // Wrap the key and verify the ciphertext result against the known answer. | 3020 // Wrap the key and verify the ciphertext result against the known answer. |
3020 std::vector<uint8> wrapped_key; | 3021 std::vector<uint8_t> wrapped_key; |
3021 ASSERT_EQ(Status::Success(), | 3022 ASSERT_EQ(Status::Success(), |
3022 WrapKey(blink::WebCryptoKeyFormatRaw, | 3023 WrapKey(blink::WebCryptoKeyFormatRaw, |
3023 key, | 3024 key, |
3024 wrapping_key, | 3025 wrapping_key, |
3025 wrapping_algorithm, | 3026 wrapping_algorithm, |
3026 &wrapped_key)); | 3027 &wrapped_key)); |
3027 EXPECT_BYTES_EQ(test_ciphertext, wrapped_key); | 3028 EXPECT_BYTES_EQ(test_ciphertext, wrapped_key); |
3028 | 3029 |
3029 // Unwrap the known ciphertext to get a new test_key. | 3030 // Unwrap the known ciphertext to get a new test_key. |
3030 blink::WebCryptoKey unwrapped_key = blink::WebCryptoKey::createNull(); | 3031 blink::WebCryptoKey unwrapped_key = blink::WebCryptoKey::createNull(); |
3031 ASSERT_EQ( | 3032 ASSERT_EQ( |
3032 Status::Success(), | 3033 Status::Success(), |
3033 UnwrapKey(blink::WebCryptoKeyFormatRaw, | 3034 UnwrapKey(blink::WebCryptoKeyFormatRaw, |
3034 CryptoData(test_ciphertext), | 3035 CryptoData(test_ciphertext), |
3035 wrapping_key, | 3036 wrapping_key, |
3036 wrapping_algorithm, | 3037 wrapping_algorithm, |
3037 CreateHmacImportAlgorithm(blink::WebCryptoAlgorithmIdSha1), | 3038 CreateHmacImportAlgorithm(blink::WebCryptoAlgorithmIdSha1), |
3038 true, | 3039 true, |
3039 blink::WebCryptoKeyUsageSign, | 3040 blink::WebCryptoKeyUsageSign, |
3040 &unwrapped_key)); | 3041 &unwrapped_key)); |
3041 EXPECT_FALSE(key.isNull()); | 3042 EXPECT_FALSE(key.isNull()); |
3042 EXPECT_TRUE(key.handle()); | 3043 EXPECT_TRUE(key.handle()); |
3043 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type()); | 3044 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type()); |
3044 EXPECT_EQ(blink::WebCryptoAlgorithmIdHmac, key.algorithm().id()); | 3045 EXPECT_EQ(blink::WebCryptoAlgorithmIdHmac, key.algorithm().id()); |
3045 EXPECT_EQ(true, key.extractable()); | 3046 EXPECT_EQ(true, key.extractable()); |
3046 EXPECT_EQ(blink::WebCryptoKeyUsageSign, key.usages()); | 3047 EXPECT_EQ(blink::WebCryptoKeyUsageSign, key.usages()); |
3047 | 3048 |
3048 // Export the new key and compare its raw bytes with the original known key. | 3049 // Export the new key and compare its raw bytes with the original known key. |
3049 std::vector<uint8> raw_key; | 3050 std::vector<uint8_t> raw_key; |
3050 EXPECT_EQ(Status::Success(), | 3051 EXPECT_EQ(Status::Success(), |
3051 ExportKey(blink::WebCryptoKeyFormatRaw, unwrapped_key, &raw_key)); | 3052 ExportKey(blink::WebCryptoKeyFormatRaw, unwrapped_key, &raw_key)); |
3052 EXPECT_BYTES_EQ(test_key, raw_key); | 3053 EXPECT_BYTES_EQ(test_key, raw_key); |
3053 } | 3054 } |
3054 } | 3055 } |
3055 | 3056 |
3056 // Unwrap a HMAC key using AES-KW, and then try doing a sign/verify with the | 3057 // Unwrap a HMAC key using AES-KW, and then try doing a sign/verify with the |
3057 // unwrapped key | 3058 // unwrapped key |
3058 TEST_F(SharedCryptoTest, MAYBE(AesKwRawSymkeyUnwrapSignVerifyHmac)) { | 3059 TEST_F(SharedCryptoTest, MAYBE(AesKwRawSymkeyUnwrapSignVerifyHmac)) { |
3059 scoped_ptr<base::ListValue> tests; | 3060 scoped_ptr<base::ListValue> tests; |
3060 ASSERT_TRUE(ReadJsonTestFileToList("aes_kw.json", &tests)); | 3061 ASSERT_TRUE(ReadJsonTestFileToList("aes_kw.json", &tests)); |
3061 | 3062 |
3062 base::DictionaryValue* test; | 3063 base::DictionaryValue* test; |
3063 ASSERT_TRUE(tests->GetDictionary(0, &test)); | 3064 ASSERT_TRUE(tests->GetDictionary(0, &test)); |
3064 const std::vector<uint8> test_kek = GetBytesFromHexString(test, "kek"); | 3065 const std::vector<uint8_t> test_kek = GetBytesFromHexString(test, "kek"); |
3065 const std::vector<uint8> test_ciphertext = | 3066 const std::vector<uint8_t> test_ciphertext = |
3066 GetBytesFromHexString(test, "ciphertext"); | 3067 GetBytesFromHexString(test, "ciphertext"); |
3067 const blink::WebCryptoAlgorithm wrapping_algorithm = | 3068 const blink::WebCryptoAlgorithm wrapping_algorithm = |
3068 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesKw); | 3069 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesKw); |
3069 | 3070 |
3070 // Import the wrapping key. | 3071 // Import the wrapping key. |
3071 blink::WebCryptoKey wrapping_key = ImportSecretKeyFromRaw( | 3072 blink::WebCryptoKey wrapping_key = ImportSecretKeyFromRaw( |
3072 test_kek, wrapping_algorithm, blink::WebCryptoKeyUsageUnwrapKey); | 3073 test_kek, wrapping_algorithm, blink::WebCryptoKeyUsageUnwrapKey); |
3073 | 3074 |
3074 // Unwrap the known ciphertext. | 3075 // Unwrap the known ciphertext. |
3075 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | 3076 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
3076 ASSERT_EQ( | 3077 ASSERT_EQ( |
3077 Status::Success(), | 3078 Status::Success(), |
3078 UnwrapKey(blink::WebCryptoKeyFormatRaw, | 3079 UnwrapKey(blink::WebCryptoKeyFormatRaw, |
3079 CryptoData(test_ciphertext), | 3080 CryptoData(test_ciphertext), |
3080 wrapping_key, | 3081 wrapping_key, |
3081 wrapping_algorithm, | 3082 wrapping_algorithm, |
3082 CreateHmacImportAlgorithm(blink::WebCryptoAlgorithmIdSha1), | 3083 CreateHmacImportAlgorithm(blink::WebCryptoAlgorithmIdSha1), |
3083 false, | 3084 false, |
3084 blink::WebCryptoKeyUsageSign | blink::WebCryptoKeyUsageVerify, | 3085 blink::WebCryptoKeyUsageSign | blink::WebCryptoKeyUsageVerify, |
3085 &key)); | 3086 &key)); |
3086 | 3087 |
3087 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type()); | 3088 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type()); |
3088 EXPECT_EQ(blink::WebCryptoAlgorithmIdHmac, key.algorithm().id()); | 3089 EXPECT_EQ(blink::WebCryptoAlgorithmIdHmac, key.algorithm().id()); |
3089 EXPECT_FALSE(key.extractable()); | 3090 EXPECT_FALSE(key.extractable()); |
3090 EXPECT_EQ(blink::WebCryptoKeyUsageSign | blink::WebCryptoKeyUsageVerify, | 3091 EXPECT_EQ(blink::WebCryptoKeyUsageSign | blink::WebCryptoKeyUsageVerify, |
3091 key.usages()); | 3092 key.usages()); |
3092 | 3093 |
3093 // Sign an empty message and ensure it is verified. | 3094 // Sign an empty message and ensure it is verified. |
3094 std::vector<uint8> test_message; | 3095 std::vector<uint8_t> test_message; |
3095 std::vector<uint8> signature; | 3096 std::vector<uint8_t> signature; |
3096 | 3097 |
3097 ASSERT_EQ(Status::Success(), | 3098 ASSERT_EQ(Status::Success(), |
3098 Sign(CreateAlgorithm(blink::WebCryptoAlgorithmIdHmac), | 3099 Sign(CreateAlgorithm(blink::WebCryptoAlgorithmIdHmac), |
3099 key, | 3100 key, |
3100 CryptoData(test_message), | 3101 CryptoData(test_message), |
3101 &signature)); | 3102 &signature)); |
3102 | 3103 |
3103 EXPECT_GT(signature.size(), 0u); | 3104 EXPECT_GT(signature.size(), 0u); |
3104 | 3105 |
3105 bool verify_result; | 3106 bool verify_result; |
3106 ASSERT_EQ(Status::Success(), | 3107 ASSERT_EQ(Status::Success(), |
3107 Verify(CreateAlgorithm(blink::WebCryptoAlgorithmIdHmac), | 3108 Verify(CreateAlgorithm(blink::WebCryptoAlgorithmIdHmac), |
3108 key, | 3109 key, |
3109 CryptoData(signature), | 3110 CryptoData(signature), |
3110 CryptoData(test_message), | 3111 CryptoData(test_message), |
3111 &verify_result)); | 3112 &verify_result)); |
3112 } | 3113 } |
3113 | 3114 |
3114 TEST_F(SharedCryptoTest, MAYBE(AesKwRawSymkeyWrapUnwrapErrors)) { | 3115 TEST_F(SharedCryptoTest, MAYBE(AesKwRawSymkeyWrapUnwrapErrors)) { |
3115 scoped_ptr<base::ListValue> tests; | 3116 scoped_ptr<base::ListValue> tests; |
3116 ASSERT_TRUE(ReadJsonTestFileToList("aes_kw.json", &tests)); | 3117 ASSERT_TRUE(ReadJsonTestFileToList("aes_kw.json", &tests)); |
3117 base::DictionaryValue* test; | 3118 base::DictionaryValue* test; |
3118 // Use 256 bits of data with a 256-bit KEK | 3119 // Use 256 bits of data with a 256-bit KEK |
3119 ASSERT_TRUE(tests->GetDictionary(3, &test)); | 3120 ASSERT_TRUE(tests->GetDictionary(3, &test)); |
3120 const std::vector<uint8> test_kek = GetBytesFromHexString(test, "kek"); | 3121 const std::vector<uint8_t> test_kek = GetBytesFromHexString(test, "kek"); |
3121 const std::vector<uint8> test_key = GetBytesFromHexString(test, "key"); | 3122 const std::vector<uint8_t> test_key = GetBytesFromHexString(test, "key"); |
3122 const std::vector<uint8> test_ciphertext = | 3123 const std::vector<uint8_t> test_ciphertext = |
3123 GetBytesFromHexString(test, "ciphertext"); | 3124 GetBytesFromHexString(test, "ciphertext"); |
3124 const blink::WebCryptoAlgorithm wrapping_algorithm = | 3125 const blink::WebCryptoAlgorithm wrapping_algorithm = |
3125 webcrypto::CreateAlgorithm(blink::WebCryptoAlgorithmIdAesKw); | 3126 webcrypto::CreateAlgorithm(blink::WebCryptoAlgorithmIdAesKw); |
3126 const blink::WebCryptoAlgorithm key_algorithm = | 3127 const blink::WebCryptoAlgorithm key_algorithm = |
3127 webcrypto::CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc); | 3128 webcrypto::CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc); |
3128 // Import the wrapping key. | 3129 // Import the wrapping key. |
3129 blink::WebCryptoKey wrapping_key = ImportSecretKeyFromRaw( | 3130 blink::WebCryptoKey wrapping_key = ImportSecretKeyFromRaw( |
3130 test_kek, | 3131 test_kek, |
3131 wrapping_algorithm, | 3132 wrapping_algorithm, |
3132 blink::WebCryptoKeyUsageWrapKey | blink::WebCryptoKeyUsageUnwrapKey); | 3133 blink::WebCryptoKeyUsageWrapKey | blink::WebCryptoKeyUsageUnwrapKey); |
3133 // Import the key to be wrapped. | 3134 // Import the key to be wrapped. |
3134 blink::WebCryptoKey key = ImportSecretKeyFromRaw( | 3135 blink::WebCryptoKey key = ImportSecretKeyFromRaw( |
3135 test_key, | 3136 test_key, |
3136 webcrypto::CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc), | 3137 webcrypto::CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc), |
3137 blink::WebCryptoKeyUsageEncrypt); | 3138 blink::WebCryptoKeyUsageEncrypt); |
3138 | 3139 |
3139 // Unwrap with wrapped data too small must fail. | 3140 // Unwrap with wrapped data too small must fail. |
3140 const std::vector<uint8> small_data(test_ciphertext.begin(), | 3141 const std::vector<uint8_t> small_data(test_ciphertext.begin(), |
3141 test_ciphertext.begin() + 23); | 3142 test_ciphertext.begin() + 23); |
3142 blink::WebCryptoKey unwrapped_key = blink::WebCryptoKey::createNull(); | 3143 blink::WebCryptoKey unwrapped_key = blink::WebCryptoKey::createNull(); |
3143 EXPECT_EQ(Status::ErrorDataTooSmall(), | 3144 EXPECT_EQ(Status::ErrorDataTooSmall(), |
3144 UnwrapKey(blink::WebCryptoKeyFormatRaw, | 3145 UnwrapKey(blink::WebCryptoKeyFormatRaw, |
3145 CryptoData(small_data), | 3146 CryptoData(small_data), |
3146 wrapping_key, | 3147 wrapping_key, |
3147 wrapping_algorithm, | 3148 wrapping_algorithm, |
3148 key_algorithm, | 3149 key_algorithm, |
3149 true, | 3150 true, |
3150 blink::WebCryptoKeyUsageEncrypt, | 3151 blink::WebCryptoKeyUsageEncrypt, |
3151 &unwrapped_key)); | 3152 &unwrapped_key)); |
3152 | 3153 |
3153 // Unwrap with wrapped data size not a multiple of 8 bytes must fail. | 3154 // Unwrap with wrapped data size not a multiple of 8 bytes must fail. |
3154 const std::vector<uint8> unaligned_data(test_ciphertext.begin(), | 3155 const std::vector<uint8_t> unaligned_data(test_ciphertext.begin(), |
3155 test_ciphertext.end() - 2); | 3156 test_ciphertext.end() - 2); |
3156 EXPECT_EQ(Status::ErrorInvalidAesKwDataLength(), | 3157 EXPECT_EQ(Status::ErrorInvalidAesKwDataLength(), |
3157 UnwrapKey(blink::WebCryptoKeyFormatRaw, | 3158 UnwrapKey(blink::WebCryptoKeyFormatRaw, |
3158 CryptoData(unaligned_data), | 3159 CryptoData(unaligned_data), |
3159 wrapping_key, | 3160 wrapping_key, |
3160 wrapping_algorithm, | 3161 wrapping_algorithm, |
3161 key_algorithm, | 3162 key_algorithm, |
3162 true, | 3163 true, |
3163 blink::WebCryptoKeyUsageEncrypt, | 3164 blink::WebCryptoKeyUsageEncrypt, |
3164 &unwrapped_key)); | 3165 &unwrapped_key)); |
3165 } | 3166 } |
3166 | 3167 |
3167 TEST_F(SharedCryptoTest, MAYBE(AesKwRawSymkeyUnwrapCorruptData)) { | 3168 TEST_F(SharedCryptoTest, MAYBE(AesKwRawSymkeyUnwrapCorruptData)) { |
3168 scoped_ptr<base::ListValue> tests; | 3169 scoped_ptr<base::ListValue> tests; |
3169 ASSERT_TRUE(ReadJsonTestFileToList("aes_kw.json", &tests)); | 3170 ASSERT_TRUE(ReadJsonTestFileToList("aes_kw.json", &tests)); |
3170 base::DictionaryValue* test; | 3171 base::DictionaryValue* test; |
3171 // Use 256 bits of data with a 256-bit KEK | 3172 // Use 256 bits of data with a 256-bit KEK |
3172 ASSERT_TRUE(tests->GetDictionary(3, &test)); | 3173 ASSERT_TRUE(tests->GetDictionary(3, &test)); |
3173 const std::vector<uint8> test_kek = GetBytesFromHexString(test, "kek"); | 3174 const std::vector<uint8_t> test_kek = GetBytesFromHexString(test, "kek"); |
3174 const std::vector<uint8> test_key = GetBytesFromHexString(test, "key"); | 3175 const std::vector<uint8_t> test_key = GetBytesFromHexString(test, "key"); |
3175 const std::vector<uint8> test_ciphertext = | 3176 const std::vector<uint8_t> test_ciphertext = |
3176 GetBytesFromHexString(test, "ciphertext"); | 3177 GetBytesFromHexString(test, "ciphertext"); |
3177 const blink::WebCryptoAlgorithm wrapping_algorithm = | 3178 const blink::WebCryptoAlgorithm wrapping_algorithm = |
3178 webcrypto::CreateAlgorithm(blink::WebCryptoAlgorithmIdAesKw); | 3179 webcrypto::CreateAlgorithm(blink::WebCryptoAlgorithmIdAesKw); |
3179 | 3180 |
3180 // Import the wrapping key. | 3181 // Import the wrapping key. |
3181 blink::WebCryptoKey wrapping_key = ImportSecretKeyFromRaw( | 3182 blink::WebCryptoKey wrapping_key = ImportSecretKeyFromRaw( |
3182 test_kek, | 3183 test_kek, |
3183 wrapping_algorithm, | 3184 wrapping_algorithm, |
3184 blink::WebCryptoKeyUsageWrapKey | blink::WebCryptoKeyUsageUnwrapKey); | 3185 blink::WebCryptoKeyUsageWrapKey | blink::WebCryptoKeyUsageUnwrapKey); |
3185 | 3186 |
(...skipping 13 matching lines...) Expand all Loading... |
3199 } | 3200 } |
3200 | 3201 |
3201 TEST_F(SharedCryptoTest, MAYBE(AesKwJwkSymkeyUnwrapKnownData)) { | 3202 TEST_F(SharedCryptoTest, MAYBE(AesKwJwkSymkeyUnwrapKnownData)) { |
3202 // The following data lists a known HMAC SHA-256 key, then a JWK | 3203 // The following data lists a known HMAC SHA-256 key, then a JWK |
3203 // representation of this key which was encrypted ("wrapped") using AES-KW and | 3204 // representation of this key which was encrypted ("wrapped") using AES-KW and |
3204 // the following wrapping key. | 3205 // the following wrapping key. |
3205 // For reference, the intermediate clear JWK is | 3206 // For reference, the intermediate clear JWK is |
3206 // {"alg":"HS256","ext":true,"k":<b64urlKey>,"key_ops":["verify"],"kty":"oct"} | 3207 // {"alg":"HS256","ext":true,"k":<b64urlKey>,"key_ops":["verify"],"kty":"oct"} |
3207 // (Not shown is space padding to ensure the cleartext meets the size | 3208 // (Not shown is space padding to ensure the cleartext meets the size |
3208 // requirements of the AES-KW algorithm.) | 3209 // requirements of the AES-KW algorithm.) |
3209 const std::vector<uint8> key_data = HexStringToBytes( | 3210 const std::vector<uint8_t> key_data = HexStringToBytes( |
3210 "000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0F"); | 3211 "000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0F"); |
3211 const std::vector<uint8> wrapped_key_data = HexStringToBytes( | 3212 const std::vector<uint8_t> wrapped_key_data = HexStringToBytes( |
3212 "14E6380B35FDC5B72E1994764B6CB7BFDD64E7832894356AAEE6C3768FC3D0F115E6B0" | 3213 "14E6380B35FDC5B72E1994764B6CB7BFDD64E7832894356AAEE6C3768FC3D0F115E6B0" |
3213 "6729756225F999AA99FDF81FD6A359F1576D3D23DE6CB69C3937054EB497AC1E8C38D5" | 3214 "6729756225F999AA99FDF81FD6A359F1576D3D23DE6CB69C3937054EB497AC1E8C38D5" |
3214 "5E01B9783A20C8D930020932CF25926103002213D0FC37279888154FEBCEDF31832158" | 3215 "5E01B9783A20C8D930020932CF25926103002213D0FC37279888154FEBCEDF31832158" |
3215 "97938C5CFE5B10B4254D0C399F39D0"); | 3216 "97938C5CFE5B10B4254D0C399F39D0"); |
3216 const std::vector<uint8> wrapping_key_data = | 3217 const std::vector<uint8_t> wrapping_key_data = |
3217 HexStringToBytes("000102030405060708090A0B0C0D0E0F"); | 3218 HexStringToBytes("000102030405060708090A0B0C0D0E0F"); |
3218 const blink::WebCryptoAlgorithm wrapping_algorithm = | 3219 const blink::WebCryptoAlgorithm wrapping_algorithm = |
3219 webcrypto::CreateAlgorithm(blink::WebCryptoAlgorithmIdAesKw); | 3220 webcrypto::CreateAlgorithm(blink::WebCryptoAlgorithmIdAesKw); |
3220 | 3221 |
3221 // Import the wrapping key. | 3222 // Import the wrapping key. |
3222 blink::WebCryptoKey wrapping_key = ImportSecretKeyFromRaw( | 3223 blink::WebCryptoKey wrapping_key = ImportSecretKeyFromRaw( |
3223 wrapping_key_data, wrapping_algorithm, blink::WebCryptoKeyUsageUnwrapKey); | 3224 wrapping_key_data, wrapping_algorithm, blink::WebCryptoKeyUsageUnwrapKey); |
3224 | 3225 |
3225 // Unwrap the known wrapped key data to produce a new key | 3226 // Unwrap the known wrapped key data to produce a new key |
3226 blink::WebCryptoKey unwrapped_key = blink::WebCryptoKey::createNull(); | 3227 blink::WebCryptoKey unwrapped_key = blink::WebCryptoKey::createNull(); |
(...skipping 13 matching lines...) Expand all Loading... |
3240 EXPECT_TRUE(unwrapped_key.handle()); | 3241 EXPECT_TRUE(unwrapped_key.handle()); |
3241 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, unwrapped_key.type()); | 3242 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, unwrapped_key.type()); |
3242 EXPECT_EQ(blink::WebCryptoAlgorithmIdHmac, unwrapped_key.algorithm().id()); | 3243 EXPECT_EQ(blink::WebCryptoAlgorithmIdHmac, unwrapped_key.algorithm().id()); |
3243 EXPECT_EQ(blink::WebCryptoAlgorithmIdSha256, | 3244 EXPECT_EQ(blink::WebCryptoAlgorithmIdSha256, |
3244 unwrapped_key.algorithm().hmacParams()->hash().id()); | 3245 unwrapped_key.algorithm().hmacParams()->hash().id()); |
3245 EXPECT_EQ(256u, unwrapped_key.algorithm().hmacParams()->lengthBits()); | 3246 EXPECT_EQ(256u, unwrapped_key.algorithm().hmacParams()->lengthBits()); |
3246 EXPECT_EQ(true, unwrapped_key.extractable()); | 3247 EXPECT_EQ(true, unwrapped_key.extractable()); |
3247 EXPECT_EQ(blink::WebCryptoKeyUsageVerify, unwrapped_key.usages()); | 3248 EXPECT_EQ(blink::WebCryptoKeyUsageVerify, unwrapped_key.usages()); |
3248 | 3249 |
3249 // Export the new key's raw data and compare to the known original. | 3250 // Export the new key's raw data and compare to the known original. |
3250 std::vector<uint8> raw_key; | 3251 std::vector<uint8_t> raw_key; |
3251 EXPECT_EQ(Status::Success(), | 3252 EXPECT_EQ(Status::Success(), |
3252 ExportKey(blink::WebCryptoKeyFormatRaw, unwrapped_key, &raw_key)); | 3253 ExportKey(blink::WebCryptoKeyFormatRaw, unwrapped_key, &raw_key)); |
3253 EXPECT_BYTES_EQ(key_data, raw_key); | 3254 EXPECT_BYTES_EQ(key_data, raw_key); |
3254 } | 3255 } |
3255 | 3256 |
3256 // TODO(eroman): | 3257 // TODO(eroman): |
3257 // * Test decryption when the tag length exceeds input size | 3258 // * Test decryption when the tag length exceeds input size |
3258 // * Test decryption with empty input | 3259 // * Test decryption with empty input |
3259 // * Test decryption with tag length of 0. | 3260 // * Test decryption with tag length of 0. |
3260 TEST_F(SharedCryptoTest, AesGcmSampleSets) { | 3261 TEST_F(SharedCryptoTest, AesGcmSampleSets) { |
3261 // Some Linux test runners may not have a new enough version of NSS. | 3262 // Some Linux test runners may not have a new enough version of NSS. |
3262 if (!SupportsAesGcm()) { | 3263 if (!SupportsAesGcm()) { |
3263 LOG(WARNING) << "AES GCM not supported, skipping tests"; | 3264 LOG(WARNING) << "AES GCM not supported, skipping tests"; |
3264 return; | 3265 return; |
3265 } | 3266 } |
3266 | 3267 |
3267 scoped_ptr<base::ListValue> tests; | 3268 scoped_ptr<base::ListValue> tests; |
3268 ASSERT_TRUE(ReadJsonTestFileToList("aes_gcm.json", &tests)); | 3269 ASSERT_TRUE(ReadJsonTestFileToList("aes_gcm.json", &tests)); |
3269 | 3270 |
3270 // Note that WebCrypto appends the authentication tag to the ciphertext. | 3271 // Note that WebCrypto appends the authentication tag to the ciphertext. |
3271 for (size_t test_index = 0; test_index < tests->GetSize(); ++test_index) { | 3272 for (size_t test_index = 0; test_index < tests->GetSize(); ++test_index) { |
3272 SCOPED_TRACE(test_index); | 3273 SCOPED_TRACE(test_index); |
3273 base::DictionaryValue* test; | 3274 base::DictionaryValue* test; |
3274 ASSERT_TRUE(tests->GetDictionary(test_index, &test)); | 3275 ASSERT_TRUE(tests->GetDictionary(test_index, &test)); |
3275 | 3276 |
3276 const std::vector<uint8> test_key = GetBytesFromHexString(test, "key"); | 3277 const std::vector<uint8_t> test_key = GetBytesFromHexString(test, "key"); |
3277 const std::vector<uint8> test_iv = GetBytesFromHexString(test, "iv"); | 3278 const std::vector<uint8_t> test_iv = GetBytesFromHexString(test, "iv"); |
3278 const std::vector<uint8> test_additional_data = | 3279 const std::vector<uint8_t> test_additional_data = |
3279 GetBytesFromHexString(test, "additional_data"); | 3280 GetBytesFromHexString(test, "additional_data"); |
3280 const std::vector<uint8> test_plain_text = | 3281 const std::vector<uint8_t> test_plain_text = |
3281 GetBytesFromHexString(test, "plain_text"); | 3282 GetBytesFromHexString(test, "plain_text"); |
3282 const std::vector<uint8> test_authentication_tag = | 3283 const std::vector<uint8_t> test_authentication_tag = |
3283 GetBytesFromHexString(test, "authentication_tag"); | 3284 GetBytesFromHexString(test, "authentication_tag"); |
3284 const unsigned int test_tag_size_bits = test_authentication_tag.size() * 8; | 3285 const unsigned int test_tag_size_bits = test_authentication_tag.size() * 8; |
3285 const std::vector<uint8> test_cipher_text = | 3286 const std::vector<uint8_t> test_cipher_text = |
3286 GetBytesFromHexString(test, "cipher_text"); | 3287 GetBytesFromHexString(test, "cipher_text"); |
3287 | 3288 |
3288 #if defined(USE_OPENSSL) | 3289 #if defined(USE_OPENSSL) |
3289 // TODO(eroman): Add support for 256-bit keys. | 3290 // TODO(eroman): Add support for 256-bit keys. |
3290 if (test_key.size() == 32) { | 3291 if (test_key.size() == 32) { |
3291 LOG(WARNING) | 3292 LOG(WARNING) |
3292 << "OpenSSL doesn't support 256-bit keys for AES-GCM; skipping"; | 3293 << "OpenSSL doesn't support 256-bit keys for AES-GCM; skipping"; |
3293 continue; | 3294 continue; |
3294 } | 3295 } |
3295 #endif | 3296 #endif |
3296 | 3297 |
3297 blink::WebCryptoKey key = ImportSecretKeyFromRaw( | 3298 blink::WebCryptoKey key = ImportSecretKeyFromRaw( |
3298 test_key, | 3299 test_key, |
3299 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesGcm), | 3300 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesGcm), |
3300 blink::WebCryptoKeyUsageEncrypt | blink::WebCryptoKeyUsageDecrypt); | 3301 blink::WebCryptoKeyUsageEncrypt | blink::WebCryptoKeyUsageDecrypt); |
3301 | 3302 |
3302 // Verify exported raw key is identical to the imported data | 3303 // Verify exported raw key is identical to the imported data |
3303 std::vector<uint8> raw_key; | 3304 std::vector<uint8_t> raw_key; |
3304 EXPECT_EQ(Status::Success(), | 3305 EXPECT_EQ(Status::Success(), |
3305 ExportKey(blink::WebCryptoKeyFormatRaw, key, &raw_key)); | 3306 ExportKey(blink::WebCryptoKeyFormatRaw, key, &raw_key)); |
3306 | 3307 |
3307 EXPECT_BYTES_EQ(test_key, raw_key); | 3308 EXPECT_BYTES_EQ(test_key, raw_key); |
3308 | 3309 |
3309 // Test encryption. | 3310 // Test encryption. |
3310 std::vector<uint8> cipher_text; | 3311 std::vector<uint8_t> cipher_text; |
3311 std::vector<uint8> authentication_tag; | 3312 std::vector<uint8_t> authentication_tag; |
3312 EXPECT_EQ(Status::Success(), | 3313 EXPECT_EQ(Status::Success(), |
3313 AesGcmEncrypt(key, | 3314 AesGcmEncrypt(key, |
3314 test_iv, | 3315 test_iv, |
3315 test_additional_data, | 3316 test_additional_data, |
3316 test_tag_size_bits, | 3317 test_tag_size_bits, |
3317 test_plain_text, | 3318 test_plain_text, |
3318 &cipher_text, | 3319 &cipher_text, |
3319 &authentication_tag)); | 3320 &authentication_tag)); |
3320 | 3321 |
3321 EXPECT_BYTES_EQ(test_cipher_text, cipher_text); | 3322 EXPECT_BYTES_EQ(test_cipher_text, cipher_text); |
3322 EXPECT_BYTES_EQ(test_authentication_tag, authentication_tag); | 3323 EXPECT_BYTES_EQ(test_authentication_tag, authentication_tag); |
3323 | 3324 |
3324 // Test decryption. | 3325 // Test decryption. |
3325 std::vector<uint8> plain_text; | 3326 std::vector<uint8_t> plain_text; |
3326 EXPECT_EQ(Status::Success(), | 3327 EXPECT_EQ(Status::Success(), |
3327 AesGcmDecrypt(key, | 3328 AesGcmDecrypt(key, |
3328 test_iv, | 3329 test_iv, |
3329 test_additional_data, | 3330 test_additional_data, |
3330 test_tag_size_bits, | 3331 test_tag_size_bits, |
3331 test_cipher_text, | 3332 test_cipher_text, |
3332 test_authentication_tag, | 3333 test_authentication_tag, |
3333 &plain_text)); | 3334 &plain_text)); |
3334 EXPECT_BYTES_EQ(test_plain_text, plain_text); | 3335 EXPECT_BYTES_EQ(test_plain_text, plain_text); |
3335 | 3336 |
(...skipping 25 matching lines...) Expand all Loading... |
3361 EXPECT_EQ(Status::OperationError(), | 3362 EXPECT_EQ(Status::OperationError(), |
3362 AesGcmDecrypt(key, | 3363 AesGcmDecrypt(key, |
3363 test_iv, | 3364 test_iv, |
3364 test_additional_data, | 3365 test_additional_data, |
3365 test_tag_size_bits, | 3366 test_tag_size_bits, |
3366 test_cipher_text, | 3367 test_cipher_text, |
3367 Corrupted(test_authentication_tag), | 3368 Corrupted(test_authentication_tag), |
3368 &plain_text)); | 3369 &plain_text)); |
3369 | 3370 |
3370 // Try different incorrect tag lengths | 3371 // Try different incorrect tag lengths |
3371 uint8 kAlternateTagLengths[] = {0, 8, 96, 120, 128, 160, 255}; | 3372 uint8_t kAlternateTagLengths[] = {0, 8, 96, 120, 128, 160, 255}; |
3372 for (size_t tag_i = 0; tag_i < arraysize(kAlternateTagLengths); ++tag_i) { | 3373 for (size_t tag_i = 0; tag_i < arraysize(kAlternateTagLengths); ++tag_i) { |
3373 unsigned int wrong_tag_size_bits = kAlternateTagLengths[tag_i]; | 3374 unsigned int wrong_tag_size_bits = kAlternateTagLengths[tag_i]; |
3374 if (test_tag_size_bits == wrong_tag_size_bits) | 3375 if (test_tag_size_bits == wrong_tag_size_bits) |
3375 continue; | 3376 continue; |
3376 EXPECT_NE(Status::Success(), | 3377 EXPECT_NE(Status::Success(), |
3377 AesGcmDecrypt(key, | 3378 AesGcmDecrypt(key, |
3378 test_iv, | 3379 test_iv, |
3379 test_additional_data, | 3380 test_additional_data, |
3380 wrong_tag_size_bits, | 3381 wrong_tag_size_bits, |
3381 test_cipher_text, | 3382 test_cipher_text, |
3382 test_authentication_tag, | 3383 test_authentication_tag, |
3383 &plain_text)); | 3384 &plain_text)); |
3384 } | 3385 } |
3385 } | 3386 } |
3386 } | 3387 } |
3387 | 3388 |
3388 // AES 192-bit is not allowed: http://crbug.com/381829 | 3389 // AES 192-bit is not allowed: http://crbug.com/381829 |
3389 TEST_F(SharedCryptoTest, MAYBE(ImportAesCbc192Raw)) { | 3390 TEST_F(SharedCryptoTest, MAYBE(ImportAesCbc192Raw)) { |
3390 std::vector<uint8> key_raw(24, 0); | 3391 std::vector<uint8_t> key_raw(24, 0); |
3391 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | 3392 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
3392 Status status = ImportKey(blink::WebCryptoKeyFormatRaw, | 3393 Status status = ImportKey(blink::WebCryptoKeyFormatRaw, |
3393 CryptoData(key_raw), | 3394 CryptoData(key_raw), |
3394 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc), | 3395 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc), |
3395 true, | 3396 true, |
3396 blink::WebCryptoKeyUsageEncrypt, | 3397 blink::WebCryptoKeyUsageEncrypt, |
3397 &key); | 3398 &key); |
3398 ASSERT_EQ(Status::ErrorAes192BitUnsupported(), status); | 3399 ASSERT_EQ(Status::ErrorAes192BitUnsupported(), status); |
3399 } | 3400 } |
3400 | 3401 |
(...skipping 20 matching lines...) Expand all Loading... |
3421 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | 3422 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
3422 Status status = GenerateSecretKey(CreateAesCbcKeyGenAlgorithm(192), | 3423 Status status = GenerateSecretKey(CreateAesCbcKeyGenAlgorithm(192), |
3423 true, | 3424 true, |
3424 blink::WebCryptoKeyUsageEncrypt, | 3425 blink::WebCryptoKeyUsageEncrypt, |
3425 &key); | 3426 &key); |
3426 ASSERT_EQ(Status::ErrorAes192BitUnsupported(), status); | 3427 ASSERT_EQ(Status::ErrorAes192BitUnsupported(), status); |
3427 } | 3428 } |
3428 | 3429 |
3429 // AES 192-bit is not allowed: http://crbug.com/381829 | 3430 // AES 192-bit is not allowed: http://crbug.com/381829 |
3430 TEST_F(SharedCryptoTest, MAYBE(UnwrapAesCbc192)) { | 3431 TEST_F(SharedCryptoTest, MAYBE(UnwrapAesCbc192)) { |
3431 std::vector<uint8> wrapping_key_data(16, 0); | 3432 std::vector<uint8_t> wrapping_key_data(16, 0); |
3432 std::vector<uint8> wrapped_key = HexStringToBytes( | 3433 std::vector<uint8_t> wrapped_key = HexStringToBytes( |
3433 "1A07ACAB6C906E50883173C29441DB1DE91D34F45C435B5F99C822867FB3956F"); | 3434 "1A07ACAB6C906E50883173C29441DB1DE91D34F45C435B5F99C822867FB3956F"); |
3434 | 3435 |
3435 blink::WebCryptoKey wrapping_key = | 3436 blink::WebCryptoKey wrapping_key = |
3436 ImportSecretKeyFromRaw(wrapping_key_data, | 3437 ImportSecretKeyFromRaw(wrapping_key_data, |
3437 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesKw), | 3438 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesKw), |
3438 blink::WebCryptoKeyUsageUnwrapKey); | 3439 blink::WebCryptoKeyUsageUnwrapKey); |
3439 | 3440 |
3440 blink::WebCryptoKey unwrapped_key = blink::WebCryptoKey::createNull(); | 3441 blink::WebCryptoKey unwrapped_key = blink::WebCryptoKey::createNull(); |
3441 ASSERT_EQ(Status::ErrorAes192BitUnsupported(), | 3442 ASSERT_EQ(Status::ErrorAes192BitUnsupported(), |
3442 UnwrapKey(blink::WebCryptoKeyFormatRaw, | 3443 UnwrapKey(blink::WebCryptoKeyFormatRaw, |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3587 ASSERT_EQ(Status::Success(), | 3588 ASSERT_EQ(Status::Success(), |
3588 ImportKeyJwkFromDict( | 3589 ImportKeyJwkFromDict( |
3589 *jwk.get(), | 3590 *jwk.get(), |
3590 CreateRsaHashedImportAlgorithm( | 3591 CreateRsaHashedImportAlgorithm( |
3591 blink::WebCryptoAlgorithmIdRsaOaep, test_data.hash_alg), | 3592 blink::WebCryptoAlgorithmIdRsaOaep, test_data.hash_alg), |
3592 true, | 3593 true, |
3593 blink::WebCryptoKeyUsageEncrypt, | 3594 blink::WebCryptoKeyUsageEncrypt, |
3594 &public_key)); | 3595 &public_key)); |
3595 | 3596 |
3596 // Now export the key as JWK and verify its contents | 3597 // Now export the key as JWK and verify its contents |
3597 std::vector<uint8> jwk_data; | 3598 std::vector<uint8_t> jwk_data; |
3598 ASSERT_EQ(Status::Success(), | 3599 ASSERT_EQ(Status::Success(), |
3599 ExportKey(blink::WebCryptoKeyFormatJwk, public_key, &jwk_data)); | 3600 ExportKey(blink::WebCryptoKeyFormatJwk, public_key, &jwk_data)); |
3600 EXPECT_TRUE(VerifyPublicJwk(jwk_data, | 3601 EXPECT_TRUE(VerifyPublicJwk(jwk_data, |
3601 test_data.expected_jwk_alg, | 3602 test_data.expected_jwk_alg, |
3602 kPublicKeyModulusHex, | 3603 kPublicKeyModulusHex, |
3603 kPublicKeyExponentHex, | 3604 kPublicKeyExponentHex, |
3604 blink::WebCryptoKeyUsageEncrypt)); | 3605 blink::WebCryptoKeyUsageEncrypt)); |
3605 } | 3606 } |
3606 } | 3607 } |
3607 | 3608 |
3608 TEST_F(SharedCryptoRsaOaepTest, EncryptDecryptKnownAnswerTest) { | 3609 TEST_F(SharedCryptoRsaOaepTest, EncryptDecryptKnownAnswerTest) { |
3609 if (!SupportsRsaOaep()) { | 3610 if (!SupportsRsaOaep()) { |
3610 LOG(WARNING) << "RSA-OAEP support not present; skipping."; | 3611 LOG(WARNING) << "RSA-OAEP support not present; skipping."; |
3611 return; | 3612 return; |
3612 } | 3613 } |
3613 | 3614 |
3614 scoped_ptr<base::ListValue> tests; | 3615 scoped_ptr<base::ListValue> tests; |
3615 ASSERT_TRUE(ReadJsonTestFileToList("rsa_oaep.json", &tests)); | 3616 ASSERT_TRUE(ReadJsonTestFileToList("rsa_oaep.json", &tests)); |
3616 | 3617 |
3617 for (size_t test_index = 0; test_index < tests->GetSize(); ++test_index) { | 3618 for (size_t test_index = 0; test_index < tests->GetSize(); ++test_index) { |
3618 SCOPED_TRACE(test_index); | 3619 SCOPED_TRACE(test_index); |
3619 | 3620 |
3620 base::DictionaryValue* test = NULL; | 3621 base::DictionaryValue* test = NULL; |
3621 ASSERT_TRUE(tests->GetDictionary(test_index, &test)); | 3622 ASSERT_TRUE(tests->GetDictionary(test_index, &test)); |
3622 | 3623 |
3623 blink::WebCryptoAlgorithm digest_algorithm = | 3624 blink::WebCryptoAlgorithm digest_algorithm = |
3624 GetDigestAlgorithm(test, "hash"); | 3625 GetDigestAlgorithm(test, "hash"); |
3625 ASSERT_FALSE(digest_algorithm.isNull()); | 3626 ASSERT_FALSE(digest_algorithm.isNull()); |
3626 std::vector<uint8> public_key_der = | 3627 std::vector<uint8_t> public_key_der = |
3627 GetBytesFromHexString(test, "public_key"); | 3628 GetBytesFromHexString(test, "public_key"); |
3628 std::vector<uint8> private_key_der = | 3629 std::vector<uint8_t> private_key_der = |
3629 GetBytesFromHexString(test, "private_key"); | 3630 GetBytesFromHexString(test, "private_key"); |
3630 std::vector<uint8> ciphertext = GetBytesFromHexString(test, "ciphertext"); | 3631 std::vector<uint8_t> ciphertext = GetBytesFromHexString(test, "ciphertext"); |
3631 std::vector<uint8> plaintext = GetBytesFromHexString(test, "plaintext"); | 3632 std::vector<uint8_t> plaintext = GetBytesFromHexString(test, "plaintext"); |
3632 std::vector<uint8> label = GetBytesFromHexString(test, "label"); | 3633 std::vector<uint8_t> label = GetBytesFromHexString(test, "label"); |
3633 | 3634 |
3634 blink::WebCryptoAlgorithm import_algorithm = CreateRsaHashedImportAlgorithm( | 3635 blink::WebCryptoAlgorithm import_algorithm = CreateRsaHashedImportAlgorithm( |
3635 blink::WebCryptoAlgorithmIdRsaOaep, digest_algorithm.id()); | 3636 blink::WebCryptoAlgorithmIdRsaOaep, digest_algorithm.id()); |
3636 blink::WebCryptoKey public_key = blink::WebCryptoKey::createNull(); | 3637 blink::WebCryptoKey public_key = blink::WebCryptoKey::createNull(); |
3637 blink::WebCryptoKey private_key = blink::WebCryptoKey::createNull(); | 3638 blink::WebCryptoKey private_key = blink::WebCryptoKey::createNull(); |
3638 | 3639 |
3639 ASSERT_NO_FATAL_FAILURE(ImportRsaKeyPair(public_key_der, | 3640 ASSERT_NO_FATAL_FAILURE(ImportRsaKeyPair(public_key_der, |
3640 private_key_der, | 3641 private_key_der, |
3641 import_algorithm, | 3642 import_algorithm, |
3642 false, | 3643 false, |
3643 blink::WebCryptoKeyUsageEncrypt, | 3644 blink::WebCryptoKeyUsageEncrypt, |
3644 blink::WebCryptoKeyUsageDecrypt, | 3645 blink::WebCryptoKeyUsageDecrypt, |
3645 &public_key, | 3646 &public_key, |
3646 &private_key)); | 3647 &private_key)); |
3647 | 3648 |
3648 blink::WebCryptoAlgorithm op_algorithm = CreateRsaOaepAlgorithm(label); | 3649 blink::WebCryptoAlgorithm op_algorithm = CreateRsaOaepAlgorithm(label); |
3649 std::vector<uint8> decrypted_data; | 3650 std::vector<uint8_t> decrypted_data; |
3650 ASSERT_EQ(Status::Success(), | 3651 ASSERT_EQ(Status::Success(), |
3651 Decrypt(op_algorithm, | 3652 Decrypt(op_algorithm, |
3652 private_key, | 3653 private_key, |
3653 CryptoData(ciphertext), | 3654 CryptoData(ciphertext), |
3654 &decrypted_data)); | 3655 &decrypted_data)); |
3655 EXPECT_BYTES_EQ(plaintext, decrypted_data); | 3656 EXPECT_BYTES_EQ(plaintext, decrypted_data); |
3656 std::vector<uint8> encrypted_data; | 3657 std::vector<uint8_t> encrypted_data; |
3657 ASSERT_EQ( | 3658 ASSERT_EQ( |
3658 Status::Success(), | 3659 Status::Success(), |
3659 Encrypt( | 3660 Encrypt( |
3660 op_algorithm, public_key, CryptoData(plaintext), &encrypted_data)); | 3661 op_algorithm, public_key, CryptoData(plaintext), &encrypted_data)); |
3661 std::vector<uint8> redecrypted_data; | 3662 std::vector<uint8_t> redecrypted_data; |
3662 ASSERT_EQ(Status::Success(), | 3663 ASSERT_EQ(Status::Success(), |
3663 Decrypt(op_algorithm, | 3664 Decrypt(op_algorithm, |
3664 private_key, | 3665 private_key, |
3665 CryptoData(encrypted_data), | 3666 CryptoData(encrypted_data), |
3666 &redecrypted_data)); | 3667 &redecrypted_data)); |
3667 EXPECT_BYTES_EQ(plaintext, redecrypted_data); | 3668 EXPECT_BYTES_EQ(plaintext, redecrypted_data); |
3668 } | 3669 } |
3669 } | 3670 } |
3670 | 3671 |
3671 TEST_F(SharedCryptoRsaOaepTest, EncryptWithLargeMessageFails) { | 3672 TEST_F(SharedCryptoRsaOaepTest, EncryptWithLargeMessageFails) { |
(...skipping 19 matching lines...) Expand all Loading... |
3691 // The maximum size of an encrypted message is: | 3692 // The maximum size of an encrypted message is: |
3692 // modulus length | 3693 // modulus length |
3693 // - 1 (leading octet) | 3694 // - 1 (leading octet) |
3694 // - hash size (maskedSeed) | 3695 // - hash size (maskedSeed) |
3695 // - hash size (lHash portion of maskedDB) | 3696 // - hash size (lHash portion of maskedDB) |
3696 // - 1 (at least one octet for the padding string) | 3697 // - 1 (at least one octet for the padding string) |
3697 size_t kMaxMessageSize = (kModulusLengthBits / 8) - 2 - (2 * kHashSize); | 3698 size_t kMaxMessageSize = (kModulusLengthBits / 8) - 2 - (2 * kHashSize); |
3698 | 3699 |
3699 // The label has no influence on the maximum message size. For simplicity, | 3700 // The label has no influence on the maximum message size. For simplicity, |
3700 // use the empty string. | 3701 // use the empty string. |
3701 std::vector<uint8> label; | 3702 std::vector<uint8_t> label; |
3702 blink::WebCryptoAlgorithm op_algorithm = CreateRsaOaepAlgorithm(label); | 3703 blink::WebCryptoAlgorithm op_algorithm = CreateRsaOaepAlgorithm(label); |
3703 | 3704 |
3704 // Test that a message just before the boundary succeeds. | 3705 // Test that a message just before the boundary succeeds. |
3705 std::string large_message; | 3706 std::string large_message; |
3706 large_message.resize(kMaxMessageSize - 1, 'A'); | 3707 large_message.resize(kMaxMessageSize - 1, 'A'); |
3707 | 3708 |
3708 std::vector<uint8> ciphertext; | 3709 std::vector<uint8_t> ciphertext; |
3709 ASSERT_EQ( | 3710 ASSERT_EQ( |
3710 Status::Success(), | 3711 Status::Success(), |
3711 Encrypt( | 3712 Encrypt( |
3712 op_algorithm, public_key, CryptoData(large_message), &ciphertext)); | 3713 op_algorithm, public_key, CryptoData(large_message), &ciphertext)); |
3713 | 3714 |
3714 // Test that a message at the boundary succeeds. | 3715 // Test that a message at the boundary succeeds. |
3715 large_message.resize(kMaxMessageSize, 'A'); | 3716 large_message.resize(kMaxMessageSize, 'A'); |
3716 ciphertext.clear(); | 3717 ciphertext.clear(); |
3717 | 3718 |
3718 ASSERT_EQ( | 3719 ASSERT_EQ( |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3750 ASSERT_EQ(Status::Success(), | 3751 ASSERT_EQ(Status::Success(), |
3751 ImportKeyJwkFromDict(*jwk.get(), | 3752 ImportKeyJwkFromDict(*jwk.get(), |
3752 CreateRsaHashedImportAlgorithm( | 3753 CreateRsaHashedImportAlgorithm( |
3753 blink::WebCryptoAlgorithmIdRsaOaep, kHash), | 3754 blink::WebCryptoAlgorithmIdRsaOaep, kHash), |
3754 true, | 3755 true, |
3755 blink::WebCryptoKeyUsageEncrypt, | 3756 blink::WebCryptoKeyUsageEncrypt, |
3756 &public_key)); | 3757 &public_key)); |
3757 | 3758 |
3758 // The label has no influence on the maximum message size. For simplicity, | 3759 // The label has no influence on the maximum message size. For simplicity, |
3759 // use the empty string. | 3760 // use the empty string. |
3760 std::vector<uint8> label; | 3761 std::vector<uint8_t> label; |
3761 blink::WebCryptoAlgorithm op_algorithm = CreateRsaOaepAlgorithm(label); | 3762 blink::WebCryptoAlgorithm op_algorithm = CreateRsaOaepAlgorithm(label); |
3762 | 3763 |
3763 std::string small_message("A"); | 3764 std::string small_message("A"); |
3764 std::vector<uint8> ciphertext; | 3765 std::vector<uint8_t> ciphertext; |
3765 // This is an operation error, as the internal consistency checking of the | 3766 // This is an operation error, as the internal consistency checking of the |
3766 // algorithm parameters is up to the implementation. | 3767 // algorithm parameters is up to the implementation. |
3767 ASSERT_EQ( | 3768 ASSERT_EQ( |
3768 Status::OperationError(), | 3769 Status::OperationError(), |
3769 Encrypt( | 3770 Encrypt( |
3770 op_algorithm, public_key, CryptoData(small_message), &ciphertext)); | 3771 op_algorithm, public_key, CryptoData(small_message), &ciphertext)); |
3771 } | 3772 } |
3772 | 3773 |
3773 TEST_F(SharedCryptoRsaOaepTest, DecryptWithLargeMessageFails) { | 3774 TEST_F(SharedCryptoRsaOaepTest, DecryptWithLargeMessageFails) { |
3774 if (!SupportsRsaOaep()) { | 3775 if (!SupportsRsaOaep()) { |
3775 LOG(WARNING) << "RSA-OAEP support not present; skipping."; | 3776 LOG(WARNING) << "RSA-OAEP support not present; skipping."; |
3776 return; | 3777 return; |
3777 } | 3778 } |
3778 | 3779 |
3779 blink::WebCryptoKey private_key = blink::WebCryptoKey::createNull(); | 3780 blink::WebCryptoKey private_key = blink::WebCryptoKey::createNull(); |
3780 ASSERT_EQ(Status::Success(), | 3781 ASSERT_EQ(Status::Success(), |
3781 ImportKey(blink::WebCryptoKeyFormatPkcs8, | 3782 ImportKey(blink::WebCryptoKeyFormatPkcs8, |
3782 CryptoData(HexStringToBytes(kPrivateKeyPkcs8DerHex)), | 3783 CryptoData(HexStringToBytes(kPrivateKeyPkcs8DerHex)), |
3783 CreateRsaHashedImportAlgorithm( | 3784 CreateRsaHashedImportAlgorithm( |
3784 blink::WebCryptoAlgorithmIdRsaOaep, | 3785 blink::WebCryptoAlgorithmIdRsaOaep, |
3785 blink::WebCryptoAlgorithmIdSha1), | 3786 blink::WebCryptoAlgorithmIdSha1), |
3786 true, | 3787 true, |
3787 blink::WebCryptoKeyUsageDecrypt, | 3788 blink::WebCryptoKeyUsageDecrypt, |
3788 &private_key)); | 3789 &private_key)); |
3789 | 3790 |
3790 // The label has no influence on the maximum message size. For simplicity, | 3791 // The label has no influence on the maximum message size. For simplicity, |
3791 // use the empty string. | 3792 // use the empty string. |
3792 std::vector<uint8> label; | 3793 std::vector<uint8_t> label; |
3793 blink::WebCryptoAlgorithm op_algorithm = CreateRsaOaepAlgorithm(label); | 3794 blink::WebCryptoAlgorithm op_algorithm = CreateRsaOaepAlgorithm(label); |
3794 | 3795 |
3795 std::string large_dummy_message(kModulusLengthBits / 8, 'A'); | 3796 std::string large_dummy_message(kModulusLengthBits / 8, 'A'); |
3796 std::vector<uint8> plaintext; | 3797 std::vector<uint8_t> plaintext; |
3797 | 3798 |
3798 ASSERT_EQ(Status::OperationError(), | 3799 ASSERT_EQ(Status::OperationError(), |
3799 Decrypt(op_algorithm, | 3800 Decrypt(op_algorithm, |
3800 private_key, | 3801 private_key, |
3801 CryptoData(large_dummy_message), | 3802 CryptoData(large_dummy_message), |
3802 &plaintext)); | 3803 &plaintext)); |
3803 } | 3804 } |
3804 | 3805 |
3805 TEST_F(SharedCryptoRsaOaepTest, WrapUnwrapRawKey) { | 3806 TEST_F(SharedCryptoRsaOaepTest, WrapUnwrapRawKey) { |
3806 if (!SupportsRsaOaep()) { | 3807 if (!SupportsRsaOaep()) { |
3807 LOG(WARNING) << "RSA-OAEP support not present; skipping."; | 3808 LOG(WARNING) << "RSA-OAEP support not present; skipping."; |
3808 return; | 3809 return; |
3809 } | 3810 } |
3810 | 3811 |
3811 blink::WebCryptoAlgorithm import_algorithm = CreateRsaHashedImportAlgorithm( | 3812 blink::WebCryptoAlgorithm import_algorithm = CreateRsaHashedImportAlgorithm( |
3812 blink::WebCryptoAlgorithmIdRsaOaep, blink::WebCryptoAlgorithmIdSha1); | 3813 blink::WebCryptoAlgorithmIdRsaOaep, blink::WebCryptoAlgorithmIdSha1); |
3813 blink::WebCryptoKey public_key = blink::WebCryptoKey::createNull(); | 3814 blink::WebCryptoKey public_key = blink::WebCryptoKey::createNull(); |
3814 blink::WebCryptoKey private_key = blink::WebCryptoKey::createNull(); | 3815 blink::WebCryptoKey private_key = blink::WebCryptoKey::createNull(); |
3815 | 3816 |
3816 ASSERT_NO_FATAL_FAILURE(ImportRsaKeyPair( | 3817 ASSERT_NO_FATAL_FAILURE(ImportRsaKeyPair( |
3817 HexStringToBytes(kPublicKeySpkiDerHex), | 3818 HexStringToBytes(kPublicKeySpkiDerHex), |
3818 HexStringToBytes(kPrivateKeyPkcs8DerHex), | 3819 HexStringToBytes(kPrivateKeyPkcs8DerHex), |
3819 import_algorithm, | 3820 import_algorithm, |
3820 false, | 3821 false, |
3821 blink::WebCryptoKeyUsageEncrypt | blink::WebCryptoKeyUsageWrapKey, | 3822 blink::WebCryptoKeyUsageEncrypt | blink::WebCryptoKeyUsageWrapKey, |
3822 blink::WebCryptoKeyUsageDecrypt | blink::WebCryptoKeyUsageUnwrapKey, | 3823 blink::WebCryptoKeyUsageDecrypt | blink::WebCryptoKeyUsageUnwrapKey, |
3823 &public_key, | 3824 &public_key, |
3824 &private_key)); | 3825 &private_key)); |
3825 | 3826 |
3826 std::vector<uint8> label; | 3827 std::vector<uint8_t> label; |
3827 blink::WebCryptoAlgorithm wrapping_algorithm = CreateRsaOaepAlgorithm(label); | 3828 blink::WebCryptoAlgorithm wrapping_algorithm = CreateRsaOaepAlgorithm(label); |
3828 | 3829 |
3829 const std::string key_hex = "000102030405060708090A0B0C0D0E0F"; | 3830 const std::string key_hex = "000102030405060708090A0B0C0D0E0F"; |
3830 const blink::WebCryptoAlgorithm key_algorithm = | 3831 const blink::WebCryptoAlgorithm key_algorithm = |
3831 webcrypto::CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc); | 3832 webcrypto::CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc); |
3832 | 3833 |
3833 blink::WebCryptoKey key = | 3834 blink::WebCryptoKey key = |
3834 ImportSecretKeyFromRaw(HexStringToBytes(key_hex), | 3835 ImportSecretKeyFromRaw(HexStringToBytes(key_hex), |
3835 key_algorithm, | 3836 key_algorithm, |
3836 blink::WebCryptoKeyUsageEncrypt); | 3837 blink::WebCryptoKeyUsageEncrypt); |
3837 ASSERT_FALSE(key.isNull()); | 3838 ASSERT_FALSE(key.isNull()); |
3838 | 3839 |
3839 std::vector<uint8> wrapped_key; | 3840 std::vector<uint8_t> wrapped_key; |
3840 ASSERT_EQ(Status::Success(), | 3841 ASSERT_EQ(Status::Success(), |
3841 WrapKey(blink::WebCryptoKeyFormatRaw, | 3842 WrapKey(blink::WebCryptoKeyFormatRaw, |
3842 key, | 3843 key, |
3843 public_key, | 3844 public_key, |
3844 wrapping_algorithm, | 3845 wrapping_algorithm, |
3845 &wrapped_key)); | 3846 &wrapped_key)); |
3846 | 3847 |
3847 // Verify that |wrapped_key| can be decrypted and yields the key data. | 3848 // Verify that |wrapped_key| can be decrypted and yields the key data. |
3848 // Because |private_key| supports both decrypt and unwrap, this is valid. | 3849 // Because |private_key| supports both decrypt and unwrap, this is valid. |
3849 std::vector<uint8> decrypted_key; | 3850 std::vector<uint8_t> decrypted_key; |
3850 ASSERT_EQ(Status::Success(), | 3851 ASSERT_EQ(Status::Success(), |
3851 Decrypt(wrapping_algorithm, | 3852 Decrypt(wrapping_algorithm, |
3852 private_key, | 3853 private_key, |
3853 CryptoData(wrapped_key), | 3854 CryptoData(wrapped_key), |
3854 &decrypted_key)); | 3855 &decrypted_key)); |
3855 EXPECT_BYTES_EQ_HEX(key_hex, decrypted_key); | 3856 EXPECT_BYTES_EQ_HEX(key_hex, decrypted_key); |
3856 | 3857 |
3857 // Now attempt to unwrap the key, which should also decrypt the data. | 3858 // Now attempt to unwrap the key, which should also decrypt the data. |
3858 blink::WebCryptoKey unwrapped_key = blink::WebCryptoKey::createNull(); | 3859 blink::WebCryptoKey unwrapped_key = blink::WebCryptoKey::createNull(); |
3859 ASSERT_EQ(Status::Success(), | 3860 ASSERT_EQ(Status::Success(), |
3860 UnwrapKey(blink::WebCryptoKeyFormatRaw, | 3861 UnwrapKey(blink::WebCryptoKeyFormatRaw, |
3861 CryptoData(wrapped_key), | 3862 CryptoData(wrapped_key), |
3862 private_key, | 3863 private_key, |
3863 wrapping_algorithm, | 3864 wrapping_algorithm, |
3864 key_algorithm, | 3865 key_algorithm, |
3865 true, | 3866 true, |
3866 blink::WebCryptoKeyUsageEncrypt, | 3867 blink::WebCryptoKeyUsageEncrypt, |
3867 &unwrapped_key)); | 3868 &unwrapped_key)); |
3868 ASSERT_FALSE(unwrapped_key.isNull()); | 3869 ASSERT_FALSE(unwrapped_key.isNull()); |
3869 | 3870 |
3870 std::vector<uint8> raw_key; | 3871 std::vector<uint8_t> raw_key; |
3871 ASSERT_EQ(Status::Success(), | 3872 ASSERT_EQ(Status::Success(), |
3872 ExportKey(blink::WebCryptoKeyFormatRaw, unwrapped_key, &raw_key)); | 3873 ExportKey(blink::WebCryptoKeyFormatRaw, unwrapped_key, &raw_key)); |
3873 EXPECT_BYTES_EQ_HEX(key_hex, raw_key); | 3874 EXPECT_BYTES_EQ_HEX(key_hex, raw_key); |
3874 } | 3875 } |
3875 | 3876 |
3876 TEST_F(SharedCryptoRsaOaepTest, WrapUnwrapJwkSymKey) { | 3877 TEST_F(SharedCryptoRsaOaepTest, WrapUnwrapJwkSymKey) { |
3877 if (!SupportsRsaOaep()) { | 3878 if (!SupportsRsaOaep()) { |
3878 LOG(WARNING) << "RSA-OAEP support not present; skipping."; | 3879 LOG(WARNING) << "RSA-OAEP support not present; skipping."; |
3879 return; | 3880 return; |
3880 } | 3881 } |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3934 ASSERT_NO_FATAL_FAILURE(ImportRsaKeyPair( | 3935 ASSERT_NO_FATAL_FAILURE(ImportRsaKeyPair( |
3935 HexStringToBytes(kPublicKey2048SpkiDerHex), | 3936 HexStringToBytes(kPublicKey2048SpkiDerHex), |
3936 HexStringToBytes(kPrivateKey2048Pkcs8DerHex), | 3937 HexStringToBytes(kPrivateKey2048Pkcs8DerHex), |
3937 import_algorithm, | 3938 import_algorithm, |
3938 false, | 3939 false, |
3939 blink::WebCryptoKeyUsageEncrypt | blink::WebCryptoKeyUsageWrapKey, | 3940 blink::WebCryptoKeyUsageEncrypt | blink::WebCryptoKeyUsageWrapKey, |
3940 blink::WebCryptoKeyUsageDecrypt | blink::WebCryptoKeyUsageUnwrapKey, | 3941 blink::WebCryptoKeyUsageDecrypt | blink::WebCryptoKeyUsageUnwrapKey, |
3941 &public_key, | 3942 &public_key, |
3942 &private_key)); | 3943 &private_key)); |
3943 | 3944 |
3944 std::vector<uint8> label; | 3945 std::vector<uint8_t> label; |
3945 blink::WebCryptoAlgorithm wrapping_algorithm = CreateRsaOaepAlgorithm(label); | 3946 blink::WebCryptoAlgorithm wrapping_algorithm = CreateRsaOaepAlgorithm(label); |
3946 | 3947 |
3947 const std::string key_hex = "000102030405060708090a0b0c0d0e0f"; | 3948 const std::string key_hex = "000102030405060708090a0b0c0d0e0f"; |
3948 const blink::WebCryptoAlgorithm key_algorithm = | 3949 const blink::WebCryptoAlgorithm key_algorithm = |
3949 webcrypto::CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc); | 3950 webcrypto::CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc); |
3950 | 3951 |
3951 blink::WebCryptoKey key = | 3952 blink::WebCryptoKey key = |
3952 ImportSecretKeyFromRaw(HexStringToBytes(key_hex), | 3953 ImportSecretKeyFromRaw(HexStringToBytes(key_hex), |
3953 key_algorithm, | 3954 key_algorithm, |
3954 blink::WebCryptoKeyUsageEncrypt); | 3955 blink::WebCryptoKeyUsageEncrypt); |
3955 ASSERT_FALSE(key.isNull()); | 3956 ASSERT_FALSE(key.isNull()); |
3956 | 3957 |
3957 std::vector<uint8> wrapped_key; | 3958 std::vector<uint8_t> wrapped_key; |
3958 ASSERT_EQ(Status::Success(), | 3959 ASSERT_EQ(Status::Success(), |
3959 WrapKey(blink::WebCryptoKeyFormatJwk, | 3960 WrapKey(blink::WebCryptoKeyFormatJwk, |
3960 key, | 3961 key, |
3961 public_key, | 3962 public_key, |
3962 wrapping_algorithm, | 3963 wrapping_algorithm, |
3963 &wrapped_key)); | 3964 &wrapped_key)); |
3964 | 3965 |
3965 // Verify that |wrapped_key| can be decrypted and yields a valid JWK object. | 3966 // Verify that |wrapped_key| can be decrypted and yields a valid JWK object. |
3966 // Because |private_key| supports both decrypt and unwrap, this is valid. | 3967 // Because |private_key| supports both decrypt and unwrap, this is valid. |
3967 std::vector<uint8> decrypted_jwk; | 3968 std::vector<uint8_t> decrypted_jwk; |
3968 ASSERT_EQ(Status::Success(), | 3969 ASSERT_EQ(Status::Success(), |
3969 Decrypt(wrapping_algorithm, | 3970 Decrypt(wrapping_algorithm, |
3970 private_key, | 3971 private_key, |
3971 CryptoData(wrapped_key), | 3972 CryptoData(wrapped_key), |
3972 &decrypted_jwk)); | 3973 &decrypted_jwk)); |
3973 EXPECT_TRUE(VerifySecretJwk( | 3974 EXPECT_TRUE(VerifySecretJwk( |
3974 decrypted_jwk, "A128CBC", key_hex, blink::WebCryptoKeyUsageEncrypt)); | 3975 decrypted_jwk, "A128CBC", key_hex, blink::WebCryptoKeyUsageEncrypt)); |
3975 | 3976 |
3976 // Now attempt to unwrap the key, which should also decrypt the data. | 3977 // Now attempt to unwrap the key, which should also decrypt the data. |
3977 blink::WebCryptoKey unwrapped_key = blink::WebCryptoKey::createNull(); | 3978 blink::WebCryptoKey unwrapped_key = blink::WebCryptoKey::createNull(); |
3978 ASSERT_EQ(Status::Success(), | 3979 ASSERT_EQ(Status::Success(), |
3979 UnwrapKey(blink::WebCryptoKeyFormatJwk, | 3980 UnwrapKey(blink::WebCryptoKeyFormatJwk, |
3980 CryptoData(wrapped_key), | 3981 CryptoData(wrapped_key), |
3981 private_key, | 3982 private_key, |
3982 wrapping_algorithm, | 3983 wrapping_algorithm, |
3983 key_algorithm, | 3984 key_algorithm, |
3984 true, | 3985 true, |
3985 blink::WebCryptoKeyUsageEncrypt, | 3986 blink::WebCryptoKeyUsageEncrypt, |
3986 &unwrapped_key)); | 3987 &unwrapped_key)); |
3987 ASSERT_FALSE(unwrapped_key.isNull()); | 3988 ASSERT_FALSE(unwrapped_key.isNull()); |
3988 | 3989 |
3989 std::vector<uint8> raw_key; | 3990 std::vector<uint8_t> raw_key; |
3990 ASSERT_EQ(Status::Success(), | 3991 ASSERT_EQ(Status::Success(), |
3991 ExportKey(blink::WebCryptoKeyFormatRaw, unwrapped_key, &raw_key)); | 3992 ExportKey(blink::WebCryptoKeyFormatRaw, unwrapped_key, &raw_key)); |
3992 EXPECT_BYTES_EQ_HEX(key_hex, raw_key); | 3993 EXPECT_BYTES_EQ_HEX(key_hex, raw_key); |
3993 } | 3994 } |
3994 | 3995 |
3995 // Try importing an RSA-SSA public key with unsupported key usages using SPKI | 3996 // Try importing an RSA-SSA public key with unsupported key usages using SPKI |
3996 // format. RSA-SSA public keys only support the 'verify' usage. | 3997 // format. RSA-SSA public keys only support the 'verify' usage. |
3997 TEST_F(SharedCryptoTest, MAYBE(ImportRsaSsaPublicKeyBadUsage_SPKI)) { | 3998 TEST_F(SharedCryptoTest, MAYBE(ImportRsaSsaPublicKeyBadUsage_SPKI)) { |
3998 const blink::WebCryptoAlgorithm algorithm = | 3999 const blink::WebCryptoAlgorithm algorithm = |
3999 CreateRsaHashedImportAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, | 4000 CreateRsaHashedImportAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4056 const blink::WebCryptoAlgorithm algorithm = | 4057 const blink::WebCryptoAlgorithm algorithm = |
4057 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc); | 4058 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc); |
4058 | 4059 |
4059 blink::WebCryptoKeyUsageMask bad_usages[] = { | 4060 blink::WebCryptoKeyUsageMask bad_usages[] = { |
4060 blink::WebCryptoKeyUsageSign, | 4061 blink::WebCryptoKeyUsageSign, |
4061 blink::WebCryptoKeyUsageSign | blink::WebCryptoKeyUsageDecrypt, | 4062 blink::WebCryptoKeyUsageSign | blink::WebCryptoKeyUsageDecrypt, |
4062 blink::WebCryptoKeyUsageDeriveBits, | 4063 blink::WebCryptoKeyUsageDeriveBits, |
4063 blink::WebCryptoKeyUsageUnwrapKey | blink::WebCryptoKeyUsageVerify, | 4064 blink::WebCryptoKeyUsageUnwrapKey | blink::WebCryptoKeyUsageVerify, |
4064 }; | 4065 }; |
4065 | 4066 |
4066 std::vector<uint8> key_bytes(16); | 4067 std::vector<uint8_t> key_bytes(16); |
4067 | 4068 |
4068 for (size_t i = 0; i < arraysize(bad_usages); ++i) { | 4069 for (size_t i = 0; i < arraysize(bad_usages); ++i) { |
4069 SCOPED_TRACE(i); | 4070 SCOPED_TRACE(i); |
4070 | 4071 |
4071 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | 4072 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
4072 ASSERT_EQ(Status::ErrorCreateKeyBadUsages(), | 4073 ASSERT_EQ(Status::ErrorCreateKeyBadUsages(), |
4073 ImportKey(blink::WebCryptoKeyFormatRaw, | 4074 ImportKey(blink::WebCryptoKeyFormatRaw, |
4074 CryptoData(key_bytes), | 4075 CryptoData(key_bytes), |
4075 algorithm, | 4076 algorithm, |
4076 true, | 4077 true, |
(...skipping 11 matching lines...) Expand all Loading... |
4088 | 4089 |
4089 blink::WebCryptoKeyUsageMask bad_usages[] = { | 4090 blink::WebCryptoKeyUsageMask bad_usages[] = { |
4090 blink::WebCryptoKeyUsageEncrypt, | 4091 blink::WebCryptoKeyUsageEncrypt, |
4091 blink::WebCryptoKeyUsageDecrypt, | 4092 blink::WebCryptoKeyUsageDecrypt, |
4092 blink::WebCryptoKeyUsageSign, | 4093 blink::WebCryptoKeyUsageSign, |
4093 blink::WebCryptoKeyUsageSign | blink::WebCryptoKeyUsageUnwrapKey, | 4094 blink::WebCryptoKeyUsageSign | blink::WebCryptoKeyUsageUnwrapKey, |
4094 blink::WebCryptoKeyUsageDeriveBits, | 4095 blink::WebCryptoKeyUsageDeriveBits, |
4095 blink::WebCryptoKeyUsageUnwrapKey | blink::WebCryptoKeyUsageVerify, | 4096 blink::WebCryptoKeyUsageUnwrapKey | blink::WebCryptoKeyUsageVerify, |
4096 }; | 4097 }; |
4097 | 4098 |
4098 std::vector<uint8> key_bytes(16); | 4099 std::vector<uint8_t> key_bytes(16); |
4099 | 4100 |
4100 for (size_t i = 0; i < arraysize(bad_usages); ++i) { | 4101 for (size_t i = 0; i < arraysize(bad_usages); ++i) { |
4101 SCOPED_TRACE(i); | 4102 SCOPED_TRACE(i); |
4102 | 4103 |
4103 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | 4104 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
4104 ASSERT_EQ(Status::ErrorCreateKeyBadUsages(), | 4105 ASSERT_EQ(Status::ErrorCreateKeyBadUsages(), |
4105 ImportKey(blink::WebCryptoKeyFormatRaw, | 4106 ImportKey(blink::WebCryptoKeyFormatRaw, |
4106 CryptoData(key_bytes), | 4107 CryptoData(key_bytes), |
4107 algorithm, | 4108 algorithm, |
4108 true, | 4109 true, |
(...skipping 14 matching lines...) Expand all Loading... |
4123 blink::WebCryptoKeyUsageDecrypt, | 4124 blink::WebCryptoKeyUsageDecrypt, |
4124 blink::WebCryptoKeyUsageWrapKey, | 4125 blink::WebCryptoKeyUsageWrapKey, |
4125 blink::WebCryptoKeyUsageSign | blink::WebCryptoKeyUsageWrapKey, | 4126 blink::WebCryptoKeyUsageSign | blink::WebCryptoKeyUsageWrapKey, |
4126 blink::WebCryptoKeyUsageVerify | blink::WebCryptoKeyUsageDeriveKey, | 4127 blink::WebCryptoKeyUsageVerify | blink::WebCryptoKeyUsageDeriveKey, |
4127 }; | 4128 }; |
4128 | 4129 |
4129 // Import the wrapping key. | 4130 // Import the wrapping key. |
4130 blink::WebCryptoKey wrapping_key = blink::WebCryptoKey::createNull(); | 4131 blink::WebCryptoKey wrapping_key = blink::WebCryptoKey::createNull(); |
4131 ASSERT_EQ(Status::Success(), | 4132 ASSERT_EQ(Status::Success(), |
4132 ImportKey(blink::WebCryptoKeyFormatRaw, | 4133 ImportKey(blink::WebCryptoKeyFormatRaw, |
4133 CryptoData(std::vector<uint8>(16)), | 4134 CryptoData(std::vector<uint8_t>(16)), |
4134 unwrap_algorithm, | 4135 unwrap_algorithm, |
4135 true, | 4136 true, |
4136 blink::WebCryptoKeyUsageUnwrapKey, | 4137 blink::WebCryptoKeyUsageUnwrapKey, |
4137 &wrapping_key)); | 4138 &wrapping_key)); |
4138 | 4139 |
4139 // The JWK plain text is: | 4140 // The JWK plain text is: |
4140 // { "kty": "oct","alg": "HS256","k": "GADWrMRHwQfoNaXU5fZvTg=="} | 4141 // { "kty": "oct","alg": "HS256","k": "GADWrMRHwQfoNaXU5fZvTg=="} |
4141 const char* kWrappedJwk = | 4142 const char* kWrappedJwk = |
4142 "0AA245F17064FFB2A7A094436A39BEBFC962C627303D1327EA750CE9F917688C2782A943" | 4143 "0AA245F17064FFB2A7A094436A39BEBFC962C627303D1327EA750CE9F917688C2782A943" |
4143 "7AE7586547AC490E8AE7D5B02D63868D5C3BB57D36C4C8C5BF3962ACEC6F42E767E5706" | 4144 "7AE7586547AC490E8AE7D5B02D63868D5C3BB57D36C4C8C5BF3962ACEC6F42E767E5706" |
(...skipping 29 matching lines...) Expand all Loading... |
4173 blink::WebCryptoKeyUsageSign, | 4174 blink::WebCryptoKeyUsageSign, |
4174 blink::WebCryptoKeyUsageDecrypt, | 4175 blink::WebCryptoKeyUsageDecrypt, |
4175 blink::WebCryptoKeyUsageWrapKey, | 4176 blink::WebCryptoKeyUsageWrapKey, |
4176 blink::WebCryptoKeyUsageSign | blink::WebCryptoKeyUsageWrapKey, | 4177 blink::WebCryptoKeyUsageSign | blink::WebCryptoKeyUsageWrapKey, |
4177 }; | 4178 }; |
4178 | 4179 |
4179 // Import the wrapping key. | 4180 // Import the wrapping key. |
4180 blink::WebCryptoKey wrapping_key = blink::WebCryptoKey::createNull(); | 4181 blink::WebCryptoKey wrapping_key = blink::WebCryptoKey::createNull(); |
4181 ASSERT_EQ(Status::Success(), | 4182 ASSERT_EQ(Status::Success(), |
4182 ImportKey(blink::WebCryptoKeyFormatRaw, | 4183 ImportKey(blink::WebCryptoKeyFormatRaw, |
4183 CryptoData(std::vector<uint8>(16)), | 4184 CryptoData(std::vector<uint8_t>(16)), |
4184 unwrap_algorithm, | 4185 unwrap_algorithm, |
4185 true, | 4186 true, |
4186 blink::WebCryptoKeyUsageUnwrapKey, | 4187 blink::WebCryptoKeyUsageUnwrapKey, |
4187 &wrapping_key)); | 4188 &wrapping_key)); |
4188 | 4189 |
4189 // The JWK plaintext is: | 4190 // The JWK plaintext is: |
4190 // { "kty": "RSA","alg": "RS256","n": "...","e": "AQAB"} | 4191 // { "kty": "RSA","alg": "RS256","n": "...","e": "AQAB"} |
4191 | 4192 |
4192 const char* kWrappedJwk = | 4193 const char* kWrappedJwk = |
4193 "CE8DAEF99E977EE58958B8C4494755C846E883B2ECA575C5366622839AF71AB30875F152" | 4194 "CE8DAEF99E977EE58958B8C4494755C846E883B2ECA575C5366622839AF71AB30875F152" |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4239 // Generate an RSA-SSA key pair with invalid usages. RSA-SSA supports: | 4240 // Generate an RSA-SSA key pair with invalid usages. RSA-SSA supports: |
4240 // 'sign', 'verify' | 4241 // 'sign', 'verify' |
4241 TEST_F(SharedCryptoTest, MAYBE(GenerateRsaSsaBadUsages)) { | 4242 TEST_F(SharedCryptoTest, MAYBE(GenerateRsaSsaBadUsages)) { |
4242 blink::WebCryptoKeyUsageMask bad_usages[] = { | 4243 blink::WebCryptoKeyUsageMask bad_usages[] = { |
4243 blink::WebCryptoKeyUsageDecrypt, | 4244 blink::WebCryptoKeyUsageDecrypt, |
4244 blink::WebCryptoKeyUsageVerify | blink::WebCryptoKeyUsageDecrypt, | 4245 blink::WebCryptoKeyUsageVerify | blink::WebCryptoKeyUsageDecrypt, |
4245 blink::WebCryptoKeyUsageWrapKey, | 4246 blink::WebCryptoKeyUsageWrapKey, |
4246 }; | 4247 }; |
4247 | 4248 |
4248 const unsigned int modulus_length = 256; | 4249 const unsigned int modulus_length = 256; |
4249 const std::vector<uint8> public_exponent = HexStringToBytes("010001"); | 4250 const std::vector<uint8_t> public_exponent = HexStringToBytes("010001"); |
4250 | 4251 |
4251 for (size_t i = 0; i < arraysize(bad_usages); ++i) { | 4252 for (size_t i = 0; i < arraysize(bad_usages); ++i) { |
4252 SCOPED_TRACE(i); | 4253 SCOPED_TRACE(i); |
4253 | 4254 |
4254 blink::WebCryptoKey public_key = blink::WebCryptoKey::createNull(); | 4255 blink::WebCryptoKey public_key = blink::WebCryptoKey::createNull(); |
4255 blink::WebCryptoKey private_key = blink::WebCryptoKey::createNull(); | 4256 blink::WebCryptoKey private_key = blink::WebCryptoKey::createNull(); |
4256 | 4257 |
4257 ASSERT_EQ(Status::ErrorCreateKeyBadUsages(), | 4258 ASSERT_EQ(Status::ErrorCreateKeyBadUsages(), |
4258 GenerateKeyPair(CreateRsaHashedKeyGenAlgorithm( | 4259 GenerateKeyPair(CreateRsaHashedKeyGenAlgorithm( |
4259 blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, | 4260 blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, |
4260 blink::WebCryptoAlgorithmIdSha256, | 4261 blink::WebCryptoAlgorithmIdSha256, |
4261 modulus_length, | 4262 modulus_length, |
4262 public_exponent), | 4263 public_exponent), |
4263 true, | 4264 true, |
4264 bad_usages[i], | 4265 bad_usages[i], |
4265 &public_key, | 4266 &public_key, |
4266 &private_key)); | 4267 &private_key)); |
4267 } | 4268 } |
4268 } | 4269 } |
4269 | 4270 |
4270 // Generate an RSA-SSA key pair. The public and private keys should select the | 4271 // Generate an RSA-SSA key pair. The public and private keys should select the |
4271 // key usages which are applicable, and not have the exact same usages as was | 4272 // key usages which are applicable, and not have the exact same usages as was |
4272 // specified to GenerateKey | 4273 // specified to GenerateKey |
4273 TEST_F(SharedCryptoTest, MAYBE(GenerateRsaSsaKeyPairIntersectUsages)) { | 4274 TEST_F(SharedCryptoTest, MAYBE(GenerateRsaSsaKeyPairIntersectUsages)) { |
4274 const unsigned int modulus_length = 256; | 4275 const unsigned int modulus_length = 256; |
4275 const std::vector<uint8> public_exponent = HexStringToBytes("010001"); | 4276 const std::vector<uint8_t> public_exponent = HexStringToBytes("010001"); |
4276 | 4277 |
4277 blink::WebCryptoKey public_key = blink::WebCryptoKey::createNull(); | 4278 blink::WebCryptoKey public_key = blink::WebCryptoKey::createNull(); |
4278 blink::WebCryptoKey private_key = blink::WebCryptoKey::createNull(); | 4279 blink::WebCryptoKey private_key = blink::WebCryptoKey::createNull(); |
4279 | 4280 |
4280 ASSERT_EQ(Status::Success(), | 4281 ASSERT_EQ(Status::Success(), |
4281 GenerateKeyPair( | 4282 GenerateKeyPair( |
4282 CreateRsaHashedKeyGenAlgorithm( | 4283 CreateRsaHashedKeyGenAlgorithm( |
4283 blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, | 4284 blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, |
4284 blink::WebCryptoAlgorithmIdSha256, | 4285 blink::WebCryptoAlgorithmIdSha256, |
4285 modulus_length, | 4286 modulus_length, |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4319 blink::WebCryptoKey wrapping_key = blink::WebCryptoKey::createNull(); | 4320 blink::WebCryptoKey wrapping_key = blink::WebCryptoKey::createNull(); |
4320 ASSERT_EQ(Status::Success(), | 4321 ASSERT_EQ(Status::Success(), |
4321 GenerateSecretKey(CreateAesCbcKeyGenAlgorithm(128), | 4322 GenerateSecretKey(CreateAesCbcKeyGenAlgorithm(128), |
4322 true, | 4323 true, |
4323 blink::WebCryptoKeyUsageWrapKey | | 4324 blink::WebCryptoKeyUsageWrapKey | |
4324 blink::WebCryptoKeyUsageUnwrapKey, | 4325 blink::WebCryptoKeyUsageUnwrapKey, |
4325 &wrapping_key)); | 4326 &wrapping_key)); |
4326 | 4327 |
4327 // Generate an RSA key pair to be wrapped. | 4328 // Generate an RSA key pair to be wrapped. |
4328 const unsigned int modulus_length = 256; | 4329 const unsigned int modulus_length = 256; |
4329 const std::vector<uint8> public_exponent = HexStringToBytes("010001"); | 4330 const std::vector<uint8_t> public_exponent = HexStringToBytes("010001"); |
4330 | 4331 |
4331 blink::WebCryptoKey public_key = blink::WebCryptoKey::createNull(); | 4332 blink::WebCryptoKey public_key = blink::WebCryptoKey::createNull(); |
4332 blink::WebCryptoKey private_key = blink::WebCryptoKey::createNull(); | 4333 blink::WebCryptoKey private_key = blink::WebCryptoKey::createNull(); |
4333 ASSERT_EQ(Status::Success(), | 4334 ASSERT_EQ(Status::Success(), |
4334 GenerateKeyPair(CreateRsaHashedKeyGenAlgorithm( | 4335 GenerateKeyPair(CreateRsaHashedKeyGenAlgorithm( |
4335 blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, | 4336 blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, |
4336 blink::WebCryptoAlgorithmIdSha256, | 4337 blink::WebCryptoAlgorithmIdSha256, |
4337 modulus_length, | 4338 modulus_length, |
4338 public_exponent), | 4339 public_exponent), |
4339 true, | 4340 true, |
4340 0, | 4341 0, |
4341 &public_key, | 4342 &public_key, |
4342 &private_key)); | 4343 &private_key)); |
4343 | 4344 |
4344 // Export key pair as SPKI + PKCS8 | 4345 // Export key pair as SPKI + PKCS8 |
4345 std::vector<uint8> public_key_spki; | 4346 std::vector<uint8_t> public_key_spki; |
4346 ASSERT_EQ( | 4347 ASSERT_EQ( |
4347 Status::Success(), | 4348 Status::Success(), |
4348 ExportKey(blink::WebCryptoKeyFormatSpki, public_key, &public_key_spki)); | 4349 ExportKey(blink::WebCryptoKeyFormatSpki, public_key, &public_key_spki)); |
4349 | 4350 |
4350 std::vector<uint8> private_key_pkcs8; | 4351 std::vector<uint8_t> private_key_pkcs8; |
4351 ASSERT_EQ( | 4352 ASSERT_EQ( |
4352 Status::Success(), | 4353 Status::Success(), |
4353 ExportKey( | 4354 ExportKey( |
4354 blink::WebCryptoKeyFormatPkcs8, private_key, &private_key_pkcs8)); | 4355 blink::WebCryptoKeyFormatPkcs8, private_key, &private_key_pkcs8)); |
4355 | 4356 |
4356 // Wrap the key pair. | 4357 // Wrap the key pair. |
4357 blink::WebCryptoAlgorithm wrap_algorithm = | 4358 blink::WebCryptoAlgorithm wrap_algorithm = |
4358 CreateAesCbcAlgorithm(std::vector<uint8>(16, 0)); | 4359 CreateAesCbcAlgorithm(std::vector<uint8_t>(16, 0)); |
4359 | 4360 |
4360 std::vector<uint8> wrapped_public_key; | 4361 std::vector<uint8_t> wrapped_public_key; |
4361 ASSERT_EQ(Status::Success(), | 4362 ASSERT_EQ(Status::Success(), |
4362 WrapKey(blink::WebCryptoKeyFormatSpki, | 4363 WrapKey(blink::WebCryptoKeyFormatSpki, |
4363 public_key, | 4364 public_key, |
4364 wrapping_key, | 4365 wrapping_key, |
4365 wrap_algorithm, | 4366 wrap_algorithm, |
4366 &wrapped_public_key)); | 4367 &wrapped_public_key)); |
4367 | 4368 |
4368 std::vector<uint8> wrapped_private_key; | 4369 std::vector<uint8_t> wrapped_private_key; |
4369 ASSERT_EQ(Status::Success(), | 4370 ASSERT_EQ(Status::Success(), |
4370 WrapKey(blink::WebCryptoKeyFormatPkcs8, | 4371 WrapKey(blink::WebCryptoKeyFormatPkcs8, |
4371 private_key, | 4372 private_key, |
4372 wrapping_key, | 4373 wrapping_key, |
4373 wrap_algorithm, | 4374 wrap_algorithm, |
4374 &wrapped_private_key)); | 4375 &wrapped_private_key)); |
4375 | 4376 |
4376 // Unwrap the key pair. | 4377 // Unwrap the key pair. |
4377 blink::WebCryptoAlgorithm rsa_import_algorithm = | 4378 blink::WebCryptoAlgorithm rsa_import_algorithm = |
4378 CreateRsaHashedImportAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, | 4379 CreateRsaHashedImportAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, |
(...skipping 17 matching lines...) Expand all Loading... |
4396 UnwrapKey(blink::WebCryptoKeyFormatPkcs8, | 4397 UnwrapKey(blink::WebCryptoKeyFormatPkcs8, |
4397 CryptoData(wrapped_private_key), | 4398 CryptoData(wrapped_private_key), |
4398 wrapping_key, | 4399 wrapping_key, |
4399 wrap_algorithm, | 4400 wrap_algorithm, |
4400 rsa_import_algorithm, | 4401 rsa_import_algorithm, |
4401 true, | 4402 true, |
4402 0, | 4403 0, |
4403 &unwrapped_private_key)); | 4404 &unwrapped_private_key)); |
4404 | 4405 |
4405 // Export unwrapped key pair as SPKI + PKCS8 | 4406 // Export unwrapped key pair as SPKI + PKCS8 |
4406 std::vector<uint8> unwrapped_public_key_spki; | 4407 std::vector<uint8_t> unwrapped_public_key_spki; |
4407 ASSERT_EQ(Status::Success(), | 4408 ASSERT_EQ(Status::Success(), |
4408 ExportKey(blink::WebCryptoKeyFormatSpki, | 4409 ExportKey(blink::WebCryptoKeyFormatSpki, |
4409 unwrapped_public_key, | 4410 unwrapped_public_key, |
4410 &unwrapped_public_key_spki)); | 4411 &unwrapped_public_key_spki)); |
4411 | 4412 |
4412 std::vector<uint8> unwrapped_private_key_pkcs8; | 4413 std::vector<uint8_t> unwrapped_private_key_pkcs8; |
4413 ASSERT_EQ(Status::Success(), | 4414 ASSERT_EQ(Status::Success(), |
4414 ExportKey(blink::WebCryptoKeyFormatPkcs8, | 4415 ExportKey(blink::WebCryptoKeyFormatPkcs8, |
4415 unwrapped_private_key, | 4416 unwrapped_private_key, |
4416 &unwrapped_private_key_pkcs8)); | 4417 &unwrapped_private_key_pkcs8)); |
4417 | 4418 |
4418 EXPECT_EQ(public_key_spki, unwrapped_public_key_spki); | 4419 EXPECT_EQ(public_key_spki, unwrapped_public_key_spki); |
4419 EXPECT_EQ(private_key_pkcs8, unwrapped_private_key_pkcs8); | 4420 EXPECT_EQ(private_key_pkcs8, unwrapped_private_key_pkcs8); |
4420 | 4421 |
4421 EXPECT_NE(public_key_spki, wrapped_public_key); | 4422 EXPECT_NE(public_key_spki, wrapped_public_key); |
4422 EXPECT_NE(private_key_pkcs8, wrapped_private_key); | 4423 EXPECT_NE(private_key_pkcs8, wrapped_private_key); |
4423 } | 4424 } |
4424 | 4425 |
4425 } // namespace webcrypto | 4426 } // namespace webcrypto |
4426 | 4427 |
4427 } // namespace content | 4428 } // namespace content |
OLD | NEW |