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 <cstdint>
10#include <memory>
11#include <vector>
12
13#include <absl/log/log.h>
14
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>
20
21namespace shaka {
22namespace media {
23
24std::unique_ptr<AesCryptor> AesEncryptorFactory::CreateEncryptor(
25 FourCC protection_scheme,
26 uint8_t crypt_byte_block,
27 uint8_t skip_byte_block,
28 Codec codec,
29 const std::vector<uint8_t>& key,
30 const std::vector<uint8_t>& iv) {
31 std::unique_ptr<AesCryptor> encryptor;
32 switch (protection_scheme) {
33 case FOURCC_cenc:
34 encryptor.reset(new AesCtrEncryptor);
35 break;
36 case FOURCC_cbc1:
37 encryptor.reset(new AesCbcEncryptor(kNoPadding));
38 break;
39 case FOURCC_cens:
40 encryptor.reset(new AesPatternCryptor(
41 crypt_byte_block, skip_byte_block,
43 AesCryptor::kDontUseConstantIv,
44 std::unique_ptr<AesCryptor>(new AesCtrEncryptor)));
45 break;
46 case FOURCC_cbcs:
47 encryptor.reset(new AesPatternCryptor(
48 crypt_byte_block, skip_byte_block,
50 AesCryptor::kUseConstantIv,
51 std::unique_ptr<AesCryptor>(new AesCbcEncryptor(kNoPadding))));
52 break;
53 case kAes128ProtectionScheme:
54 // HLS AES-128: whole-segment CBC with PKCS7 padding (RFC 8216 ยง5.2).
55 encryptor.reset(
56 new AesCbcEncryptor(kPkcs5Padding, AesCryptor::kUseConstantIv));
57 break;
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))));
63 } else {
64 encryptor.reset(
65 new AesCbcEncryptor(kNoPadding, AesCryptor::kUseConstantIv));
66 }
67 } else {
68 encryptor.reset(new AesPatternCryptor(
69 crypt_byte_block, skip_byte_block,
71 AesCryptor::kUseConstantIv,
72 std::unique_ptr<AesCryptor>(new AesCbcEncryptor(kNoPadding))));
73 }
74 break;
75 default:
76 LOG(ERROR) << "Unsupported protection scheme.";
77 return nullptr;
78 }
79
80 if (iv.empty()) {
81 std::vector<uint8_t> random_iv;
82 if (!AesCryptor::GenerateRandomIv(protection_scheme, &random_iv)) {
83 LOG(ERROR) << "Failed to generate random iv.";
84 return nullptr;
85 }
86 if (!encryptor->InitializeWithIv(key, random_iv))
87 return nullptr;
88 } else {
89 if (!encryptor->InitializeWithIv(key, iv))
90 return nullptr;
91 }
92
93 return encryptor;
94}
95
96} // namespace media
97} // namespace shaka
static bool GenerateRandomIv(FourCC protection_scheme, std::vector< uint8_t > *iv)
All the methods that are virtual are virtual for mocking.