Chromium Code Reviews| Index: content/child/webcrypto/shared_crypto_unittest.cc |
| diff --git a/content/child/webcrypto/shared_crypto_unittest.cc b/content/child/webcrypto/shared_crypto_unittest.cc |
| index 48db1a6da8d72e5a49c27bc39cc298fb41fc6402..a63260ff953e89cc9a7397dcf4473e0f3b28c042 100644 |
| --- a/content/child/webcrypto/shared_crypto_unittest.cc |
| +++ b/content/child/webcrypto/shared_crypto_unittest.cc |
| @@ -51,6 +51,25 @@ namespace webcrypto { |
| namespace { |
| +// TODO(eroman): For Linux builds using system NSS, AES-GCM support is a |
| +// runtime dependency. Test it by trying to import a key. |
| +// TODO(padolph): Consider caching the result of the import key test. |
| +bool SupportsAesGcm() { |
| + std::vector<uint8> key_raw(16, 0); |
| + |
| + blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
| + Status status = ImportKey(blink::WebCryptoKeyFormatRaw, |
| + CryptoData(key_raw), |
| + CreateAlgorithm(blink::WebCryptoAlgorithmIdAesGcm), |
| + true, |
| + blink::WebCryptoKeyUsageEncrypt, |
| + &key); |
| + |
| + if (status.IsError()) |
| + EXPECT_EQ(Status::ErrorUnsupported().ToString(), status.ToString()); |
|
eroman
2014/03/13 22:31:13
[optional] update this to use EXPECT_STATUS()
padolph
2014/03/13 22:39:34
Done.
|
| + return status.IsSuccess(); |
| +} |
| + |
| blink::WebCryptoAlgorithm CreateRsaKeyGenAlgorithm( |
| blink::WebCryptoAlgorithmId algorithm_id, |
| unsigned int modulus_length, |
| @@ -93,6 +112,7 @@ blink::WebCryptoAlgorithm CreateAesGcmAlgorithm( |
| const std::vector<uint8>& iv, |
| const std::vector<uint8>& additional_data, |
| unsigned int tag_length_bits) { |
| + DCHECK(SupportsAesGcm()); |
|
eroman
2014/03/13 22:31:13
Instead of DCHECK() please use EXPECT_TRUE(). DCHE
padolph
2014/03/13 22:39:34
Done.
|
| return blink::WebCryptoAlgorithm::adoptParamsAndCreate( |
| blink::WebCryptoAlgorithmIdAesGcm, |
| new blink::WebCryptoAesGcmParams(Uint8VectorStart(iv), |
| @@ -343,6 +363,7 @@ blink::WebCryptoAlgorithm CreateAesCbcKeyGenAlgorithm( |
| blink::WebCryptoAlgorithm CreateAesGcmKeyGenAlgorithm( |
| unsigned short key_length_bits) { |
| + DCHECK(SupportsAesGcm()); |
|
eroman
2014/03/13 22:31:13
ditto
padolph
2014/03/13 22:39:34
Done.
|
| return CreateAesKeyGenAlgorithm(blink::WebCryptoAlgorithmIdAesGcm, |
| key_length_bits); |
| } |
| @@ -450,24 +471,6 @@ void ImportRsaKeyPair(const std::vector<uint8>& spki_der, |
| EXPECT_EQ(usage_mask, private_key->usages()); |
| } |
| -// TODO(eroman): For Linux builds using system NSS, AES-GCM support is a |
| -// runtime dependency. Test it by trying to import a key. |
| -bool SupportsAesGcm() { |
| - std::vector<uint8> key_raw(16, 0); |
| - |
| - blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
| - Status status = ImportKey(blink::WebCryptoKeyFormatRaw, |
| - CryptoData(key_raw), |
| - CreateAlgorithm(blink::WebCryptoAlgorithmIdAesGcm), |
| - true, |
| - blink::WebCryptoKeyUsageEncrypt, |
| - &key); |
| - |
| - if (status.IsError()) |
| - EXPECT_EQ(Status::ErrorUnsupported().ToString(), status.ToString()); |
| - return status.IsSuccess(); |
| -} |
| - |
| Status AesGcmEncrypt(const blink::WebCryptoKey& key, |
| const std::vector<uint8>& iv, |
| const std::vector<uint8>& additional_data, |
| @@ -475,6 +478,7 @@ Status AesGcmEncrypt(const blink::WebCryptoKey& key, |
| const std::vector<uint8>& plain_text, |
| std::vector<uint8>* cipher_text, |
| std::vector<uint8>* authentication_tag) { |
| + DCHECK(SupportsAesGcm()); |
| blink::WebCryptoAlgorithm algorithm = |
| CreateAesGcmAlgorithm(iv, additional_data, tag_length_bits); |
| @@ -506,6 +510,7 @@ Status AesGcmDecrypt(const blink::WebCryptoKey& key, |
| const std::vector<uint8>& cipher_text, |
| const std::vector<uint8>& authentication_tag, |
| blink::WebArrayBuffer* plain_text) { |
| + DCHECK(SupportsAesGcm()); |
| blink::WebCryptoAlgorithm algorithm = |
| CreateAesGcmAlgorithm(iv, additional_data, tag_length_bits); |
| @@ -535,6 +540,14 @@ Status ImportKeyJwkFromDict(const base::DictionaryValue& dict, |
| } // namespace |
| +TEST_F(SharedCryptoTest, CheckAesGcm) { |
| + if (!SupportsAesGcm()) { |
| + LOG(WARNING) << "AES GCM not supported on this platform, so some tests " |
| + "will be skipped. Consider upgrading local NSS libraries"; |
| + return; |
| + } |
| +} |
| + |
| TEST_F(SharedCryptoTest, StatusToString) { |
| EXPECT_EQ("Success", Status::Success().ToString()); |
| EXPECT_EQ("", Status::Error().ToString()); |
| @@ -814,8 +827,9 @@ TEST_F(SharedCryptoTest, MAYBE(GenerateKeyAes)) { |
| const unsigned short kKeyLength[] = {128, 192, 256}; |
| for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kKeyLength); ++i) { |
| algorithm.push_back(CreateAesCbcKeyGenAlgorithm(kKeyLength[i])); |
| - algorithm.push_back(CreateAesGcmKeyGenAlgorithm(kKeyLength[i])); |
| algorithm.push_back(CreateAesKwKeyGenAlgorithm(kKeyLength[i])); |
| + if (SupportsAesGcm()) |
|
eroman
2014/03/13 22:31:13
Interesting. So generating AES-GCM key works witho
padolph
2014/03/13 22:39:34
Yes, appears so. Strange.
|
| + algorithm.push_back(CreateAesGcmKeyGenAlgorithm(kKeyLength[i])); |
| } |
| blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
| std::vector<blink::WebArrayBuffer> keys; |
| @@ -850,10 +864,12 @@ TEST_F(SharedCryptoTest, MAYBE(GenerateKeyAesBadLength)) { |
| CreateAesCbcKeyGenAlgorithm(kKeyLen[i]), true, 0, &key)); |
| EXPECT_STATUS(Status::ErrorGenerateKeyLength(), |
| GenerateSecretKey( |
| - CreateAesGcmKeyGenAlgorithm(kKeyLen[i]), true, 0, &key)); |
| - EXPECT_STATUS(Status::ErrorGenerateKeyLength(), |
| - GenerateSecretKey( |
| CreateAesKwKeyGenAlgorithm(kKeyLen[i]), true, 0, &key)); |
| + if (SupportsAesGcm()) { |
| + EXPECT_STATUS(Status::ErrorGenerateKeyLength(), |
| + GenerateSecretKey( |
| + CreateAesGcmKeyGenAlgorithm(kKeyLen[i]), true, 0, &key)); |
| + } |
| } |
| } |
| @@ -919,7 +935,6 @@ TEST_F(SharedCryptoTest, MAYBE(ImportSecretKeyNoAlgorithm)) { |
| } |
| TEST_F(SharedCryptoTest, ImportJwkFailures) { |
| - |
| blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
| blink::WebCryptoAlgorithm algorithm = |
| CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc); |
| @@ -1005,7 +1020,6 @@ TEST_F(SharedCryptoTest, ImportJwkFailures) { |
| } |
| TEST_F(SharedCryptoTest, ImportJwkOctFailures) { |
| - |
| base::DictionaryValue dict; |
| RestoreJwkOctDictionary(&dict); |
| blink::WebCryptoAlgorithm algorithm = |
| @@ -1057,7 +1071,6 @@ TEST_F(SharedCryptoTest, ImportJwkOctFailures) { |
| } |
| TEST_F(SharedCryptoTest, MAYBE(ImportJwkRsaFailures)) { |
| - |
| base::DictionaryValue dict; |
| RestoreJwkRsaDictionary(&dict); |
| blink::WebCryptoAlgorithm algorithm = |
| @@ -1084,7 +1097,6 @@ TEST_F(SharedCryptoTest, MAYBE(ImportJwkRsaFailures)) { |
| // Fail if either "n" or "e" is not present or malformed. |
| const std::string kKtyParmName[] = {"n", "e"}; |
| for (size_t idx = 0; idx < ARRAYSIZE_UNSAFE(kKtyParmName); ++idx) { |
| - |
| // Fail on missing parameter. |
| dict.Remove(kKtyParmName[idx], NULL); |
| EXPECT_STATUS_ERROR( |
| @@ -1233,7 +1245,6 @@ TEST_F(SharedCryptoTest, MAYBE(ImportJwkInputConsistency)) { |
| } |
| TEST_F(SharedCryptoTest, MAYBE(ImportJwkHappy)) { |
| - |
| // This test verifies the happy path of JWK import, including the application |
| // of the imported key material. |