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