7 #include "packager/media/base/decryptor_source.h"
9 #include "packager/base/logging.h"
10 #include "packager/base/stl_util.h"
11 #include "packager/media/base/aes_decryptor.h"
12 #include "packager/media/base/aes_pattern_cryptor.h"
14 namespace edash_packager {
17 DecryptorSource::DecryptorSource(KeySource* key_source)
18 : key_source_(key_source) {
21 DecryptorSource::~DecryptorSource() {
22 STLDeleteValues(&decryptor_map_);
25 bool DecryptorSource::DecryptSampleBuffer(
const DecryptConfig* decrypt_config,
28 DCHECK(decrypt_config);
32 AesCryptor* decryptor;
33 auto found = decryptor_map_.find(decrypt_config->key_id());
34 if (found == decryptor_map_.end()) {
37 Status status(key_source_->
GetKey(decrypt_config->key_id(), &key));
39 LOG(ERROR) <<
"Error retrieving decryption key: " << status;
43 scoped_ptr<AesCryptor> aes_decryptor;
44 switch (decrypt_config->protection_scheme()) {
46 aes_decryptor.reset(
new AesCtrDecryptor);
49 aes_decryptor.reset(
new AesCbcDecryptor(kNoPadding));
52 aes_decryptor.reset(
new AesPatternCryptor(
53 decrypt_config->crypt_byte_block(),
54 decrypt_config->skip_byte_block(), AesCryptor::kDontUseConstantIv,
55 scoped_ptr<AesCryptor>(
new AesCtrDecryptor)));
58 aes_decryptor.reset(
new AesPatternCryptor(
59 decrypt_config->crypt_byte_block(),
60 decrypt_config->skip_byte_block(), AesCryptor::kUseConstantIv,
61 scoped_ptr<AesCryptor>(
new AesCbcDecryptor(kNoPadding))));
64 LOG(ERROR) <<
"Unsupported protection scheme: "
65 << decrypt_config->protection_scheme();
69 if (!aes_decryptor->InitializeWithIv(key.key, decrypt_config->iv())) {
70 LOG(ERROR) <<
"Failed to initialize AesDecryptor for decryption.";
73 decryptor = aes_decryptor.release();
74 decryptor_map_[decrypt_config->key_id()] = decryptor;
76 decryptor = found->second;
78 if (!decryptor->SetIv(decrypt_config->iv())) {
79 LOG(ERROR) <<
"Invalid initialization vector.";
83 if (decrypt_config->subsamples().empty()) {
85 if (!decryptor->Crypt(buffer, buffer_size, buffer)) {
86 LOG(ERROR) <<
"Error during bulk sample decryption.";
93 const std::vector<SubsampleEntry>& subsamples = decrypt_config->subsamples();
94 uint8_t* current_ptr = buffer;
95 const uint8_t*
const buffer_end = buffer + buffer_size;
96 for (
const auto& subsample : subsamples) {
97 if ((current_ptr + subsample.clear_bytes + subsample.cipher_bytes) >
99 LOG(ERROR) <<
"Subsamples overflow sample buffer.";
102 current_ptr += subsample.clear_bytes;
103 if (!decryptor->Crypt(current_ptr, subsample.cipher_bytes, current_ptr)) {
104 LOG(ERROR) <<
"Error decrypting subsample buffer.";
107 current_ptr += subsample.cipher_bytes;