| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "media/base/decrypt_config.h" |
| |
| #include <sstream> |
| |
| #include "media/base/encryption_pattern.h" |
| #include "media/base/subsample_entry.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace media { |
| |
| namespace { |
| |
| const char kDefaultKeyId[] = "key_id"; |
| const char kDefaultIV[] = "1234567890123456"; |
| const char kAlternateKeyId[] = "alternate"; |
| const char kAlternateIV[] = "abcdefghijklmnop"; |
| |
| } // namespace |
| |
| TEST(DecryptConfigTest, CencConstruction) { |
| auto config = DecryptConfig::CreateCencConfig(kDefaultKeyId, kDefaultIV, {}); |
| EXPECT_EQ(config->key_id(), kDefaultKeyId); |
| EXPECT_EQ(config->iv(), kDefaultIV); |
| EXPECT_EQ(config->subsamples().size(), 0u); |
| EXPECT_EQ(config->encryption_scheme(), EncryptionScheme::kCenc); |
| |
| // Now with single subsample entry. |
| config = |
| DecryptConfig::CreateCencConfig(kAlternateKeyId, kDefaultIV, {{1, 2}}); |
| EXPECT_EQ(config->key_id(), kAlternateKeyId); |
| EXPECT_EQ(config->iv(), kDefaultIV); |
| EXPECT_EQ(config->subsamples().size(), 1u); |
| EXPECT_EQ(config->subsamples()[0].clear_bytes, 1u); |
| EXPECT_EQ(config->subsamples()[0].cypher_bytes, 2u); |
| EXPECT_EQ(config->encryption_scheme(), EncryptionScheme::kCenc); |
| |
| // Now with multiple subsample entries. |
| config = DecryptConfig::CreateCencConfig(kDefaultKeyId, kAlternateIV, |
| {{1, 2}, {3, 4}, {5, 6}, {7, 8}}); |
| EXPECT_EQ(config->key_id(), kDefaultKeyId); |
| EXPECT_EQ(config->iv(), kAlternateIV); |
| EXPECT_EQ(config->subsamples().size(), 4u); |
| EXPECT_EQ(config->subsamples()[1].clear_bytes, 3u); |
| EXPECT_EQ(config->subsamples()[3].cypher_bytes, 8u); |
| EXPECT_EQ(config->encryption_scheme(), EncryptionScheme::kCenc); |
| } |
| |
| TEST(DecryptConfigTest, CbcsConstruction) { |
| auto config = DecryptConfig::CreateCbcsConfig(kDefaultKeyId, kDefaultIV, {}, |
| EncryptionPattern(1, 2)); |
| EXPECT_EQ(config->key_id(), kDefaultKeyId); |
| EXPECT_EQ(config->iv(), kDefaultIV); |
| EXPECT_EQ(config->subsamples().size(), 0u); |
| EXPECT_EQ(config->encryption_scheme(), EncryptionScheme::kCbcs); |
| EXPECT_TRUE(config->HasPattern()); |
| EXPECT_EQ(config->encryption_pattern()->crypt_byte_block(), 1u); |
| EXPECT_EQ(config->encryption_pattern()->skip_byte_block(), 2u); |
| |
| // Now with multiple subsample entries. |
| config = DecryptConfig::CreateCbcsConfig(kDefaultKeyId, kAlternateIV, |
| {{1, 2}, {3, 4}, {5, 6}, {7, 8}}, |
| EncryptionPattern(1, 0)); |
| EXPECT_EQ(config->key_id(), kDefaultKeyId); |
| EXPECT_EQ(config->iv(), kAlternateIV); |
| EXPECT_EQ(config->subsamples().size(), 4u); |
| EXPECT_EQ(config->subsamples()[0].clear_bytes, 1u); |
| EXPECT_EQ(config->subsamples()[0].cypher_bytes, 2u); |
| EXPECT_EQ(config->subsamples()[3].clear_bytes, 7u); |
| EXPECT_EQ(config->subsamples()[3].cypher_bytes, 8u); |
| EXPECT_EQ(config->encryption_scheme(), EncryptionScheme::kCbcs); |
| EXPECT_TRUE(config->HasPattern()); |
| EXPECT_EQ(config->encryption_pattern()->crypt_byte_block(), 1u); |
| EXPECT_EQ(config->encryption_pattern()->skip_byte_block(), 0u); |
| |
| // Now without pattern. |
| config = DecryptConfig::CreateCbcsConfig(kAlternateKeyId, kDefaultIV, |
| {{1, 2}}, absl::nullopt); |
| EXPECT_EQ(config->key_id(), kAlternateKeyId); |
| EXPECT_EQ(config->iv(), kDefaultIV); |
| EXPECT_EQ(config->subsamples().size(), 1u); |
| EXPECT_EQ(config->subsamples()[0].clear_bytes, 1u); |
| EXPECT_EQ(config->subsamples()[0].cypher_bytes, 2u); |
| EXPECT_EQ(config->encryption_scheme(), EncryptionScheme::kCbcs); |
| EXPECT_FALSE(config->HasPattern()); |
| } |
| |
| TEST(DecryptConfigTest, Matches) { |
| auto config1 = DecryptConfig::CreateCencConfig(kDefaultKeyId, kDefaultIV, {}); |
| EXPECT_TRUE(config1->Matches(*config1)); |
| |
| auto config2 = DecryptConfig::CreateCbcsConfig(kDefaultKeyId, kDefaultIV, {}, |
| EncryptionPattern(1, 2)); |
| EXPECT_TRUE(config2->Matches(*config2)); |
| |
| EXPECT_FALSE(config1->Matches(*config2)); |
| EXPECT_FALSE(config2->Matches(*config1)); |
| } |
| |
| TEST(DecryptConfigTest, CencMatches) { |
| auto config1 = DecryptConfig::CreateCencConfig(kDefaultKeyId, kDefaultIV, {}); |
| EXPECT_TRUE(config1->Matches(*config1)); |
| |
| // Different key_id. |
| auto config2 = |
| DecryptConfig::CreateCencConfig(kAlternateKeyId, kDefaultIV, {}); |
| EXPECT_FALSE(config1->Matches(*config2)); |
| EXPECT_FALSE(config2->Matches(*config1)); |
| |
| // Different IV. |
| auto config3 = |
| DecryptConfig::CreateCencConfig(kDefaultKeyId, kAlternateIV, {}); |
| EXPECT_FALSE(config1->Matches(*config3)); |
| EXPECT_FALSE(config2->Matches(*config3)); |
| EXPECT_FALSE(config3->Matches(*config1)); |
| EXPECT_FALSE(config3->Matches(*config2)); |
| |
| // Different subsamples. |
| auto config4 = DecryptConfig::CreateCencConfig( |
| kDefaultKeyId, kDefaultIV, {{1, 2}, {3, 4}, {5, 6}, {7, 8}}); |
| EXPECT_FALSE(config1->Matches(*config4)); |
| EXPECT_FALSE(config2->Matches(*config4)); |
| EXPECT_FALSE(config3->Matches(*config4)); |
| EXPECT_FALSE(config4->Matches(*config1)); |
| EXPECT_FALSE(config4->Matches(*config2)); |
| EXPECT_FALSE(config4->Matches(*config3)); |
| } |
| |
| TEST(DecryptConfigTest, CbcsMatches) { |
| auto config1 = DecryptConfig::CreateCbcsConfig(kDefaultKeyId, kDefaultIV, {}, |
| EncryptionPattern(1, 2)); |
| EXPECT_TRUE(config1->Matches(*config1)); |
| |
| // Different key_id. |
| auto config2 = DecryptConfig::CreateCbcsConfig(kAlternateKeyId, kDefaultIV, |
| {}, EncryptionPattern(1, 2)); |
| EXPECT_FALSE(config1->Matches(*config2)); |
| EXPECT_FALSE(config2->Matches(*config1)); |
| |
| // Different IV. |
| auto config3 = DecryptConfig::CreateCbcsConfig(kDefaultKeyId, kAlternateIV, |
| {}, EncryptionPattern(1, 2)); |
| EXPECT_FALSE(config1->Matches(*config3)); |
| EXPECT_FALSE(config2->Matches(*config3)); |
| EXPECT_FALSE(config3->Matches(*config1)); |
| EXPECT_FALSE(config3->Matches(*config2)); |
| |
| // Different subsamples. |
| auto config4 = DecryptConfig::CreateCbcsConfig(kDefaultKeyId, kDefaultIV, |
| {{1, 2}, {3, 4}, {5, 6}}, |
| EncryptionPattern(1, 2)); |
| EXPECT_FALSE(config1->Matches(*config4)); |
| EXPECT_FALSE(config2->Matches(*config4)); |
| EXPECT_FALSE(config3->Matches(*config4)); |
| EXPECT_FALSE(config4->Matches(*config1)); |
| EXPECT_FALSE(config4->Matches(*config2)); |
| EXPECT_FALSE(config4->Matches(*config3)); |
| |
| // Different pattern. |
| auto config5 = DecryptConfig::CreateCbcsConfig(kDefaultKeyId, kDefaultIV, {}, |
| EncryptionPattern(5, 6)); |
| EXPECT_FALSE(config1->Matches(*config5)); |
| EXPECT_FALSE(config2->Matches(*config5)); |
| EXPECT_FALSE(config3->Matches(*config5)); |
| EXPECT_FALSE(config4->Matches(*config5)); |
| EXPECT_FALSE(config5->Matches(*config1)); |
| EXPECT_FALSE(config5->Matches(*config2)); |
| EXPECT_FALSE(config5->Matches(*config3)); |
| EXPECT_FALSE(config5->Matches(*config4)); |
| |
| // Without pattern. |
| auto config6 = DecryptConfig::CreateCbcsConfig(kDefaultKeyId, kDefaultIV, {}, |
| absl::nullopt); |
| EXPECT_FALSE(config1->Matches(*config6)); |
| EXPECT_FALSE(config5->Matches(*config6)); |
| EXPECT_FALSE(config6->Matches(*config1)); |
| EXPECT_FALSE(config6->Matches(*config5)); |
| } |
| |
| TEST(DecryptConfigTest, Output) { |
| std::ostringstream stream; |
| |
| // Simple 'cenc' config. |
| stream << *DecryptConfig::CreateCencConfig(kDefaultKeyId, kDefaultIV, {}); |
| |
| // Try with subsamples. |
| stream << *DecryptConfig::CreateCencConfig(kAlternateKeyId, kAlternateIV, |
| {{1, 2}, {3, 4}, {5, 6}}); |
| |
| // Simple 'cbcs' config. |
| stream << *DecryptConfig::CreateCbcsConfig(kDefaultKeyId, kDefaultIV, {}, |
| absl::nullopt); |
| |
| // 'cbcs' config with subsamples and pattern. |
| stream << *DecryptConfig::CreateCbcsConfig(kAlternateKeyId, kAlternateIV, |
| {{1, 2}, {3, 4}, {5, 6}, {7, 8}}, |
| EncryptionPattern(1, 2)); |
| } |
| |
| } // namespace media |