7#include <packager/media/crypto/aes_encryptor_factory.h>
13#include <absl/log/log.h>
15#include <packager/media/base/aes_encryptor.h>
16#include <packager/media/base/aes_pattern_cryptor.h>
17#include <packager/media/base/fourccs.h>
18#include <packager/media/base/stream_info.h>
19#include <packager/media/crypto/sample_aes_ec3_cryptor.h>
24std::unique_ptr<AesCryptor> AesEncryptorFactory::CreateEncryptor(
25 FourCC protection_scheme,
26 uint8_t crypt_byte_block,
27 uint8_t skip_byte_block,
29 const std::vector<uint8_t>& key,
30 const std::vector<uint8_t>& iv) {
31 std::unique_ptr<AesCryptor> encryptor;
32 switch (protection_scheme) {
34 encryptor.reset(
new AesCtrEncryptor);
37 encryptor.reset(
new AesCbcEncryptor(kNoPadding));
40 encryptor.reset(
new AesPatternCryptor(
41 crypt_byte_block, skip_byte_block,
43 AesCryptor::kDontUseConstantIv,
44 std::unique_ptr<AesCryptor>(
new AesCtrEncryptor)));
47 encryptor.reset(
new AesPatternCryptor(
48 crypt_byte_block, skip_byte_block,
50 AesCryptor::kUseConstantIv,
51 std::unique_ptr<AesCryptor>(
new AesCbcEncryptor(kNoPadding))));
53 case kAes128ProtectionScheme:
56 new AesCbcEncryptor(kPkcs5Padding, AesCryptor::kUseConstantIv));
58 case kAppleSampleAesProtectionScheme:
59 if (crypt_byte_block == 0 && skip_byte_block == 0) {
60 if (codec == kCodecEAC3) {
61 encryptor.reset(
new SampleAesEc3Cryptor(
62 std::unique_ptr<AesCryptor>(
new AesCbcEncryptor(kNoPadding))));
65 new AesCbcEncryptor(kNoPadding, AesCryptor::kUseConstantIv));
68 encryptor.reset(
new AesPatternCryptor(
69 crypt_byte_block, skip_byte_block,
71 AesCryptor::kUseConstantIv,
72 std::unique_ptr<AesCryptor>(
new AesCbcEncryptor(kNoPadding))));
76 LOG(ERROR) <<
"Unsupported protection scheme.";
81 std::vector<uint8_t> random_iv;
83 LOG(ERROR) <<
"Failed to generate random iv.";
86 if (!encryptor->InitializeWithIv(key, random_iv))
89 if (!encryptor->InitializeWithIv(key, iv))
All the methods that are virtual are virtual for mocking.