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