This repository has been archived by the owner on Dec 29, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 10
/
content_key_list.cc
81 lines (68 loc) · 2.11 KB
/
content_key_list.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// Copyright 2019 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "content_key_list.h"
#include <memory>
#include <utility>
#include <vector>
#include "absl/memory/memory.h"
#include "aes_cryptor.h"
#include "content_key.h"
#include "cpix_element.h"
#include "cpix_util.h"
#include "xml_node.h"
namespace cpix {
ContentKeyList::~ContentKeyList() = default;
bool ContentKeyList::AddContentKey(std::unique_ptr<ContentKey> key) {
if (key->kid().empty() || key->key_value().empty()) {
return false;
}
AddElement(std::move(key));
return true;
}
ContentKey* ContentKeyList::FindContentKey(const std::vector<uint8_t>& kid) {
if (kid.empty()) {
return nullptr;
}
for (const auto& element : elements_) {
if (static_cast<ContentKey*>(element.get())->kid() == kid) {
return static_cast<ContentKey*>(element.get());
}
}
return nullptr;
}
std::unique_ptr<CPIXElement> ContentKeyList::CreateElement() {
return absl::make_unique<ContentKey>();
}
bool ContentKeyList::DecryptContentKeys(
const std::vector<uint8_t>& decrypt_key) {
if (decrypt_key.empty()) {
return false;
}
for (const auto& key : elements_) {
ContentKey* key_ptr = static_cast<ContentKey*>(key.get());
std::unique_ptr<AESCryptor> aes = AESCryptor::Create(decrypt_key);
if (!key_ptr->explicit_iv().empty()) {
if (!aes->SetIV(key_ptr->explicit_iv())) {
return false;
}
}
std::vector<uint8_t> plaintext = aes->CBCDecrypt(key_ptr->key_value());
if (plaintext.empty()) {
return false;
}
key_ptr->SetKeyValue(plaintext);
}
return true;
}
} // namespace cpix