// 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 #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