Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/webcrypto/webcrypto_impl.h" | 5 #include "content/renderer/webcrypto/webcrypto_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/basictypes.h" | 11 #include "base/basictypes.h" |
| 12 #include "base/json/json_writer.h" | 12 #include "base/json/json_writer.h" |
| 13 #include "base/logging.h" | 13 #include "base/logging.h" |
| 14 #include "base/memory/ref_counted.h" | 14 #include "base/memory/ref_counted.h" |
| 15 #include "base/strings/string_number_conversions.h" | 15 #include "base/strings/string_number_conversions.h" |
| 16 #include "content/public/renderer/content_renderer_client.h" | 16 #include "content/public/renderer/content_renderer_client.h" |
| 17 #include "content/renderer/renderer_webkitplatformsupport_impl.h" | 17 #include "content/renderer/renderer_webkitplatformsupport_impl.h" |
| 18 #include "content/renderer/webcrypto/webcrypto_util.h" | 18 #include "content/renderer/webcrypto/webcrypto_util.h" |
| 19 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
| 20 #include "third_party/WebKit/public/platform/WebArrayBuffer.h" | 20 #include "third_party/WebKit/public/platform/WebArrayBuffer.h" |
| 21 #include "third_party/WebKit/public/platform/WebCryptoAlgorithm.h" | 21 #include "third_party/WebKit/public/platform/WebCryptoAlgorithm.h" |
| 22 #include "third_party/WebKit/public/platform/WebCryptoAlgorithmParams.h" | 22 #include "third_party/WebKit/public/platform/WebCryptoAlgorithmParams.h" |
| 23 #include "third_party/WebKit/public/platform/WebCryptoKey.h" | 23 #include "third_party/WebKit/public/platform/WebCryptoKey.h" |
| 24 | 24 |
| 25 // The OpenSSL implementation of WebCrypto is less complete, so don't run all of | |
| 26 // the tests: http://crbug.com/267888 | |
| 27 #if defined(USE_OPENSSL) | |
| 28 #define NSSONLY(test_name) DISABLED_##test_name | |
| 29 #else | |
| 30 #define NSSONLY(test_name) test_name | |
| 31 #endif | |
|
Ryan Sleevi
2013/12/08 05:20:48
Please do not use macros like this.
As we discuss
| |
| 32 | |
| 25 namespace content { | 33 namespace content { |
| 26 | 34 |
| 27 namespace { | 35 namespace { |
| 28 | 36 |
| 29 std::vector<uint8> HexStringToBytes(const std::string& hex) { | 37 std::vector<uint8> HexStringToBytes(const std::string& hex) { |
| 30 std::vector<uint8> bytes; | 38 std::vector<uint8> bytes; |
| 31 base::HexStringToBytes(hex, &bytes); | 39 base::HexStringToBytes(hex, &bytes); |
| 32 return bytes; | 40 return bytes; |
| 33 } | 41 } |
| 34 | 42 |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 53 // dictionary to a good state | 61 // dictionary to a good state |
| 54 void RestoreJwkOctDictionary(base::DictionaryValue* dict) { | 62 void RestoreJwkOctDictionary(base::DictionaryValue* dict) { |
| 55 dict->Clear(); | 63 dict->Clear(); |
| 56 dict->SetString("kty", "oct"); | 64 dict->SetString("kty", "oct"); |
| 57 dict->SetString("alg", "A128CBC"); | 65 dict->SetString("alg", "A128CBC"); |
| 58 dict->SetString("use", "enc"); | 66 dict->SetString("use", "enc"); |
| 59 dict->SetBoolean("extractable", false); | 67 dict->SetBoolean("extractable", false); |
| 60 dict->SetString("k", "GADWrMRHwQfoNaXU5fZvTg=="); | 68 dict->SetString("k", "GADWrMRHwQfoNaXU5fZvTg=="); |
| 61 } | 69 } |
| 62 | 70 |
| 63 #if !defined(USE_OPENSSL) | |
| 64 | |
| 65 // Helper for ImportJwkRsaFailures. Restores the JWK JSON | 71 // Helper for ImportJwkRsaFailures. Restores the JWK JSON |
| 66 // dictionary to a good state | 72 // dictionary to a good state |
| 67 void RestoreJwkRsaDictionary(base::DictionaryValue* dict) { | 73 void RestoreJwkRsaDictionary(base::DictionaryValue* dict) { |
| 68 dict->Clear(); | 74 dict->Clear(); |
| 69 dict->SetString("kty", "RSA"); | 75 dict->SetString("kty", "RSA"); |
| 70 dict->SetString("alg", "RSA1_5"); | 76 dict->SetString("alg", "RSA1_5"); |
| 71 dict->SetString("use", "enc"); | 77 dict->SetString("use", "enc"); |
| 72 dict->SetBoolean("extractable", false); | 78 dict->SetBoolean("extractable", false); |
| 73 dict->SetString("n", | 79 dict->SetString("n", |
| 74 "qLOyhK-OtQs4cDSoYPFGxJGfMYdjzWxVmMiuSBGh4KvEx-CwgtaTpef87Wdc9GaFEncsDLxk" | 80 "qLOyhK-OtQs4cDSoYPFGxJGfMYdjzWxVmMiuSBGh4KvEx-CwgtaTpef87Wdc9GaFEncsDLxk" |
| 75 "p0LGxjD1M8jMcvYq6DPEC_JYQumEu3i9v5fAEH1VvbZi9cTg-rmEXLUUjvc5LdOq_5OuHmtm" | 81 "p0LGxjD1M8jMcvYq6DPEC_JYQumEu3i9v5fAEH1VvbZi9cTg-rmEXLUUjvc5LdOq_5OuHmtm" |
| 76 "e7PUJHYW1PW6ENTP0ibeiNOfFvs"); | 82 "e7PUJHYW1PW6ENTP0ibeiNOfFvs"); |
| 77 dict->SetString("e", "AQAB"); | 83 dict->SetString("e", "AQAB"); |
| 78 } | 84 } |
| 79 | 85 |
| 80 blink::WebCryptoAlgorithm CreateRsaKeyGenAlgorithm( | |
| 81 blink::WebCryptoAlgorithmId algorithm_id, | |
| 82 unsigned modulus_length, | |
| 83 const std::vector<uint8>& public_exponent) { | |
| 84 DCHECK(algorithm_id == blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5 || | |
| 85 algorithm_id == blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5 || | |
| 86 algorithm_id == blink::WebCryptoAlgorithmIdRsaOaep); | |
| 87 return blink::WebCryptoAlgorithm::adoptParamsAndCreate( | |
| 88 algorithm_id, | |
| 89 new blink::WebCryptoRsaKeyGenParams( | |
| 90 modulus_length, | |
| 91 webcrypto::Uint8VectorStart(public_exponent), | |
| 92 public_exponent.size())); | |
| 93 } | |
| 94 | |
| 95 // Determines if two ArrayBuffers have identical content. | 86 // Determines if two ArrayBuffers have identical content. |
| 96 bool ArrayBuffersEqual( | 87 bool ArrayBuffersEqual( |
| 97 const blink::WebArrayBuffer& a, | 88 const blink::WebArrayBuffer& a, |
| 98 const blink::WebArrayBuffer& b) { | 89 const blink::WebArrayBuffer& b) { |
| 99 return a.byteLength() == b.byteLength() && | 90 return a.byteLength() == b.byteLength() && |
| 100 memcmp(a.data(), b.data(), a.byteLength()) == 0; | 91 memcmp(a.data(), b.data(), a.byteLength()) == 0; |
| 101 } | 92 } |
| 102 | 93 |
| 103 // Given a vector of WebArrayBuffers, determines if there are any copies. | 94 // Given a vector of WebArrayBuffers, determines if there are any copies. |
| 104 bool CopiesExist(std::vector<blink::WebArrayBuffer> bufs) { | 95 bool CopiesExist(std::vector<blink::WebArrayBuffer> bufs) { |
| 105 for (size_t i = 0; i < bufs.size(); ++i) { | 96 for (size_t i = 0; i < bufs.size(); ++i) { |
| 106 for (size_t j = i + 1; j < bufs.size(); ++j) { | 97 for (size_t j = i + 1; j < bufs.size(); ++j) { |
| 107 if (ArrayBuffersEqual(bufs[i], bufs[j])) | 98 if (ArrayBuffersEqual(bufs[i], bufs[j])) |
| 108 return true; | 99 return true; |
| 109 } | 100 } |
| 110 } | 101 } |
| 111 return false; | 102 return false; |
| 112 } | 103 } |
| 113 | 104 |
| 114 #endif // #if !defined(USE_OPENSSL) | |
| 115 | |
| 116 } // namespace | 105 } // namespace |
| 117 | 106 |
| 118 class WebCryptoImplTest : public testing::Test { | 107 class WebCryptoImplTest : public testing::Test { |
| 119 protected: | 108 protected: |
| 120 blink::WebCryptoKey ImportSecretKeyFromRawHexString( | 109 blink::WebCryptoKey ImportSecretKeyFromRawHexString( |
| 121 const std::string& key_hex, | 110 const std::string& key_hex, |
| 122 const blink::WebCryptoAlgorithm& algorithm, | 111 const blink::WebCryptoAlgorithm& algorithm, |
| 123 blink::WebCryptoKeyUsageMask usage) { | 112 blink::WebCryptoKeyUsageMask usage) { |
| 124 std::vector<uint8> key_raw = HexStringToBytes(key_hex); | 113 std::vector<uint8> key_raw = HexStringToBytes(key_hex); |
| 125 | 114 |
| (...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 490 algorithm, | 479 algorithm, |
| 491 key, | 480 key, |
| 492 kLongSignature, | 481 kLongSignature, |
| 493 sizeof(kLongSignature), | 482 sizeof(kLongSignature), |
| 494 message_raw, | 483 message_raw, |
| 495 &signature_match)); | 484 &signature_match)); |
| 496 EXPECT_FALSE(signature_match); | 485 EXPECT_FALSE(signature_match); |
| 497 } | 486 } |
| 498 } | 487 } |
| 499 | 488 |
| 500 #if !defined(USE_OPENSSL) | |
| 501 | |
| 502 TEST_F(WebCryptoImplTest, AesCbcFailures) { | 489 TEST_F(WebCryptoImplTest, AesCbcFailures) { |
| 503 const std::string key_hex = "2b7e151628aed2a6abf7158809cf4f3c"; | 490 const std::string key_hex = "2b7e151628aed2a6abf7158809cf4f3c"; |
| 504 blink::WebCryptoKey key = ImportSecretKeyFromRawHexString( | 491 blink::WebCryptoKey key = ImportSecretKeyFromRawHexString( |
| 505 key_hex, | 492 key_hex, |
| 506 webcrypto::CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc), | 493 webcrypto::CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc), |
| 507 blink::WebCryptoKeyUsageEncrypt | blink::WebCryptoKeyUsageDecrypt); | 494 blink::WebCryptoKeyUsageEncrypt | blink::WebCryptoKeyUsageDecrypt); |
| 508 | 495 |
| 509 // Verify exported raw key is identical to the imported data | 496 // Verify exported raw key is identical to the imported data |
| 510 blink::WebArrayBuffer raw_key; | 497 blink::WebArrayBuffer raw_key; |
| 511 EXPECT_TRUE(ExportKeyInternal(blink::WebCryptoKeyFormatRaw, key, &raw_key)); | 498 EXPECT_TRUE(ExportKeyInternal(blink::WebCryptoKeyFormatRaw, key, &raw_key)); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 563 blink::WebCryptoKeyUsageEncrypt, | 550 blink::WebCryptoKeyUsageEncrypt, |
| 564 &key)); | 551 &key)); |
| 565 } | 552 } |
| 566 | 553 |
| 567 // Fail exporting the key in SPKI and PKCS#8 formats (not allowed for secret | 554 // Fail exporting the key in SPKI and PKCS#8 formats (not allowed for secret |
| 568 // keys). | 555 // keys). |
| 569 EXPECT_FALSE(ExportKeyInternal(blink::WebCryptoKeyFormatSpki, key, &output)); | 556 EXPECT_FALSE(ExportKeyInternal(blink::WebCryptoKeyFormatSpki, key, &output)); |
| 570 EXPECT_FALSE(ExportKeyInternal(blink::WebCryptoKeyFormatPkcs8, key, &output)); | 557 EXPECT_FALSE(ExportKeyInternal(blink::WebCryptoKeyFormatPkcs8, key, &output)); |
| 571 } | 558 } |
| 572 | 559 |
| 573 TEST_F(WebCryptoImplTest, AesCbcSampleSets) { | 560 TEST_F(WebCryptoImplTest, NSSONLY(AesCbcSampleSets)) { |
| 574 struct TestCase { | 561 struct TestCase { |
| 575 const char* key; | 562 const char* key; |
| 576 const char* iv; | 563 const char* iv; |
| 577 const char* plain_text; | 564 const char* plain_text; |
| 578 const char* cipher_text; | 565 const char* cipher_text; |
| 579 }; | 566 }; |
| 580 | 567 |
| 581 TestCase kTests[] = { | 568 TestCase kTests[] = { |
| 582 // F.2.1 (CBC-AES128.Encrypt) | 569 // F.2.1 (CBC-AES128.Encrypt) |
| 583 // http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf | 570 // http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 699 if (cipher_text.size() > 3) { | 686 if (cipher_text.size() > 3) { |
| 700 EXPECT_FALSE(DecryptInternal(webcrypto::CreateAesCbcAlgorithm(iv), | 687 EXPECT_FALSE(DecryptInternal(webcrypto::CreateAesCbcAlgorithm(iv), |
| 701 key, | 688 key, |
| 702 &cipher_text[0], | 689 &cipher_text[0], |
| 703 cipher_text.size() - 3, | 690 cipher_text.size() - 3, |
| 704 &output)); | 691 &output)); |
| 705 } | 692 } |
| 706 } | 693 } |
| 707 } | 694 } |
| 708 | 695 |
| 709 TEST_F(WebCryptoImplTest, GenerateKeyAes) { | 696 TEST_F(WebCryptoImplTest, NSSONLY(GenerateKeyAes)) { |
| 710 // Generate a small sample of AES keys. | 697 // Generate a small sample of AES keys. |
| 711 std::vector<blink::WebArrayBuffer> keys; | 698 std::vector<blink::WebArrayBuffer> keys; |
| 712 blink::WebArrayBuffer key_bytes; | 699 blink::WebArrayBuffer key_bytes; |
| 713 for (int i = 0; i < 16; ++i) { | 700 for (int i = 0; i < 16; ++i) { |
| 714 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | 701 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
| 715 ASSERT_TRUE( | 702 ASSERT_TRUE( |
| 716 GenerateKeyInternal(webcrypto::CreateAesCbcKeyGenAlgorithm(128), &key)); | 703 GenerateKeyInternal(webcrypto::CreateAesCbcKeyGenAlgorithm(128), &key)); |
| 717 EXPECT_TRUE(key.handle()); | 704 EXPECT_TRUE(key.handle()); |
| 718 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type()); | 705 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type()); |
| 719 ASSERT_TRUE( | 706 ASSERT_TRUE( |
| 720 ExportKeyInternal(blink::WebCryptoKeyFormatRaw, key, &key_bytes)); | 707 ExportKeyInternal(blink::WebCryptoKeyFormatRaw, key, &key_bytes)); |
| 721 keys.push_back(key_bytes); | 708 keys.push_back(key_bytes); |
| 722 } | 709 } |
| 723 // Ensure all entries in the key sample set are unique. This is a simplistic | 710 // Ensure all entries in the key sample set are unique. This is a simplistic |
| 724 // estimate of whether the generated keys appear random. | 711 // estimate of whether the generated keys appear random. |
| 725 EXPECT_FALSE(CopiesExist(keys)); | 712 EXPECT_FALSE(CopiesExist(keys)); |
| 726 } | 713 } |
| 727 | 714 |
| 728 TEST_F(WebCryptoImplTest, GenerateKeyAesBadLength) { | 715 TEST_F(WebCryptoImplTest, NSSONLY(GenerateKeyAesBadLength)) { |
| 729 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | 716 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
| 730 EXPECT_FALSE( | 717 EXPECT_FALSE( |
| 731 GenerateKeyInternal(webcrypto::CreateAesCbcKeyGenAlgorithm(0), &key)); | 718 GenerateKeyInternal(webcrypto::CreateAesCbcKeyGenAlgorithm(0), &key)); |
| 732 EXPECT_FALSE( | 719 EXPECT_FALSE( |
| 733 GenerateKeyInternal(webcrypto::CreateAesCbcKeyGenAlgorithm(0), &key)); | 720 GenerateKeyInternal(webcrypto::CreateAesCbcKeyGenAlgorithm(0), &key)); |
| 734 EXPECT_FALSE( | 721 EXPECT_FALSE( |
| 735 GenerateKeyInternal(webcrypto::CreateAesCbcKeyGenAlgorithm(129), &key)); | 722 GenerateKeyInternal(webcrypto::CreateAesCbcKeyGenAlgorithm(129), &key)); |
| 736 } | 723 } |
| 737 | 724 |
| 738 TEST_F(WebCryptoImplTest, GenerateKeyHmac) { | 725 TEST_F(WebCryptoImplTest, NSSONLY(GenerateKeyHmac)) { |
| 739 // Generate a small sample of HMAC keys. | 726 // Generate a small sample of HMAC keys. |
| 740 std::vector<blink::WebArrayBuffer> keys; | 727 std::vector<blink::WebArrayBuffer> keys; |
| 741 for (int i = 0; i < 16; ++i) { | 728 for (int i = 0; i < 16; ++i) { |
| 742 blink::WebArrayBuffer key_bytes; | 729 blink::WebArrayBuffer key_bytes; |
| 743 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | 730 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
| 744 blink::WebCryptoAlgorithm algorithm = webcrypto::CreateHmacKeyGenAlgorithm( | 731 blink::WebCryptoAlgorithm algorithm = webcrypto::CreateHmacKeyGenAlgorithm( |
| 745 blink::WebCryptoAlgorithmIdSha1, 128); | 732 blink::WebCryptoAlgorithmIdSha1, 128); |
| 746 ASSERT_TRUE(GenerateKeyInternal(algorithm, &key)); | 733 ASSERT_TRUE(GenerateKeyInternal(algorithm, &key)); |
| 747 EXPECT_FALSE(key.isNull()); | 734 EXPECT_FALSE(key.isNull()); |
| 748 EXPECT_TRUE(key.handle()); | 735 EXPECT_TRUE(key.handle()); |
| 749 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type()); | 736 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type()); |
| 750 } | 737 } |
| 751 // Ensure all entries in the key sample set are unique. This is a simplistic | 738 // Ensure all entries in the key sample set are unique. This is a simplistic |
| 752 // estimate of whether the generated keys appear random. | 739 // estimate of whether the generated keys appear random. |
| 753 EXPECT_FALSE(CopiesExist(keys)); | 740 EXPECT_FALSE(CopiesExist(keys)); |
| 754 } | 741 } |
| 755 | 742 |
| 756 TEST_F(WebCryptoImplTest, GenerateKeyHmacNoLength) { | 743 TEST_F(WebCryptoImplTest, NSSONLY(GenerateKeyHmacNoLength)) { |
| 757 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | 744 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
| 758 blink::WebCryptoAlgorithm algorithm = | 745 blink::WebCryptoAlgorithm algorithm = |
| 759 webcrypto::CreateHmacKeyGenAlgorithm(blink::WebCryptoAlgorithmIdSha1, 0); | 746 webcrypto::CreateHmacKeyGenAlgorithm(blink::WebCryptoAlgorithmIdSha1, 0); |
| 760 ASSERT_TRUE(GenerateKeyInternal(algorithm, &key)); | 747 ASSERT_TRUE(GenerateKeyInternal(algorithm, &key)); |
| 761 EXPECT_TRUE(key.handle()); | 748 EXPECT_TRUE(key.handle()); |
| 762 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type()); | 749 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type()); |
| 763 } | 750 } |
| 764 | 751 |
| 765 TEST_F(WebCryptoImplTest, ImportSecretKeyNoAlgorithm) { | 752 TEST_F(WebCryptoImplTest, NSSONLY(ImportSecretKeyNoAlgorithm)) { |
| 766 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | 753 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
| 767 | 754 |
| 768 // This fails because the algorithm is null. | 755 // This fails because the algorithm is null. |
| 769 EXPECT_FALSE(ImportKeyInternal( | 756 EXPECT_FALSE(ImportKeyInternal( |
| 770 blink::WebCryptoKeyFormatRaw, | 757 blink::WebCryptoKeyFormatRaw, |
| 771 HexStringToBytes("00000000000000000000"), | 758 HexStringToBytes("00000000000000000000"), |
| 772 blink::WebCryptoAlgorithm::createNull(), | 759 blink::WebCryptoAlgorithm::createNull(), |
| 773 true, | 760 true, |
| 774 blink::WebCryptoKeyUsageEncrypt, | 761 blink::WebCryptoKeyUsageEncrypt, |
| 775 &key)); | 762 &key)); |
| 776 } | 763 } |
| 777 | 764 |
| 778 #endif //#if !defined(USE_OPENSSL) | |
| 779 | 765 |
| 780 TEST_F(WebCryptoImplTest, ImportJwkFailures) { | 766 TEST_F(WebCryptoImplTest, ImportJwkFailures) { |
| 781 | 767 |
| 782 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | 768 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
| 783 blink::WebCryptoAlgorithm algorithm = | 769 blink::WebCryptoAlgorithm algorithm = |
| 784 webcrypto::CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc); | 770 webcrypto::CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc); |
| 785 blink::WebCryptoKeyUsageMask usage_mask = blink::WebCryptoKeyUsageEncrypt; | 771 blink::WebCryptoKeyUsageMask usage_mask = blink::WebCryptoKeyUsageEncrypt; |
| 786 | 772 |
| 787 // Baseline pass: each test below breaks a single item, so we start with a | 773 // Baseline pass: each test below breaks a single item, so we start with a |
| 788 // passing case to make sure each failure is caused by the isolated break. | 774 // passing case to make sure each failure is caused by the isolated break. |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 878 RestoreJwkOctDictionary(&dict); | 864 RestoreJwkOctDictionary(&dict); |
| 879 | 865 |
| 880 // Fail on k actual length (120 bits) inconsistent with the embedded JWK alg | 866 // Fail on k actual length (120 bits) inconsistent with the embedded JWK alg |
| 881 // value (128) for an AES key. | 867 // value (128) for an AES key. |
| 882 dict.SetString("k", "AVj42h0Y5aqGtE3yluKL"); | 868 dict.SetString("k", "AVj42h0Y5aqGtE3yluKL"); |
| 883 EXPECT_FALSE(ImportKeyJwk( | 869 EXPECT_FALSE(ImportKeyJwk( |
| 884 MakeJsonVector(dict), algorithm, false, usage_mask, &key)); | 870 MakeJsonVector(dict), algorithm, false, usage_mask, &key)); |
| 885 RestoreJwkOctDictionary(&dict); | 871 RestoreJwkOctDictionary(&dict); |
| 886 } | 872 } |
| 887 | 873 |
| 888 #if !defined(USE_OPENSSL) | 874 TEST_F(WebCryptoImplTest, NSSONLY(ImportJwkRsaFailures)) { |
| 889 | |
| 890 TEST_F(WebCryptoImplTest, ImportJwkRsaFailures) { | |
| 891 | 875 |
| 892 base::DictionaryValue dict; | 876 base::DictionaryValue dict; |
| 893 RestoreJwkRsaDictionary(&dict); | 877 RestoreJwkRsaDictionary(&dict); |
| 894 blink::WebCryptoAlgorithm algorithm = | 878 blink::WebCryptoAlgorithm algorithm = |
| 895 webcrypto::CreateAlgorithm(blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5); | 879 webcrypto::CreateAlgorithm(blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5); |
| 896 blink::WebCryptoKeyUsageMask usage_mask = blink::WebCryptoKeyUsageEncrypt; | 880 blink::WebCryptoKeyUsageMask usage_mask = blink::WebCryptoKeyUsageEncrypt; |
| 897 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | 881 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
| 898 | 882 |
| 899 // An RSA public key JWK _must_ have an "n" (modulus) and an "e" (exponent) | 883 // An RSA public key JWK _must_ have an "n" (modulus) and an "e" (exponent) |
| 900 // entry, while an RSA private key must have those plus at least a "d" | 884 // entry, while an RSA private key must have those plus at least a "d" |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 936 } | 920 } |
| 937 | 921 |
| 938 // Fail if "d" parameter is present, implying the JWK is a private key, which | 922 // Fail if "d" parameter is present, implying the JWK is a private key, which |
| 939 // is not supported. | 923 // is not supported. |
| 940 dict.SetString("d", "Qk3f0Dsyt"); | 924 dict.SetString("d", "Qk3f0Dsyt"); |
| 941 EXPECT_FALSE(ImportKeyJwk( | 925 EXPECT_FALSE(ImportKeyJwk( |
| 942 MakeJsonVector(dict), algorithm, false, usage_mask, &key)); | 926 MakeJsonVector(dict), algorithm, false, usage_mask, &key)); |
| 943 RestoreJwkRsaDictionary(&dict); | 927 RestoreJwkRsaDictionary(&dict); |
| 944 } | 928 } |
| 945 | 929 |
| 946 #endif // #if !defined(USE_OPENSSL) | 930 TEST_F(WebCryptoImplTest, NSSONLY(ImportJwkInputConsistency)) { |
| 947 | |
| 948 TEST_F(WebCryptoImplTest, ImportJwkInputConsistency) { | |
| 949 // The Web Crypto spec says that if a JWK value is present, but is | 931 // The Web Crypto spec says that if a JWK value is present, but is |
| 950 // inconsistent with the input value, the operation must fail. | 932 // inconsistent with the input value, the operation must fail. |
| 951 | 933 |
| 952 // Consistency rules when JWK value is not present: Inputs should be used. | 934 // Consistency rules when JWK value is not present: Inputs should be used. |
| 953 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | 935 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
| 954 bool extractable = false; | 936 bool extractable = false; |
| 955 blink::WebCryptoAlgorithm algorithm = | 937 blink::WebCryptoAlgorithm algorithm = |
| 956 webcrypto::CreateHmacAlgorithmByHashId(blink::WebCryptoAlgorithmIdSha256); | 938 webcrypto::CreateHmacAlgorithmByHashId(blink::WebCryptoAlgorithmIdSha256); |
| 957 blink::WebCryptoKeyUsageMask usage_mask = blink::WebCryptoKeyUsageVerify; | 939 blink::WebCryptoKeyUsageMask usage_mask = blink::WebCryptoKeyUsageVerify; |
| 958 base::DictionaryValue dict; | 940 base::DictionaryValue dict; |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1047 EXPECT_FALSE( | 1029 EXPECT_FALSE( |
| 1048 ImportKeyJwk(json_vec, algorithm, extractable, usage_mask, &key)); | 1030 ImportKeyJwk(json_vec, algorithm, extractable, usage_mask, &key)); |
| 1049 usage_mask = blink::WebCryptoKeyUsageSign | blink::WebCryptoKeyUsageVerify; | 1031 usage_mask = blink::WebCryptoKeyUsageSign | blink::WebCryptoKeyUsageVerify; |
| 1050 | 1032 |
| 1051 // TODO(padolph): kty vs alg consistency tests: Depending on the kty value, | 1033 // TODO(padolph): kty vs alg consistency tests: Depending on the kty value, |
| 1052 // only certain alg values are permitted. For example, when kty = "RSA" alg | 1034 // only certain alg values are permitted. For example, when kty = "RSA" alg |
| 1053 // must be of the RSA family, or when kty = "oct" alg must be symmetric | 1035 // must be of the RSA family, or when kty = "oct" alg must be symmetric |
| 1054 // algorithm. | 1036 // algorithm. |
| 1055 } | 1037 } |
| 1056 | 1038 |
| 1057 TEST_F(WebCryptoImplTest, ImportJwkHappy) { | 1039 TEST_F(WebCryptoImplTest, NSSONLY(ImportJwkHappy)) { |
| 1058 | 1040 |
| 1059 // This test verifies the happy path of JWK import, including the application | 1041 // This test verifies the happy path of JWK import, including the application |
| 1060 // of the imported key material. | 1042 // of the imported key material. |
| 1061 | 1043 |
| 1062 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | 1044 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
| 1063 bool extractable = false; | 1045 bool extractable = false; |
| 1064 blink::WebCryptoAlgorithm algorithm = | 1046 blink::WebCryptoAlgorithm algorithm = |
| 1065 webcrypto::CreateHmacAlgorithmByHashId(blink::WebCryptoAlgorithmIdSha256); | 1047 webcrypto::CreateHmacAlgorithmByHashId(blink::WebCryptoAlgorithmIdSha256); |
| 1066 blink::WebCryptoKeyUsageMask usage_mask = blink::WebCryptoKeyUsageSign; | 1048 blink::WebCryptoKeyUsageMask usage_mask = blink::WebCryptoKeyUsageSign; |
| 1067 | 1049 |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 1089 ASSERT_TRUE(SignInternal(algorithm, key, message_raw, &output)); | 1071 ASSERT_TRUE(SignInternal(algorithm, key, message_raw, &output)); |
| 1090 | 1072 |
| 1091 const std::string mac_raw = | 1073 const std::string mac_raw = |
| 1092 "769f00d3e6a6cc1fb426a14a4f76c6462e6149726e0dee0ec0cf97a16605ac8b"; | 1074 "769f00d3e6a6cc1fb426a14a4f76c6462e6149726e0dee0ec0cf97a16605ac8b"; |
| 1093 | 1075 |
| 1094 ExpectArrayBufferMatchesHex(mac_raw, output); | 1076 ExpectArrayBufferMatchesHex(mac_raw, output); |
| 1095 | 1077 |
| 1096 // TODO(padolph): Import an RSA public key JWK and use it | 1078 // TODO(padolph): Import an RSA public key JWK and use it |
| 1097 } | 1079 } |
| 1098 | 1080 |
| 1099 #if !defined(USE_OPENSSL) | 1081 TEST_F(WebCryptoImplTest, NSSONLY(ImportExportSpki)) { |
| 1100 | |
| 1101 TEST_F(WebCryptoImplTest, ImportExportSpki) { | |
| 1102 // openssl genrsa -out pair.pem 2048 | 1082 // openssl genrsa -out pair.pem 2048 |
| 1103 // openssl rsa -in pair.pem -out pubkey.der -outform DER -pubout | 1083 // openssl rsa -in pair.pem -out pubkey.der -outform DER -pubout |
| 1104 // xxd -p pubkey.der | 1084 // xxd -p pubkey.der |
| 1105 const std::string hex_rsa_spki_der = | 1085 const std::string hex_rsa_spki_der = |
| 1106 "30820122300d06092a864886f70d01010105000382010f003082010a0282" | 1086 "30820122300d06092a864886f70d01010105000382010f003082010a0282" |
| 1107 "010100f19e40f94e3780858701577a571cca000cb9795db89ddf8e98ab0e" | 1087 "010100f19e40f94e3780858701577a571cca000cb9795db89ddf8e98ab0e" |
| 1108 "5eecfa47516cb08dc591cae5ab7fa43d6db402e95991d4a2de52e7cd3a66" | 1088 "5eecfa47516cb08dc591cae5ab7fa43d6db402e95991d4a2de52e7cd3a66" |
| 1109 "4f58284be2eb4675d5a849a2582c585d2b3c6c225a8f2c53a0414d5dbd06" | 1089 "4f58284be2eb4675d5a849a2582c585d2b3c6c225a8f2c53a0414d5dbd06" |
| 1110 "172371cefdf953e9ec3000fc9ad000743023f74e82d12aa93917a2c9b832" | 1090 "172371cefdf953e9ec3000fc9ad000743023f74e82d12aa93917a2c9b832" |
| 1111 "696085ee0711154cf98a6d098f44cee00ea3b7584236503a5483ba8b6792" | 1091 "696085ee0711154cf98a6d098f44cee00ea3b7584236503a5483ba8b6792" |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1182 HexStringToBytes(hex_rsa_spki_der), | 1162 HexStringToBytes(hex_rsa_spki_der), |
| 1183 webcrypto::CreateAlgorithm(blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5), | 1163 webcrypto::CreateAlgorithm(blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5), |
| 1184 false, | 1164 false, |
| 1185 blink::WebCryptoKeyUsageEncrypt, | 1165 blink::WebCryptoKeyUsageEncrypt, |
| 1186 &key)); | 1166 &key)); |
| 1187 EXPECT_TRUE(key.handle()); | 1167 EXPECT_TRUE(key.handle()); |
| 1188 EXPECT_FALSE(key.extractable()); | 1168 EXPECT_FALSE(key.extractable()); |
| 1189 EXPECT_FALSE(ExportKeyInternal(blink::WebCryptoKeyFormatSpki, key, &output)); | 1169 EXPECT_FALSE(ExportKeyInternal(blink::WebCryptoKeyFormatSpki, key, &output)); |
| 1190 } | 1170 } |
| 1191 | 1171 |
| 1192 TEST_F(WebCryptoImplTest, ImportPkcs8) { | 1172 TEST_F(WebCryptoImplTest, NSSONLY(ImportPkcs8)) { |
| 1193 | 1173 |
| 1194 // The following is a DER-encoded PKCS#8 representation of the RSA key from | 1174 // The following is a DER-encoded PKCS#8 representation of the RSA key from |
| 1195 // Example 1 of NIST's "Test vectors for RSA PKCS#1 v1.5 Signature". | 1175 // Example 1 of NIST's "Test vectors for RSA PKCS#1 v1.5 Signature". |
| 1196 // ftp://ftp.rsa.com/pub/rsalabs/tmp/pkcs1v15sign-vectors.txt | 1176 // ftp://ftp.rsa.com/pub/rsalabs/tmp/pkcs1v15sign-vectors.txt |
| 1197 const std::string hex_rsa_pkcs8_der = | 1177 const std::string hex_rsa_pkcs8_der = |
| 1198 "30820275020100300D06092A864886F70D01010105000482025F3082025B020100028181" | 1178 "30820275020100300D06092A864886F70D01010105000482025F3082025B020100028181" |
| 1199 "00A56E4A0E701017589A5187DC7EA841D156F2EC0E36AD52A44DFEB1E61F7AD991D8C510" | 1179 "00A56E4A0E701017589A5187DC7EA841D156F2EC0E36AD52A44DFEB1E61F7AD991D8C510" |
| 1200 "56FFEDB162B4C0F283A12A88A394DFF526AB7291CBB307CEABFCE0B1DFD5CD9508096D5B" | 1180 "56FFEDB162B4C0F283A12A88A394DFF526AB7291CBB307CEABFCE0B1DFD5CD9508096D5B" |
| 1201 "2B8B6DF5D671EF6377C0921CB23C270A70E2598E6FF89D19F105ACC2D3F0CB35F29280E1" | 1181 "2B8B6DF5D671EF6377C0921CB23C270A70E2598E6FF89D19F105ACC2D3F0CB35F29280E1" |
| 1202 "386B6F64C4EF22E1E1F20D0CE8CFFB2249BD9A2137020301000102818033A5042A90B27D" | 1182 "386B6F64C4EF22E1E1F20D0CE8CFFB2249BD9A2137020301000102818033A5042A90B27D" |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1260 // Failing case: Import RSA key but provide an inconsistent input algorithm. | 1240 // Failing case: Import RSA key but provide an inconsistent input algorithm. |
| 1261 EXPECT_FALSE(ImportKeyInternal( | 1241 EXPECT_FALSE(ImportKeyInternal( |
| 1262 blink::WebCryptoKeyFormatPkcs8, | 1242 blink::WebCryptoKeyFormatPkcs8, |
| 1263 HexStringToBytes(hex_rsa_pkcs8_der), | 1243 HexStringToBytes(hex_rsa_pkcs8_der), |
| 1264 webcrypto::CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc), | 1244 webcrypto::CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc), |
| 1265 true, | 1245 true, |
| 1266 blink::WebCryptoKeyUsageSign, | 1246 blink::WebCryptoKeyUsageSign, |
| 1267 &key)); | 1247 &key)); |
| 1268 } | 1248 } |
| 1269 | 1249 |
| 1270 TEST_F(WebCryptoImplTest, GenerateKeyPairRsa) { | 1250 TEST_F(WebCryptoImplTest, NSSONLY(GenerateKeyPairRsa)) { |
| 1271 // Note: using unrealistic short key lengths here to avoid bogging down tests. | 1251 // Note: using unrealistic short key lengths here to avoid bogging down tests. |
| 1272 | 1252 |
| 1273 // Successful WebCryptoAlgorithmIdRsaEsPkcs1v1_5 key generation. | 1253 // Successful WebCryptoAlgorithmIdRsaEsPkcs1v1_5 key generation. |
| 1274 const unsigned modulus_length = 256; | 1254 const unsigned modulus_length = 256; |
| 1275 const std::vector<uint8> public_exponent = HexStringToBytes("010001"); | 1255 const std::vector<uint8> public_exponent = HexStringToBytes("010001"); |
| 1276 blink::WebCryptoAlgorithm algorithm = webcrypto::CreateRsaKeyGenAlgorithm( | 1256 blink::WebCryptoAlgorithm algorithm = webcrypto::CreateRsaKeyGenAlgorithm( |
| 1277 blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5, | 1257 blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5, |
| 1278 modulus_length, | 1258 modulus_length, |
| 1279 public_exponent); | 1259 public_exponent); |
| 1280 bool extractable = false; | 1260 bool extractable = false; |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1374 EXPECT_EQ(usage_mask, private_key.usages()); | 1354 EXPECT_EQ(usage_mask, private_key.usages()); |
| 1375 | 1355 |
| 1376 // Fail SPKI export of private key. This is an ExportKey test, but do it here | 1356 // Fail SPKI export of private key. This is an ExportKey test, but do it here |
| 1377 // since it is expensive to generate an RSA key pair and we already have a | 1357 // since it is expensive to generate an RSA key pair and we already have a |
| 1378 // private key here. | 1358 // private key here. |
| 1379 blink::WebArrayBuffer output; | 1359 blink::WebArrayBuffer output; |
| 1380 EXPECT_FALSE( | 1360 EXPECT_FALSE( |
| 1381 ExportKeyInternal(blink::WebCryptoKeyFormatSpki, private_key, &output)); | 1361 ExportKeyInternal(blink::WebCryptoKeyFormatSpki, private_key, &output)); |
| 1382 } | 1362 } |
| 1383 | 1363 |
| 1384 TEST_F(WebCryptoImplTest, RsaEsRoundTrip) { | 1364 TEST_F(WebCryptoImplTest, NSSONLY(RsaEsRoundTrip)) { |
| 1385 // Note: using unrealistic short key length here to avoid bogging down tests. | 1365 // Note: using unrealistic short key length here to avoid bogging down tests. |
| 1386 | 1366 |
| 1387 // Create a key pair. | 1367 // Create a key pair. |
| 1388 const unsigned kModulusLength = 256; | 1368 const unsigned kModulusLength = 256; |
| 1389 blink::WebCryptoAlgorithm algorithm = | 1369 blink::WebCryptoAlgorithm algorithm = |
| 1390 CreateRsaKeyGenAlgorithm(blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5, | 1370 webcrypto::CreateRsaKeyGenAlgorithm( |
| 1391 kModulusLength, | 1371 blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5, |
| 1392 HexStringToBytes("010001")); | 1372 kModulusLength, |
| 1373 HexStringToBytes("010001")); | |
| 1393 const blink::WebCryptoKeyUsageMask usage_mask = | 1374 const blink::WebCryptoKeyUsageMask usage_mask = |
| 1394 blink::WebCryptoKeyUsageEncrypt | blink::WebCryptoKeyUsageDecrypt; | 1375 blink::WebCryptoKeyUsageEncrypt | blink::WebCryptoKeyUsageDecrypt; |
| 1395 blink::WebCryptoKey public_key = blink::WebCryptoKey::createNull(); | 1376 blink::WebCryptoKey public_key = blink::WebCryptoKey::createNull(); |
| 1396 blink::WebCryptoKey private_key = blink::WebCryptoKey::createNull(); | 1377 blink::WebCryptoKey private_key = blink::WebCryptoKey::createNull(); |
| 1397 EXPECT_TRUE(GenerateKeyPairInternal( | 1378 EXPECT_TRUE(GenerateKeyPairInternal( |
| 1398 algorithm, false, usage_mask, &public_key, &private_key)); | 1379 algorithm, false, usage_mask, &public_key, &private_key)); |
| 1399 EXPECT_FALSE(public_key.isNull()); | 1380 EXPECT_FALSE(public_key.isNull()); |
| 1400 EXPECT_FALSE(private_key.isNull()); | 1381 EXPECT_FALSE(private_key.isNull()); |
| 1401 | 1382 |
| 1402 // Make a maximum-length data message. RSAES can operate on messages up to | 1383 // Make a maximum-length data message. RSAES can operate on messages up to |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 1430 ASSERT_TRUE(DecryptInternal( | 1411 ASSERT_TRUE(DecryptInternal( |
| 1431 algorithm, | 1412 algorithm, |
| 1432 private_key, | 1413 private_key, |
| 1433 reinterpret_cast<const unsigned char*>(encrypted_data.data()), | 1414 reinterpret_cast<const unsigned char*>(encrypted_data.data()), |
| 1434 encrypted_data.byteLength(), | 1415 encrypted_data.byteLength(), |
| 1435 &decrypted_data)); | 1416 &decrypted_data)); |
| 1436 ExpectArrayBufferMatchesHex(kTestDataHex[i], decrypted_data); | 1417 ExpectArrayBufferMatchesHex(kTestDataHex[i], decrypted_data); |
| 1437 } | 1418 } |
| 1438 } | 1419 } |
| 1439 | 1420 |
| 1440 TEST_F(WebCryptoImplTest, RsaEsKnownAnswer) { | 1421 TEST_F(WebCryptoImplTest, NSSONLY(RsaEsKnownAnswer)) { |
| 1441 // Because the random data in PKCS1.5 padding makes the encryption output non- | 1422 // Because the random data in PKCS1.5 padding makes the encryption output non- |
| 1442 // deterministic, we cannot easily do a typical known-answer test for RSA | 1423 // deterministic, we cannot easily do a typical known-answer test for RSA |
| 1443 // encryption / decryption. Instead we will take a known-good encrypted | 1424 // encryption / decryption. Instead we will take a known-good encrypted |
| 1444 // message, decrypt it, re-encrypt it, then decrypt again, verifying that the | 1425 // message, decrypt it, re-encrypt it, then decrypt again, verifying that the |
| 1445 // original known cleartext is the result. | 1426 // original known cleartext is the result. |
| 1446 | 1427 |
| 1447 // The RSA public and private keys used for this test are produced by the | 1428 // The RSA public and private keys used for this test are produced by the |
| 1448 // openssl command line: | 1429 // openssl command line: |
| 1449 // % openssl genrsa -out pair.pem 1024 | 1430 // % openssl genrsa -out pair.pem 1024 |
| 1450 // % openssl rsa -in pair.pem -out spki.der -outform DER -pubout | 1431 // % openssl rsa -in pair.pem -out spki.der -outform DER -pubout |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1556 ASSERT_TRUE(DecryptInternal( | 1537 ASSERT_TRUE(DecryptInternal( |
| 1557 algorithm, | 1538 algorithm, |
| 1558 private_key, | 1539 private_key, |
| 1559 reinterpret_cast<const unsigned char*>(encrypted_data.data()), | 1540 reinterpret_cast<const unsigned char*>(encrypted_data.data()), |
| 1560 encrypted_data.byteLength(), | 1541 encrypted_data.byteLength(), |
| 1561 &decrypted_data)); | 1542 &decrypted_data)); |
| 1562 EXPECT_FALSE(decrypted_data.isNull()); | 1543 EXPECT_FALSE(decrypted_data.isNull()); |
| 1563 ExpectArrayBufferMatchesHex(cleartext_hex, decrypted_data); | 1544 ExpectArrayBufferMatchesHex(cleartext_hex, decrypted_data); |
| 1564 } | 1545 } |
| 1565 | 1546 |
| 1566 TEST_F(WebCryptoImplTest, RsaEsFailures) { | 1547 TEST_F(WebCryptoImplTest, NSSONLY(RsaEsFailures)) { |
| 1567 // Note: using unrealistic short key length here to avoid bogging down tests. | 1548 // Note: using unrealistic short key length here to avoid bogging down tests. |
| 1568 | 1549 |
| 1569 // Create a key pair. | 1550 // Create a key pair. |
| 1570 const unsigned kModulusLength = 256; | 1551 const unsigned kModulusLength = 256; |
| 1571 blink::WebCryptoAlgorithm algorithm = | 1552 blink::WebCryptoAlgorithm algorithm = |
| 1572 CreateRsaKeyGenAlgorithm(blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5, | 1553 webcrypto::CreateRsaKeyGenAlgorithm( |
| 1573 kModulusLength, | 1554 blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5, |
| 1574 HexStringToBytes("010001")); | 1555 kModulusLength, |
| 1556 HexStringToBytes("010001")); | |
| 1575 const blink::WebCryptoKeyUsageMask usage_mask = | 1557 const blink::WebCryptoKeyUsageMask usage_mask = |
| 1576 blink::WebCryptoKeyUsageEncrypt | blink::WebCryptoKeyUsageDecrypt; | 1558 blink::WebCryptoKeyUsageEncrypt | blink::WebCryptoKeyUsageDecrypt; |
| 1577 blink::WebCryptoKey public_key = blink::WebCryptoKey::createNull(); | 1559 blink::WebCryptoKey public_key = blink::WebCryptoKey::createNull(); |
| 1578 blink::WebCryptoKey private_key = blink::WebCryptoKey::createNull(); | 1560 blink::WebCryptoKey private_key = blink::WebCryptoKey::createNull(); |
| 1579 EXPECT_TRUE(GenerateKeyPairInternal( | 1561 EXPECT_TRUE(GenerateKeyPairInternal( |
| 1580 algorithm, false, usage_mask, &public_key, &private_key)); | 1562 algorithm, false, usage_mask, &public_key, &private_key)); |
| 1581 EXPECT_FALSE(public_key.isNull()); | 1563 EXPECT_FALSE(public_key.isNull()); |
| 1582 EXPECT_FALSE(private_key.isNull()); | 1564 EXPECT_FALSE(private_key.isNull()); |
| 1583 | 1565 |
| 1584 // Fail encrypt with a private key. | 1566 // Fail encrypt with a private key. |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1629 // Do a successful decrypt with good data just for confirmation. | 1611 // Do a successful decrypt with good data just for confirmation. |
| 1630 EXPECT_TRUE(DecryptInternal( | 1612 EXPECT_TRUE(DecryptInternal( |
| 1631 algorithm, | 1613 algorithm, |
| 1632 private_key, | 1614 private_key, |
| 1633 reinterpret_cast<const unsigned char*>(encrypted_data.data()), | 1615 reinterpret_cast<const unsigned char*>(encrypted_data.data()), |
| 1634 encrypted_data.byteLength(), | 1616 encrypted_data.byteLength(), |
| 1635 &decrypted_data)); | 1617 &decrypted_data)); |
| 1636 ExpectArrayBufferMatchesHex(message_hex_str, decrypted_data); | 1618 ExpectArrayBufferMatchesHex(message_hex_str, decrypted_data); |
| 1637 } | 1619 } |
| 1638 | 1620 |
| 1639 #endif // #if !defined(USE_OPENSSL) | |
| 1640 | |
| 1641 } // namespace content | 1621 } // namespace content |
| OLD | NEW |