| 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" | 5 #include "content/child/webcrypto/shared_crypto.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 a.error_details() == b.error_details(); | 60 a.error_details() == b.error_details(); |
| 61 } | 61 } |
| 62 | 62 |
| 63 bool operator!=(const content::webcrypto::Status& a, | 63 bool operator!=(const content::webcrypto::Status& a, |
| 64 const content::webcrypto::Status& b) { | 64 const content::webcrypto::Status& b) { |
| 65 return !(a == b); | 65 return !(a == b); |
| 66 } | 66 } |
| 67 | 67 |
| 68 namespace { | 68 namespace { |
| 69 | 69 |
| 70 // ----------------------------------------------------------------------------- | |
| 71 // TODO(eroman): Remove these helpers and convert all of the tests to using the | |
| 72 // std::vector<> flavor of functions directly. | |
| 73 // ----------------------------------------------------------------------------- | |
| 74 | |
| 75 blink::WebArrayBuffer CreateArrayBuffer(const uint8* data, | |
| 76 unsigned int data_size) { | |
| 77 blink::WebArrayBuffer buffer = blink::WebArrayBuffer::create(data_size, 1); | |
| 78 DCHECK(!buffer.isNull()); | |
| 79 if (data_size) // data_size == 0 might mean the data pointer is invalid | |
| 80 memcpy(buffer.data(), data, data_size); | |
| 81 return buffer; | |
| 82 } | |
| 83 | |
| 84 void AssignWebArrayBuffer(const std::vector<uint8>& in, | |
| 85 blink::WebArrayBuffer* out) { | |
| 86 *out = CreateArrayBuffer(Uint8VectorStart(in), in.size()); | |
| 87 } | |
| 88 | |
| 89 Status Encrypt(const blink::WebCryptoAlgorithm& algorithm, | |
| 90 const blink::WebCryptoKey& key, | |
| 91 const CryptoData& data, | |
| 92 blink::WebArrayBuffer* web_buffer) { | |
| 93 std::vector<uint8> buffer; | |
| 94 Status status = Encrypt(algorithm, key, data, &buffer); | |
| 95 AssignWebArrayBuffer(buffer, web_buffer); | |
| 96 return status; | |
| 97 } | |
| 98 | |
| 99 Status Decrypt(const blink::WebCryptoAlgorithm& algorithm, | |
| 100 const blink::WebCryptoKey& key, | |
| 101 const CryptoData& data, | |
| 102 blink::WebArrayBuffer* web_buffer) { | |
| 103 std::vector<uint8> buffer; | |
| 104 Status status = Decrypt(algorithm, key, data, &buffer); | |
| 105 AssignWebArrayBuffer(buffer, web_buffer); | |
| 106 return status; | |
| 107 } | |
| 108 | |
| 109 Status Digest(const blink::WebCryptoAlgorithm& algorithm, | |
| 110 const CryptoData& data, | |
| 111 blink::WebArrayBuffer* web_buffer) { | |
| 112 std::vector<uint8> buffer; | |
| 113 Status status = Digest(algorithm, data, &buffer); | |
| 114 AssignWebArrayBuffer(buffer, web_buffer); | |
| 115 return status; | |
| 116 } | |
| 117 | |
| 118 Status ExportKey(blink::WebCryptoKeyFormat format, | |
| 119 const blink::WebCryptoKey& key, | |
| 120 blink::WebArrayBuffer* web_buffer) { | |
| 121 std::vector<uint8> buffer; | |
| 122 Status status = webcrypto::ExportKey(format, key, &buffer); | |
| 123 AssignWebArrayBuffer(buffer, web_buffer); | |
| 124 return status; | |
| 125 } | |
| 126 | |
| 127 Status Sign(const blink::WebCryptoAlgorithm& algorithm, | |
| 128 const blink::WebCryptoKey& key, | |
| 129 const CryptoData& data, | |
| 130 blink::WebArrayBuffer* web_buffer) { | |
| 131 std::vector<uint8> buffer; | |
| 132 | |
| 133 Status status = Sign(algorithm, key, data, &buffer); | |
| 134 AssignWebArrayBuffer(buffer, web_buffer); | |
| 135 return status; | |
| 136 } | |
| 137 | |
| 138 Status WrapKey(blink::WebCryptoKeyFormat format, | |
| 139 const blink::WebCryptoKey& wrapping_key, | |
| 140 const blink::WebCryptoKey& key_to_wrap, | |
| 141 const blink::WebCryptoAlgorithm& wrapping_algorithm, | |
| 142 blink::WebArrayBuffer* web_buffer) { | |
| 143 std::vector<uint8> buffer; | |
| 144 | |
| 145 Status status = webcrypto::WrapKey( | |
| 146 format, wrapping_key, key_to_wrap, wrapping_algorithm, &buffer); | |
| 147 AssignWebArrayBuffer(buffer, web_buffer); | |
| 148 return status; | |
| 149 } | |
| 150 | |
| 151 // ----------------------------------------------------------------------------- | |
| 152 | |
| 153 // TODO(eroman): For Linux builds using system NSS, AES-GCM support is a | 70 // TODO(eroman): For Linux builds using system NSS, AES-GCM support is a |
| 154 // runtime dependency. Test it by trying to import a key. | 71 // runtime dependency. Test it by trying to import a key. |
| 155 // TODO(padolph): Consider caching the result of the import key test. | 72 // TODO(padolph): Consider caching the result of the import key test. |
| 156 bool SupportsAesGcm() { | 73 bool SupportsAesGcm() { |
| 157 std::vector<uint8> key_raw(16, 0); | 74 std::vector<uint8> key_raw(16, 0); |
| 158 | 75 |
| 159 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | 76 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
| 160 Status status = ImportKey(blink::WebCryptoKeyFormatRaw, | 77 Status status = ImportKey(blink::WebCryptoKeyFormatRaw, |
| 161 CryptoData(key_raw), | 78 CryptoData(key_raw), |
| 162 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesGcm), | 79 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesGcm), |
| (...skipping 1788 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1951 EXPECT_EQ(test.usage, key.usages()); | 1868 EXPECT_EQ(test.usage, key.usages()); |
| 1952 | 1869 |
| 1953 // Export the key in raw format and compare to the original. | 1870 // Export the key in raw format and compare to the original. |
| 1954 blink::WebArrayBuffer key_raw_out; | 1871 blink::WebArrayBuffer key_raw_out; |
| 1955 ASSERT_EQ(Status::Success(), | 1872 ASSERT_EQ(Status::Success(), |
| 1956 ExportKey(blink::WebCryptoKeyFormatRaw, key, &key_raw_out)); | 1873 ExportKey(blink::WebCryptoKeyFormatRaw, key, &key_raw_out)); |
| 1957 ExpectArrayBufferMatchesHex(test.key_hex, key_raw_out); | 1874 ExpectArrayBufferMatchesHex(test.key_hex, key_raw_out); |
| 1958 } | 1875 } |
| 1959 } | 1876 } |
| 1960 | 1877 |
| 1961 TEST_F(SharedCryptoTest, MAYBE(ExportJwkEmptySymmetricKey)) { | |
| 1962 const blink::WebCryptoAlgorithm import_algorithm = | |
| 1963 webcrypto::CreateHmacImportAlgorithm(blink::WebCryptoAlgorithmIdSha1); | |
| 1964 | |
| 1965 blink::WebCryptoKeyUsageMask usages = blink::WebCryptoKeyUsageSign; | |
| 1966 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | |
| 1967 | |
| 1968 // Import a zero-byte HMAC key. | |
| 1969 const char key_data_hex[] = ""; | |
| 1970 key = ImportSecretKeyFromRaw( | |
| 1971 HexStringToBytes(key_data_hex), import_algorithm, usages); | |
| 1972 EXPECT_EQ(0u, key.algorithm().hmacParams()->lengthBits()); | |
| 1973 | |
| 1974 // Export the key in JWK format and validate. | |
| 1975 blink::WebArrayBuffer json; | |
| 1976 ASSERT_EQ(Status::Success(), | |
| 1977 ExportKey(blink::WebCryptoKeyFormatJwk, key, &json)); | |
| 1978 EXPECT_TRUE(VerifySecretJwk(json, "HS1", key_data_hex, usages)); | |
| 1979 | |
| 1980 // Now try re-importing the JWK key. | |
| 1981 key = blink::WebCryptoKey::createNull(); | |
| 1982 EXPECT_EQ(Status::Success(), | |
| 1983 ImportKey(blink::WebCryptoKeyFormatJwk, | |
| 1984 CryptoData(json), | |
| 1985 import_algorithm, | |
| 1986 true, | |
| 1987 usages, | |
| 1988 &key)); | |
| 1989 | |
| 1990 EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type()); | |
| 1991 EXPECT_EQ(0u, key.algorithm().hmacParams()->lengthBits()); | |
| 1992 | |
| 1993 blink::WebArrayBuffer exported_key_data; | |
| 1994 EXPECT_EQ(Status::Success(), | |
| 1995 ExportKey(blink::WebCryptoKeyFormatRaw, key, &exported_key_data)); | |
| 1996 | |
| 1997 EXPECT_EQ(0u, exported_key_data.byteLength()); | |
| 1998 } | |
| 1999 | |
| 2000 TEST_F(SharedCryptoTest, MAYBE(ImportExportSpki)) { | 1878 TEST_F(SharedCryptoTest, MAYBE(ImportExportSpki)) { |
| 2001 // Passing case: Import a valid RSA key in SPKI format. | 1879 // Passing case: Import a valid RSA key in SPKI format. |
| 2002 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); | 1880 blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
| 2003 ASSERT_EQ( | 1881 ASSERT_EQ( |
| 2004 Status::Success(), | 1882 Status::Success(), |
| 2005 ImportKey(blink::WebCryptoKeyFormatSpki, | 1883 ImportKey(blink::WebCryptoKeyFormatSpki, |
| 2006 CryptoData(HexStringToBytes(kPublicKeySpkiDerHex)), | 1884 CryptoData(HexStringToBytes(kPublicKeySpkiDerHex)), |
| 2007 CreateAlgorithm(blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5), | 1885 CreateAlgorithm(blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5), |
| 2008 true, | 1886 true, |
| 2009 blink::WebCryptoKeyUsageEncrypt, | 1887 blink::WebCryptoKeyUsageEncrypt, |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2243 algorithm, extractable, usage_mask, &public_key, &private_key)); | 2121 algorithm, extractable, usage_mask, &public_key, &private_key)); |
| 2244 EXPECT_FALSE(public_key.isNull()); | 2122 EXPECT_FALSE(public_key.isNull()); |
| 2245 EXPECT_FALSE(private_key.isNull()); | 2123 EXPECT_FALSE(private_key.isNull()); |
| 2246 EXPECT_EQ(blink::WebCryptoKeyTypePublic, public_key.type()); | 2124 EXPECT_EQ(blink::WebCryptoKeyTypePublic, public_key.type()); |
| 2247 EXPECT_EQ(blink::WebCryptoKeyTypePrivate, private_key.type()); | 2125 EXPECT_EQ(blink::WebCryptoKeyTypePrivate, private_key.type()); |
| 2248 EXPECT_TRUE(public_key.extractable()); | 2126 EXPECT_TRUE(public_key.extractable()); |
| 2249 EXPECT_EQ(extractable, private_key.extractable()); | 2127 EXPECT_EQ(extractable, private_key.extractable()); |
| 2250 EXPECT_EQ(usage_mask, public_key.usages()); | 2128 EXPECT_EQ(usage_mask, public_key.usages()); |
| 2251 EXPECT_EQ(usage_mask, private_key.usages()); | 2129 EXPECT_EQ(usage_mask, private_key.usages()); |
| 2252 | 2130 |
| 2253 // Successful WebCryptoAlgorithmIdRsaSsaPkcs1v1_5 key generation (sha256) | 2131 // Successful WebCryptoAlgorithmIdRsaOaep key generation. |
| 2254 algorithm = | 2132 algorithm = CreateRsaHashedKeyGenAlgorithm(blink::WebCryptoAlgorithmIdRsaOaep, |
| 2255 CreateRsaHashedKeyGenAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, | 2133 blink::WebCryptoAlgorithmIdSha256, |
| 2256 blink::WebCryptoAlgorithmIdSha256, | 2134 modulus_length, |
| 2257 modulus_length, | 2135 public_exponent); |
| 2258 public_exponent); | |
| 2259 EXPECT_EQ(Status::Success(), | 2136 EXPECT_EQ(Status::Success(), |
| 2260 GenerateKeyPair( | 2137 GenerateKeyPair( |
| 2261 algorithm, extractable, usage_mask, &public_key, &private_key)); | 2138 algorithm, extractable, usage_mask, &public_key, &private_key)); |
| 2262 EXPECT_FALSE(public_key.isNull()); | 2139 EXPECT_FALSE(public_key.isNull()); |
| 2263 EXPECT_FALSE(private_key.isNull()); | 2140 EXPECT_FALSE(private_key.isNull()); |
| 2264 EXPECT_EQ(blink::WebCryptoKeyTypePublic, public_key.type()); | 2141 EXPECT_EQ(blink::WebCryptoKeyTypePublic, public_key.type()); |
| 2265 EXPECT_EQ(blink::WebCryptoKeyTypePrivate, private_key.type()); | 2142 EXPECT_EQ(blink::WebCryptoKeyTypePrivate, private_key.type()); |
| 2266 EXPECT_EQ(modulus_length, | 2143 EXPECT_EQ(modulus_length, |
| 2267 public_key.algorithm().rsaHashedParams()->modulusLengthBits()); | 2144 public_key.algorithm().rsaHashedParams()->modulusLengthBits()); |
| 2268 EXPECT_EQ(modulus_length, | 2145 EXPECT_EQ(modulus_length, |
| (...skipping 1252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3521 algorithm, | 3398 algorithm, |
| 3522 CreateAesCbcAlgorithm(std::vector<uint8>(0, 16)), | 3399 CreateAesCbcAlgorithm(std::vector<uint8>(0, 16)), |
| 3523 true, | 3400 true, |
| 3524 blink::WebCryptoKeyUsageEncrypt, | 3401 blink::WebCryptoKeyUsageEncrypt, |
| 3525 &unwrapped_key)); | 3402 &unwrapped_key)); |
| 3526 } | 3403 } |
| 3527 | 3404 |
| 3528 } // namespace webcrypto | 3405 } // namespace webcrypto |
| 3529 | 3406 |
| 3530 } // namespace content | 3407 } // namespace content |
| OLD | NEW |