Shaka Packager SDK
Loading...
Searching...
No Matches
aes_encryptor_factory.cc
1// Copyright 2018 Google LLC. All rights reserved.
2//
3// Use of this source code is governed by a BSD-style
4// license that can be found in the LICENSE file or at
5// https://developers.google.com/open-source/licenses/bsd
6
7#include <packager/media/crypto/aes_encryptor_factory.h>
8
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>
12
13namespace shaka {
14namespace media {
15
16std::unique_ptr<AesCryptor> AesEncryptorFactory::CreateEncryptor(
17 FourCC protection_scheme,
18 uint8_t crypt_byte_block,
19 uint8_t skip_byte_block,
20 Codec codec,
21 const std::vector<uint8_t>& key,
22 const std::vector<uint8_t>& iv) {
23 std::unique_ptr<AesCryptor> encryptor;
24 switch (protection_scheme) {
25 case FOURCC_cenc:
26 encryptor.reset(new AesCtrEncryptor);
27 break;
28 case FOURCC_cbc1:
29 encryptor.reset(new AesCbcEncryptor(kNoPadding));
30 break;
31 case FOURCC_cens:
32 encryptor.reset(new AesPatternCryptor(
33 crypt_byte_block, skip_byte_block,
35 AesCryptor::kDontUseConstantIv,
36 std::unique_ptr<AesCryptor>(new AesCtrEncryptor)));
37 break;
38 case FOURCC_cbcs:
39 encryptor.reset(new AesPatternCryptor(
40 crypt_byte_block, skip_byte_block,
42 AesCryptor::kUseConstantIv,
43 std::unique_ptr<AesCryptor>(new AesCbcEncryptor(kNoPadding))));
44 break;
45 case kAes128ProtectionScheme:
46 // HLS AES-128: whole-segment CBC with PKCS7 padding (RFC 8216 ยง5.2).
47 encryptor.reset(
48 new AesCbcEncryptor(kPkcs5Padding, AesCryptor::kUseConstantIv));
49 break;
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))));
55 } else {
56 encryptor.reset(
57 new AesCbcEncryptor(kNoPadding, AesCryptor::kUseConstantIv));
58 }
59 } else {
60 encryptor.reset(new AesPatternCryptor(
61 crypt_byte_block, skip_byte_block,
63 AesCryptor::kUseConstantIv,
64 std::unique_ptr<AesCryptor>(new AesCbcEncryptor(kNoPadding))));
65 }
66 break;
67 default:
68 LOG(ERROR) << "Unsupported protection scheme.";
69 return nullptr;
70 }
71
72 if (iv.empty()) {
73 std::vector<uint8_t> random_iv;
74 if (!AesCryptor::GenerateRandomIv(protection_scheme, &random_iv)) {
75 LOG(ERROR) << "Failed to generate random iv.";
76 return nullptr;
77 }
78 if (!encryptor->InitializeWithIv(key, random_iv))
79 return nullptr;
80 } else {
81 if (!encryptor->InitializeWithIv(key, iv))
82 return nullptr;
83 }
84
85 return encryptor;
86}
87
88} // namespace media
89} // namespace shaka
static bool GenerateRandomIv(FourCC protection_scheme, std::vector< uint8_t > *iv)
All the methods that are virtual are virtual for mocking.