OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <algorithm> | 5 #include <algorithm> |
6 #include <string> | 6 #include <string> |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
11 #include "base/json/json_reader.h" | 11 #include "base/json/json_reader.h" |
12 #include "base/json/json_writer.h" | 12 #include "base/json/json_writer.h" |
13 #include "base/logging.h" | 13 #include "base/logging.h" |
14 #include "base/memory/ref_counted.h" | 14 #include "base/memory/ref_counted.h" |
15 #include "base/path_service.h" | 15 #include "base/path_service.h" |
| 16 #include "base/stl_util.h" |
16 #include "base/strings/string_number_conversions.h" | 17 #include "base/strings/string_number_conversions.h" |
17 #include "base/strings/string_util.h" | 18 #include "base/strings/string_util.h" |
18 #include "base/strings/stringprintf.h" | 19 #include "base/strings/stringprintf.h" |
19 #include "content/child/webcrypto/algorithm_dispatch.h" | 20 #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" |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 unsigned int modulus_length, | 153 unsigned int modulus_length, |
153 const std::vector<uint8_t>& public_exponent) { | 154 const std::vector<uint8_t>& public_exponent) { |
154 DCHECK(algorithm_id == blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5 || | 155 DCHECK(algorithm_id == blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5 || |
155 algorithm_id == blink::WebCryptoAlgorithmIdRsaOaep); | 156 algorithm_id == blink::WebCryptoAlgorithmIdRsaOaep); |
156 DCHECK(blink::WebCryptoAlgorithm::isHash(hash_id)); | 157 DCHECK(blink::WebCryptoAlgorithm::isHash(hash_id)); |
157 return blink::WebCryptoAlgorithm::adoptParamsAndCreate( | 158 return blink::WebCryptoAlgorithm::adoptParamsAndCreate( |
158 algorithm_id, | 159 algorithm_id, |
159 new blink::WebCryptoRsaHashedKeyGenParams( | 160 new blink::WebCryptoRsaHashedKeyGenParams( |
160 CreateAlgorithm(hash_id), | 161 CreateAlgorithm(hash_id), |
161 modulus_length, | 162 modulus_length, |
162 webcrypto::Uint8VectorStart(public_exponent), | 163 vector_as_array(&public_exponent), |
163 public_exponent.size())); | 164 public_exponent.size())); |
164 } | 165 } |
165 | 166 |
166 // Creates an RSA-OAEP algorithm | 167 // Creates an RSA-OAEP algorithm |
167 blink::WebCryptoAlgorithm CreateRsaOaepAlgorithm( | 168 blink::WebCryptoAlgorithm CreateRsaOaepAlgorithm( |
168 const std::vector<uint8_t>& label) { | 169 const std::vector<uint8_t>& label) { |
169 return blink::WebCryptoAlgorithm::adoptParamsAndCreate( | 170 return blink::WebCryptoAlgorithm::adoptParamsAndCreate( |
170 blink::WebCryptoAlgorithmIdRsaOaep, | 171 blink::WebCryptoAlgorithmIdRsaOaep, |
171 new blink::WebCryptoRsaOaepParams( | 172 new blink::WebCryptoRsaOaepParams( |
172 !label.empty(), Uint8VectorStart(label), label.size())); | 173 !label.empty(), vector_as_array(&label), label.size())); |
173 } | 174 } |
174 | 175 |
175 // Creates an AES-CBC algorithm. | 176 // Creates an AES-CBC algorithm. |
176 blink::WebCryptoAlgorithm CreateAesCbcAlgorithm( | 177 blink::WebCryptoAlgorithm CreateAesCbcAlgorithm( |
177 const std::vector<uint8_t>& iv) { | 178 const std::vector<uint8_t>& iv) { |
178 return blink::WebCryptoAlgorithm::adoptParamsAndCreate( | 179 return blink::WebCryptoAlgorithm::adoptParamsAndCreate( |
179 blink::WebCryptoAlgorithmIdAesCbc, | 180 blink::WebCryptoAlgorithmIdAesCbc, |
180 new blink::WebCryptoAesCbcParams(Uint8VectorStart(iv), iv.size())); | 181 new blink::WebCryptoAesCbcParams(vector_as_array(&iv), iv.size())); |
181 } | 182 } |
182 | 183 |
183 // Creates an AES-GCM algorithm. | 184 // Creates an AES-GCM algorithm. |
184 blink::WebCryptoAlgorithm CreateAesGcmAlgorithm( | 185 blink::WebCryptoAlgorithm CreateAesGcmAlgorithm( |
185 const std::vector<uint8_t>& iv, | 186 const std::vector<uint8_t>& iv, |
186 const std::vector<uint8_t>& additional_data, | 187 const std::vector<uint8_t>& additional_data, |
187 unsigned int tag_length_bits) { | 188 unsigned int tag_length_bits) { |
188 EXPECT_TRUE(SupportsAesGcm()); | 189 EXPECT_TRUE(SupportsAesGcm()); |
189 return blink::WebCryptoAlgorithm::adoptParamsAndCreate( | 190 return blink::WebCryptoAlgorithm::adoptParamsAndCreate( |
190 blink::WebCryptoAlgorithmIdAesGcm, | 191 blink::WebCryptoAlgorithmIdAesGcm, |
191 new blink::WebCryptoAesGcmParams(Uint8VectorStart(iv), | 192 new blink::WebCryptoAesGcmParams(vector_as_array(&iv), |
192 iv.size(), | 193 iv.size(), |
193 true, | 194 true, |
194 Uint8VectorStart(additional_data), | 195 vector_as_array(&additional_data), |
195 additional_data.size(), | 196 additional_data.size(), |
196 true, | 197 true, |
197 tag_length_bits)); | 198 tag_length_bits)); |
198 } | 199 } |
199 | 200 |
200 // Creates an HMAC algorithm whose parameters struct is compatible with key | 201 // Creates an HMAC algorithm whose parameters struct is compatible with key |
201 // generation. It is an error to call this with a hash_id that is not a SHA*. | 202 // generation. It is an error to call this with a hash_id that is not a SHA*. |
202 // The key_length_bits parameter is optional, with zero meaning unspecified. | 203 // The key_length_bits parameter is optional, with zero meaning unspecified. |
203 blink::WebCryptoAlgorithm CreateHmacKeyGenAlgorithm( | 204 blink::WebCryptoAlgorithm CreateHmacKeyGenAlgorithm( |
204 blink::WebCryptoAlgorithmId hash_id, | 205 blink::WebCryptoAlgorithmId hash_id, |
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
594 algorithm, | 595 algorithm, |
595 extractable, | 596 extractable, |
596 usage_mask, | 597 usage_mask, |
597 key); | 598 key); |
598 } | 599 } |
599 | 600 |
600 // Parses a vector of JSON into a dictionary. | 601 // Parses a vector of JSON into a dictionary. |
601 scoped_ptr<base::DictionaryValue> GetJwkDictionary( | 602 scoped_ptr<base::DictionaryValue> GetJwkDictionary( |
602 const std::vector<uint8_t>& json) { | 603 const std::vector<uint8_t>& json) { |
603 base::StringPiece json_string( | 604 base::StringPiece json_string( |
604 reinterpret_cast<const char*>(Uint8VectorStart(json)), json.size()); | 605 reinterpret_cast<const char*>(vector_as_array(&json)), json.size()); |
605 base::Value* value = base::JSONReader::Read(json_string); | 606 base::Value* value = base::JSONReader::Read(json_string); |
606 EXPECT_TRUE(value); | 607 EXPECT_TRUE(value); |
607 base::DictionaryValue* dict_value = NULL; | 608 base::DictionaryValue* dict_value = NULL; |
608 value->GetAsDictionary(&dict_value); | 609 value->GetAsDictionary(&dict_value); |
609 return scoped_ptr<base::DictionaryValue>(dict_value); | 610 return scoped_ptr<base::DictionaryValue>(dict_value); |
610 } | 611 } |
611 | 612 |
612 // Verifies the input dictionary contains the expected values. Exact matches are | 613 // Verifies the input dictionary contains the expected values. Exact matches are |
613 // required on the fields examined. | 614 // required on the fields examined. |
614 ::testing::AssertionResult VerifyJwk( | 615 ::testing::AssertionResult VerifyJwk( |
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
896 key, | 897 key, |
897 CryptoData(output), | 898 CryptoData(output), |
898 CryptoData(test_message), | 899 CryptoData(test_message), |
899 &signature_match)); | 900 &signature_match)); |
900 EXPECT_TRUE(signature_match); | 901 EXPECT_TRUE(signature_match); |
901 | 902 |
902 // Ensure truncated signature does not verify by passing one less byte. | 903 // Ensure truncated signature does not verify by passing one less byte. |
903 EXPECT_EQ(Status::Success(), | 904 EXPECT_EQ(Status::Success(), |
904 Verify(algorithm, | 905 Verify(algorithm, |
905 key, | 906 key, |
906 CryptoData(Uint8VectorStart(output), output.size() - 1), | 907 CryptoData(vector_as_array(&output), output.size() - 1), |
907 CryptoData(test_message), | 908 CryptoData(test_message), |
908 &signature_match)); | 909 &signature_match)); |
909 EXPECT_FALSE(signature_match); | 910 EXPECT_FALSE(signature_match); |
910 | 911 |
911 // Ensure truncated signature does not verify by passing no bytes. | 912 // Ensure truncated signature does not verify by passing no bytes. |
912 EXPECT_EQ(Status::Success(), | 913 EXPECT_EQ(Status::Success(), |
913 Verify(algorithm, | 914 Verify(algorithm, |
914 key, | 915 key, |
915 CryptoData(), | 916 CryptoData(), |
916 CryptoData(test_message), | 917 CryptoData(test_message), |
(...skipping 1515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2432 // Technically it is OK to fail since JWA says that consumer are not required | 2433 // Technically it is OK to fail since JWA says that consumer are not required |
2433 // to support lack of the optional parameters. | 2434 // to support lack of the optional parameters. |
2434 ASSERT_EQ(Status::OperationError(), | 2435 ASSERT_EQ(Status::OperationError(), |
2435 ImportKeyJwkFromDict(dict, | 2436 ImportKeyJwkFromDict(dict, |
2436 CreateRsaHashedImportAlgorithm( | 2437 CreateRsaHashedImportAlgorithm( |
2437 blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, | 2438 blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, |
2438 blink::WebCryptoAlgorithmIdSha1), | 2439 blink::WebCryptoAlgorithmIdSha1), |
2439 true, | 2440 true, |
2440 blink::WebCryptoKeyUsageSign, | 2441 blink::WebCryptoKeyUsageSign, |
2441 &key)); | 2442 &key)); |
2442 | |
2443 } | 2443 } |
2444 | 2444 |
2445 TEST_F(SharedCryptoTest, MAYBE(GenerateKeyPairRsa)) { | 2445 TEST_F(SharedCryptoTest, MAYBE(GenerateKeyPairRsa)) { |
2446 // Note: using unrealistic short key lengths here to avoid bogging down tests. | 2446 // Note: using unrealistic short key lengths here to avoid bogging down tests. |
2447 | 2447 |
2448 // Successful WebCryptoAlgorithmIdRsaSsaPkcs1v1_5 key generation (sha256) | 2448 // Successful WebCryptoAlgorithmIdRsaSsaPkcs1v1_5 key generation (sha256) |
2449 const unsigned int modulus_length = 256; | 2449 const unsigned int modulus_length = 256; |
2450 const std::vector<uint8_t> public_exponent = HexStringToBytes("010001"); | 2450 const std::vector<uint8_t> public_exponent = HexStringToBytes("010001"); |
2451 blink::WebCryptoAlgorithm algorithm = | 2451 blink::WebCryptoAlgorithm algorithm = |
2452 CreateRsaHashedKeyGenAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, | 2452 CreateRsaHashedKeyGenAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2676 blink::WebCryptoAlgorithm algorithm = CreateRsaHashedKeyGenAlgorithm( | 2676 blink::WebCryptoAlgorithm algorithm = CreateRsaHashedKeyGenAlgorithm( |
2677 blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, | 2677 blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, |
2678 blink::WebCryptoAlgorithmIdSha256, | 2678 blink::WebCryptoAlgorithmIdSha256, |
2679 modulus_length, | 2679 modulus_length, |
2680 HexStringToBytes(kPublicExponents[i])); | 2680 HexStringToBytes(kPublicExponents[i])); |
2681 | 2681 |
2682 blink::WebCryptoKey public_key = blink::WebCryptoKey::createNull(); | 2682 blink::WebCryptoKey public_key = blink::WebCryptoKey::createNull(); |
2683 blink::WebCryptoKey private_key = blink::WebCryptoKey::createNull(); | 2683 blink::WebCryptoKey private_key = blink::WebCryptoKey::createNull(); |
2684 | 2684 |
2685 EXPECT_EQ(Status::ErrorGenerateKeyPublicExponent(), | 2685 EXPECT_EQ(Status::ErrorGenerateKeyPublicExponent(), |
2686 GenerateKeyPair( | 2686 GenerateKeyPair(algorithm, true, 0, &public_key, &private_key)); |
2687 algorithm, true, 0, &public_key, &private_key)); | |
2688 } | 2687 } |
2689 } | 2688 } |
2690 | 2689 |
2691 TEST_F(SharedCryptoTest, RsaSsaSignVerifyFailures) { | 2690 TEST_F(SharedCryptoTest, RsaSsaSignVerifyFailures) { |
2692 if (!SupportsRsaKeyImport()) | 2691 if (!SupportsRsaKeyImport()) |
2693 return; | 2692 return; |
2694 | 2693 |
2695 // Import a key pair. | 2694 // Import a key pair. |
2696 blink::WebCryptoAlgorithm import_algorithm = | 2695 blink::WebCryptoAlgorithm import_algorithm = |
2697 CreateRsaHashedImportAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, | 2696 CreateRsaHashedImportAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, |
(...skipping 19 matching lines...) Expand all Loading... |
2717 // Compute a signature. | 2716 // Compute a signature. |
2718 const std::vector<uint8_t> data = HexStringToBytes("010203040506070809"); | 2717 const std::vector<uint8_t> data = HexStringToBytes("010203040506070809"); |
2719 ASSERT_EQ(Status::Success(), | 2718 ASSERT_EQ(Status::Success(), |
2720 Sign(algorithm, private_key, CryptoData(data), &signature)); | 2719 Sign(algorithm, private_key, CryptoData(data), &signature)); |
2721 | 2720 |
2722 // Ensure truncated signature does not verify by passing one less byte. | 2721 // Ensure truncated signature does not verify by passing one less byte. |
2723 EXPECT_EQ( | 2722 EXPECT_EQ( |
2724 Status::Success(), | 2723 Status::Success(), |
2725 Verify(algorithm, | 2724 Verify(algorithm, |
2726 public_key, | 2725 public_key, |
2727 CryptoData(Uint8VectorStart(signature), signature.size() - 1), | 2726 CryptoData(vector_as_array(&signature), signature.size() - 1), |
2728 CryptoData(data), | 2727 CryptoData(data), |
2729 &signature_match)); | 2728 &signature_match)); |
2730 EXPECT_FALSE(signature_match); | 2729 EXPECT_FALSE(signature_match); |
2731 | 2730 |
2732 // Ensure truncated signature does not verify by passing no bytes. | 2731 // Ensure truncated signature does not verify by passing no bytes. |
2733 EXPECT_EQ(Status::Success(), | 2732 EXPECT_EQ(Status::Success(), |
2734 Verify(algorithm, | 2733 Verify(algorithm, |
2735 public_key, | 2734 public_key, |
2736 CryptoData(), | 2735 CryptoData(), |
2737 CryptoData(data), | 2736 CryptoData(data), |
(...skipping 685 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3423 std::vector<uint8_t> wrapping_key_data(16, 0); | 3422 std::vector<uint8_t> wrapping_key_data(16, 0); |
3424 std::vector<uint8_t> wrapped_key = HexStringToBytes( | 3423 std::vector<uint8_t> wrapped_key = HexStringToBytes( |
3425 "1A07ACAB6C906E50883173C29441DB1DE91D34F45C435B5F99C822867FB3956F"); | 3424 "1A07ACAB6C906E50883173C29441DB1DE91D34F45C435B5F99C822867FB3956F"); |
3426 | 3425 |
3427 blink::WebCryptoKey wrapping_key = | 3426 blink::WebCryptoKey wrapping_key = |
3428 ImportSecretKeyFromRaw(wrapping_key_data, | 3427 ImportSecretKeyFromRaw(wrapping_key_data, |
3429 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesKw), | 3428 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesKw), |
3430 blink::WebCryptoKeyUsageUnwrapKey); | 3429 blink::WebCryptoKeyUsageUnwrapKey); |
3431 | 3430 |
3432 blink::WebCryptoKey unwrapped_key = blink::WebCryptoKey::createNull(); | 3431 blink::WebCryptoKey unwrapped_key = blink::WebCryptoKey::createNull(); |
3433 ASSERT_EQ(Status::ErrorAes192BitUnsupported(), | 3432 ASSERT_EQ(Status::ErrorAes192BitUnsupported(), |
3434 UnwrapKey(blink::WebCryptoKeyFormatRaw, | 3433 UnwrapKey(blink::WebCryptoKeyFormatRaw, |
3435 CryptoData(wrapped_key), | 3434 CryptoData(wrapped_key), |
3436 wrapping_key, | 3435 wrapping_key, |
3437 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesKw), | 3436 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesKw), |
3438 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc), | 3437 CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc), |
3439 true, | 3438 true, |
3440 blink::WebCryptoKeyUsageEncrypt, | 3439 blink::WebCryptoKeyUsageEncrypt, |
3441 &unwrapped_key)); | 3440 &unwrapped_key)); |
3442 } | 3441 } |
3443 | 3442 |
3444 class SharedCryptoRsaOaepTest : public ::testing::Test { | 3443 class SharedCryptoRsaOaepTest : public ::testing::Test { |
3445 public: | 3444 public: |
3446 scoped_ptr<base::DictionaryValue> CreatePublicKeyJwkDict() { | 3445 scoped_ptr<base::DictionaryValue> CreatePublicKeyJwkDict() { |
3447 scoped_ptr<base::DictionaryValue> jwk(new base::DictionaryValue()); | 3446 scoped_ptr<base::DictionaryValue> jwk(new base::DictionaryValue()); |
3448 jwk->SetString("kty", "RSA"); | 3447 jwk->SetString("kty", "RSA"); |
3449 jwk->SetString("n", | 3448 jwk->SetString("n", |
3450 Base64EncodeUrlSafe(HexStringToBytes(kPublicKeyModulusHex))); | 3449 Base64EncodeUrlSafe(HexStringToBytes(kPublicKeyModulusHex))); |
3451 jwk->SetString( | 3450 jwk->SetString( |
(...skipping 958 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4410 EXPECT_EQ(public_key_spki, unwrapped_public_key_spki); | 4409 EXPECT_EQ(public_key_spki, unwrapped_public_key_spki); |
4411 EXPECT_EQ(private_key_pkcs8, unwrapped_private_key_pkcs8); | 4410 EXPECT_EQ(private_key_pkcs8, unwrapped_private_key_pkcs8); |
4412 | 4411 |
4413 EXPECT_NE(public_key_spki, wrapped_public_key); | 4412 EXPECT_NE(public_key_spki, wrapped_public_key); |
4414 EXPECT_NE(private_key_pkcs8, wrapped_private_key); | 4413 EXPECT_NE(private_key_pkcs8, wrapped_private_key); |
4415 } | 4414 } |
4416 | 4415 |
4417 } // namespace webcrypto | 4416 } // namespace webcrypto |
4418 | 4417 |
4419 } // namespace content | 4418 } // namespace content |
OLD | NEW |