| 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 "content/child/webcrypto/shared_crypto.h" |
| 6 |
| 5 #include <algorithm> | 7 #include <algorithm> |
| 6 #include <string> | 8 #include <string> |
| 7 #include <vector> | 9 #include <vector> |
| 8 | 10 |
| 9 #include "base/basictypes.h" | 11 #include "base/basictypes.h" |
| 10 #include "base/file_util.h" | 12 #include "base/file_util.h" |
| 11 #include "base/json/json_reader.h" | 13 #include "base/json/json_reader.h" |
| 12 #include "base/json/json_writer.h" | 14 #include "base/json/json_writer.h" |
| 13 #include "base/logging.h" | 15 #include "base/logging.h" |
| 14 #include "base/memory/ref_counted.h" | 16 #include "base/memory/ref_counted.h" |
| 15 #include "base/path_service.h" | 17 #include "base/path_service.h" |
| 16 #include "base/strings/string_number_conversions.h" | 18 #include "base/strings/string_number_conversions.h" |
| 17 #include "base/strings/string_util.h" | 19 #include "base/strings/string_util.h" |
| 18 #include "base/strings/stringprintf.h" | 20 #include "base/strings/stringprintf.h" |
| 19 #include "content/child/webcrypto/algorithm_dispatch.h" | |
| 20 #include "content/child/webcrypto/crypto_data.h" | 21 #include "content/child/webcrypto/crypto_data.h" |
| 21 #include "content/child/webcrypto/status.h" | 22 #include "content/child/webcrypto/status.h" |
| 22 #include "content/child/webcrypto/webcrypto_util.h" | 23 #include "content/child/webcrypto/webcrypto_util.h" |
| 23 #include "content/public/common/content_paths.h" | 24 #include "content/public/common/content_paths.h" |
| 24 #include "testing/gtest/include/gtest/gtest.h" | 25 #include "testing/gtest/include/gtest/gtest.h" |
| 25 #include "third_party/WebKit/public/platform/WebCryptoAlgorithm.h" | 26 #include "third_party/WebKit/public/platform/WebCryptoAlgorithm.h" |
| 26 #include "third_party/WebKit/public/platform/WebCryptoAlgorithmParams.h" | 27 #include "third_party/WebKit/public/platform/WebCryptoAlgorithmParams.h" |
| 27 #include "third_party/WebKit/public/platform/WebCryptoKey.h" | 28 #include "third_party/WebKit/public/platform/WebCryptoKey.h" |
| 28 #include "third_party/WebKit/public/platform/WebCryptoKeyAlgorithm.h" | 29 #include "third_party/WebKit/public/platform/WebCryptoKeyAlgorithm.h" |
| 29 #include "third_party/re2/re2/re2.h" | 30 #include "third_party/re2/re2/re2.h" |
| 30 | 31 |
| 31 #if !defined(USE_OPENSSL) | 32 #if !defined(USE_OPENSSL) |
| 32 #include <nss.h> | 33 #include <nss.h> |
| 33 #include <pk11pub.h> | 34 #include <pk11pub.h> |
| 34 | 35 |
| 35 #include "crypto/nss_util.h" | |
| 36 #include "crypto/scoped_nss_types.h" | 36 #include "crypto/scoped_nss_types.h" |
| 37 #endif | 37 #endif |
| 38 | 38 |
| 39 // The OpenSSL implementation of WebCrypto is less complete, so don't run all of | 39 // The OpenSSL implementation of WebCrypto is less complete, so don't run all of |
| 40 // the tests: http://crbug.com/267888 | 40 // the tests: http://crbug.com/267888 |
| 41 #if defined(USE_OPENSSL) | 41 #if defined(USE_OPENSSL) |
| 42 #define MAYBE(test_name) DISABLED_##test_name | 42 #define MAYBE(test_name) DISABLED_##test_name |
| 43 #else | 43 #else |
| 44 #define MAYBE(test_name) test_name | 44 #define MAYBE(test_name) test_name |
| 45 #endif | 45 #endif |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 115 | 115 |
| 116 if (status.IsError()) | 116 if (status.IsError()) |
| 117 EXPECT_EQ(blink::WebCryptoErrorTypeNotSupported, status.error_type()); | 117 EXPECT_EQ(blink::WebCryptoErrorTypeNotSupported, status.error_type()); |
| 118 return status.IsSuccess(); | 118 return status.IsSuccess(); |
| 119 } | 119 } |
| 120 | 120 |
| 121 bool SupportsRsaOaep() { | 121 bool SupportsRsaOaep() { |
| 122 #if defined(USE_OPENSSL) | 122 #if defined(USE_OPENSSL) |
| 123 return false; | 123 return false; |
| 124 #else | 124 #else |
| 125 crypto::EnsureNSSInit(); | |
| 126 // TODO(eroman): Exclude version test for OS_CHROMEOS | 125 // TODO(eroman): Exclude version test for OS_CHROMEOS |
| 127 #if defined(USE_NSS) | 126 #if defined(USE_NSS) |
| 128 if (!NSS_VersionCheck("3.16.2")) | 127 if (!NSS_VersionCheck("3.16.2")) |
| 129 return false; | 128 return false; |
| 130 #endif | 129 #endif |
| 131 crypto::ScopedPK11Slot slot(PK11_GetInternalKeySlot()); | 130 crypto::ScopedPK11Slot slot(PK11_GetInternalKeySlot()); |
| 132 return !!PK11_DoesMechanism(slot.get(), CKM_RSA_PKCS_OAEP); | 131 return !!PK11_DoesMechanism(slot.get(), CKM_RSA_PKCS_OAEP); |
| 133 #endif | 132 #endif |
| 134 } | 133 } |
| 135 | 134 |
| 136 bool SupportsRsaKeyImport() { | 135 bool SupportsRsaKeyImport() { |
| 137 // TODO(eroman): Exclude version test for OS_CHROMEOS | 136 // TODO(eroman): Exclude version test for OS_CHROMEOS |
| 138 #if defined(USE_NSS) | 137 #if defined(USE_NSS) |
| 139 crypto::EnsureNSSInit(); | |
| 140 if (!NSS_VersionCheck("3.16.2")) { | 138 if (!NSS_VersionCheck("3.16.2")) { |
| 141 LOG(WARNING) << "RSA key import is not supported by this version of NSS. " | 139 LOG(WARNING) << "RSA key import is not supported by this version of NSS. " |
| 142 "Skipping some tests"; | 140 "Skipping some tests"; |
| 143 return false; | 141 return false; |
| 144 } | 142 } |
| 145 #endif | 143 #endif |
| 146 return true; | 144 return true; |
| 147 } | 145 } |
| 148 | 146 |
| 149 blink::WebCryptoAlgorithm CreateRsaHashedKeyGenAlgorithm( | 147 blink::WebCryptoAlgorithm CreateRsaHashedKeyGenAlgorithm( |
| (...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 440 "584b8e22fdde1e5a2e3bd8aa5ba8d8584194eb2190acf832b847f13a3d24" | 438 "584b8e22fdde1e5a2e3bd8aa5ba8d8584194eb2190acf832b847f13a3d24" |
| 441 "a79f4d"; | 439 "a79f4d"; |
| 442 // The modulus and exponent (in hex) of kPublicKeySpkiDerHex | 440 // The modulus and exponent (in hex) of kPublicKeySpkiDerHex |
| 443 const char* const kPublicKeyModulusHex = | 441 const char* const kPublicKeyModulusHex = |
| 444 "A56E4A0E701017589A5187DC7EA841D156F2EC0E36AD52A44DFEB1E61F7AD991D8C51056" | 442 "A56E4A0E701017589A5187DC7EA841D156F2EC0E36AD52A44DFEB1E61F7AD991D8C51056" |
| 445 "FFEDB162B4C0F283A12A88A394DFF526AB7291CBB307CEABFCE0B1DFD5CD9508096D5B2B" | 443 "FFEDB162B4C0F283A12A88A394DFF526AB7291CBB307CEABFCE0B1DFD5CD9508096D5B2B" |
| 446 "8B6DF5D671EF6377C0921CB23C270A70E2598E6FF89D19F105ACC2D3F0CB35F29280E138" | 444 "8B6DF5D671EF6377C0921CB23C270A70E2598E6FF89D19F105ACC2D3F0CB35F29280E138" |
| 447 "6B6F64C4EF22E1E1F20D0CE8CFFB2249BD9A2137"; | 445 "6B6F64C4EF22E1E1F20D0CE8CFFB2249BD9A2137"; |
| 448 const char* const kPublicKeyExponentHex = "010001"; | 446 const char* const kPublicKeyExponentHex = "010001"; |
| 449 | 447 |
| 450 // TODO(eroman): Remove unnecessary test fixture. | |
| 451 class SharedCryptoTest : public testing::Test { | 448 class SharedCryptoTest : public testing::Test { |
| 449 protected: |
| 450 virtual void SetUp() OVERRIDE { Init(); } |
| 452 }; | 451 }; |
| 453 | 452 |
| 454 blink::WebCryptoKey ImportSecretKeyFromRaw( | 453 blink::WebCryptoKey ImportSecretKeyFromRaw( |
| 455 const std::vector<uint8>& key_raw, | 454 const std::vector<uint8>& key_raw, |
| 456 const blink::WebCryptoAlgorithm& algorithm, | 455 const blink::WebCryptoAlgorithm& algorithm, |
| 457 blink::WebCryptoKeyUsageMask usage) { | 456 blink::WebCryptoKeyUsageMask usage) { |
| 458 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | 457 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
| 459 bool extractable = true; | 458 bool extractable = true; |
| 460 EXPECT_EQ(Status::Success(), | 459 EXPECT_EQ(Status::Success(), |
| 461 ImportKey(blink::WebCryptoKeyFormatRaw, | 460 ImportKey(blink::WebCryptoKeyFormatRaw, |
| (...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 884 | 883 |
| 885 std::vector<uint8> output; | 884 std::vector<uint8> output; |
| 886 | 885 |
| 887 ASSERT_EQ(Status::Success(), | 886 ASSERT_EQ(Status::Success(), |
| 888 Sign(algorithm, key, CryptoData(test_message), &output)); | 887 Sign(algorithm, key, CryptoData(test_message), &output)); |
| 889 | 888 |
| 890 EXPECT_BYTES_EQ(test_mac, output); | 889 EXPECT_BYTES_EQ(test_mac, output); |
| 891 | 890 |
| 892 bool signature_match = false; | 891 bool signature_match = false; |
| 893 EXPECT_EQ(Status::Success(), | 892 EXPECT_EQ(Status::Success(), |
| 894 Verify(algorithm, | 893 VerifySignature(algorithm, |
| 895 key, | 894 key, |
| 896 CryptoData(output), | 895 CryptoData(output), |
| 897 CryptoData(test_message), | 896 CryptoData(test_message), |
| 898 &signature_match)); | 897 &signature_match)); |
| 899 EXPECT_TRUE(signature_match); | 898 EXPECT_TRUE(signature_match); |
| 900 | 899 |
| 901 // Ensure truncated signature does not verify by passing one less byte. | 900 // Ensure truncated signature does not verify by passing one less byte. |
| 902 EXPECT_EQ(Status::Success(), | 901 EXPECT_EQ( |
| 903 Verify(algorithm, | 902 Status::Success(), |
| 904 key, | 903 VerifySignature(algorithm, |
| 905 CryptoData(Uint8VectorStart(output), output.size() - 1), | 904 key, |
| 906 CryptoData(test_message), | 905 CryptoData(Uint8VectorStart(output), output.size() - 1), |
| 907 &signature_match)); | 906 CryptoData(test_message), |
| 907 &signature_match)); |
| 908 EXPECT_FALSE(signature_match); | 908 EXPECT_FALSE(signature_match); |
| 909 | 909 |
| 910 // Ensure truncated signature does not verify by passing no bytes. | 910 // Ensure truncated signature does not verify by passing no bytes. |
| 911 EXPECT_EQ(Status::Success(), | 911 EXPECT_EQ(Status::Success(), |
| 912 Verify(algorithm, | 912 VerifySignature(algorithm, |
| 913 key, | 913 key, |
| 914 CryptoData(), | 914 CryptoData(), |
| 915 CryptoData(test_message), | 915 CryptoData(test_message), |
| 916 &signature_match)); | 916 &signature_match)); |
| 917 EXPECT_FALSE(signature_match); | 917 EXPECT_FALSE(signature_match); |
| 918 | 918 |
| 919 // Ensure extra long signature does not cause issues and fails. | 919 // Ensure extra long signature does not cause issues and fails. |
| 920 const unsigned char kLongSignature[1024] = {0}; | 920 const unsigned char kLongSignature[1024] = {0}; |
| 921 EXPECT_EQ(Status::Success(), | 921 EXPECT_EQ( |
| 922 Verify(algorithm, | 922 Status::Success(), |
| 923 key, | 923 VerifySignature(algorithm, |
| 924 CryptoData(kLongSignature, sizeof(kLongSignature)), | 924 key, |
| 925 CryptoData(test_message), | 925 CryptoData(kLongSignature, sizeof(kLongSignature)), |
| 926 &signature_match)); | 926 CryptoData(test_message), |
| 927 &signature_match)); |
| 927 EXPECT_FALSE(signature_match); | 928 EXPECT_FALSE(signature_match); |
| 928 } | 929 } |
| 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); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 } |
| 1008 | 1009 |
| 1009 // Fail exporting the key in SPKI and PKCS#8 formats (not allowed for secret | 1010 // Fail exporting the key in SPKI and PKCS#8 formats (not allowed for secret |
| 1010 // keys). | 1011 // keys). |
| 1011 EXPECT_EQ(Status::ErrorUnsupportedExportKeyFormat(), | 1012 EXPECT_EQ(Status::ErrorUnexpectedKeyType(), |
| 1012 ExportKey(blink::WebCryptoKeyFormatSpki, key, &output)); | 1013 ExportKey(blink::WebCryptoKeyFormatSpki, key, &output)); |
| 1013 EXPECT_EQ(Status::ErrorUnsupportedExportKeyFormat(), | 1014 EXPECT_EQ(Status::ErrorUnexpectedKeyType(), |
| 1014 ExportKey(blink::WebCryptoKeyFormatPkcs8, key, &output)); | 1015 ExportKey(blink::WebCryptoKeyFormatPkcs8, key, &output)); |
| 1015 } | 1016 } |
| 1016 | 1017 |
| 1017 TEST_F(SharedCryptoTest, ImportAesCbcSpkiFailure) { | |
| 1018 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | |
| 1019 ASSERT_EQ(Status::ErrorUnsupportedImportKeyFormat(), | |
| 1020 ImportKey(blink::WebCryptoKeyFormatSpki, | |
| 1021 CryptoData(HexStringToBytes(kPublicKeySpkiDerHex)), | |
| 1022 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc), | |
| 1023 true, | |
| 1024 blink::WebCryptoKeyUsageEncrypt, | |
| 1025 &key)); | |
| 1026 } | |
| 1027 | |
| 1028 TEST_F(SharedCryptoTest, MAYBE(AesCbcSampleSets)) { | 1018 TEST_F(SharedCryptoTest, MAYBE(AesCbcSampleSets)) { |
| 1029 scoped_ptr<base::ListValue> tests; | 1019 scoped_ptr<base::ListValue> tests; |
| 1030 ASSERT_TRUE(ReadJsonTestFileToList("aes_cbc.json", &tests)); | 1020 ASSERT_TRUE(ReadJsonTestFileToList("aes_cbc.json", &tests)); |
| 1031 | 1021 |
| 1032 for (size_t test_index = 0; test_index < tests->GetSize(); ++test_index) { | 1022 for (size_t test_index = 0; test_index < tests->GetSize(); ++test_index) { |
| 1033 SCOPED_TRACE(test_index); | 1023 SCOPED_TRACE(test_index); |
| 1034 base::DictionaryValue* test; | 1024 base::DictionaryValue* test; |
| 1035 ASSERT_TRUE(tests->GetDictionary(test_index, &test)); | 1025 ASSERT_TRUE(tests->GetDictionary(test_index, &test)); |
| 1036 | 1026 |
| 1037 std::vector<uint8> test_key = GetBytesFromHexString(test, "key"); | 1027 std::vector<uint8> test_key = GetBytesFromHexString(test, "key"); |
| (...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1370 // Fail on invalid JSON. | 1360 // Fail on invalid JSON. |
| 1371 const std::vector<uint8> bad_json_vec = MakeJsonVector( | 1361 const std::vector<uint8> bad_json_vec = MakeJsonVector( |
| 1372 "{" | 1362 "{" |
| 1373 "\"kty\" : \"oct\"," | 1363 "\"kty\" : \"oct\"," |
| 1374 "\"alg\" : \"HS256\"," | 1364 "\"alg\" : \"HS256\"," |
| 1375 "\"use\" : "); | 1365 "\"use\" : "); |
| 1376 EXPECT_EQ(Status::ErrorJwkNotDictionary(), | 1366 EXPECT_EQ(Status::ErrorJwkNotDictionary(), |
| 1377 ImportKeyJwk( | 1367 ImportKeyJwk( |
| 1378 CryptoData(bad_json_vec), algorithm, false, usage_mask, &key)); | 1368 CryptoData(bad_json_vec), algorithm, false, usage_mask, &key)); |
| 1379 | 1369 |
| 1380 // Fail on JWK alg present but incorrect (expecting A128CBC). | 1370 // Fail on JWK alg present but unrecognized. |
| 1381 dict.SetString("alg", "A127CBC"); | 1371 dict.SetString("alg", "A127CBC"); |
| 1382 EXPECT_EQ(Status::ErrorJwkAlgorithmInconsistent(), | 1372 EXPECT_EQ(Status::ErrorJwkUnrecognizedAlgorithm(), |
| 1383 ImportKeyJwkFromDict(dict, algorithm, false, usage_mask, &key)); | 1373 ImportKeyJwkFromDict(dict, algorithm, false, usage_mask, &key)); |
| 1384 RestoreJwkOctDictionary(&dict); | 1374 RestoreJwkOctDictionary(&dict); |
| 1385 | 1375 |
| 1386 // Fail on invalid kty. | 1376 // Fail on invalid kty. |
| 1387 dict.SetString("kty", "foo"); | 1377 dict.SetString("kty", "foo"); |
| 1388 EXPECT_EQ(Status::ErrorJwkUnexpectedKty("oct"), | 1378 EXPECT_EQ(Status::ErrorJwkUnrecognizedKty(), |
| 1389 ImportKeyJwkFromDict(dict, algorithm, false, usage_mask, &key)); | 1379 ImportKeyJwkFromDict(dict, algorithm, false, usage_mask, &key)); |
| 1390 RestoreJwkOctDictionary(&dict); | 1380 RestoreJwkOctDictionary(&dict); |
| 1391 | 1381 |
| 1392 // Fail on missing kty. | 1382 // Fail on missing kty. |
| 1393 dict.Remove("kty", NULL); | 1383 dict.Remove("kty", NULL); |
| 1394 EXPECT_EQ(Status::ErrorJwkPropertyMissing("kty"), | 1384 EXPECT_EQ(Status::ErrorJwkPropertyMissing("kty"), |
| 1395 ImportKeyJwkFromDict(dict, algorithm, false, usage_mask, &key)); | 1385 ImportKeyJwkFromDict(dict, algorithm, false, usage_mask, &key)); |
| 1396 RestoreJwkOctDictionary(&dict); | 1386 RestoreJwkOctDictionary(&dict); |
| 1397 | 1387 |
| 1398 // Fail on kty wrong type. | 1388 // Fail on kty wrong type. |
| (...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1737 EXPECT_EQ(Status::Success(), | 1727 EXPECT_EQ(Status::Success(), |
| 1738 ImportKeyJwkFromDict(dict, algorithm, true, usage_mask, &key)); | 1728 ImportKeyJwkFromDict(dict, algorithm, true, usage_mask, &key)); |
| 1739 EXPECT_TRUE(key.extractable()); | 1729 EXPECT_TRUE(key.extractable()); |
| 1740 EXPECT_EQ(Status::Success(), | 1730 EXPECT_EQ(Status::Success(), |
| 1741 ImportKeyJwkFromDict(dict, algorithm, false, usage_mask, &key)); | 1731 ImportKeyJwkFromDict(dict, algorithm, false, usage_mask, &key)); |
| 1742 EXPECT_FALSE(key.extractable()); | 1732 EXPECT_FALSE(key.extractable()); |
| 1743 dict.SetBoolean("ext", true); // restore previous value | 1733 dict.SetBoolean("ext", true); // restore previous value |
| 1744 | 1734 |
| 1745 // Fail: Input algorithm (AES-CBC) is inconsistent with JWK value | 1735 // Fail: Input algorithm (AES-CBC) is inconsistent with JWK value |
| 1746 // (HMAC SHA256). | 1736 // (HMAC SHA256). |
| 1747 dict.Clear(); | 1737 EXPECT_EQ(Status::ErrorJwkAlgorithmInconsistent(), |
| 1748 dict.SetString("kty", "oct"); | |
| 1749 dict.SetString("alg", "HS256"); | |
| 1750 dict.SetString("k", "l3nZEgZCeX8XRwJdWyK3rGB8qwjhdY8vOkbIvh4lxTuMao9Y_--hdg"); | |
| 1751 EXPECT_EQ( | |
| 1752 Status::ErrorJwkAlgorithmInconsistent(), | |
| 1753 ImportKeyJwkFromDict(dict, | |
| 1754 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc), | |
| 1755 extractable, | |
| 1756 blink::WebCryptoKeyUsageEncrypt, | |
| 1757 &key)); | |
| 1758 // Fail: Input usage (encrypt) is inconsistent with JWK value (use=sig). | |
| 1759 EXPECT_EQ(Status::ErrorJwkUseInconsistent(), | |
| 1760 ImportKeyJwk(CryptoData(json_vec), | 1738 ImportKeyJwk(CryptoData(json_vec), |
| 1761 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc), | 1739 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc), |
| 1762 extractable, | 1740 extractable, |
| 1763 blink::WebCryptoKeyUsageEncrypt, | 1741 blink::WebCryptoKeyUsageEncrypt, |
| 1764 &key)); | 1742 &key)); |
| 1765 | 1743 |
| 1766 // Fail: Input algorithm (HMAC SHA1) is inconsistent with JWK value | 1744 // Fail: Input algorithm (HMAC SHA1) is inconsistent with JWK value |
| 1767 // (HMAC SHA256). | 1745 // (HMAC SHA256). |
| 1768 EXPECT_EQ( | 1746 EXPECT_EQ( |
| 1769 Status::ErrorJwkAlgorithmInconsistent(), | 1747 Status::ErrorJwkAlgorithmInconsistent(), |
| (...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2052 EXPECT_EQ( | 2030 EXPECT_EQ( |
| 2053 Status::DataError(), | 2031 Status::DataError(), |
| 2054 ImportKey(blink::WebCryptoKeyFormatSpki, | 2032 ImportKey(blink::WebCryptoKeyFormatSpki, |
| 2055 CryptoData(HexStringToBytes("618333c4cb")), | 2033 CryptoData(HexStringToBytes("618333c4cb")), |
| 2056 CreateAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5), | 2034 CreateAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5), |
| 2057 true, | 2035 true, |
| 2058 blink::WebCryptoKeyUsageVerify, | 2036 blink::WebCryptoKeyUsageVerify, |
| 2059 &key)); | 2037 &key)); |
| 2060 | 2038 |
| 2061 // Failing case: Import RSA key but provide an inconsistent input algorithm. | 2039 // Failing case: Import RSA key but provide an inconsistent input algorithm. |
| 2062 EXPECT_EQ(Status::ErrorUnsupportedImportKeyFormat(), | 2040 EXPECT_EQ(Status::DataError(), |
| 2063 ImportKey(blink::WebCryptoKeyFormatSpki, | 2041 ImportKey(blink::WebCryptoKeyFormatSpki, |
| 2064 CryptoData(HexStringToBytes(kPublicKeySpkiDerHex)), | 2042 CryptoData(HexStringToBytes(kPublicKeySpkiDerHex)), |
| 2065 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc), | 2043 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc), |
| 2066 true, | 2044 true, |
| 2067 blink::WebCryptoKeyUsageEncrypt, | 2045 blink::WebCryptoKeyUsageEncrypt, |
| 2068 &key)); | 2046 &key)); |
| 2069 | 2047 |
| 2070 // Passing case: Export a previously imported RSA public key in SPKI format | 2048 // Passing case: Export a previously imported RSA public key in SPKI format |
| 2071 // and compare to original data. | 2049 // and compare to original data. |
| 2072 std::vector<uint8> output; | 2050 std::vector<uint8> output; |
| 2073 ASSERT_EQ(Status::Success(), | 2051 ASSERT_EQ(Status::Success(), |
| 2074 ExportKey(blink::WebCryptoKeyFormatSpki, key, &output)); | 2052 ExportKey(blink::WebCryptoKeyFormatSpki, key, &output)); |
| 2075 EXPECT_BYTES_EQ_HEX(kPublicKeySpkiDerHex, output); | 2053 EXPECT_BYTES_EQ_HEX(kPublicKeySpkiDerHex, output); |
| 2076 | 2054 |
| 2077 // Failing case: Try to export a previously imported RSA public key in raw | 2055 // Failing case: Try to export a previously imported RSA public key in raw |
| 2078 // format (not allowed for a public key). | 2056 // format (not allowed for a public key). |
| 2079 EXPECT_EQ(Status::ErrorUnsupportedExportKeyFormat(), | 2057 EXPECT_EQ(Status::ErrorUnexpectedKeyType(), |
| 2080 ExportKey(blink::WebCryptoKeyFormatRaw, key, &output)); | 2058 ExportKey(blink::WebCryptoKeyFormatRaw, key, &output)); |
| 2081 | 2059 |
| 2082 // Failing case: Try to export a non-extractable key | 2060 // Failing case: Try to export a non-extractable key |
| 2083 ASSERT_EQ(Status::Success(), | 2061 ASSERT_EQ(Status::Success(), |
| 2084 ImportKey(blink::WebCryptoKeyFormatSpki, | 2062 ImportKey(blink::WebCryptoKeyFormatSpki, |
| 2085 CryptoData(HexStringToBytes(kPublicKeySpkiDerHex)), | 2063 CryptoData(HexStringToBytes(kPublicKeySpkiDerHex)), |
| 2086 CreateRsaHashedImportAlgorithm( | 2064 CreateRsaHashedImportAlgorithm( |
| 2087 blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, | 2065 blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, |
| 2088 blink::WebCryptoAlgorithmIdSha256), | 2066 blink::WebCryptoAlgorithmIdSha256), |
| 2089 false, | 2067 false, |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2152 CryptoData(HexStringToBytes("618333c4cb")), | 2130 CryptoData(HexStringToBytes("618333c4cb")), |
| 2153 CreateAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5), | 2131 CreateAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5), |
| 2154 true, | 2132 true, |
| 2155 blink::WebCryptoKeyUsageSign, | 2133 blink::WebCryptoKeyUsageSign, |
| 2156 &key)); | 2134 &key)); |
| 2157 | 2135 |
| 2158 // Failing case: Import RSA key but provide an inconsistent input algorithm | 2136 // Failing case: Import RSA key but provide an inconsistent input algorithm |
| 2159 // and usage. Several issues here: | 2137 // and usage. Several issues here: |
| 2160 // * AES-CBC doesn't support PKCS8 key format | 2138 // * AES-CBC doesn't support PKCS8 key format |
| 2161 // * AES-CBC doesn't support "sign" usage | 2139 // * AES-CBC doesn't support "sign" usage |
| 2162 EXPECT_EQ(Status::ErrorUnsupportedImportKeyFormat(), | 2140 EXPECT_EQ(Status::ErrorCreateKeyBadUsages(), |
| 2163 ImportKey(blink::WebCryptoKeyFormatPkcs8, | 2141 ImportKey(blink::WebCryptoKeyFormatPkcs8, |
| 2164 CryptoData(HexStringToBytes(kPrivateKeyPkcs8DerHex)), | 2142 CryptoData(HexStringToBytes(kPrivateKeyPkcs8DerHex)), |
| 2165 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc), | 2143 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc), |
| 2166 true, | 2144 true, |
| 2167 blink::WebCryptoKeyUsageSign, | 2145 blink::WebCryptoKeyUsageSign, |
| 2168 &key)); | 2146 &key)); |
| 2169 } | 2147 } |
| 2170 | 2148 |
| 2171 // Tests JWK import and export by doing a roundtrip key conversion and ensuring | 2149 // Tests JWK import and export by doing a roundtrip key conversion and ensuring |
| 2172 // it was lossless: | 2150 // it was lossless: |
| (...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2712 | 2690 |
| 2713 std::vector<uint8> signature; | 2691 std::vector<uint8> signature; |
| 2714 bool signature_match; | 2692 bool signature_match; |
| 2715 | 2693 |
| 2716 // Compute a signature. | 2694 // Compute a signature. |
| 2717 const std::vector<uint8> data = HexStringToBytes("010203040506070809"); | 2695 const std::vector<uint8> data = HexStringToBytes("010203040506070809"); |
| 2718 ASSERT_EQ(Status::Success(), | 2696 ASSERT_EQ(Status::Success(), |
| 2719 Sign(algorithm, private_key, CryptoData(data), &signature)); | 2697 Sign(algorithm, private_key, CryptoData(data), &signature)); |
| 2720 | 2698 |
| 2721 // Ensure truncated signature does not verify by passing one less byte. | 2699 // Ensure truncated signature does not verify by passing one less byte. |
| 2722 EXPECT_EQ( | 2700 EXPECT_EQ(Status::Success(), |
| 2723 Status::Success(), | 2701 VerifySignature( |
| 2724 Verify(algorithm, | 2702 algorithm, |
| 2725 public_key, | 2703 public_key, |
| 2726 CryptoData(Uint8VectorStart(signature), signature.size() - 1), | 2704 CryptoData(Uint8VectorStart(signature), signature.size() - 1), |
| 2727 CryptoData(data), | 2705 CryptoData(data), |
| 2728 &signature_match)); | 2706 &signature_match)); |
| 2729 EXPECT_FALSE(signature_match); | 2707 EXPECT_FALSE(signature_match); |
| 2730 | 2708 |
| 2731 // Ensure truncated signature does not verify by passing no bytes. | 2709 // Ensure truncated signature does not verify by passing no bytes. |
| 2732 EXPECT_EQ(Status::Success(), | 2710 EXPECT_EQ(Status::Success(), |
| 2733 Verify(algorithm, | 2711 VerifySignature(algorithm, |
| 2734 public_key, | 2712 public_key, |
| 2735 CryptoData(), | 2713 CryptoData(), |
| 2736 CryptoData(data), | 2714 CryptoData(data), |
| 2737 &signature_match)); | 2715 &signature_match)); |
| 2738 EXPECT_FALSE(signature_match); | 2716 EXPECT_FALSE(signature_match); |
| 2739 | 2717 |
| 2740 // Ensure corrupted signature does not verify. | 2718 // Ensure corrupted signature does not verify. |
| 2741 std::vector<uint8> corrupt_sig = signature; | 2719 std::vector<uint8> corrupt_sig = signature; |
| 2742 corrupt_sig[corrupt_sig.size() / 2] ^= 0x1; | 2720 corrupt_sig[corrupt_sig.size() / 2] ^= 0x1; |
| 2743 EXPECT_EQ(Status::Success(), | 2721 EXPECT_EQ(Status::Success(), |
| 2744 Verify(algorithm, | 2722 VerifySignature(algorithm, |
| 2745 public_key, | 2723 public_key, |
| 2746 CryptoData(corrupt_sig), | 2724 CryptoData(corrupt_sig), |
| 2747 CryptoData(data), | 2725 CryptoData(data), |
| 2748 &signature_match)); | 2726 &signature_match)); |
| 2749 EXPECT_FALSE(signature_match); | 2727 EXPECT_FALSE(signature_match); |
| 2750 | 2728 |
| 2751 // Ensure signatures that are greater than the modulus size fail. | 2729 // Ensure signatures that are greater than the modulus size fail. |
| 2752 const unsigned int long_message_size_bytes = 1024; | 2730 const unsigned int long_message_size_bytes = 1024; |
| 2753 DCHECK_GT(long_message_size_bytes, kModulusLengthBits / 8); | 2731 DCHECK_GT(long_message_size_bytes, kModulusLengthBits / 8); |
| 2754 const unsigned char kLongSignature[long_message_size_bytes] = {0}; | 2732 const unsigned char kLongSignature[long_message_size_bytes] = {0}; |
| 2755 EXPECT_EQ(Status::Success(), | 2733 EXPECT_EQ(Status::Success(), |
| 2756 Verify(algorithm, | 2734 VerifySignature(algorithm, |
| 2757 public_key, | 2735 public_key, |
| 2758 CryptoData(kLongSignature, sizeof(kLongSignature)), | 2736 CryptoData(kLongSignature, sizeof(kLongSignature)), |
| 2759 CryptoData(data), | 2737 CryptoData(data), |
| 2760 &signature_match)); | 2738 &signature_match)); |
| 2761 EXPECT_FALSE(signature_match); | 2739 EXPECT_FALSE(signature_match); |
| 2762 | 2740 |
| 2763 // Ensure that signing and verifying with an incompatible algorithm fails. | 2741 // Ensure that signing and verifying with an incompatible algorithm fails. |
| 2764 algorithm = CreateAlgorithm(blink::WebCryptoAlgorithmIdRsaOaep); | 2742 algorithm = CreateAlgorithm(blink::WebCryptoAlgorithmIdRsaOaep); |
| 2765 | 2743 |
| 2766 EXPECT_EQ(Status::ErrorUnexpected(), | 2744 EXPECT_EQ(Status::ErrorUnexpected(), |
| 2767 Sign(algorithm, private_key, CryptoData(data), &signature)); | 2745 Sign(algorithm, private_key, CryptoData(data), &signature)); |
| 2768 EXPECT_EQ(Status::ErrorUnexpected(), | 2746 EXPECT_EQ(Status::ErrorUnexpected(), |
| 2769 Verify(algorithm, | 2747 VerifySignature(algorithm, |
| 2770 public_key, | 2748 public_key, |
| 2771 CryptoData(signature), | 2749 CryptoData(signature), |
| 2772 CryptoData(data), | 2750 CryptoData(data), |
| 2773 &signature_match)); | 2751 &signature_match)); |
| 2774 | 2752 |
| 2775 // Some crypto libraries (NSS) can automatically select the RSA SSA inner hash | 2753 // Some crypto libraries (NSS) can automatically select the RSA SSA inner hash |
| 2776 // based solely on the contents of the input signature data. In the Web Crypto | 2754 // based solely on the contents of the input signature data. In the Web Crypto |
| 2777 // implementation, the inner hash should be specified uniquely by the key | 2755 // implementation, the inner hash should be specified uniquely by the key |
| 2778 // algorithm parameter. To validate this behavior, call Verify with a computed | 2756 // algorithm parameter. To validate this behavior, call Verify with a computed |
| 2779 // signature that used one hash type (SHA-1), but pass in a key with a | 2757 // signature that used one hash type (SHA-1), but pass in a key with a |
| 2780 // different inner hash type (SHA-256). If the hash type is determined by the | 2758 // different inner hash type (SHA-256). If the hash type is determined by the |
| 2781 // signature itself (undesired), the verify will pass, while if the hash type | 2759 // signature itself (undesired), the verify will pass, while if the hash type |
| 2782 // is specified by the key algorithm (desired), the verify will fail. | 2760 // is specified by the key algorithm (desired), the verify will fail. |
| 2783 | 2761 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 2804 // NOTE: public_key was produced by generateKey, and so its associated | 2782 // NOTE: public_key was produced by generateKey, and so its associated |
| 2805 // algorithm has WebCryptoRsaKeyGenParams and not WebCryptoRsaSsaParams. Thus | 2783 // algorithm has WebCryptoRsaKeyGenParams and not WebCryptoRsaSsaParams. Thus |
| 2806 // it has no inner hash to conflict with the input algorithm. | 2784 // it has no inner hash to conflict with the input algorithm. |
| 2807 EXPECT_EQ(blink::WebCryptoAlgorithmIdSha1, | 2785 EXPECT_EQ(blink::WebCryptoAlgorithmIdSha1, |
| 2808 private_key.algorithm().rsaHashedParams()->hash().id()); | 2786 private_key.algorithm().rsaHashedParams()->hash().id()); |
| 2809 EXPECT_EQ(blink::WebCryptoAlgorithmIdSha256, | 2787 EXPECT_EQ(blink::WebCryptoAlgorithmIdSha256, |
| 2810 public_key_256.algorithm().rsaHashedParams()->hash().id()); | 2788 public_key_256.algorithm().rsaHashedParams()->hash().id()); |
| 2811 | 2789 |
| 2812 bool is_match; | 2790 bool is_match; |
| 2813 EXPECT_EQ(Status::Success(), | 2791 EXPECT_EQ(Status::Success(), |
| 2814 Verify(CreateAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5), | 2792 VerifySignature( |
| 2815 public_key_256, | 2793 CreateAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5), |
| 2816 CryptoData(signature), | 2794 public_key_256, |
| 2817 CryptoData(data), | 2795 CryptoData(signature), |
| 2818 &is_match)); | 2796 CryptoData(data), |
| 2797 &is_match)); |
| 2819 EXPECT_FALSE(is_match); | 2798 EXPECT_FALSE(is_match); |
| 2820 } | 2799 } |
| 2821 | 2800 |
| 2822 TEST_F(SharedCryptoTest, MAYBE(RsaSignVerifyKnownAnswer)) { | 2801 TEST_F(SharedCryptoTest, MAYBE(RsaSignVerifyKnownAnswer)) { |
| 2823 if (!SupportsRsaKeyImport()) | 2802 if (!SupportsRsaKeyImport()) |
| 2824 return; | 2803 return; |
| 2825 | 2804 |
| 2826 scoped_ptr<base::ListValue> tests; | 2805 scoped_ptr<base::ListValue> tests; |
| 2827 ASSERT_TRUE(ReadJsonTestFileToList("pkcs1v15_sign.json", &tests)); | 2806 ASSERT_TRUE(ReadJsonTestFileToList("pkcs1v15_sign.json", &tests)); |
| 2828 | 2807 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 2859 GetBytesFromHexString(test, "signature_hex"); | 2838 GetBytesFromHexString(test, "signature_hex"); |
| 2860 | 2839 |
| 2861 signature.clear(); | 2840 signature.clear(); |
| 2862 ASSERT_EQ( | 2841 ASSERT_EQ( |
| 2863 Status::Success(), | 2842 Status::Success(), |
| 2864 Sign(algorithm, private_key, CryptoData(test_message), &signature)); | 2843 Sign(algorithm, private_key, CryptoData(test_message), &signature)); |
| 2865 EXPECT_BYTES_EQ(test_signature, signature); | 2844 EXPECT_BYTES_EQ(test_signature, signature); |
| 2866 | 2845 |
| 2867 bool is_match = false; | 2846 bool is_match = false; |
| 2868 ASSERT_EQ(Status::Success(), | 2847 ASSERT_EQ(Status::Success(), |
| 2869 Verify(algorithm, | 2848 VerifySignature(algorithm, |
| 2870 public_key, | 2849 public_key, |
| 2871 CryptoData(test_signature), | 2850 CryptoData(test_signature), |
| 2872 CryptoData(test_message), | 2851 CryptoData(test_message), |
| 2873 &is_match)); | 2852 &is_match)); |
| 2874 EXPECT_TRUE(is_match); | 2853 EXPECT_TRUE(is_match); |
| 2875 } | 2854 } |
| 2876 } | 2855 } |
| 2877 | 2856 |
| 2878 TEST_F(SharedCryptoTest, MAYBE(AesKwKeyImport)) { | 2857 TEST_F(SharedCryptoTest, MAYBE(AesKwKeyImport)) { |
| 2879 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | 2858 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
| 2880 blink::WebCryptoAlgorithm algorithm = | 2859 blink::WebCryptoAlgorithm algorithm = |
| 2881 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesKw); | 2860 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesKw); |
| 2882 | 2861 |
| 2883 // Import a 128-bit Key Encryption Key (KEK) | 2862 // Import a 128-bit Key Encryption Key (KEK) |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3097 ASSERT_EQ(Status::Success(), | 3076 ASSERT_EQ(Status::Success(), |
| 3098 Sign(CreateAlgorithm(blink::WebCryptoAlgorithmIdHmac), | 3077 Sign(CreateAlgorithm(blink::WebCryptoAlgorithmIdHmac), |
| 3099 key, | 3078 key, |
| 3100 CryptoData(test_message), | 3079 CryptoData(test_message), |
| 3101 &signature)); | 3080 &signature)); |
| 3102 | 3081 |
| 3103 EXPECT_GT(signature.size(), 0u); | 3082 EXPECT_GT(signature.size(), 0u); |
| 3104 | 3083 |
| 3105 bool verify_result; | 3084 bool verify_result; |
| 3106 ASSERT_EQ(Status::Success(), | 3085 ASSERT_EQ(Status::Success(), |
| 3107 Verify(CreateAlgorithm(blink::WebCryptoAlgorithmIdHmac), | 3086 VerifySignature(CreateAlgorithm(blink::WebCryptoAlgorithmIdHmac), |
| 3108 key, | 3087 key, |
| 3109 CryptoData(signature), | 3088 CryptoData(signature), |
| 3110 CryptoData(test_message), | 3089 CryptoData(test_message), |
| 3111 &verify_result)); | 3090 &verify_result)); |
| 3112 } | 3091 } |
| 3113 | 3092 |
| 3114 TEST_F(SharedCryptoTest, MAYBE(AesKwRawSymkeyWrapUnwrapErrors)) { | 3093 TEST_F(SharedCryptoTest, MAYBE(AesKwRawSymkeyWrapUnwrapErrors)) { |
| 3115 scoped_ptr<base::ListValue> tests; | 3094 scoped_ptr<base::ListValue> tests; |
| 3116 ASSERT_TRUE(ReadJsonTestFileToList("aes_kw.json", &tests)); | 3095 ASSERT_TRUE(ReadJsonTestFileToList("aes_kw.json", &tests)); |
| 3117 base::DictionaryValue* test; | 3096 base::DictionaryValue* test; |
| 3118 // Use 256 bits of data with a 256-bit KEK | 3097 // Use 256 bits of data with a 256-bit KEK |
| 3119 ASSERT_TRUE(tests->GetDictionary(3, &test)); | 3098 ASSERT_TRUE(tests->GetDictionary(3, &test)); |
| 3120 const std::vector<uint8> test_kek = GetBytesFromHexString(test, "kek"); | 3099 const std::vector<uint8> test_kek = GetBytesFromHexString(test, "kek"); |
| 3121 const std::vector<uint8> test_key = GetBytesFromHexString(test, "key"); | 3100 const std::vector<uint8> test_key = GetBytesFromHexString(test, "key"); |
| (...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3444 wrapping_key, | 3423 wrapping_key, |
| 3445 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesKw), | 3424 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesKw), |
| 3446 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc), | 3425 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc), |
| 3447 true, | 3426 true, |
| 3448 blink::WebCryptoKeyUsageEncrypt, | 3427 blink::WebCryptoKeyUsageEncrypt, |
| 3449 &unwrapped_key)); | 3428 &unwrapped_key)); |
| 3450 } | 3429 } |
| 3451 | 3430 |
| 3452 class SharedCryptoRsaOaepTest : public ::testing::Test { | 3431 class SharedCryptoRsaOaepTest : public ::testing::Test { |
| 3453 public: | 3432 public: |
| 3433 SharedCryptoRsaOaepTest() { Init(); } |
| 3434 |
| 3454 scoped_ptr<base::DictionaryValue> CreatePublicKeyJwkDict() { | 3435 scoped_ptr<base::DictionaryValue> CreatePublicKeyJwkDict() { |
| 3455 scoped_ptr<base::DictionaryValue> jwk(new base::DictionaryValue()); | 3436 scoped_ptr<base::DictionaryValue> jwk(new base::DictionaryValue()); |
| 3456 jwk->SetString("kty", "RSA"); | 3437 jwk->SetString("kty", "RSA"); |
| 3457 jwk->SetString("n", | 3438 jwk->SetString("n", |
| 3458 Base64EncodeUrlSafe(HexStringToBytes(kPublicKeyModulusHex))); | 3439 Base64EncodeUrlSafe(HexStringToBytes(kPublicKeyModulusHex))); |
| 3459 jwk->SetString( | 3440 jwk->SetString( |
| 3460 "e", Base64EncodeUrlSafe(HexStringToBytes(kPublicKeyExponentHex))); | 3441 "e", Base64EncodeUrlSafe(HexStringToBytes(kPublicKeyExponentHex))); |
| 3461 return jwk.Pass(); | 3442 return jwk.Pass(); |
| 3462 } | 3443 } |
| 3463 }; | 3444 }; |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3545 if (!SupportsRsaOaep()) { | 3526 if (!SupportsRsaOaep()) { |
| 3546 LOG(WARNING) << "RSA-OAEP support not present; skipping."; | 3527 LOG(WARNING) << "RSA-OAEP support not present; skipping."; |
| 3547 return; | 3528 return; |
| 3548 } | 3529 } |
| 3549 | 3530 |
| 3550 scoped_ptr<base::DictionaryValue> jwk(CreatePublicKeyJwkDict()); | 3531 scoped_ptr<base::DictionaryValue> jwk(CreatePublicKeyJwkDict()); |
| 3551 jwk->SetString("kty", "oct"); | 3532 jwk->SetString("kty", "oct"); |
| 3552 jwk->SetString("alg", "RSA-OAEP"); | 3533 jwk->SetString("alg", "RSA-OAEP"); |
| 3553 | 3534 |
| 3554 blink::WebCryptoKey public_key = blink::WebCryptoKey::createNull(); | 3535 blink::WebCryptoKey public_key = blink::WebCryptoKey::createNull(); |
| 3555 ASSERT_EQ(Status::ErrorJwkUnexpectedKty("RSA"), | 3536 ASSERT_EQ(Status::ErrorJwkPropertyMissing("k"), |
| 3556 ImportKeyJwkFromDict(*jwk.get(), | 3537 ImportKeyJwkFromDict(*jwk.get(), |
| 3557 CreateRsaHashedImportAlgorithm( | 3538 CreateRsaHashedImportAlgorithm( |
| 3558 blink::WebCryptoAlgorithmIdRsaOaep, | 3539 blink::WebCryptoAlgorithmIdRsaOaep, |
| 3559 blink::WebCryptoAlgorithmIdSha1), | 3540 blink::WebCryptoAlgorithmIdSha1), |
| 3560 true, | 3541 true, |
| 3561 blink::WebCryptoKeyUsageEncrypt, | 3542 blink::WebCryptoKeyUsageEncrypt, |
| 3562 &public_key)); | 3543 &public_key)); |
| 3563 } | 3544 } |
| 3564 | 3545 |
| 3565 TEST_F(SharedCryptoRsaOaepTest, ExportPublicJwk) { | 3546 TEST_F(SharedCryptoRsaOaepTest, ExportPublicJwk) { |
| (...skipping 852 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4418 EXPECT_EQ(public_key_spki, unwrapped_public_key_spki); | 4399 EXPECT_EQ(public_key_spki, unwrapped_public_key_spki); |
| 4419 EXPECT_EQ(private_key_pkcs8, unwrapped_private_key_pkcs8); | 4400 EXPECT_EQ(private_key_pkcs8, unwrapped_private_key_pkcs8); |
| 4420 | 4401 |
| 4421 EXPECT_NE(public_key_spki, wrapped_public_key); | 4402 EXPECT_NE(public_key_spki, wrapped_public_key); |
| 4422 EXPECT_NE(private_key_pkcs8, wrapped_private_key); | 4403 EXPECT_NE(private_key_pkcs8, wrapped_private_key); |
| 4423 } | 4404 } |
| 4424 | 4405 |
| 4425 } // namespace webcrypto | 4406 } // namespace webcrypto |
| 4426 | 4407 |
| 4427 } // namespace content | 4408 } // namespace content |
| OLD | NEW |