7#include <packager/media/crypto/aes_encryptor_factory.h>
9#include <packager/media/base/aes_encryptor.h>
10#include <packager/media/base/aes_pattern_cryptor.h>
11#include <packager/media/crypto/sample_aes_ec3_cryptor.h>
16std::unique_ptr<AesCryptor> AesEncryptorFactory::CreateEncryptor(
17 FourCC protection_scheme,
18 uint8_t crypt_byte_block,
19 uint8_t skip_byte_block,
21 const std::vector<uint8_t>& key,
22 const std::vector<uint8_t>& iv) {
23 std::unique_ptr<AesCryptor> encryptor;
24 switch (protection_scheme) {
26 encryptor.reset(
new AesCtrEncryptor);
29 encryptor.reset(
new AesCbcEncryptor(kNoPadding));
32 encryptor.reset(
new AesPatternCryptor(
33 crypt_byte_block, skip_byte_block,
35 AesCryptor::kDontUseConstantIv,
36 std::unique_ptr<AesCryptor>(
new AesCtrEncryptor)));
39 encryptor.reset(
new AesPatternCryptor(
40 crypt_byte_block, skip_byte_block,
42 AesCryptor::kUseConstantIv,
43 std::unique_ptr<AesCryptor>(
new AesCbcEncryptor(kNoPadding))));
45 case kAes128ProtectionScheme:
48 new AesCbcEncryptor(kPkcs5Padding, AesCryptor::kUseConstantIv));
50 case kAppleSampleAesProtectionScheme:
51 if (crypt_byte_block == 0 && skip_byte_block == 0) {
52 if (codec == kCodecEAC3) {
53 encryptor.reset(
new SampleAesEc3Cryptor(
54 std::unique_ptr<AesCryptor>(
new AesCbcEncryptor(kNoPadding))));
57 new AesCbcEncryptor(kNoPadding, AesCryptor::kUseConstantIv));
60 encryptor.reset(
new AesPatternCryptor(
61 crypt_byte_block, skip_byte_block,
63 AesCryptor::kUseConstantIv,
64 std::unique_ptr<AesCryptor>(
new AesCbcEncryptor(kNoPadding))));
68 LOG(ERROR) <<
"Unsupported protection scheme.";
73 std::vector<uint8_t> random_iv;
75 LOG(ERROR) <<
"Failed to generate random iv.";
78 if (!encryptor->InitializeWithIv(key, random_iv))
81 if (!encryptor->InitializeWithIv(key, iv))
All the methods that are virtual are virtual for mocking.