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 815c9c2050776c12eabaa076da3e1865b6ebd706..908e5e2995193cec3c3547c3ee96a729e9faf469 100644 |
| --- a/content/child/webcrypto/shared_crypto_unittest.cc |
| +++ b/content/child/webcrypto/shared_crypto_unittest.cc |
| @@ -17,6 +17,7 @@ |
| #include "base/path_service.h" |
| #include "base/strings/string_number_conversions.h" |
| #include "base/strings/string_util.h" |
| +#include "base/strings/stringprintf.h" |
| #include "content/child/webcrypto/crypto_data.h" |
| #include "content/child/webcrypto/status.h" |
| #include "content/child/webcrypto/webcrypto_util.h" |
| @@ -40,9 +41,9 @@ |
| // Helper macros to verify the value of a Status. |
| #define EXPECT_STATUS_ERROR(code) EXPECT_FALSE((code).IsSuccess()) |
| #define EXPECT_STATUS(expected, code) \ |
| - EXPECT_EQ(expected.ToString(), (code).ToString()) |
| + EXPECT_EQ(StatusToString(expected), StatusToString(code)) |
| #define ASSERT_STATUS(expected, code) \ |
| - ASSERT_EQ(expected.ToString(), (code).ToString()) |
| + ASSERT_EQ(StatusToString(expected), StatusToString(code)) |
| #define EXPECT_STATUS_SUCCESS(code) EXPECT_STATUS(Status::Success(), code) |
| #define ASSERT_STATUS_SUCCESS(code) ASSERT_STATUS(Status::Success(), code) |
| @@ -52,6 +53,14 @@ namespace webcrypto { |
| namespace { |
| +std::string StatusToString(const Status& status) { |
| + if (status.IsSuccess()) |
| + return "Success"; |
| + return base::StringPrintf("error_type=%d: %s, error_details=", |
| + status.error_type(), |
| + status.error_details().c_str()); |
| +} |
|
Ryan Sleevi
2014/04/24 01:17:01
This isn't really idiomatic GTest to do this.
The
eroman
2014/04/24 02:34:37
I addressed this by changing the code to using EXP
|
| + |
| // 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. |
| @@ -479,7 +488,7 @@ Status AesGcmEncrypt(const blink::WebCryptoKey& key, |
| if (output.byteLength() * 8 < tag_length_bits) { |
| EXPECT_TRUE(false); |
| - return Status::Error(); |
| + return Status::OperationError(); |
| } |
| // The encryption result is cipher text with authentication tag appended. |
| @@ -682,17 +691,49 @@ TEST_F(SharedCryptoTest, CheckAesGcm) { |
| } |
| } |
| -TEST_F(SharedCryptoTest, StatusToString) { |
| - EXPECT_EQ("Success", Status::Success().ToString()); |
| - EXPECT_EQ("", Status::Error().ToString()); |
| - EXPECT_EQ("The requested operation is unsupported", |
| - Status::ErrorUnsupported().ToString()); |
| +TEST_F(SharedCryptoTest, Status) { |
|
Ryan Sleevi
2014/04/24 01:17:01
It's not clear what you're trying to test by this
eroman
2014/04/24 02:34:37
The relevant distinction is to make sure that erro
|
| + Status status = Status::Success(); |
| + |
| + EXPECT_EQ(false, status.IsError()); |
| + EXPECT_EQ("", status.error_details()); |
| + |
| + status = Status::OperationError(); |
| + EXPECT_EQ(true, status.IsError()); |
| + EXPECT_EQ("", status.error_details()); |
| + EXPECT_EQ(blink::WebCryptoErrorTypeOperation, status.error_type()); |
| + |
| + status = Status::DataError(); |
| + EXPECT_EQ(true, status.IsError()); |
| + EXPECT_EQ("", status.error_details()); |
| + EXPECT_EQ(blink::WebCryptoErrorTypeData, Status::DataError().error_type()); |
| + |
| + // Even though the error message is the same, these should not be considered |
| + // the same by the tests. |
|
Ryan Sleevi
2014/04/24 01:17:01
This doesn't make any sense. Is "error message" th
eroman
2014/04/24 02:34:37
error message, versus error type.
|
| + EXPECT_NE(StatusToString(Status::DataError()), |
| + StatusToString(Status::OperationError())); |
| + |
| + status = Status::ErrorUnsupported(); |
| + EXPECT_EQ(true, status.IsError()); |
| + EXPECT_EQ("The requested operation is unsupported", status.error_details()); |
| + EXPECT_EQ(blink::WebCryptoErrorTypeNotSupported, status.error_type()); |
| + |
| + status = Status::ErrorJwkPropertyMissing("kty"); |
| + EXPECT_EQ(true, status.IsError()); |
| EXPECT_EQ("The required JWK property \"kty\" was missing", |
| - Status::ErrorJwkPropertyMissing("kty").ToString()); |
| + status.error_details()); |
| + EXPECT_EQ(blink::WebCryptoErrorTypeData, Status::DataError().error_type()); |
| + |
| + status = Status::ErrorJwkPropertyWrongType("kty", "string"); |
| + EXPECT_EQ(true, status.IsError()); |
| EXPECT_EQ("The JWK property \"kty\" must be a string", |
| - Status::ErrorJwkPropertyWrongType("kty", "string").ToString()); |
| + status.error_details()); |
| + EXPECT_EQ(blink::WebCryptoErrorTypeData, Status::DataError().error_type()); |
| + |
| + status = Status::ErrorJwkBase64Decode("n"); |
| + EXPECT_EQ(true, status.IsError()); |
| EXPECT_EQ("The JWK property \"n\" could not be base64 decoded", |
| - Status::ErrorJwkBase64Decode("n").ToString()); |
| + status.error_details()); |
| + EXPECT_EQ(blink::WebCryptoErrorTypeData, Status::DataError().error_type()); |
| } |
| TEST_F(SharedCryptoTest, DigestSampleSets) { |
| @@ -902,7 +943,7 @@ TEST_F(SharedCryptoTest, AesCbcFailures) { |
| std::vector<uint8> iv(16); |
| blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
| - EXPECT_STATUS(Status::Error(), |
| + EXPECT_STATUS(Status::ErrorImportAesKeyLength(), |
| ImportKey(blink::WebCryptoKeyFormatRaw, |
| CryptoData(key_raw), |
| CreateAesCbcAlgorithm(iv), |
| @@ -972,7 +1013,7 @@ TEST_F(SharedCryptoTest, MAYBE(AesCbcSampleSets)) { |
| // up testing decryption over empty cipher text. |
| if (test_cipher_text.size() >= kAesCbcBlockSize) { |
| EXPECT_STATUS( |
| - Status::Error(), |
| + Status::OperationError(), |
| Decrypt(CreateAesCbcAlgorithm(test_iv), |
| key, |
| CryptoData(&test_cipher_text[0], |
| @@ -984,7 +1025,7 @@ TEST_F(SharedCryptoTest, MAYBE(AesCbcSampleSets)) { |
| // a few bytes off the cipher text. |
| if (test_cipher_text.size() > 3) { |
| EXPECT_STATUS( |
| - Status::Error(), |
| + Status::OperationError(), |
| Decrypt(CreateAesCbcAlgorithm(test_iv), |
| key, |
| CryptoData(&test_cipher_text[0], test_cipher_text.size() - 3), |
| @@ -1822,7 +1863,7 @@ TEST_F(SharedCryptoTest, MAYBE(ImportExportSpki)) { |
| // Failing case: Bad DER encoding. |
| EXPECT_STATUS( |
| - Status::Error(), |
| + Status::DataError(), |
| ImportKey(blink::WebCryptoKeyFormatSpki, |
| CryptoData(HexStringToBytes("618333c4cb")), |
| CreateAlgorithm(blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5), |
| @@ -1831,7 +1872,7 @@ TEST_F(SharedCryptoTest, MAYBE(ImportExportSpki)) { |
| &key)); |
| // Failing case: Import RSA key but provide an inconsistent input algorithm. |
| - EXPECT_STATUS(Status::Error(), |
| + EXPECT_STATUS(Status::DataError(), |
| ImportKey(blink::WebCryptoKeyFormatSpki, |
| CryptoData(HexStringToBytes(kPublicKeySpkiDerHex)), |
| CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc), |
| @@ -1905,7 +1946,7 @@ TEST_F(SharedCryptoTest, MAYBE(ImportExportPkcs8)) { |
| // Failing case: Bad DER encoding. |
| EXPECT_STATUS( |
| - Status::Error(), |
| + Status::DataError(), |
| ImportKey(blink::WebCryptoKeyFormatPkcs8, |
| CryptoData(HexStringToBytes("618333c4cb")), |
| CreateAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5), |
| @@ -1914,7 +1955,7 @@ TEST_F(SharedCryptoTest, MAYBE(ImportExportPkcs8)) { |
| &key)); |
| // Failing case: Import RSA key but provide an inconsistent input algorithm. |
| - EXPECT_STATUS(Status::Error(), |
| + EXPECT_STATUS(Status::DataError(), |
| ImportKey(blink::WebCryptoKeyFormatPkcs8, |
| CryptoData(HexStringToBytes(kPrivateKeyPkcs8DerHex)), |
| CreateAlgorithm(blink::WebCryptoAlgorithmIdAesCbc), |
| @@ -2229,7 +2270,7 @@ TEST_F(SharedCryptoTest, MAYBE(RsaEsFailures)) { |
| algorithm, private_key, CryptoData(message_hex), &encrypted_data)); |
| // Fail encrypt with empty message. |
| - EXPECT_STATUS(Status::Error(), |
| + EXPECT_STATUS(Status::ErrorDataTooSmall(), |
| Encrypt(algorithm, |
| public_key, |
| CryptoData(std::vector<uint8>()), |
| @@ -2263,7 +2304,7 @@ TEST_F(SharedCryptoTest, MAYBE(RsaEsFailures)) { |
| static_cast<uint8*>(encrypted_data.data()) + encrypted_data.byteLength()); |
| corrupted_data[corrupted_data.size() / 2] ^= 0x01; |
| EXPECT_STATUS( |
| - Status::Error(), |
| + Status::OperationError(), |
| Decrypt( |
| algorithm, private_key, CryptoData(corrupted_data), &decrypted_data)); |
| @@ -2507,7 +2548,7 @@ TEST_F(SharedCryptoTest, MAYBE(AesKwKeyImport)) { |
| ExpectArrayBufferMatchesHex(key_raw_hex_in, key_raw_out); |
| // Fail import of 0 length key |
| - EXPECT_STATUS(Status::Error(), |
| + EXPECT_STATUS(Status::ErrorImportAesKeyLength(), |
| ImportKey(blink::WebCryptoKeyFormatRaw, |
| CryptoData(HexStringToBytes("")), |
| algorithm, |
| @@ -2517,7 +2558,7 @@ TEST_F(SharedCryptoTest, MAYBE(AesKwKeyImport)) { |
| // Fail import of 124-bit KEK |
| key_raw_hex_in = "3e4566a2bdaa10cb68134fa66c15ddb"; |
| - EXPECT_STATUS(Status::Error(), |
| + EXPECT_STATUS(Status::ErrorImportAesKeyLength(), |
| ImportKey(blink::WebCryptoKeyFormatRaw, |
| CryptoData(HexStringToBytes(key_raw_hex_in)), |
| algorithm, |
| @@ -2527,7 +2568,7 @@ TEST_F(SharedCryptoTest, MAYBE(AesKwKeyImport)) { |
| // Fail import of 200-bit KEK |
| key_raw_hex_in = "0a1d88608a5ad9fec64f1ada269ebab4baa2feeb8d95638c0e"; |
| - EXPECT_STATUS(Status::Error(), |
| + EXPECT_STATUS(Status::ErrorImportAesKeyLength(), |
| ImportKey(blink::WebCryptoKeyFormatRaw, |
| CryptoData(HexStringToBytes(key_raw_hex_in)), |
| algorithm, |
| @@ -2538,7 +2579,7 @@ TEST_F(SharedCryptoTest, MAYBE(AesKwKeyImport)) { |
| // Fail import of 260-bit KEK |
| key_raw_hex_in = |
| "72d4e475ff34215416c9ad9c8281247a4d730c5f275ac23f376e73e3bce8d7d5a"; |
| - EXPECT_STATUS(Status::Error(), |
| + EXPECT_STATUS(Status::ErrorImportAesKeyLength(), |
| ImportKey(blink::WebCryptoKeyFormatRaw, |
| CryptoData(HexStringToBytes(key_raw_hex_in)), |
| algorithm, |
| @@ -2732,7 +2773,7 @@ TEST_F(SharedCryptoTest, MAYBE(AesKwRawSymkeyUnwrapCorruptData)) { |
| // AES-KW's built-in integrity check. |
| blink::WebCryptoKey unwrapped_key = blink::WebCryptoKey::createNull(); |
| EXPECT_STATUS( |
| - Status::Error(), |
| + Status::OperationError(), |
| UnwrapKey(blink::WebCryptoKeyFormatRaw, |
| CryptoData(Corrupted(test_ciphertext)), |
| wrapping_key, |
| @@ -2867,7 +2908,7 @@ TEST_F(SharedCryptoTest, MAYBE(AesGcmSampleSets)) { |
| EXPECT_TRUE(ArrayBufferMatches(test_plain_text, plain_text)); |
| // Decryption should fail if any of the inputs are tampered with. |
| - EXPECT_STATUS(Status::Error(), |
| + EXPECT_STATUS(Status::OperationError(), |
| AesGcmDecrypt(key, |
| Corrupted(test_iv), |
| test_additional_data, |
| @@ -2875,7 +2916,7 @@ TEST_F(SharedCryptoTest, MAYBE(AesGcmSampleSets)) { |
| test_cipher_text, |
| test_authentication_tag, |
| &plain_text)); |
| - EXPECT_STATUS(Status::Error(), |
| + EXPECT_STATUS(Status::OperationError(), |
| AesGcmDecrypt(key, |
| test_iv, |
| Corrupted(test_additional_data), |
| @@ -2883,7 +2924,7 @@ TEST_F(SharedCryptoTest, MAYBE(AesGcmSampleSets)) { |
| test_cipher_text, |
| test_authentication_tag, |
| &plain_text)); |
| - EXPECT_STATUS(Status::Error(), |
| + EXPECT_STATUS(Status::OperationError(), |
| AesGcmDecrypt(key, |
| test_iv, |
| test_additional_data, |
| @@ -2891,7 +2932,7 @@ TEST_F(SharedCryptoTest, MAYBE(AesGcmSampleSets)) { |
| Corrupted(test_cipher_text), |
| test_authentication_tag, |
| &plain_text)); |
| - EXPECT_STATUS(Status::Error(), |
| + EXPECT_STATUS(Status::OperationError(), |
| AesGcmDecrypt(key, |
| test_iv, |
| test_additional_data, |
| @@ -3253,7 +3294,7 @@ TEST_F(SharedCryptoTest, MAYBE(RsaEsJwkSymkeyWrapUnwrapErrors)) { |
| // Treat the ciphertext as a wrapped key and try to unwrap it. Ensure a |
| // generic error is received. |
| blink::WebCryptoKey unwrapped_key = blink::WebCryptoKey::createNull(); |
| - EXPECT_STATUS(Status::Error(), |
| + EXPECT_STATUS(Status::OperationError(), |
| UnwrapKey(blink::WebCryptoKeyFormatJwk, |
| CryptoData(ciphertext), |
| private_wrapping_key, |