Index: components/gcm_driver/crypto/gcm_encryption_provider_unittest.cc |
diff --git a/components/gcm_driver/crypto/gcm_encryption_provider_unittest.cc b/components/gcm_driver/crypto/gcm_encryption_provider_unittest.cc |
index 5cee4ba7ee22eb5b9f29787c300b47d77487022b..cc79971951941c30b93fcf687f1cdd68a2fa5020 100644 |
--- a/components/gcm_driver/crypto/gcm_encryption_provider_unittest.cc |
+++ b/components/gcm_driver/crypto/gcm_encryption_provider_unittest.cc |
@@ -40,7 +40,15 @@ const char kInvalidEncryptionHeader[] = "keyid"; |
const char kValidCryptoKeyHeader[] = |
"keyid=foo;dh=BL_UGhfudEkXMUd4U4-D4nP5KHxKjQHsW6j88ybbehXM7fqi1OMFefDUEi0eJ" |
"vsKfyVBWYkQjH-lSPJKxjAyslg"; |
+const char kValidThreeValueCryptoKeyHeader[] = |
+ "keyid=foo,keyid=bar,keyid=baz;dh=BL_UGhfudEkXMUd4U4-D4nP5KHxKjQHsW6j88ybbe" |
+ "hXM7fqi1OMFefDUEi0eJvsKfyVBWYkQjH-lSPJKxjAyslg"; |
+ |
const char kInvalidCryptoKeyHeader[] = "keyid"; |
+const char kInvalidThreeValueCryptoKeyHeader[] = |
+ "keyid=foo,dh=BL_UGhfudEkXMUd4U4-D4nP5KHxKjQHsW6j88ybbehXM7fqi1OMFefDUEi0eJ" |
+ "vsKfyVBWYkQjH-lSPJKxjAyslg,keyid=baz,dh=BL_UGhfudEkXMUd4U4-D4nP5KHxKjQHsW6" |
+ "j88ybbehXM7fqi1OMFefDUEi0eJvsKfyVBWYkQjH-lSPJKxjAyslg"; |
} // namespace |
@@ -204,7 +212,7 @@ TEST_F(GCMEncryptionProviderTest, VerifiesEncryptionHeaderParsing) { |
} |
TEST_F(GCMEncryptionProviderTest, VerifiesCryptoKeyHeaderParsing) { |
- // The Encryption-Key header must be parsable and contain valid values. |
+ // The Crypto-Key header must be parsable and contain valid values. |
// Note that this is more extensively tested in EncryptionHeaderParsersTest. |
IncomingMessage invalid_message; |
@@ -217,7 +225,7 @@ TEST_F(GCMEncryptionProviderTest, VerifiesCryptoKeyHeaderParsing) { |
decryption_result()); |
IncomingMessage valid_message; |
- valid_message.data["encryption"] = kInvalidEncryptionHeader; |
+ valid_message.data["encryption"] = kValidEncryptionHeader; |
valid_message.data["crypto-key"] = kValidCryptoKeyHeader; |
valid_message.raw_data = "foo"; |
@@ -226,6 +234,34 @@ TEST_F(GCMEncryptionProviderTest, VerifiesCryptoKeyHeaderParsing) { |
decryption_result()); |
} |
+TEST_F(GCMEncryptionProviderTest, VerifiesCryptoKeyHeaderParsingThirdValue) { |
+ // The Crypto-Key header must be parsable and contain valid values, in which |
+ // values will be ignored unless they contain a "dh" property. |
+ |
+ IncomingMessage valid_message; |
+ valid_message.data["encryption"] = kValidEncryptionHeader; |
+ valid_message.data["crypto-key"] = kValidThreeValueCryptoKeyHeader; |
+ valid_message.raw_data = "foo"; |
+ |
+ ASSERT_NO_FATAL_FAILURE(Decrypt(valid_message)); |
+ EXPECT_NE(GCMEncryptionProvider::DECRYPTION_RESULT_INVALID_CRYPTO_KEY_HEADER, |
+ decryption_result()); |
+} |
+ |
+TEST_F(GCMEncryptionProviderTest, VerifiesCryptoKeyHeaderSingleDhEntry) { |
+ // The Crypto-Key header must include at most one value that contains the |
+ // "dh" property. Having more than once occurrence is forbidden. |
+ |
+ IncomingMessage valid_message; |
+ valid_message.data["encryption"] = kValidEncryptionHeader; |
+ valid_message.data["crypto-key"] = kInvalidThreeValueCryptoKeyHeader; |
+ valid_message.raw_data = "foo"; |
+ |
+ ASSERT_NO_FATAL_FAILURE(Decrypt(valid_message)); |
+ EXPECT_EQ(GCMEncryptionProvider::DECRYPTION_RESULT_INVALID_CRYPTO_KEY_HEADER, |
+ decryption_result()); |
+} |
+ |
TEST_F(GCMEncryptionProviderTest, VerifiesExistingKeys) { |
// When both headers are valid, the encryption keys still must be known to |
// the GCM key store before the message can be decrypted. |