1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2021 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker *
4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker *
8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker *
10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker */
16*ec779b8eSAndroid Build Coastguard Worker
17*ec779b8eSAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
18*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "DrmHalAidl"
19*ec779b8eSAndroid Build Coastguard Worker
20*ec779b8eSAndroid Build Coastguard Worker #include <array>
21*ec779b8eSAndroid Build Coastguard Worker #include <algorithm>
22*ec779b8eSAndroid Build Coastguard Worker #include <map>
23*ec779b8eSAndroid Build Coastguard Worker #include <android/binder_auto_utils.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <android/binder_manager.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <media/PluginMetricsReporting.h>
26*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/ADebug.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/AString.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/base64.h>
29*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/hexdump.h>
30*ec779b8eSAndroid Build Coastguard Worker #include <mediadrm/DrmHalAidl.h>
31*ec779b8eSAndroid Build Coastguard Worker #include <mediadrm/DrmSessionManager.h>
32*ec779b8eSAndroid Build Coastguard Worker #include <mediadrm/DrmStatus.h>
33*ec779b8eSAndroid Build Coastguard Worker #include <mediadrm/DrmUtils.h>
34*ec779b8eSAndroid Build Coastguard Worker
35*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::CryptoSchemes;
36*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::DrmMetricNamedValue;
37*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::DrmMetricValue;
38*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::HdcpLevel;
39*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::HdcpLevels;
40*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::KeyRequest;
41*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::KeyRequestType;
42*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::KeySetId;
43*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::KeyStatus;
44*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::KeyStatusType;
45*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::KeyType;
46*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::KeyValue;
47*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::NumberOfSessions;
48*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::OfflineLicenseState;
49*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::OpaqueData;
50*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::ProvideProvisionResponseResult;
51*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::ProvisionRequest;
52*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::SecureStop;
53*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::SecureStopId;
54*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::SecurityLevel;
55*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::Status;
56*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::SupportedContentType;
57*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::Uuid;
58*ec779b8eSAndroid Build Coastguard Worker using ::android::DrmUtils::statusAidlToDrmStatus;
59*ec779b8eSAndroid Build Coastguard Worker using DrmMetricGroupAidl = ::aidl::android::hardware::drm::DrmMetricGroup;
60*ec779b8eSAndroid Build Coastguard Worker using DrmMetricGroupHidl = ::android::hardware::drm::V1_1::DrmMetricGroup;
61*ec779b8eSAndroid Build Coastguard Worker using DrmMetricAidl = ::aidl::android::hardware::drm::DrmMetric;
62*ec779b8eSAndroid Build Coastguard Worker using DrmMetricHidl = ::android::hardware::drm::V1_1::DrmMetricGroup::Metric;
63*ec779b8eSAndroid Build Coastguard Worker using ValueHidl = ::android::hardware::drm::V1_1::DrmMetricGroup::Value;
64*ec779b8eSAndroid Build Coastguard Worker using AttributeHidl = ::android::hardware::drm::V1_1::DrmMetricGroup::Attribute;
65*ec779b8eSAndroid Build Coastguard Worker using IDrmPluginAidl = ::aidl::android::hardware::drm::IDrmPlugin;
66*ec779b8eSAndroid Build Coastguard Worker using EventTypeAidl = ::aidl::android::hardware::drm::EventType;
67*ec779b8eSAndroid Build Coastguard Worker using ::android::hardware::hidl_vec;
68*ec779b8eSAndroid Build Coastguard Worker
69*ec779b8eSAndroid Build Coastguard Worker namespace {
70*ec779b8eSAndroid Build Coastguard Worker
71*ec779b8eSAndroid Build Coastguard Worker constexpr char kPropertyDeviceUniqueId[] = "deviceUniqueId";
72*ec779b8eSAndroid Build Coastguard Worker constexpr char kEqualsSign[] = "=";
73*ec779b8eSAndroid Build Coastguard Worker
74*ec779b8eSAndroid Build Coastguard Worker template <typename T>
toBase64StringNoPad(const T * data,size_t size)75*ec779b8eSAndroid Build Coastguard Worker std::string toBase64StringNoPad(const T* data, size_t size) {
76*ec779b8eSAndroid Build Coastguard Worker // Note that the base 64 conversion only works with arrays of single-byte
77*ec779b8eSAndroid Build Coastguard Worker // values. If the source is empty or is not an array of single-byte values,
78*ec779b8eSAndroid Build Coastguard Worker // return empty string.
79*ec779b8eSAndroid Build Coastguard Worker if (size == 0 || sizeof(data[0]) != 1) {
80*ec779b8eSAndroid Build Coastguard Worker return "";
81*ec779b8eSAndroid Build Coastguard Worker }
82*ec779b8eSAndroid Build Coastguard Worker
83*ec779b8eSAndroid Build Coastguard Worker android::AString outputString;
84*ec779b8eSAndroid Build Coastguard Worker encodeBase64(data, size, &outputString);
85*ec779b8eSAndroid Build Coastguard Worker // Remove trailing equals padding if it exists.
86*ec779b8eSAndroid Build Coastguard Worker while (outputString.size() > 0 && outputString.endsWith(kEqualsSign)) {
87*ec779b8eSAndroid Build Coastguard Worker outputString.erase(outputString.size() - 1, 1);
88*ec779b8eSAndroid Build Coastguard Worker }
89*ec779b8eSAndroid Build Coastguard Worker
90*ec779b8eSAndroid Build Coastguard Worker return std::string(outputString.c_str(), outputString.size());
91*ec779b8eSAndroid Build Coastguard Worker }
92*ec779b8eSAndroid Build Coastguard Worker
93*ec779b8eSAndroid Build Coastguard Worker } // anonymous namespace
94*ec779b8eSAndroid Build Coastguard Worker
95*ec779b8eSAndroid Build Coastguard Worker namespace android {
96*ec779b8eSAndroid Build Coastguard Worker
97*ec779b8eSAndroid Build Coastguard Worker #define INIT_CHECK() \
98*ec779b8eSAndroid Build Coastguard Worker { \
99*ec779b8eSAndroid Build Coastguard Worker if (mInitCheck != OK) return mInitCheck; \
100*ec779b8eSAndroid Build Coastguard Worker }
101*ec779b8eSAndroid Build Coastguard Worker
102*ec779b8eSAndroid Build Coastguard Worker template <typename Byte = uint8_t>
toStdVec(const Vector<uint8_t> & vector)103*ec779b8eSAndroid Build Coastguard Worker static std::vector<Byte> toStdVec(const Vector<uint8_t>& vector) {
104*ec779b8eSAndroid Build Coastguard Worker auto v = reinterpret_cast<const Byte*>(vector.array());
105*ec779b8eSAndroid Build Coastguard Worker std::vector<Byte> vec(v, v + vector.size());
106*ec779b8eSAndroid Build Coastguard Worker return vec;
107*ec779b8eSAndroid Build Coastguard Worker }
108*ec779b8eSAndroid Build Coastguard Worker
toVector(const std::vector<uint8_t> & vec)109*ec779b8eSAndroid Build Coastguard Worker static const Vector<uint8_t> toVector(const std::vector<uint8_t>& vec) {
110*ec779b8eSAndroid Build Coastguard Worker Vector<uint8_t> vector;
111*ec779b8eSAndroid Build Coastguard Worker vector.appendArray(vec.data(), vec.size());
112*ec779b8eSAndroid Build Coastguard Worker return *const_cast<const Vector<uint8_t>*>(&vector);
113*ec779b8eSAndroid Build Coastguard Worker }
114*ec779b8eSAndroid Build Coastguard Worker
toString8(const std::string & string)115*ec779b8eSAndroid Build Coastguard Worker static String8 toString8(const std::string& string) {
116*ec779b8eSAndroid Build Coastguard Worker return String8(string.c_str());
117*ec779b8eSAndroid Build Coastguard Worker }
118*ec779b8eSAndroid Build Coastguard Worker
toStdString(const String8 & string8)119*ec779b8eSAndroid Build Coastguard Worker static std::string toStdString(const String8& string8) {
120*ec779b8eSAndroid Build Coastguard Worker return std::string(string8.c_str());
121*ec779b8eSAndroid Build Coastguard Worker }
122*ec779b8eSAndroid Build Coastguard Worker
toKeyValueVector(const KeyedVector<String8,String8> & keyedVector)123*ec779b8eSAndroid Build Coastguard Worker static std::vector<KeyValue> toKeyValueVector(const KeyedVector<String8, String8>& keyedVector) {
124*ec779b8eSAndroid Build Coastguard Worker std::vector<KeyValue> stdKeyedVector;
125*ec779b8eSAndroid Build Coastguard Worker for (size_t i = 0; i < keyedVector.size(); i++) {
126*ec779b8eSAndroid Build Coastguard Worker KeyValue keyValue;
127*ec779b8eSAndroid Build Coastguard Worker keyValue.key = toStdString(keyedVector.keyAt(i));
128*ec779b8eSAndroid Build Coastguard Worker keyValue.value = toStdString(keyedVector.valueAt(i));
129*ec779b8eSAndroid Build Coastguard Worker stdKeyedVector.push_back(keyValue);
130*ec779b8eSAndroid Build Coastguard Worker }
131*ec779b8eSAndroid Build Coastguard Worker return stdKeyedVector;
132*ec779b8eSAndroid Build Coastguard Worker }
133*ec779b8eSAndroid Build Coastguard Worker
toKeyedVector(const std::vector<KeyValue> & keyValueVec)134*ec779b8eSAndroid Build Coastguard Worker static KeyedVector<String8, String8> toKeyedVector(const std::vector<KeyValue>& keyValueVec) {
135*ec779b8eSAndroid Build Coastguard Worker KeyedVector<String8, String8> keyedVector;
136*ec779b8eSAndroid Build Coastguard Worker for (size_t i = 0; i < keyValueVec.size(); i++) {
137*ec779b8eSAndroid Build Coastguard Worker keyedVector.add(toString8(keyValueVec[i].key), toString8(keyValueVec[i].value));
138*ec779b8eSAndroid Build Coastguard Worker }
139*ec779b8eSAndroid Build Coastguard Worker return keyedVector;
140*ec779b8eSAndroid Build Coastguard Worker }
141*ec779b8eSAndroid Build Coastguard Worker
toKeyRequestType(KeyRequestType keyRequestType)142*ec779b8eSAndroid Build Coastguard Worker static DrmPlugin::KeyRequestType toKeyRequestType(KeyRequestType keyRequestType) {
143*ec779b8eSAndroid Build Coastguard Worker switch (keyRequestType) {
144*ec779b8eSAndroid Build Coastguard Worker case KeyRequestType::INITIAL:
145*ec779b8eSAndroid Build Coastguard Worker return DrmPlugin::kKeyRequestType_Initial;
146*ec779b8eSAndroid Build Coastguard Worker break;
147*ec779b8eSAndroid Build Coastguard Worker case KeyRequestType::RENEWAL:
148*ec779b8eSAndroid Build Coastguard Worker return DrmPlugin::kKeyRequestType_Renewal;
149*ec779b8eSAndroid Build Coastguard Worker break;
150*ec779b8eSAndroid Build Coastguard Worker case KeyRequestType::RELEASE:
151*ec779b8eSAndroid Build Coastguard Worker return DrmPlugin::kKeyRequestType_Release;
152*ec779b8eSAndroid Build Coastguard Worker break;
153*ec779b8eSAndroid Build Coastguard Worker case KeyRequestType::NONE:
154*ec779b8eSAndroid Build Coastguard Worker return DrmPlugin::kKeyRequestType_None;
155*ec779b8eSAndroid Build Coastguard Worker break;
156*ec779b8eSAndroid Build Coastguard Worker case KeyRequestType::UPDATE:
157*ec779b8eSAndroid Build Coastguard Worker return DrmPlugin::kKeyRequestType_Update;
158*ec779b8eSAndroid Build Coastguard Worker break;
159*ec779b8eSAndroid Build Coastguard Worker default:
160*ec779b8eSAndroid Build Coastguard Worker return DrmPlugin::kKeyRequestType_Unknown;
161*ec779b8eSAndroid Build Coastguard Worker break;
162*ec779b8eSAndroid Build Coastguard Worker }
163*ec779b8eSAndroid Build Coastguard Worker }
164*ec779b8eSAndroid Build Coastguard Worker
toSecureStops(const std::vector<SecureStop> & aSecureStops)165*ec779b8eSAndroid Build Coastguard Worker static List<Vector<uint8_t>> toSecureStops(const std::vector<SecureStop>& aSecureStops) {
166*ec779b8eSAndroid Build Coastguard Worker List<Vector<uint8_t>> secureStops;
167*ec779b8eSAndroid Build Coastguard Worker for (size_t i = 0; i < aSecureStops.size(); i++) {
168*ec779b8eSAndroid Build Coastguard Worker secureStops.push_back(toVector(aSecureStops[i].opaqueData));
169*ec779b8eSAndroid Build Coastguard Worker }
170*ec779b8eSAndroid Build Coastguard Worker return secureStops;
171*ec779b8eSAndroid Build Coastguard Worker }
172*ec779b8eSAndroid Build Coastguard Worker
toSecureStopIds(const std::vector<SecureStopId> & aSecureStopIds)173*ec779b8eSAndroid Build Coastguard Worker static List<Vector<uint8_t>> toSecureStopIds(const std::vector<SecureStopId>& aSecureStopIds) {
174*ec779b8eSAndroid Build Coastguard Worker List<Vector<uint8_t>> secureStopIds;
175*ec779b8eSAndroid Build Coastguard Worker for (size_t i = 0; i < aSecureStopIds.size(); i++) {
176*ec779b8eSAndroid Build Coastguard Worker secureStopIds.push_back(toVector(aSecureStopIds[i].secureStopId));
177*ec779b8eSAndroid Build Coastguard Worker }
178*ec779b8eSAndroid Build Coastguard Worker return secureStopIds;
179*ec779b8eSAndroid Build Coastguard Worker }
180*ec779b8eSAndroid Build Coastguard Worker
toHdcpLevel(HdcpLevel level)181*ec779b8eSAndroid Build Coastguard Worker static DrmPlugin::HdcpLevel toHdcpLevel(HdcpLevel level) {
182*ec779b8eSAndroid Build Coastguard Worker switch (level) {
183*ec779b8eSAndroid Build Coastguard Worker case HdcpLevel::HDCP_NONE:
184*ec779b8eSAndroid Build Coastguard Worker return DrmPlugin::kHdcpNone;
185*ec779b8eSAndroid Build Coastguard Worker case HdcpLevel::HDCP_V1:
186*ec779b8eSAndroid Build Coastguard Worker return DrmPlugin::kHdcpV1;
187*ec779b8eSAndroid Build Coastguard Worker case HdcpLevel::HDCP_V2:
188*ec779b8eSAndroid Build Coastguard Worker return DrmPlugin::kHdcpV2;
189*ec779b8eSAndroid Build Coastguard Worker case HdcpLevel::HDCP_V2_1:
190*ec779b8eSAndroid Build Coastguard Worker return DrmPlugin::kHdcpV2_1;
191*ec779b8eSAndroid Build Coastguard Worker case HdcpLevel::HDCP_V2_2:
192*ec779b8eSAndroid Build Coastguard Worker return DrmPlugin::kHdcpV2_2;
193*ec779b8eSAndroid Build Coastguard Worker case HdcpLevel::HDCP_V2_3:
194*ec779b8eSAndroid Build Coastguard Worker return DrmPlugin::kHdcpV2_3;
195*ec779b8eSAndroid Build Coastguard Worker case HdcpLevel::HDCP_NO_OUTPUT:
196*ec779b8eSAndroid Build Coastguard Worker return DrmPlugin::kHdcpNoOutput;
197*ec779b8eSAndroid Build Coastguard Worker default:
198*ec779b8eSAndroid Build Coastguard Worker return DrmPlugin::kHdcpLevelUnknown;
199*ec779b8eSAndroid Build Coastguard Worker }
200*ec779b8eSAndroid Build Coastguard Worker }
201*ec779b8eSAndroid Build Coastguard Worker
toSecurityLevel(SecurityLevel level)202*ec779b8eSAndroid Build Coastguard Worker static DrmPlugin::SecurityLevel toSecurityLevel(SecurityLevel level) {
203*ec779b8eSAndroid Build Coastguard Worker switch (level) {
204*ec779b8eSAndroid Build Coastguard Worker case SecurityLevel::SW_SECURE_CRYPTO:
205*ec779b8eSAndroid Build Coastguard Worker return DrmPlugin::kSecurityLevelSwSecureCrypto;
206*ec779b8eSAndroid Build Coastguard Worker case SecurityLevel::SW_SECURE_DECODE:
207*ec779b8eSAndroid Build Coastguard Worker return DrmPlugin::kSecurityLevelSwSecureDecode;
208*ec779b8eSAndroid Build Coastguard Worker case SecurityLevel::HW_SECURE_CRYPTO:
209*ec779b8eSAndroid Build Coastguard Worker return DrmPlugin::kSecurityLevelHwSecureCrypto;
210*ec779b8eSAndroid Build Coastguard Worker case SecurityLevel::HW_SECURE_DECODE:
211*ec779b8eSAndroid Build Coastguard Worker return DrmPlugin::kSecurityLevelHwSecureDecode;
212*ec779b8eSAndroid Build Coastguard Worker case SecurityLevel::HW_SECURE_ALL:
213*ec779b8eSAndroid Build Coastguard Worker return DrmPlugin::kSecurityLevelHwSecureAll;
214*ec779b8eSAndroid Build Coastguard Worker case SecurityLevel::DEFAULT:
215*ec779b8eSAndroid Build Coastguard Worker return DrmPlugin::kSecurityLevelMax;
216*ec779b8eSAndroid Build Coastguard Worker default:
217*ec779b8eSAndroid Build Coastguard Worker return DrmPlugin::kSecurityLevelUnknown;
218*ec779b8eSAndroid Build Coastguard Worker }
219*ec779b8eSAndroid Build Coastguard Worker }
220*ec779b8eSAndroid Build Coastguard Worker
toAidlSecurityLevel(DrmPlugin::SecurityLevel level)221*ec779b8eSAndroid Build Coastguard Worker static SecurityLevel toAidlSecurityLevel(DrmPlugin::SecurityLevel level) {
222*ec779b8eSAndroid Build Coastguard Worker switch (level) {
223*ec779b8eSAndroid Build Coastguard Worker case DrmPlugin::kSecurityLevelSwSecureCrypto:
224*ec779b8eSAndroid Build Coastguard Worker return SecurityLevel::SW_SECURE_CRYPTO;
225*ec779b8eSAndroid Build Coastguard Worker case DrmPlugin::kSecurityLevelSwSecureDecode:
226*ec779b8eSAndroid Build Coastguard Worker return SecurityLevel::SW_SECURE_DECODE;
227*ec779b8eSAndroid Build Coastguard Worker case DrmPlugin::kSecurityLevelHwSecureCrypto:
228*ec779b8eSAndroid Build Coastguard Worker return SecurityLevel::HW_SECURE_CRYPTO;
229*ec779b8eSAndroid Build Coastguard Worker case DrmPlugin::kSecurityLevelHwSecureDecode:
230*ec779b8eSAndroid Build Coastguard Worker return SecurityLevel::HW_SECURE_DECODE;
231*ec779b8eSAndroid Build Coastguard Worker case DrmPlugin::kSecurityLevelHwSecureAll:
232*ec779b8eSAndroid Build Coastguard Worker return SecurityLevel::HW_SECURE_ALL;
233*ec779b8eSAndroid Build Coastguard Worker case DrmPlugin::kSecurityLevelMax:
234*ec779b8eSAndroid Build Coastguard Worker return SecurityLevel::DEFAULT;
235*ec779b8eSAndroid Build Coastguard Worker default:
236*ec779b8eSAndroid Build Coastguard Worker return SecurityLevel::UNKNOWN;
237*ec779b8eSAndroid Build Coastguard Worker }
238*ec779b8eSAndroid Build Coastguard Worker }
239*ec779b8eSAndroid Build Coastguard Worker
toKeySetIds(const std::vector<KeySetId> & hKeySetIds)240*ec779b8eSAndroid Build Coastguard Worker static List<Vector<uint8_t>> toKeySetIds(const std::vector<KeySetId>& hKeySetIds) {
241*ec779b8eSAndroid Build Coastguard Worker List<Vector<uint8_t>> keySetIds;
242*ec779b8eSAndroid Build Coastguard Worker for (size_t i = 0; i < hKeySetIds.size(); i++) {
243*ec779b8eSAndroid Build Coastguard Worker keySetIds.push_back(toVector(hKeySetIds[i].keySetId));
244*ec779b8eSAndroid Build Coastguard Worker }
245*ec779b8eSAndroid Build Coastguard Worker return keySetIds;
246*ec779b8eSAndroid Build Coastguard Worker }
247*ec779b8eSAndroid Build Coastguard Worker
toHidlVec(const Vector<uint8_t> & vector)248*ec779b8eSAndroid Build Coastguard Worker static hidl_vec<uint8_t> toHidlVec(const Vector<uint8_t>& vector) {
249*ec779b8eSAndroid Build Coastguard Worker hidl_vec<uint8_t> vec;
250*ec779b8eSAndroid Build Coastguard Worker vec.setToExternal(const_cast<uint8_t*>(vector.array()), vector.size());
251*ec779b8eSAndroid Build Coastguard Worker return vec;
252*ec779b8eSAndroid Build Coastguard Worker }
253*ec779b8eSAndroid Build Coastguard Worker
toOfflineLicenseState(OfflineLicenseState licenseState)254*ec779b8eSAndroid Build Coastguard Worker static DrmPlugin::OfflineLicenseState toOfflineLicenseState(OfflineLicenseState licenseState) {
255*ec779b8eSAndroid Build Coastguard Worker switch (licenseState) {
256*ec779b8eSAndroid Build Coastguard Worker case OfflineLicenseState::USABLE:
257*ec779b8eSAndroid Build Coastguard Worker return DrmPlugin::kOfflineLicenseStateUsable;
258*ec779b8eSAndroid Build Coastguard Worker case OfflineLicenseState::INACTIVE:
259*ec779b8eSAndroid Build Coastguard Worker return DrmPlugin::kOfflineLicenseStateReleased;
260*ec779b8eSAndroid Build Coastguard Worker default:
261*ec779b8eSAndroid Build Coastguard Worker return DrmPlugin::kOfflineLicenseStateUnknown;
262*ec779b8eSAndroid Build Coastguard Worker }
263*ec779b8eSAndroid Build Coastguard Worker }
264*ec779b8eSAndroid Build Coastguard Worker
265*ec779b8eSAndroid Build Coastguard Worker Mutex DrmHalAidl::mLock;
266*ec779b8eSAndroid Build Coastguard Worker
toDrmMetricGroupHidl(std::vector<DrmMetricGroupAidl> result)267*ec779b8eSAndroid Build Coastguard Worker static hidl_vec<DrmMetricGroupHidl> toDrmMetricGroupHidl(std::vector<DrmMetricGroupAidl> result) {
268*ec779b8eSAndroid Build Coastguard Worker std::vector<DrmMetricGroupHidl> resultHidl;
269*ec779b8eSAndroid Build Coastguard Worker for (auto r : result) {
270*ec779b8eSAndroid Build Coastguard Worker DrmMetricGroupHidl re;
271*ec779b8eSAndroid Build Coastguard Worker std::vector<DrmMetricHidl> tmpMetric;
272*ec779b8eSAndroid Build Coastguard Worker for (auto m : r.metrics) {
273*ec779b8eSAndroid Build Coastguard Worker DrmMetricHidl me;
274*ec779b8eSAndroid Build Coastguard Worker me.name = m.name;
275*ec779b8eSAndroid Build Coastguard Worker std::vector<AttributeHidl> aTmp;
276*ec779b8eSAndroid Build Coastguard Worker for (auto attr : m.attributes) {
277*ec779b8eSAndroid Build Coastguard Worker AttributeHidl attrHidl;
278*ec779b8eSAndroid Build Coastguard Worker attrHidl.name = attr.name;
279*ec779b8eSAndroid Build Coastguard Worker
280*ec779b8eSAndroid Build Coastguard Worker switch (attr.value.getTag()) {
281*ec779b8eSAndroid Build Coastguard Worker case DrmMetricValue::Tag::int64Value:
282*ec779b8eSAndroid Build Coastguard Worker attrHidl.type = DrmMetricGroupHidl::ValueType::INT64_TYPE;
283*ec779b8eSAndroid Build Coastguard Worker attrHidl.int64Value = attr.value.get<DrmMetricValue::Tag::int64Value>();
284*ec779b8eSAndroid Build Coastguard Worker break;
285*ec779b8eSAndroid Build Coastguard Worker case DrmMetricValue::Tag::doubleValue:
286*ec779b8eSAndroid Build Coastguard Worker attrHidl.type = DrmMetricGroupHidl::ValueType::DOUBLE_TYPE;
287*ec779b8eSAndroid Build Coastguard Worker attrHidl.doubleValue = attr.value.get<DrmMetricValue::Tag::doubleValue>();
288*ec779b8eSAndroid Build Coastguard Worker break;
289*ec779b8eSAndroid Build Coastguard Worker case DrmMetricValue::Tag::stringValue:
290*ec779b8eSAndroid Build Coastguard Worker attrHidl.type = DrmMetricGroupHidl::ValueType::STRING_TYPE;
291*ec779b8eSAndroid Build Coastguard Worker attrHidl.stringValue = attr.value.get<DrmMetricValue::Tag::stringValue>();
292*ec779b8eSAndroid Build Coastguard Worker break;
293*ec779b8eSAndroid Build Coastguard Worker default:
294*ec779b8eSAndroid Build Coastguard Worker break;
295*ec779b8eSAndroid Build Coastguard Worker }
296*ec779b8eSAndroid Build Coastguard Worker
297*ec779b8eSAndroid Build Coastguard Worker aTmp.push_back(attrHidl);
298*ec779b8eSAndroid Build Coastguard Worker }
299*ec779b8eSAndroid Build Coastguard Worker
300*ec779b8eSAndroid Build Coastguard Worker me.attributes = aTmp;
301*ec779b8eSAndroid Build Coastguard Worker
302*ec779b8eSAndroid Build Coastguard Worker std::vector<ValueHidl> vTmp;
303*ec779b8eSAndroid Build Coastguard Worker for (auto value : m.values) {
304*ec779b8eSAndroid Build Coastguard Worker ValueHidl valueHidl;
305*ec779b8eSAndroid Build Coastguard Worker valueHidl.componentName = value.name;
306*ec779b8eSAndroid Build Coastguard Worker switch (value.value.getTag()) {
307*ec779b8eSAndroid Build Coastguard Worker case DrmMetricValue::Tag::int64Value:
308*ec779b8eSAndroid Build Coastguard Worker valueHidl.type = DrmMetricGroupHidl::ValueType::INT64_TYPE;
309*ec779b8eSAndroid Build Coastguard Worker valueHidl.int64Value = value.value.get<DrmMetricValue::Tag::int64Value>();
310*ec779b8eSAndroid Build Coastguard Worker break;
311*ec779b8eSAndroid Build Coastguard Worker case DrmMetricValue::Tag::doubleValue:
312*ec779b8eSAndroid Build Coastguard Worker valueHidl.type = DrmMetricGroupHidl::ValueType::DOUBLE_TYPE;
313*ec779b8eSAndroid Build Coastguard Worker valueHidl.doubleValue = value.value.get<DrmMetricValue::Tag::doubleValue>();
314*ec779b8eSAndroid Build Coastguard Worker break;
315*ec779b8eSAndroid Build Coastguard Worker case DrmMetricValue::Tag::stringValue:
316*ec779b8eSAndroid Build Coastguard Worker valueHidl.type = DrmMetricGroupHidl::ValueType::STRING_TYPE;
317*ec779b8eSAndroid Build Coastguard Worker valueHidl.stringValue = value.value.get<DrmMetricValue::Tag::stringValue>();
318*ec779b8eSAndroid Build Coastguard Worker break;
319*ec779b8eSAndroid Build Coastguard Worker default:
320*ec779b8eSAndroid Build Coastguard Worker break;
321*ec779b8eSAndroid Build Coastguard Worker }
322*ec779b8eSAndroid Build Coastguard Worker
323*ec779b8eSAndroid Build Coastguard Worker vTmp.push_back(valueHidl);
324*ec779b8eSAndroid Build Coastguard Worker }
325*ec779b8eSAndroid Build Coastguard Worker
326*ec779b8eSAndroid Build Coastguard Worker me.values = vTmp;
327*ec779b8eSAndroid Build Coastguard Worker tmpMetric.push_back(me);
328*ec779b8eSAndroid Build Coastguard Worker }
329*ec779b8eSAndroid Build Coastguard Worker
330*ec779b8eSAndroid Build Coastguard Worker re.metrics = tmpMetric;
331*ec779b8eSAndroid Build Coastguard Worker resultHidl.push_back(re);
332*ec779b8eSAndroid Build Coastguard Worker }
333*ec779b8eSAndroid Build Coastguard Worker
334*ec779b8eSAndroid Build Coastguard Worker return resultHidl;
335*ec779b8eSAndroid Build Coastguard Worker }
336*ec779b8eSAndroid Build Coastguard Worker
337*ec779b8eSAndroid Build Coastguard Worker // DrmSessionClient Definition
338*ec779b8eSAndroid Build Coastguard Worker
339*ec779b8eSAndroid Build Coastguard Worker struct DrmHalAidl::DrmSessionClient : public aidl::android::media::BnResourceManagerClient {
DrmSessionClientandroid::DrmHalAidl::DrmSessionClient340*ec779b8eSAndroid Build Coastguard Worker explicit DrmSessionClient(DrmHalAidl* drm, const Vector<uint8_t>& sessionId)
341*ec779b8eSAndroid Build Coastguard Worker : mSessionId(sessionId), mDrm(drm) {}
342*ec779b8eSAndroid Build Coastguard Worker
343*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus reclaimResource(bool* _aidl_return) override;
344*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus getName(::std::string* _aidl_return) override;
345*ec779b8eSAndroid Build Coastguard Worker
346*ec779b8eSAndroid Build Coastguard Worker const Vector<uint8_t> mSessionId;
347*ec779b8eSAndroid Build Coastguard Worker
348*ec779b8eSAndroid Build Coastguard Worker virtual ~DrmSessionClient();
349*ec779b8eSAndroid Build Coastguard Worker
350*ec779b8eSAndroid Build Coastguard Worker private:
351*ec779b8eSAndroid Build Coastguard Worker wp<DrmHalAidl> mDrm;
352*ec779b8eSAndroid Build Coastguard Worker
353*ec779b8eSAndroid Build Coastguard Worker DISALLOW_EVIL_CONSTRUCTORS(DrmSessionClient);
354*ec779b8eSAndroid Build Coastguard Worker };
355*ec779b8eSAndroid Build Coastguard Worker
reclaimResource(bool * _aidl_return)356*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus DrmHalAidl::DrmSessionClient::reclaimResource(bool* _aidl_return) {
357*ec779b8eSAndroid Build Coastguard Worker auto sessionId = mSessionId;
358*ec779b8eSAndroid Build Coastguard Worker sp<DrmHalAidl> drm = mDrm.promote();
359*ec779b8eSAndroid Build Coastguard Worker if (drm == NULL) {
360*ec779b8eSAndroid Build Coastguard Worker *_aidl_return = true;
361*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
362*ec779b8eSAndroid Build Coastguard Worker }
363*ec779b8eSAndroid Build Coastguard Worker status_t err = drm->closeSession(sessionId);
364*ec779b8eSAndroid Build Coastguard Worker if (err != OK) {
365*ec779b8eSAndroid Build Coastguard Worker *_aidl_return = false;
366*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
367*ec779b8eSAndroid Build Coastguard Worker }
368*ec779b8eSAndroid Build Coastguard Worker drm->onEvent(EventTypeAidl::SESSION_RECLAIMED, toHidlVec(sessionId), hidl_vec<uint8_t>());
369*ec779b8eSAndroid Build Coastguard Worker *_aidl_return = true;
370*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
371*ec779b8eSAndroid Build Coastguard Worker }
372*ec779b8eSAndroid Build Coastguard Worker
getName(::std::string * _aidl_return)373*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus DrmHalAidl::DrmSessionClient::getName(::std::string* _aidl_return) {
374*ec779b8eSAndroid Build Coastguard Worker String8 name;
375*ec779b8eSAndroid Build Coastguard Worker sp<DrmHalAidl> drm = mDrm.promote();
376*ec779b8eSAndroid Build Coastguard Worker if (drm == NULL) {
377*ec779b8eSAndroid Build Coastguard Worker name.append("<deleted>");
378*ec779b8eSAndroid Build Coastguard Worker } else if (drm->getPropertyStringInternal(String8("vendor"), name) != OK || name.empty()) {
379*ec779b8eSAndroid Build Coastguard Worker name.append("<Get vendor failed or is empty>");
380*ec779b8eSAndroid Build Coastguard Worker }
381*ec779b8eSAndroid Build Coastguard Worker name.append("[");
382*ec779b8eSAndroid Build Coastguard Worker for (size_t i = 0; i < mSessionId.size(); ++i) {
383*ec779b8eSAndroid Build Coastguard Worker name.appendFormat("%02x", mSessionId[i]);
384*ec779b8eSAndroid Build Coastguard Worker }
385*ec779b8eSAndroid Build Coastguard Worker name.append("]");
386*ec779b8eSAndroid Build Coastguard Worker *_aidl_return = name;
387*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
388*ec779b8eSAndroid Build Coastguard Worker }
389*ec779b8eSAndroid Build Coastguard Worker
~DrmSessionClient()390*ec779b8eSAndroid Build Coastguard Worker DrmHalAidl::DrmSessionClient::~DrmSessionClient() {
391*ec779b8eSAndroid Build Coastguard Worker DrmSessionManager::Instance()->removeSession(mSessionId);
392*ec779b8eSAndroid Build Coastguard Worker }
393*ec779b8eSAndroid Build Coastguard Worker
394*ec779b8eSAndroid Build Coastguard Worker // DrmHalAidl methods
DrmHalAidl()395*ec779b8eSAndroid Build Coastguard Worker DrmHalAidl::DrmHalAidl()
396*ec779b8eSAndroid Build Coastguard Worker : mMetrics(std::make_shared<MediaDrmMetrics>()),
397*ec779b8eSAndroid Build Coastguard Worker mListener(::ndk::SharedRefBase::make<DrmHalListener>(mMetrics)),
398*ec779b8eSAndroid Build Coastguard Worker mFactories(DrmUtils::makeDrmFactoriesAidl()),
399*ec779b8eSAndroid Build Coastguard Worker mInitCheck((mFactories.size() == 0) ? ERROR_UNSUPPORTED : NO_INIT) {}
400*ec779b8eSAndroid Build Coastguard Worker
initCheck() const401*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::initCheck() const {
402*ec779b8eSAndroid Build Coastguard Worker return DrmStatus(mInitCheck);
403*ec779b8eSAndroid Build Coastguard Worker }
404*ec779b8eSAndroid Build Coastguard Worker
~DrmHalAidl()405*ec779b8eSAndroid Build Coastguard Worker DrmHalAidl::~DrmHalAidl() {}
406*ec779b8eSAndroid Build Coastguard Worker
setListener(const sp<IDrmClient> & listener)407*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::setListener(const sp<IDrmClient>& listener) {
408*ec779b8eSAndroid Build Coastguard Worker mListener->setListener(listener);
409*ec779b8eSAndroid Build Coastguard Worker return DrmStatus(NO_ERROR);
410*ec779b8eSAndroid Build Coastguard Worker }
411*ec779b8eSAndroid Build Coastguard Worker
isCryptoSchemeSupported(const uint8_t uuid[16],const String8 & mimeType,DrmPlugin::SecurityLevel level,bool * isSupported)412*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::isCryptoSchemeSupported(const uint8_t uuid[16], const String8& mimeType,
413*ec779b8eSAndroid Build Coastguard Worker DrmPlugin::SecurityLevel level, bool* isSupported) {
414*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
415*ec779b8eSAndroid Build Coastguard Worker *isSupported = false;
416*ec779b8eSAndroid Build Coastguard Worker Uuid uuidAidl = DrmUtils::toAidlUuid(uuid);
417*ec779b8eSAndroid Build Coastguard Worker SecurityLevel levelAidl = toAidlSecurityLevel(level);
418*ec779b8eSAndroid Build Coastguard Worker std::string mimeTypeStr = mimeType.c_str();
419*ec779b8eSAndroid Build Coastguard Worker
420*ec779b8eSAndroid Build Coastguard Worker for (ssize_t i = mFactories.size() - 1; i >= 0; i--) {
421*ec779b8eSAndroid Build Coastguard Worker CryptoSchemes schemes{};
422*ec779b8eSAndroid Build Coastguard Worker auto err = mFactories[i]->getSupportedCryptoSchemes(&schemes);
423*ec779b8eSAndroid Build Coastguard Worker if (!err.isOk() || !std::count(schemes.uuids.begin(), schemes.uuids.end(), uuidAidl)) {
424*ec779b8eSAndroid Build Coastguard Worker continue;
425*ec779b8eSAndroid Build Coastguard Worker }
426*ec779b8eSAndroid Build Coastguard Worker
427*ec779b8eSAndroid Build Coastguard Worker ALOGV("supported schemes: %s; query: level %d mime %s",
428*ec779b8eSAndroid Build Coastguard Worker schemes.toString().c_str(), levelAidl, mimeType.c_str());
429*ec779b8eSAndroid Build Coastguard Worker std::map<std::string, SupportedContentType> contentTypes;
430*ec779b8eSAndroid Build Coastguard Worker for (auto ct : schemes.mimeTypes) {
431*ec779b8eSAndroid Build Coastguard Worker contentTypes[ct.mime] = ct;
432*ec779b8eSAndroid Build Coastguard Worker }
433*ec779b8eSAndroid Build Coastguard Worker
434*ec779b8eSAndroid Build Coastguard Worker // handle default value cases
435*ec779b8eSAndroid Build Coastguard Worker if (levelAidl == SecurityLevel::DEFAULT || levelAidl == SecurityLevel::UNKNOWN) {
436*ec779b8eSAndroid Build Coastguard Worker if (mimeType == "") {
437*ec779b8eSAndroid Build Coastguard Worker // isCryptoSchemeSupported(uuid)
438*ec779b8eSAndroid Build Coastguard Worker *isSupported = true;
439*ec779b8eSAndroid Build Coastguard Worker } else {
440*ec779b8eSAndroid Build Coastguard Worker // isCryptoSchemeSupported(uuid, mimeType)
441*ec779b8eSAndroid Build Coastguard Worker *isSupported = contentTypes.count(mimeTypeStr);
442*ec779b8eSAndroid Build Coastguard Worker }
443*ec779b8eSAndroid Build Coastguard Worker return DrmStatus(OK);
444*ec779b8eSAndroid Build Coastguard Worker } else if (mimeType == "") {
445*ec779b8eSAndroid Build Coastguard Worker return DrmStatus(BAD_VALUE);
446*ec779b8eSAndroid Build Coastguard Worker }
447*ec779b8eSAndroid Build Coastguard Worker
448*ec779b8eSAndroid Build Coastguard Worker auto ct = contentTypes[mimeTypeStr];
449*ec779b8eSAndroid Build Coastguard Worker if (levelAidl > ct.maxLevel || levelAidl < ct.minLevel) {
450*ec779b8eSAndroid Build Coastguard Worker continue;
451*ec779b8eSAndroid Build Coastguard Worker }
452*ec779b8eSAndroid Build Coastguard Worker
453*ec779b8eSAndroid Build Coastguard Worker *isSupported = true;
454*ec779b8eSAndroid Build Coastguard Worker break;
455*ec779b8eSAndroid Build Coastguard Worker }
456*ec779b8eSAndroid Build Coastguard Worker
457*ec779b8eSAndroid Build Coastguard Worker return DrmStatus(OK);
458*ec779b8eSAndroid Build Coastguard Worker }
459*ec779b8eSAndroid Build Coastguard Worker
createPlugin(const uint8_t uuid[16],const String8 & appPackageName)460*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::createPlugin(const uint8_t uuid[16], const String8& appPackageName) {
461*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
462*ec779b8eSAndroid Build Coastguard Worker if (mInitCheck == ERROR_UNSUPPORTED) return mInitCheck;
463*ec779b8eSAndroid Build Coastguard Worker Uuid uuidAidl = DrmUtils::toAidlUuid(uuid);
464*ec779b8eSAndroid Build Coastguard Worker std::string appPackageNameAidl = toStdString(appPackageName);
465*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<IDrmPluginAidl> pluginAidl;
466*ec779b8eSAndroid Build Coastguard Worker mMetrics->SetAppPackageName(appPackageName);
467*ec779b8eSAndroid Build Coastguard Worker mMetrics->SetAppUid(AIBinder_getCallingUid());
468*ec779b8eSAndroid Build Coastguard Worker for (ssize_t i = mFactories.size() - 1; i >= 0; i--) {
469*ec779b8eSAndroid Build Coastguard Worker CryptoSchemes schemes{};
470*ec779b8eSAndroid Build Coastguard Worker auto err = mFactories[i]->getSupportedCryptoSchemes(&schemes);
471*ec779b8eSAndroid Build Coastguard Worker if (!err.isOk() || !std::count(schemes.uuids.begin(), schemes.uuids.end(), uuidAidl)) {
472*ec779b8eSAndroid Build Coastguard Worker continue;
473*ec779b8eSAndroid Build Coastguard Worker }
474*ec779b8eSAndroid Build Coastguard Worker
475*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status =
476*ec779b8eSAndroid Build Coastguard Worker mFactories[i]->createDrmPlugin(uuidAidl, appPackageNameAidl, &pluginAidl);
477*ec779b8eSAndroid Build Coastguard Worker if (status.isOk()) {
478*ec779b8eSAndroid Build Coastguard Worker if (pluginAidl != NULL) {
479*ec779b8eSAndroid Build Coastguard Worker mPlugin = pluginAidl;
480*ec779b8eSAndroid Build Coastguard Worker break;
481*ec779b8eSAndroid Build Coastguard Worker }
482*ec779b8eSAndroid Build Coastguard Worker } else {
483*ec779b8eSAndroid Build Coastguard Worker DrmUtils::LOG2BE(uuid, "Failed to make drm plugin: %d",
484*ec779b8eSAndroid Build Coastguard Worker status.getServiceSpecificError());
485*ec779b8eSAndroid Build Coastguard Worker }
486*ec779b8eSAndroid Build Coastguard Worker }
487*ec779b8eSAndroid Build Coastguard Worker
488*ec779b8eSAndroid Build Coastguard Worker if (mPlugin == NULL) {
489*ec779b8eSAndroid Build Coastguard Worker DrmUtils::LOG2BE(uuid, "No supported hal instance found");
490*ec779b8eSAndroid Build Coastguard Worker mInitCheck = ERROR_UNSUPPORTED;
491*ec779b8eSAndroid Build Coastguard Worker } else {
492*ec779b8eSAndroid Build Coastguard Worker mInitCheck = OK;
493*ec779b8eSAndroid Build Coastguard Worker // Stored pointer mListener upcast to base BnDrmPluginListener
494*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin
495*ec779b8eSAndroid Build Coastguard Worker ->setListener(std::static_pointer_cast<BnDrmPluginListener>(mListener));
496*ec779b8eSAndroid Build Coastguard Worker if (!status.isOk()) {
497*ec779b8eSAndroid Build Coastguard Worker mInitCheck = DEAD_OBJECT;
498*ec779b8eSAndroid Build Coastguard Worker ALOGE("setListener failed: ex %d svc err %d",
499*ec779b8eSAndroid Build Coastguard Worker status.getExceptionCode(),
500*ec779b8eSAndroid Build Coastguard Worker status.getServiceSpecificError());
501*ec779b8eSAndroid Build Coastguard Worker }
502*ec779b8eSAndroid Build Coastguard Worker
503*ec779b8eSAndroid Build Coastguard Worker if (mInitCheck != OK) {
504*ec779b8eSAndroid Build Coastguard Worker mPlugin.reset();
505*ec779b8eSAndroid Build Coastguard Worker }
506*ec779b8eSAndroid Build Coastguard Worker }
507*ec779b8eSAndroid Build Coastguard Worker
508*ec779b8eSAndroid Build Coastguard Worker return DrmStatus(mInitCheck);
509*ec779b8eSAndroid Build Coastguard Worker }
510*ec779b8eSAndroid Build Coastguard Worker
openSession(DrmPlugin::SecurityLevel level,Vector<uint8_t> & sessionId)511*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::openSession(DrmPlugin::SecurityLevel level, Vector<uint8_t>& sessionId) {
512*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
513*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
514*ec779b8eSAndroid Build Coastguard Worker
515*ec779b8eSAndroid Build Coastguard Worker SecurityLevel aSecurityLevel = toAidlSecurityLevel(level);
516*ec779b8eSAndroid Build Coastguard Worker
517*ec779b8eSAndroid Build Coastguard Worker if (aSecurityLevel == SecurityLevel::UNKNOWN) {
518*ec779b8eSAndroid Build Coastguard Worker return ERROR_DRM_CANNOT_HANDLE;
519*ec779b8eSAndroid Build Coastguard Worker }
520*ec779b8eSAndroid Build Coastguard Worker
521*ec779b8eSAndroid Build Coastguard Worker DrmStatus err = UNKNOWN_ERROR;
522*ec779b8eSAndroid Build Coastguard Worker bool retry = true;
523*ec779b8eSAndroid Build Coastguard Worker do {
524*ec779b8eSAndroid Build Coastguard Worker std::vector<uint8_t> aSessionId;
525*ec779b8eSAndroid Build Coastguard Worker
526*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->openSession(aSecurityLevel, &aSessionId);
527*ec779b8eSAndroid Build Coastguard Worker if (status.isOk()) sessionId = toVector(aSessionId);
528*ec779b8eSAndroid Build Coastguard Worker err = statusAidlToDrmStatus(status);
529*ec779b8eSAndroid Build Coastguard Worker
530*ec779b8eSAndroid Build Coastguard Worker if (err == ERROR_DRM_RESOURCE_BUSY && retry) {
531*ec779b8eSAndroid Build Coastguard Worker mLock.unlock();
532*ec779b8eSAndroid Build Coastguard Worker // reclaimSession may call back to closeSession, since mLock is
533*ec779b8eSAndroid Build Coastguard Worker // shared between Drm instances, we should unlock here to avoid
534*ec779b8eSAndroid Build Coastguard Worker // deadlock.
535*ec779b8eSAndroid Build Coastguard Worker retry = DrmSessionManager::Instance()->reclaimSession(AIBinder_getCallingPid());
536*ec779b8eSAndroid Build Coastguard Worker mLock.lock();
537*ec779b8eSAndroid Build Coastguard Worker } else {
538*ec779b8eSAndroid Build Coastguard Worker retry = false;
539*ec779b8eSAndroid Build Coastguard Worker }
540*ec779b8eSAndroid Build Coastguard Worker } while (retry);
541*ec779b8eSAndroid Build Coastguard Worker
542*ec779b8eSAndroid Build Coastguard Worker if (err == OK) {
543*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<DrmSessionClient> client =
544*ec779b8eSAndroid Build Coastguard Worker ndk::SharedRefBase::make<DrmSessionClient>(this, sessionId);
545*ec779b8eSAndroid Build Coastguard Worker DrmSessionManager::Instance()->addSession(
546*ec779b8eSAndroid Build Coastguard Worker AIBinder_getCallingPid(), std::static_pointer_cast<IResourceManagerClient>(client),
547*ec779b8eSAndroid Build Coastguard Worker sessionId);
548*ec779b8eSAndroid Build Coastguard Worker mOpenSessions.push_back(client);
549*ec779b8eSAndroid Build Coastguard Worker mMetrics->SetSessionStart(sessionId);
550*ec779b8eSAndroid Build Coastguard Worker }
551*ec779b8eSAndroid Build Coastguard Worker
552*ec779b8eSAndroid Build Coastguard Worker mMetrics->mOpenSessionCounter.Increment(err);
553*ec779b8eSAndroid Build Coastguard Worker return err;
554*ec779b8eSAndroid Build Coastguard Worker }
555*ec779b8eSAndroid Build Coastguard Worker
closeSession(Vector<uint8_t> const & sessionId)556*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::closeSession(Vector<uint8_t> const& sessionId) {
557*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
558*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
559*ec779b8eSAndroid Build Coastguard Worker
560*ec779b8eSAndroid Build Coastguard Worker std::vector<uint8_t> sessionIdAidl = toStdVec(sessionId);
561*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->closeSession(sessionIdAidl);
562*ec779b8eSAndroid Build Coastguard Worker DrmStatus response = statusAidlToDrmStatus(status);
563*ec779b8eSAndroid Build Coastguard Worker if (status.isOk()) {
564*ec779b8eSAndroid Build Coastguard Worker DrmSessionManager::Instance()->removeSession(sessionId);
565*ec779b8eSAndroid Build Coastguard Worker for (auto i = mOpenSessions.begin(); i != mOpenSessions.end(); i++) {
566*ec779b8eSAndroid Build Coastguard Worker if (isEqualSessionId((*i)->mSessionId, sessionId)) {
567*ec779b8eSAndroid Build Coastguard Worker mOpenSessions.erase(i);
568*ec779b8eSAndroid Build Coastguard Worker break;
569*ec779b8eSAndroid Build Coastguard Worker }
570*ec779b8eSAndroid Build Coastguard Worker }
571*ec779b8eSAndroid Build Coastguard Worker
572*ec779b8eSAndroid Build Coastguard Worker mMetrics->SetSessionEnd(sessionId);
573*ec779b8eSAndroid Build Coastguard Worker }
574*ec779b8eSAndroid Build Coastguard Worker
575*ec779b8eSAndroid Build Coastguard Worker mMetrics->mCloseSessionCounter.Increment(response);
576*ec779b8eSAndroid Build Coastguard Worker return response;
577*ec779b8eSAndroid Build Coastguard Worker }
578*ec779b8eSAndroid Build Coastguard Worker
getKeyRequest(Vector<uint8_t> const & sessionId,Vector<uint8_t> const & initData,String8 const & mimeType,DrmPlugin::KeyType keyType,KeyedVector<String8,String8> const & optionalParameters,Vector<uint8_t> & request,String8 & defaultUrl,DrmPlugin::KeyRequestType * keyRequestType)579*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::getKeyRequest(Vector<uint8_t> const& sessionId,
580*ec779b8eSAndroid Build Coastguard Worker Vector<uint8_t> const& initData, String8 const& mimeType,
581*ec779b8eSAndroid Build Coastguard Worker DrmPlugin::KeyType keyType,
582*ec779b8eSAndroid Build Coastguard Worker KeyedVector<String8, String8> const& optionalParameters,
583*ec779b8eSAndroid Build Coastguard Worker Vector<uint8_t>& request, String8& defaultUrl,
584*ec779b8eSAndroid Build Coastguard Worker DrmPlugin::KeyRequestType* keyRequestType) {
585*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
586*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
587*ec779b8eSAndroid Build Coastguard Worker EventTimer<status_t> keyRequestTimer(&mMetrics->mGetKeyRequestTimeUs);
588*ec779b8eSAndroid Build Coastguard Worker
589*ec779b8eSAndroid Build Coastguard Worker DrmSessionManager::Instance()->useSession(sessionId);
590*ec779b8eSAndroid Build Coastguard Worker
591*ec779b8eSAndroid Build Coastguard Worker KeyType aKeyType;
592*ec779b8eSAndroid Build Coastguard Worker if (keyType == DrmPlugin::kKeyType_Streaming) {
593*ec779b8eSAndroid Build Coastguard Worker aKeyType = KeyType::STREAMING;
594*ec779b8eSAndroid Build Coastguard Worker } else if (keyType == DrmPlugin::kKeyType_Offline) {
595*ec779b8eSAndroid Build Coastguard Worker aKeyType = KeyType::OFFLINE;
596*ec779b8eSAndroid Build Coastguard Worker } else if (keyType == DrmPlugin::kKeyType_Release) {
597*ec779b8eSAndroid Build Coastguard Worker aKeyType = KeyType::RELEASE;
598*ec779b8eSAndroid Build Coastguard Worker } else {
599*ec779b8eSAndroid Build Coastguard Worker keyRequestTimer.SetAttribute(BAD_VALUE);
600*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
601*ec779b8eSAndroid Build Coastguard Worker }
602*ec779b8eSAndroid Build Coastguard Worker
603*ec779b8eSAndroid Build Coastguard Worker DrmStatus err = UNKNOWN_ERROR;
604*ec779b8eSAndroid Build Coastguard Worker
605*ec779b8eSAndroid Build Coastguard Worker std::vector<uint8_t> sessionIdAidl = toStdVec(sessionId);
606*ec779b8eSAndroid Build Coastguard Worker std::vector<uint8_t> initDataAidl = toStdVec(initData);
607*ec779b8eSAndroid Build Coastguard Worker KeyRequest keyRequest;
608*ec779b8eSAndroid Build Coastguard Worker
609*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status =
610*ec779b8eSAndroid Build Coastguard Worker mPlugin->getKeyRequest(sessionIdAidl, initDataAidl, toStdString(mimeType), aKeyType,
611*ec779b8eSAndroid Build Coastguard Worker toKeyValueVector(optionalParameters), &keyRequest);
612*ec779b8eSAndroid Build Coastguard Worker if (status.isOk()) {
613*ec779b8eSAndroid Build Coastguard Worker request = toVector(keyRequest.request);
614*ec779b8eSAndroid Build Coastguard Worker defaultUrl = toString8(keyRequest.defaultUrl);
615*ec779b8eSAndroid Build Coastguard Worker *keyRequestType = toKeyRequestType(keyRequest.requestType);
616*ec779b8eSAndroid Build Coastguard Worker }
617*ec779b8eSAndroid Build Coastguard Worker
618*ec779b8eSAndroid Build Coastguard Worker err = statusAidlToDrmStatus(status);
619*ec779b8eSAndroid Build Coastguard Worker keyRequestTimer.SetAttribute(err);
620*ec779b8eSAndroid Build Coastguard Worker return err;
621*ec779b8eSAndroid Build Coastguard Worker }
622*ec779b8eSAndroid Build Coastguard Worker
provideKeyResponse(Vector<uint8_t> const & sessionId,Vector<uint8_t> const & response,Vector<uint8_t> & keySetId)623*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::provideKeyResponse(Vector<uint8_t> const& sessionId,
624*ec779b8eSAndroid Build Coastguard Worker Vector<uint8_t> const& response,
625*ec779b8eSAndroid Build Coastguard Worker Vector<uint8_t>& keySetId) {
626*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
627*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
628*ec779b8eSAndroid Build Coastguard Worker EventTimer<status_t> keyResponseTimer(&mMetrics->mProvideKeyResponseTimeUs);
629*ec779b8eSAndroid Build Coastguard Worker
630*ec779b8eSAndroid Build Coastguard Worker DrmSessionManager::Instance()->useSession(sessionId);
631*ec779b8eSAndroid Build Coastguard Worker
632*ec779b8eSAndroid Build Coastguard Worker DrmStatus err = UNKNOWN_ERROR;
633*ec779b8eSAndroid Build Coastguard Worker
634*ec779b8eSAndroid Build Coastguard Worker std::vector<uint8_t> sessionIdAidl = toStdVec(sessionId);
635*ec779b8eSAndroid Build Coastguard Worker std::vector<uint8_t> responseAidl = toStdVec(response);
636*ec779b8eSAndroid Build Coastguard Worker KeySetId keySetIdsAidl;
637*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status =
638*ec779b8eSAndroid Build Coastguard Worker mPlugin->provideKeyResponse(sessionIdAidl, responseAidl, &keySetIdsAidl);
639*ec779b8eSAndroid Build Coastguard Worker
640*ec779b8eSAndroid Build Coastguard Worker if (status.isOk()) keySetId = toVector(keySetIdsAidl.keySetId);
641*ec779b8eSAndroid Build Coastguard Worker err = statusAidlToDrmStatus(status);
642*ec779b8eSAndroid Build Coastguard Worker keyResponseTimer.SetAttribute(err);
643*ec779b8eSAndroid Build Coastguard Worker return err;
644*ec779b8eSAndroid Build Coastguard Worker }
645*ec779b8eSAndroid Build Coastguard Worker
removeKeys(Vector<uint8_t> const & keySetId)646*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::removeKeys(Vector<uint8_t> const& keySetId) {
647*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
648*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
649*ec779b8eSAndroid Build Coastguard Worker
650*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->removeKeys(toStdVec(keySetId));
651*ec779b8eSAndroid Build Coastguard Worker return statusAidlToDrmStatus(status);
652*ec779b8eSAndroid Build Coastguard Worker }
653*ec779b8eSAndroid Build Coastguard Worker
restoreKeys(Vector<uint8_t> const & sessionId,Vector<uint8_t> const & keySetId)654*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::restoreKeys(Vector<uint8_t> const& sessionId,
655*ec779b8eSAndroid Build Coastguard Worker Vector<uint8_t> const& keySetId) {
656*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
657*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
658*ec779b8eSAndroid Build Coastguard Worker
659*ec779b8eSAndroid Build Coastguard Worker DrmSessionManager::Instance()->useSession(sessionId);
660*ec779b8eSAndroid Build Coastguard Worker
661*ec779b8eSAndroid Build Coastguard Worker KeySetId keySetIdsAidl;
662*ec779b8eSAndroid Build Coastguard Worker keySetIdsAidl.keySetId = toStdVec(keySetId);
663*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->restoreKeys(toStdVec(sessionId), keySetIdsAidl);
664*ec779b8eSAndroid Build Coastguard Worker return statusAidlToDrmStatus(status);
665*ec779b8eSAndroid Build Coastguard Worker }
666*ec779b8eSAndroid Build Coastguard Worker
queryKeyStatus(Vector<uint8_t> const & sessionId,KeyedVector<String8,String8> & infoMap) const667*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::queryKeyStatus(Vector<uint8_t> const& sessionId,
668*ec779b8eSAndroid Build Coastguard Worker KeyedVector<String8, String8>& infoMap) const {
669*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
670*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
671*ec779b8eSAndroid Build Coastguard Worker
672*ec779b8eSAndroid Build Coastguard Worker DrmSessionManager::Instance()->useSession(sessionId);
673*ec779b8eSAndroid Build Coastguard Worker
674*ec779b8eSAndroid Build Coastguard Worker std::vector<KeyValue> infoMapAidl;
675*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->queryKeyStatus(toStdVec(sessionId), &infoMapAidl);
676*ec779b8eSAndroid Build Coastguard Worker
677*ec779b8eSAndroid Build Coastguard Worker infoMap = toKeyedVector(infoMapAidl);
678*ec779b8eSAndroid Build Coastguard Worker
679*ec779b8eSAndroid Build Coastguard Worker return statusAidlToDrmStatus(status);
680*ec779b8eSAndroid Build Coastguard Worker }
681*ec779b8eSAndroid Build Coastguard Worker
getProvisionRequest(String8 const & certType,String8 const & certAuthority,Vector<uint8_t> & request,String8 & defaultUrl)682*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::getProvisionRequest(String8 const& certType, String8 const& certAuthority,
683*ec779b8eSAndroid Build Coastguard Worker Vector<uint8_t>& request, String8& defaultUrl) {
684*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
685*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
686*ec779b8eSAndroid Build Coastguard Worker
687*ec779b8eSAndroid Build Coastguard Worker DrmStatus err = UNKNOWN_ERROR;
688*ec779b8eSAndroid Build Coastguard Worker
689*ec779b8eSAndroid Build Coastguard Worker ProvisionRequest requestAidl;
690*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->getProvisionRequest(
691*ec779b8eSAndroid Build Coastguard Worker toStdString(certType), toStdString(certAuthority), &requestAidl);
692*ec779b8eSAndroid Build Coastguard Worker
693*ec779b8eSAndroid Build Coastguard Worker request = toVector(requestAidl.request);
694*ec779b8eSAndroid Build Coastguard Worker defaultUrl = toString8(requestAidl.defaultUrl);
695*ec779b8eSAndroid Build Coastguard Worker
696*ec779b8eSAndroid Build Coastguard Worker err = statusAidlToDrmStatus(status);
697*ec779b8eSAndroid Build Coastguard Worker mMetrics->mGetProvisionRequestCounter.Increment(err);
698*ec779b8eSAndroid Build Coastguard Worker return err;
699*ec779b8eSAndroid Build Coastguard Worker }
700*ec779b8eSAndroid Build Coastguard Worker
provideProvisionResponse(Vector<uint8_t> const & response,Vector<uint8_t> & certificate,Vector<uint8_t> & wrappedKey)701*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::provideProvisionResponse(Vector<uint8_t> const& response,
702*ec779b8eSAndroid Build Coastguard Worker Vector<uint8_t>& certificate,
703*ec779b8eSAndroid Build Coastguard Worker Vector<uint8_t>& wrappedKey) {
704*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
705*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
706*ec779b8eSAndroid Build Coastguard Worker
707*ec779b8eSAndroid Build Coastguard Worker DrmStatus err = UNKNOWN_ERROR;
708*ec779b8eSAndroid Build Coastguard Worker ProvideProvisionResponseResult result;
709*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->provideProvisionResponse(toStdVec(response), &result);
710*ec779b8eSAndroid Build Coastguard Worker
711*ec779b8eSAndroid Build Coastguard Worker certificate = toVector(result.certificate);
712*ec779b8eSAndroid Build Coastguard Worker wrappedKey = toVector(result.wrappedKey);
713*ec779b8eSAndroid Build Coastguard Worker err = statusAidlToDrmStatus(status);
714*ec779b8eSAndroid Build Coastguard Worker mMetrics->mProvideProvisionResponseCounter.Increment(err);
715*ec779b8eSAndroid Build Coastguard Worker return err;
716*ec779b8eSAndroid Build Coastguard Worker }
717*ec779b8eSAndroid Build Coastguard Worker
getSecureStops(List<Vector<uint8_t>> & secureStops)718*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::getSecureStops(List<Vector<uint8_t>>& secureStops) {
719*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
720*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
721*ec779b8eSAndroid Build Coastguard Worker
722*ec779b8eSAndroid Build Coastguard Worker std::vector<SecureStop> result;
723*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->getSecureStops(&result);
724*ec779b8eSAndroid Build Coastguard Worker
725*ec779b8eSAndroid Build Coastguard Worker secureStops = toSecureStops(result);
726*ec779b8eSAndroid Build Coastguard Worker
727*ec779b8eSAndroid Build Coastguard Worker return statusAidlToDrmStatus(status);
728*ec779b8eSAndroid Build Coastguard Worker }
729*ec779b8eSAndroid Build Coastguard Worker
getSecureStopIds(List<Vector<uint8_t>> & secureStopIds)730*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::getSecureStopIds(List<Vector<uint8_t>>& secureStopIds) {
731*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
732*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
733*ec779b8eSAndroid Build Coastguard Worker
734*ec779b8eSAndroid Build Coastguard Worker std::vector<SecureStopId> result;
735*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->getSecureStopIds(&result);
736*ec779b8eSAndroid Build Coastguard Worker
737*ec779b8eSAndroid Build Coastguard Worker secureStopIds = toSecureStopIds(result);
738*ec779b8eSAndroid Build Coastguard Worker
739*ec779b8eSAndroid Build Coastguard Worker return statusAidlToDrmStatus(status);
740*ec779b8eSAndroid Build Coastguard Worker }
741*ec779b8eSAndroid Build Coastguard Worker
getSecureStop(Vector<uint8_t> const & ssid,Vector<uint8_t> & secureStop)742*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::getSecureStop(Vector<uint8_t> const& ssid, Vector<uint8_t>& secureStop) {
743*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
744*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
745*ec779b8eSAndroid Build Coastguard Worker
746*ec779b8eSAndroid Build Coastguard Worker SecureStopId ssidAidl;
747*ec779b8eSAndroid Build Coastguard Worker ssidAidl.secureStopId = toStdVec(ssid);
748*ec779b8eSAndroid Build Coastguard Worker
749*ec779b8eSAndroid Build Coastguard Worker SecureStop result;
750*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->getSecureStop(ssidAidl, &result);
751*ec779b8eSAndroid Build Coastguard Worker
752*ec779b8eSAndroid Build Coastguard Worker secureStop = toVector(result.opaqueData);
753*ec779b8eSAndroid Build Coastguard Worker
754*ec779b8eSAndroid Build Coastguard Worker return statusAidlToDrmStatus(status);
755*ec779b8eSAndroid Build Coastguard Worker }
756*ec779b8eSAndroid Build Coastguard Worker
releaseSecureStops(Vector<uint8_t> const & ssRelease)757*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::releaseSecureStops(Vector<uint8_t> const& ssRelease) {
758*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
759*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
760*ec779b8eSAndroid Build Coastguard Worker
761*ec779b8eSAndroid Build Coastguard Worker OpaqueData ssId;
762*ec779b8eSAndroid Build Coastguard Worker ssId.opaqueData = toStdVec(ssRelease);
763*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->releaseSecureStops(ssId);
764*ec779b8eSAndroid Build Coastguard Worker
765*ec779b8eSAndroid Build Coastguard Worker return statusAidlToDrmStatus(status);
766*ec779b8eSAndroid Build Coastguard Worker }
767*ec779b8eSAndroid Build Coastguard Worker
removeSecureStop(Vector<uint8_t> const & ssid)768*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::removeSecureStop(Vector<uint8_t> const& ssid) {
769*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
770*ec779b8eSAndroid Build Coastguard Worker
771*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
772*ec779b8eSAndroid Build Coastguard Worker
773*ec779b8eSAndroid Build Coastguard Worker SecureStopId ssidAidl;
774*ec779b8eSAndroid Build Coastguard Worker ssidAidl.secureStopId = toStdVec(ssid);
775*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->removeSecureStop(ssidAidl);
776*ec779b8eSAndroid Build Coastguard Worker return statusAidlToDrmStatus(status);
777*ec779b8eSAndroid Build Coastguard Worker }
778*ec779b8eSAndroid Build Coastguard Worker
removeAllSecureStops()779*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::removeAllSecureStops() {
780*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
781*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
782*ec779b8eSAndroid Build Coastguard Worker
783*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->releaseAllSecureStops();
784*ec779b8eSAndroid Build Coastguard Worker return statusAidlToDrmStatus(status);
785*ec779b8eSAndroid Build Coastguard Worker }
786*ec779b8eSAndroid Build Coastguard Worker
getHdcpLevels(DrmPlugin::HdcpLevel * connected,DrmPlugin::HdcpLevel * max) const787*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::getHdcpLevels(DrmPlugin::HdcpLevel* connected,
788*ec779b8eSAndroid Build Coastguard Worker DrmPlugin::HdcpLevel* max) const {
789*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
790*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
791*ec779b8eSAndroid Build Coastguard Worker
792*ec779b8eSAndroid Build Coastguard Worker if (connected == NULL || max == NULL) {
793*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
794*ec779b8eSAndroid Build Coastguard Worker }
795*ec779b8eSAndroid Build Coastguard Worker
796*ec779b8eSAndroid Build Coastguard Worker *connected = DrmPlugin::kHdcpLevelUnknown;
797*ec779b8eSAndroid Build Coastguard Worker *max = DrmPlugin::kHdcpLevelUnknown;
798*ec779b8eSAndroid Build Coastguard Worker
799*ec779b8eSAndroid Build Coastguard Worker HdcpLevels lvlsAidl;
800*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->getHdcpLevels(&lvlsAidl);
801*ec779b8eSAndroid Build Coastguard Worker
802*ec779b8eSAndroid Build Coastguard Worker *connected = toHdcpLevel(lvlsAidl.connectedLevel);
803*ec779b8eSAndroid Build Coastguard Worker *max = toHdcpLevel(lvlsAidl.maxLevel);
804*ec779b8eSAndroid Build Coastguard Worker
805*ec779b8eSAndroid Build Coastguard Worker return statusAidlToDrmStatus(status);
806*ec779b8eSAndroid Build Coastguard Worker }
807*ec779b8eSAndroid Build Coastguard Worker
getNumberOfSessions(uint32_t * open,uint32_t * max) const808*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::getNumberOfSessions(uint32_t* open, uint32_t* max) const {
809*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
810*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
811*ec779b8eSAndroid Build Coastguard Worker
812*ec779b8eSAndroid Build Coastguard Worker if (open == NULL || max == NULL) {
813*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
814*ec779b8eSAndroid Build Coastguard Worker }
815*ec779b8eSAndroid Build Coastguard Worker
816*ec779b8eSAndroid Build Coastguard Worker *open = 0;
817*ec779b8eSAndroid Build Coastguard Worker *max = 0;
818*ec779b8eSAndroid Build Coastguard Worker
819*ec779b8eSAndroid Build Coastguard Worker NumberOfSessions result;
820*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->getNumberOfSessions(&result);
821*ec779b8eSAndroid Build Coastguard Worker
822*ec779b8eSAndroid Build Coastguard Worker *open = result.currentSessions;
823*ec779b8eSAndroid Build Coastguard Worker *max = result.maxSessions;
824*ec779b8eSAndroid Build Coastguard Worker
825*ec779b8eSAndroid Build Coastguard Worker return statusAidlToDrmStatus(status);
826*ec779b8eSAndroid Build Coastguard Worker }
827*ec779b8eSAndroid Build Coastguard Worker
getSecurityLevel(Vector<uint8_t> const & sessionId,DrmPlugin::SecurityLevel * level) const828*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::getSecurityLevel(Vector<uint8_t> const& sessionId,
829*ec779b8eSAndroid Build Coastguard Worker DrmPlugin::SecurityLevel* level) const {
830*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
831*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
832*ec779b8eSAndroid Build Coastguard Worker
833*ec779b8eSAndroid Build Coastguard Worker if (level == NULL) {
834*ec779b8eSAndroid Build Coastguard Worker return BAD_VALUE;
835*ec779b8eSAndroid Build Coastguard Worker }
836*ec779b8eSAndroid Build Coastguard Worker
837*ec779b8eSAndroid Build Coastguard Worker *level = DrmPlugin::kSecurityLevelUnknown;
838*ec779b8eSAndroid Build Coastguard Worker
839*ec779b8eSAndroid Build Coastguard Worker SecurityLevel result;
840*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->getSecurityLevel(toStdVec(sessionId), &result);
841*ec779b8eSAndroid Build Coastguard Worker
842*ec779b8eSAndroid Build Coastguard Worker *level = toSecurityLevel(result);
843*ec779b8eSAndroid Build Coastguard Worker
844*ec779b8eSAndroid Build Coastguard Worker return statusAidlToDrmStatus(status);
845*ec779b8eSAndroid Build Coastguard Worker }
846*ec779b8eSAndroid Build Coastguard Worker
getOfflineLicenseKeySetIds(List<Vector<uint8_t>> & keySetIds) const847*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::getOfflineLicenseKeySetIds(List<Vector<uint8_t>>& keySetIds) const {
848*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
849*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
850*ec779b8eSAndroid Build Coastguard Worker
851*ec779b8eSAndroid Build Coastguard Worker std::vector<KeySetId> result;
852*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->getOfflineLicenseKeySetIds(&result);
853*ec779b8eSAndroid Build Coastguard Worker
854*ec779b8eSAndroid Build Coastguard Worker keySetIds = toKeySetIds(result);
855*ec779b8eSAndroid Build Coastguard Worker
856*ec779b8eSAndroid Build Coastguard Worker return statusAidlToDrmStatus(status);
857*ec779b8eSAndroid Build Coastguard Worker }
858*ec779b8eSAndroid Build Coastguard Worker
removeOfflineLicense(Vector<uint8_t> const & keySetId)859*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::removeOfflineLicense(Vector<uint8_t> const& keySetId) {
860*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
861*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
862*ec779b8eSAndroid Build Coastguard Worker
863*ec779b8eSAndroid Build Coastguard Worker KeySetId keySetIdAidl;
864*ec779b8eSAndroid Build Coastguard Worker keySetIdAidl.keySetId = toStdVec(keySetId);
865*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->removeOfflineLicense(keySetIdAidl);
866*ec779b8eSAndroid Build Coastguard Worker return statusAidlToDrmStatus(status);
867*ec779b8eSAndroid Build Coastguard Worker }
868*ec779b8eSAndroid Build Coastguard Worker
getOfflineLicenseState(Vector<uint8_t> const & keySetId,DrmPlugin::OfflineLicenseState * licenseState) const869*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::getOfflineLicenseState(Vector<uint8_t> const& keySetId,
870*ec779b8eSAndroid Build Coastguard Worker DrmPlugin::OfflineLicenseState* licenseState) const {
871*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
872*ec779b8eSAndroid Build Coastguard Worker
873*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
874*ec779b8eSAndroid Build Coastguard Worker *licenseState = DrmPlugin::kOfflineLicenseStateUnknown;
875*ec779b8eSAndroid Build Coastguard Worker
876*ec779b8eSAndroid Build Coastguard Worker KeySetId keySetIdAidl;
877*ec779b8eSAndroid Build Coastguard Worker keySetIdAidl.keySetId = toStdVec(keySetId);
878*ec779b8eSAndroid Build Coastguard Worker
879*ec779b8eSAndroid Build Coastguard Worker OfflineLicenseState result;
880*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->getOfflineLicenseState(keySetIdAidl, &result);
881*ec779b8eSAndroid Build Coastguard Worker
882*ec779b8eSAndroid Build Coastguard Worker *licenseState = toOfflineLicenseState(result);
883*ec779b8eSAndroid Build Coastguard Worker
884*ec779b8eSAndroid Build Coastguard Worker return statusAidlToDrmStatus(status);
885*ec779b8eSAndroid Build Coastguard Worker }
886*ec779b8eSAndroid Build Coastguard Worker
getPropertyString(String8 const & name,String8 & value) const887*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::getPropertyString(String8 const& name, String8& value) const {
888*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
889*ec779b8eSAndroid Build Coastguard Worker return DrmStatus(getPropertyStringInternal(name, value));
890*ec779b8eSAndroid Build Coastguard Worker }
891*ec779b8eSAndroid Build Coastguard Worker
getPropertyStringInternal(String8 const & name,String8 & value) const892*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::getPropertyStringInternal(String8 const& name, String8& value) const {
893*ec779b8eSAndroid Build Coastguard Worker // This function is internal to the class and should only be called while
894*ec779b8eSAndroid Build Coastguard Worker // mLock is already held.
895*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
896*ec779b8eSAndroid Build Coastguard Worker
897*ec779b8eSAndroid Build Coastguard Worker std::string result;
898*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->getPropertyString(toStdString(name), &result);
899*ec779b8eSAndroid Build Coastguard Worker
900*ec779b8eSAndroid Build Coastguard Worker value = toString8(result);
901*ec779b8eSAndroid Build Coastguard Worker
902*ec779b8eSAndroid Build Coastguard Worker return statusAidlToDrmStatus(status);
903*ec779b8eSAndroid Build Coastguard Worker }
904*ec779b8eSAndroid Build Coastguard Worker
getPropertyByteArray(String8 const & name,Vector<uint8_t> & value) const905*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::getPropertyByteArray(String8 const& name, Vector<uint8_t>& value) const {
906*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
907*ec779b8eSAndroid Build Coastguard Worker return DrmStatus(getPropertyByteArrayInternal(name, value));
908*ec779b8eSAndroid Build Coastguard Worker }
909*ec779b8eSAndroid Build Coastguard Worker
getPropertyByteArrayInternal(String8 const & name,Vector<uint8_t> & value) const910*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::getPropertyByteArrayInternal(String8 const& name,
911*ec779b8eSAndroid Build Coastguard Worker Vector<uint8_t>& value) const {
912*ec779b8eSAndroid Build Coastguard Worker // This function is internal to the class and should only be called while
913*ec779b8eSAndroid Build Coastguard Worker // mLock is already held.
914*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
915*ec779b8eSAndroid Build Coastguard Worker
916*ec779b8eSAndroid Build Coastguard Worker DrmStatus err = UNKNOWN_ERROR;
917*ec779b8eSAndroid Build Coastguard Worker
918*ec779b8eSAndroid Build Coastguard Worker std::vector<uint8_t> result;
919*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->getPropertyByteArray(toStdString(name), &result);
920*ec779b8eSAndroid Build Coastguard Worker
921*ec779b8eSAndroid Build Coastguard Worker value = toVector(result);
922*ec779b8eSAndroid Build Coastguard Worker err = statusAidlToDrmStatus(status);
923*ec779b8eSAndroid Build Coastguard Worker if (name == kPropertyDeviceUniqueId) {
924*ec779b8eSAndroid Build Coastguard Worker mMetrics->mGetDeviceUniqueIdCounter.Increment(err);
925*ec779b8eSAndroid Build Coastguard Worker }
926*ec779b8eSAndroid Build Coastguard Worker return err;
927*ec779b8eSAndroid Build Coastguard Worker }
928*ec779b8eSAndroid Build Coastguard Worker
setPropertyString(String8 const & name,String8 const & value) const929*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::setPropertyString(String8 const& name, String8 const& value) const {
930*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
931*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
932*ec779b8eSAndroid Build Coastguard Worker
933*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->setPropertyString(toStdString(name), toStdString(value));
934*ec779b8eSAndroid Build Coastguard Worker return statusAidlToDrmStatus(status);
935*ec779b8eSAndroid Build Coastguard Worker }
936*ec779b8eSAndroid Build Coastguard Worker
setPropertyByteArray(String8 const & name,Vector<uint8_t> const & value) const937*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::setPropertyByteArray(String8 const& name,
938*ec779b8eSAndroid Build Coastguard Worker Vector<uint8_t> const& value) const {
939*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
940*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
941*ec779b8eSAndroid Build Coastguard Worker
942*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->setPropertyByteArray(toStdString(name), toStdVec(value));
943*ec779b8eSAndroid Build Coastguard Worker return statusAidlToDrmStatus(status);
944*ec779b8eSAndroid Build Coastguard Worker }
945*ec779b8eSAndroid Build Coastguard Worker
getMetrics(const sp<IDrmMetricsConsumer> & consumer)946*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::getMetrics(const sp<IDrmMetricsConsumer>& consumer) {
947*ec779b8eSAndroid Build Coastguard Worker if (consumer == nullptr) {
948*ec779b8eSAndroid Build Coastguard Worker return DrmStatus(UNEXPECTED_NULL);
949*ec779b8eSAndroid Build Coastguard Worker }
950*ec779b8eSAndroid Build Coastguard Worker consumer->consumeFrameworkMetrics(*mMetrics.get());
951*ec779b8eSAndroid Build Coastguard Worker
952*ec779b8eSAndroid Build Coastguard Worker // Append vendor metrics if they are supported.
953*ec779b8eSAndroid Build Coastguard Worker
954*ec779b8eSAndroid Build Coastguard Worker String8 vendor;
955*ec779b8eSAndroid Build Coastguard Worker String8 description;
956*ec779b8eSAndroid Build Coastguard Worker if (getPropertyStringInternal(String8("vendor"), vendor) != OK || vendor.empty()) {
957*ec779b8eSAndroid Build Coastguard Worker ALOGE("Get vendor failed or is empty");
958*ec779b8eSAndroid Build Coastguard Worker vendor = "NONE";
959*ec779b8eSAndroid Build Coastguard Worker }
960*ec779b8eSAndroid Build Coastguard Worker if (getPropertyStringInternal(String8("description"), description) != OK ||
961*ec779b8eSAndroid Build Coastguard Worker description.empty()) {
962*ec779b8eSAndroid Build Coastguard Worker ALOGE("Get description failed or is empty.");
963*ec779b8eSAndroid Build Coastguard Worker description = "NONE";
964*ec779b8eSAndroid Build Coastguard Worker }
965*ec779b8eSAndroid Build Coastguard Worker vendor += ".";
966*ec779b8eSAndroid Build Coastguard Worker vendor += description;
967*ec779b8eSAndroid Build Coastguard Worker
968*ec779b8eSAndroid Build Coastguard Worker hidl_vec<DrmMetricGroupHidl> pluginMetrics;
969*ec779b8eSAndroid Build Coastguard Worker DrmStatus err = UNKNOWN_ERROR;
970*ec779b8eSAndroid Build Coastguard Worker
971*ec779b8eSAndroid Build Coastguard Worker std::vector<DrmMetricGroupAidl> result;
972*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->getMetrics(&result);
973*ec779b8eSAndroid Build Coastguard Worker
974*ec779b8eSAndroid Build Coastguard Worker if (status.isOk()) {
975*ec779b8eSAndroid Build Coastguard Worker pluginMetrics = toDrmMetricGroupHidl(result);
976*ec779b8eSAndroid Build Coastguard Worker consumer->consumeHidlMetrics(vendor, pluginMetrics);
977*ec779b8eSAndroid Build Coastguard Worker }
978*ec779b8eSAndroid Build Coastguard Worker
979*ec779b8eSAndroid Build Coastguard Worker err = statusAidlToDrmStatus(status);
980*ec779b8eSAndroid Build Coastguard Worker
981*ec779b8eSAndroid Build Coastguard Worker return err;
982*ec779b8eSAndroid Build Coastguard Worker }
983*ec779b8eSAndroid Build Coastguard Worker
setCipherAlgorithm(Vector<uint8_t> const & sessionId,String8 const & algorithm)984*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::setCipherAlgorithm(Vector<uint8_t> const& sessionId,
985*ec779b8eSAndroid Build Coastguard Worker String8 const& algorithm) {
986*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
987*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
988*ec779b8eSAndroid Build Coastguard Worker
989*ec779b8eSAndroid Build Coastguard Worker DrmSessionManager::Instance()->useSession(sessionId);
990*ec779b8eSAndroid Build Coastguard Worker
991*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status =
992*ec779b8eSAndroid Build Coastguard Worker mPlugin->setCipherAlgorithm(toStdVec(sessionId), toStdString(algorithm));
993*ec779b8eSAndroid Build Coastguard Worker return statusAidlToDrmStatus(status);
994*ec779b8eSAndroid Build Coastguard Worker }
995*ec779b8eSAndroid Build Coastguard Worker
setMacAlgorithm(Vector<uint8_t> const & sessionId,String8 const & algorithm)996*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::setMacAlgorithm(Vector<uint8_t> const& sessionId, String8 const& algorithm) {
997*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
998*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
999*ec779b8eSAndroid Build Coastguard Worker
1000*ec779b8eSAndroid Build Coastguard Worker DrmSessionManager::Instance()->useSession(sessionId);
1001*ec779b8eSAndroid Build Coastguard Worker
1002*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status =
1003*ec779b8eSAndroid Build Coastguard Worker mPlugin->setMacAlgorithm(toStdVec(sessionId), toStdString(algorithm));
1004*ec779b8eSAndroid Build Coastguard Worker return statusAidlToDrmStatus(status);
1005*ec779b8eSAndroid Build Coastguard Worker }
1006*ec779b8eSAndroid Build Coastguard Worker
encrypt(Vector<uint8_t> const & sessionId,Vector<uint8_t> const & keyId,Vector<uint8_t> const & input,Vector<uint8_t> const & iv,Vector<uint8_t> & output)1007*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::encrypt(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keyId,
1008*ec779b8eSAndroid Build Coastguard Worker Vector<uint8_t> const& input, Vector<uint8_t> const& iv,
1009*ec779b8eSAndroid Build Coastguard Worker Vector<uint8_t>& output) {
1010*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
1011*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
1012*ec779b8eSAndroid Build Coastguard Worker
1013*ec779b8eSAndroid Build Coastguard Worker DrmSessionManager::Instance()->useSession(sessionId);
1014*ec779b8eSAndroid Build Coastguard Worker
1015*ec779b8eSAndroid Build Coastguard Worker std::vector<uint8_t> result;
1016*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->encrypt(toStdVec(sessionId), toStdVec(keyId),
1017*ec779b8eSAndroid Build Coastguard Worker toStdVec(input), toStdVec(iv), &result);
1018*ec779b8eSAndroid Build Coastguard Worker
1019*ec779b8eSAndroid Build Coastguard Worker output = toVector(result);
1020*ec779b8eSAndroid Build Coastguard Worker
1021*ec779b8eSAndroid Build Coastguard Worker return statusAidlToDrmStatus(status);
1022*ec779b8eSAndroid Build Coastguard Worker }
1023*ec779b8eSAndroid Build Coastguard Worker
decrypt(Vector<uint8_t> const & sessionId,Vector<uint8_t> const & keyId,Vector<uint8_t> const & input,Vector<uint8_t> const & iv,Vector<uint8_t> & output)1024*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::decrypt(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keyId,
1025*ec779b8eSAndroid Build Coastguard Worker Vector<uint8_t> const& input, Vector<uint8_t> const& iv,
1026*ec779b8eSAndroid Build Coastguard Worker Vector<uint8_t>& output) {
1027*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
1028*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
1029*ec779b8eSAndroid Build Coastguard Worker
1030*ec779b8eSAndroid Build Coastguard Worker DrmSessionManager::Instance()->useSession(sessionId);
1031*ec779b8eSAndroid Build Coastguard Worker
1032*ec779b8eSAndroid Build Coastguard Worker std::vector<uint8_t> result;
1033*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->decrypt(toStdVec(sessionId), toStdVec(keyId),
1034*ec779b8eSAndroid Build Coastguard Worker toStdVec(input), toStdVec(iv), &result);
1035*ec779b8eSAndroid Build Coastguard Worker
1036*ec779b8eSAndroid Build Coastguard Worker output = toVector(result);
1037*ec779b8eSAndroid Build Coastguard Worker
1038*ec779b8eSAndroid Build Coastguard Worker return statusAidlToDrmStatus(status);
1039*ec779b8eSAndroid Build Coastguard Worker }
1040*ec779b8eSAndroid Build Coastguard Worker
sign(Vector<uint8_t> const & sessionId,Vector<uint8_t> const & keyId,Vector<uint8_t> const & message,Vector<uint8_t> & signature)1041*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::sign(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keyId,
1042*ec779b8eSAndroid Build Coastguard Worker Vector<uint8_t> const& message, Vector<uint8_t>& signature) {
1043*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
1044*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
1045*ec779b8eSAndroid Build Coastguard Worker
1046*ec779b8eSAndroid Build Coastguard Worker DrmSessionManager::Instance()->useSession(sessionId);
1047*ec779b8eSAndroid Build Coastguard Worker
1048*ec779b8eSAndroid Build Coastguard Worker std::vector<uint8_t> result;
1049*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status =
1050*ec779b8eSAndroid Build Coastguard Worker mPlugin->sign(toStdVec(sessionId), toStdVec(keyId), toStdVec(message), &result);
1051*ec779b8eSAndroid Build Coastguard Worker
1052*ec779b8eSAndroid Build Coastguard Worker signature = toVector(result);
1053*ec779b8eSAndroid Build Coastguard Worker
1054*ec779b8eSAndroid Build Coastguard Worker return statusAidlToDrmStatus(status);
1055*ec779b8eSAndroid Build Coastguard Worker }
1056*ec779b8eSAndroid Build Coastguard Worker
verify(Vector<uint8_t> const & sessionId,Vector<uint8_t> const & keyId,Vector<uint8_t> const & message,Vector<uint8_t> const & signature,bool & match)1057*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::verify(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keyId,
1058*ec779b8eSAndroid Build Coastguard Worker Vector<uint8_t> const& message, Vector<uint8_t> const& signature,
1059*ec779b8eSAndroid Build Coastguard Worker bool& match) {
1060*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
1061*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
1062*ec779b8eSAndroid Build Coastguard Worker
1063*ec779b8eSAndroid Build Coastguard Worker DrmSessionManager::Instance()->useSession(sessionId);
1064*ec779b8eSAndroid Build Coastguard Worker
1065*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->verify(toStdVec(sessionId), toStdVec(keyId),
1066*ec779b8eSAndroid Build Coastguard Worker toStdVec(message), toStdVec(signature), &match);
1067*ec779b8eSAndroid Build Coastguard Worker
1068*ec779b8eSAndroid Build Coastguard Worker return statusAidlToDrmStatus(status);
1069*ec779b8eSAndroid Build Coastguard Worker }
1070*ec779b8eSAndroid Build Coastguard Worker
signRSA(Vector<uint8_t> const & sessionId,String8 const & algorithm,Vector<uint8_t> const & message,Vector<uint8_t> const & wrappedKey,Vector<uint8_t> & signature)1071*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::signRSA(Vector<uint8_t> const& sessionId, String8 const& algorithm,
1072*ec779b8eSAndroid Build Coastguard Worker Vector<uint8_t> const& message, Vector<uint8_t> const& wrappedKey,
1073*ec779b8eSAndroid Build Coastguard Worker Vector<uint8_t>& signature) {
1074*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
1075*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
1076*ec779b8eSAndroid Build Coastguard Worker
1077*ec779b8eSAndroid Build Coastguard Worker DrmSessionManager::Instance()->useSession(sessionId);
1078*ec779b8eSAndroid Build Coastguard Worker
1079*ec779b8eSAndroid Build Coastguard Worker std::vector<uint8_t> result;
1080*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status =
1081*ec779b8eSAndroid Build Coastguard Worker mPlugin->signRSA(toStdVec(sessionId), toStdString(algorithm), toStdVec(message),
1082*ec779b8eSAndroid Build Coastguard Worker toStdVec(wrappedKey), &result);
1083*ec779b8eSAndroid Build Coastguard Worker
1084*ec779b8eSAndroid Build Coastguard Worker signature = toVector(result);
1085*ec779b8eSAndroid Build Coastguard Worker
1086*ec779b8eSAndroid Build Coastguard Worker return statusAidlToDrmStatus(status);
1087*ec779b8eSAndroid Build Coastguard Worker }
1088*ec779b8eSAndroid Build Coastguard Worker
requiresSecureDecoder(const char * mime,bool * required) const1089*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::requiresSecureDecoder(const char* mime, bool* required) const {
1090*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
1091*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
1092*ec779b8eSAndroid Build Coastguard Worker
1093*ec779b8eSAndroid Build Coastguard Worker std::string mimeAidl(mime);
1094*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status =
1095*ec779b8eSAndroid Build Coastguard Worker mPlugin->requiresSecureDecoder(mimeAidl, SecurityLevel::DEFAULT, required);
1096*ec779b8eSAndroid Build Coastguard Worker if (!status.isOk()) {
1097*ec779b8eSAndroid Build Coastguard Worker DrmUtils::LOG2BE("requiresSecureDecoder txn failed: %d", status.getServiceSpecificError());
1098*ec779b8eSAndroid Build Coastguard Worker return DrmStatus(DEAD_OBJECT);
1099*ec779b8eSAndroid Build Coastguard Worker }
1100*ec779b8eSAndroid Build Coastguard Worker
1101*ec779b8eSAndroid Build Coastguard Worker return DrmStatus(OK);
1102*ec779b8eSAndroid Build Coastguard Worker }
1103*ec779b8eSAndroid Build Coastguard Worker
requiresSecureDecoder(const char * mime,DrmPlugin::SecurityLevel securityLevel,bool * required) const1104*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::requiresSecureDecoder(const char* mime,
1105*ec779b8eSAndroid Build Coastguard Worker DrmPlugin::SecurityLevel securityLevel,
1106*ec779b8eSAndroid Build Coastguard Worker bool* required) const {
1107*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
1108*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
1109*ec779b8eSAndroid Build Coastguard Worker
1110*ec779b8eSAndroid Build Coastguard Worker auto aLevel = toAidlSecurityLevel(securityLevel);
1111*ec779b8eSAndroid Build Coastguard Worker std::string mimeAidl(mime);
1112*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->requiresSecureDecoder(mimeAidl, aLevel, required);
1113*ec779b8eSAndroid Build Coastguard Worker
1114*ec779b8eSAndroid Build Coastguard Worker DrmStatus err = statusAidlToDrmStatus(status);
1115*ec779b8eSAndroid Build Coastguard Worker if (!status.isOk()) {
1116*ec779b8eSAndroid Build Coastguard Worker DrmUtils::LOG2BE("requiresSecureDecoder txn failed: %d", status.getServiceSpecificError());
1117*ec779b8eSAndroid Build Coastguard Worker }
1118*ec779b8eSAndroid Build Coastguard Worker
1119*ec779b8eSAndroid Build Coastguard Worker return err;
1120*ec779b8eSAndroid Build Coastguard Worker }
1121*ec779b8eSAndroid Build Coastguard Worker
setPlaybackId(Vector<uint8_t> const & sessionId,const char * playbackId)1122*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::setPlaybackId(Vector<uint8_t> const& sessionId, const char* playbackId) {
1123*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
1124*ec779b8eSAndroid Build Coastguard Worker INIT_CHECK();
1125*ec779b8eSAndroid Build Coastguard Worker std::string playbackIdAidl(playbackId);
1126*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus status = mPlugin->setPlaybackId(toStdVec(sessionId), playbackIdAidl);
1127*ec779b8eSAndroid Build Coastguard Worker return statusAidlToDrmStatus(status);
1128*ec779b8eSAndroid Build Coastguard Worker }
1129*ec779b8eSAndroid Build Coastguard Worker
getLogMessages(Vector<drm::V1_4::LogMessage> & logs) const1130*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::getLogMessages(Vector<drm::V1_4::LogMessage>& logs) const {
1131*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
1132*ec779b8eSAndroid Build Coastguard Worker return DrmStatus(DrmUtils::GetLogMessagesAidl<IDrmPluginAidl>(mPlugin, logs));
1133*ec779b8eSAndroid Build Coastguard Worker }
1134*ec779b8eSAndroid Build Coastguard Worker
closeOpenSessions()1135*ec779b8eSAndroid Build Coastguard Worker void DrmHalAidl::closeOpenSessions() {
1136*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
1137*ec779b8eSAndroid Build Coastguard Worker auto openSessions = mOpenSessions;
1138*ec779b8eSAndroid Build Coastguard Worker for (size_t i = 0; i < openSessions.size(); i++) {
1139*ec779b8eSAndroid Build Coastguard Worker mLock.unlock();
1140*ec779b8eSAndroid Build Coastguard Worker closeSession(openSessions[i]->mSessionId);
1141*ec779b8eSAndroid Build Coastguard Worker mLock.lock();
1142*ec779b8eSAndroid Build Coastguard Worker }
1143*ec779b8eSAndroid Build Coastguard Worker mOpenSessions.clear();
1144*ec779b8eSAndroid Build Coastguard Worker }
1145*ec779b8eSAndroid Build Coastguard Worker
reportPluginMetrics() const1146*ec779b8eSAndroid Build Coastguard Worker std::string DrmHalAidl::reportPluginMetrics() const {
1147*ec779b8eSAndroid Build Coastguard Worker Vector<uint8_t> metricsVector;
1148*ec779b8eSAndroid Build Coastguard Worker String8 vendor;
1149*ec779b8eSAndroid Build Coastguard Worker String8 description;
1150*ec779b8eSAndroid Build Coastguard Worker std::string metricsString;
1151*ec779b8eSAndroid Build Coastguard Worker if (getPropertyStringInternal(String8("vendor"), vendor) == OK &&
1152*ec779b8eSAndroid Build Coastguard Worker getPropertyStringInternal(String8("description"), description) == OK &&
1153*ec779b8eSAndroid Build Coastguard Worker getPropertyByteArrayInternal(String8("metrics"), metricsVector) == OK) {
1154*ec779b8eSAndroid Build Coastguard Worker metricsString = toBase64StringNoPad(metricsVector.array(), metricsVector.size());
1155*ec779b8eSAndroid Build Coastguard Worker status_t res = android::reportDrmPluginMetrics(metricsString, vendor, description,
1156*ec779b8eSAndroid Build Coastguard Worker mMetrics->GetAppUid());
1157*ec779b8eSAndroid Build Coastguard Worker if (res != OK) {
1158*ec779b8eSAndroid Build Coastguard Worker ALOGE("Metrics were retrieved but could not be reported: %d", res);
1159*ec779b8eSAndroid Build Coastguard Worker }
1160*ec779b8eSAndroid Build Coastguard Worker }
1161*ec779b8eSAndroid Build Coastguard Worker return metricsString;
1162*ec779b8eSAndroid Build Coastguard Worker }
1163*ec779b8eSAndroid Build Coastguard Worker
reportFrameworkMetrics(const std::string & pluginMetrics) const1164*ec779b8eSAndroid Build Coastguard Worker std::string DrmHalAidl::reportFrameworkMetrics(const std::string& pluginMetrics) const {
1165*ec779b8eSAndroid Build Coastguard Worker mediametrics_handle_t item(mediametrics_create("mediadrm"));
1166*ec779b8eSAndroid Build Coastguard Worker mediametrics_setUid(item, mMetrics->GetAppUid());
1167*ec779b8eSAndroid Build Coastguard Worker String8 vendor;
1168*ec779b8eSAndroid Build Coastguard Worker String8 description;
1169*ec779b8eSAndroid Build Coastguard Worker status_t result = getPropertyStringInternal(String8("vendor"), vendor);
1170*ec779b8eSAndroid Build Coastguard Worker if (result != OK) {
1171*ec779b8eSAndroid Build Coastguard Worker ALOGE("Failed to get vendor from drm plugin: %d", result);
1172*ec779b8eSAndroid Build Coastguard Worker } else {
1173*ec779b8eSAndroid Build Coastguard Worker mediametrics_setCString(item, "vendor", vendor.c_str());
1174*ec779b8eSAndroid Build Coastguard Worker }
1175*ec779b8eSAndroid Build Coastguard Worker result = getPropertyStringInternal(String8("description"), description);
1176*ec779b8eSAndroid Build Coastguard Worker if (result != OK) {
1177*ec779b8eSAndroid Build Coastguard Worker ALOGE("Failed to get description from drm plugin: %d", result);
1178*ec779b8eSAndroid Build Coastguard Worker } else {
1179*ec779b8eSAndroid Build Coastguard Worker mediametrics_setCString(item, "description", description.c_str());
1180*ec779b8eSAndroid Build Coastguard Worker }
1181*ec779b8eSAndroid Build Coastguard Worker
1182*ec779b8eSAndroid Build Coastguard Worker std::string serializedMetrics;
1183*ec779b8eSAndroid Build Coastguard Worker result = mMetrics->GetSerializedMetrics(&serializedMetrics);
1184*ec779b8eSAndroid Build Coastguard Worker if (result != OK) {
1185*ec779b8eSAndroid Build Coastguard Worker ALOGE("Failed to serialize framework metrics: %d", result);
1186*ec779b8eSAndroid Build Coastguard Worker }
1187*ec779b8eSAndroid Build Coastguard Worker std::string b64EncodedMetrics =
1188*ec779b8eSAndroid Build Coastguard Worker toBase64StringNoPad(serializedMetrics.data(), serializedMetrics.size());
1189*ec779b8eSAndroid Build Coastguard Worker if (!b64EncodedMetrics.empty()) {
1190*ec779b8eSAndroid Build Coastguard Worker mediametrics_setCString(item, "serialized_metrics", b64EncodedMetrics.c_str());
1191*ec779b8eSAndroid Build Coastguard Worker }
1192*ec779b8eSAndroid Build Coastguard Worker if (!pluginMetrics.empty()) {
1193*ec779b8eSAndroid Build Coastguard Worker mediametrics_setCString(item, "plugin_metrics", pluginMetrics.c_str());
1194*ec779b8eSAndroid Build Coastguard Worker }
1195*ec779b8eSAndroid Build Coastguard Worker if (!mediametrics_selfRecord(item)) {
1196*ec779b8eSAndroid Build Coastguard Worker ALOGE("Failed to self record framework metrics");
1197*ec779b8eSAndroid Build Coastguard Worker }
1198*ec779b8eSAndroid Build Coastguard Worker mediametrics_delete(item);
1199*ec779b8eSAndroid Build Coastguard Worker return serializedMetrics;
1200*ec779b8eSAndroid Build Coastguard Worker }
1201*ec779b8eSAndroid Build Coastguard Worker
getSupportedSchemes(std::vector<uint8_t> & schemes) const1202*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::getSupportedSchemes(std::vector<uint8_t>& schemes) const {
1203*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
1204*ec779b8eSAndroid Build Coastguard Worker
1205*ec779b8eSAndroid Build Coastguard Worker if (mFactories.empty()) return UNKNOWN_ERROR;
1206*ec779b8eSAndroid Build Coastguard Worker for (ssize_t i = mFactories.size() - 1; i >= 0; i--) {
1207*ec779b8eSAndroid Build Coastguard Worker CryptoSchemes curSchemes{};
1208*ec779b8eSAndroid Build Coastguard Worker auto err = mFactories[i]->getSupportedCryptoSchemes(&curSchemes);
1209*ec779b8eSAndroid Build Coastguard Worker if (!err.isOk()) {
1210*ec779b8eSAndroid Build Coastguard Worker continue;
1211*ec779b8eSAndroid Build Coastguard Worker }
1212*ec779b8eSAndroid Build Coastguard Worker
1213*ec779b8eSAndroid Build Coastguard Worker for (auto uuidObj : curSchemes.uuids) {
1214*ec779b8eSAndroid Build Coastguard Worker schemes.insert(schemes.end(), uuidObj.uuid.begin(), uuidObj.uuid.end());
1215*ec779b8eSAndroid Build Coastguard Worker }
1216*ec779b8eSAndroid Build Coastguard Worker }
1217*ec779b8eSAndroid Build Coastguard Worker
1218*ec779b8eSAndroid Build Coastguard Worker return DrmStatus(OK);
1219*ec779b8eSAndroid Build Coastguard Worker }
1220*ec779b8eSAndroid Build Coastguard Worker
cleanup()1221*ec779b8eSAndroid Build Coastguard Worker void DrmHalAidl::cleanup() {
1222*ec779b8eSAndroid Build Coastguard Worker closeOpenSessions();
1223*ec779b8eSAndroid Build Coastguard Worker
1224*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mLock);
1225*ec779b8eSAndroid Build Coastguard Worker if (mInitCheck == OK) reportFrameworkMetrics(reportPluginMetrics());
1226*ec779b8eSAndroid Build Coastguard Worker
1227*ec779b8eSAndroid Build Coastguard Worker setListener(NULL);
1228*ec779b8eSAndroid Build Coastguard Worker mInitCheck = NO_INIT;
1229*ec779b8eSAndroid Build Coastguard Worker if (mPlugin != NULL) {
1230*ec779b8eSAndroid Build Coastguard Worker if (!mPlugin->setListener(NULL).isOk()) {
1231*ec779b8eSAndroid Build Coastguard Worker mInitCheck = DEAD_OBJECT;
1232*ec779b8eSAndroid Build Coastguard Worker }
1233*ec779b8eSAndroid Build Coastguard Worker }
1234*ec779b8eSAndroid Build Coastguard Worker
1235*ec779b8eSAndroid Build Coastguard Worker mPlugin.reset();
1236*ec779b8eSAndroid Build Coastguard Worker }
1237*ec779b8eSAndroid Build Coastguard Worker
destroyPlugin()1238*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmHalAidl::destroyPlugin() {
1239*ec779b8eSAndroid Build Coastguard Worker cleanup();
1240*ec779b8eSAndroid Build Coastguard Worker return DrmStatus(OK);
1241*ec779b8eSAndroid Build Coastguard Worker }
1242*ec779b8eSAndroid Build Coastguard Worker
onEvent(EventTypeAidl eventTypeAidl,const std::vector<uint8_t> & sessionId,const std::vector<uint8_t> & data)1243*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus DrmHalAidl::onEvent(EventTypeAidl eventTypeAidl,
1244*ec779b8eSAndroid Build Coastguard Worker const std::vector<uint8_t>& sessionId,
1245*ec779b8eSAndroid Build Coastguard Worker const std::vector<uint8_t>& data) {
1246*ec779b8eSAndroid Build Coastguard Worker return mListener->onEvent(eventTypeAidl, sessionId, data);
1247*ec779b8eSAndroid Build Coastguard Worker }
1248*ec779b8eSAndroid Build Coastguard Worker
onExpirationUpdate(const std::vector<uint8_t> & sessionId,int64_t expiryTimeInMS)1249*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus DrmHalAidl::onExpirationUpdate(const std::vector<uint8_t>& sessionId,
1250*ec779b8eSAndroid Build Coastguard Worker int64_t expiryTimeInMS) {
1251*ec779b8eSAndroid Build Coastguard Worker return mListener->onExpirationUpdate(sessionId, expiryTimeInMS);
1252*ec779b8eSAndroid Build Coastguard Worker }
1253*ec779b8eSAndroid Build Coastguard Worker
onKeysChange(const std::vector<uint8_t> & sessionId,const std::vector<KeyStatus> & keyStatusListAidl,bool hasNewUsableKey)1254*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus DrmHalAidl::onKeysChange(const std::vector<uint8_t>& sessionId,
1255*ec779b8eSAndroid Build Coastguard Worker const std::vector<KeyStatus>& keyStatusListAidl,
1256*ec779b8eSAndroid Build Coastguard Worker bool hasNewUsableKey) {
1257*ec779b8eSAndroid Build Coastguard Worker return mListener->onKeysChange(sessionId, keyStatusListAidl, hasNewUsableKey);
1258*ec779b8eSAndroid Build Coastguard Worker }
1259*ec779b8eSAndroid Build Coastguard Worker
onSessionLostState(const std::vector<uint8_t> & sessionId)1260*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus DrmHalAidl::onSessionLostState(const std::vector<uint8_t>& sessionId) {
1261*ec779b8eSAndroid Build Coastguard Worker return mListener->onSessionLostState(sessionId);
1262*ec779b8eSAndroid Build Coastguard Worker }
1263*ec779b8eSAndroid Build Coastguard Worker
1264*ec779b8eSAndroid Build Coastguard Worker } // namespace android