1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2023 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_TAG "DrmRkpAdapter"
18*ec779b8eSAndroid Build Coastguard Worker #include "DrmRkpAdapter.h"
19*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/hardware/drm/IDrmFactory.h>
20*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/hardware/drm/IDrmPlugin.h>
21*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/hardware/security/keymint/BnRemotelyProvisionedComponent.h>
22*ec779b8eSAndroid Build Coastguard Worker #include <android/binder_manager.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <log/log.h>
24*ec779b8eSAndroid Build Coastguard Worker #include "DrmRemotelyProvisionedComponent.h"
25*ec779b8eSAndroid Build Coastguard Worker
26*ec779b8eSAndroid Build Coastguard Worker namespace android::mediadrm {
27*ec779b8eSAndroid Build Coastguard Worker using CryptoSchemes = ::aidl::android::hardware::drm::CryptoSchemes;
28*ec779b8eSAndroid Build Coastguard Worker using IDrmFactory = ::aidl::android::hardware::drm::IDrmFactory;
29*ec779b8eSAndroid Build Coastguard Worker using IDrmPlugin = ::aidl::android::hardware::drm::IDrmPlugin;
30*ec779b8eSAndroid Build Coastguard Worker
31*ec779b8eSAndroid Build Coastguard Worker std::map<std::string, std::shared_ptr<IRemotelyProvisionedComponent>>
getDrmRemotelyProvisionedComponents()32*ec779b8eSAndroid Build Coastguard Worker getDrmRemotelyProvisionedComponents() {
33*ec779b8eSAndroid Build Coastguard Worker std::map<std::string, std::shared_ptr<IRemotelyProvisionedComponent>> comps;
34*ec779b8eSAndroid Build Coastguard Worker AServiceManager_forEachDeclaredInstance(
35*ec779b8eSAndroid Build Coastguard Worker IDrmFactory::descriptor, &comps, [](const char* instance, void* context) {
36*ec779b8eSAndroid Build Coastguard Worker auto fullName = std::string(IDrmFactory::descriptor) + "/" + std::string(instance);
37*ec779b8eSAndroid Build Coastguard Worker auto factory = IDrmFactory::fromBinder(
38*ec779b8eSAndroid Build Coastguard Worker ::ndk::SpAIBinder(AServiceManager_waitForService(fullName.c_str())));
39*ec779b8eSAndroid Build Coastguard Worker if (factory == nullptr) {
40*ec779b8eSAndroid Build Coastguard Worker ALOGE("not found IDrmFactory. Instance name:[%s]", fullName.c_str());
41*ec779b8eSAndroid Build Coastguard Worker return;
42*ec779b8eSAndroid Build Coastguard Worker }
43*ec779b8eSAndroid Build Coastguard Worker
44*ec779b8eSAndroid Build Coastguard Worker ALOGI("found IDrmFactory. Instance name:[%s]", fullName.c_str());
45*ec779b8eSAndroid Build Coastguard Worker CryptoSchemes schemes{};
46*ec779b8eSAndroid Build Coastguard Worker auto status = factory->getSupportedCryptoSchemes(&schemes);
47*ec779b8eSAndroid Build Coastguard Worker if (!status.isOk()) {
48*ec779b8eSAndroid Build Coastguard Worker ALOGE("getSupportedCryptoSchemes failed.Detail: [%s].",
49*ec779b8eSAndroid Build Coastguard Worker status.getDescription().c_str());
50*ec779b8eSAndroid Build Coastguard Worker return;
51*ec779b8eSAndroid Build Coastguard Worker }
52*ec779b8eSAndroid Build Coastguard Worker
53*ec779b8eSAndroid Build Coastguard Worker if (schemes.uuids.empty()) {
54*ec779b8eSAndroid Build Coastguard Worker ALOGW("IDrmFactory Instance [%s] has empty supported schemes",
55*ec779b8eSAndroid Build Coastguard Worker fullName.c_str());
56*ec779b8eSAndroid Build Coastguard Worker return;
57*ec779b8eSAndroid Build Coastguard Worker }
58*ec779b8eSAndroid Build Coastguard Worker
59*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<IDrmPlugin> mDrm;
60*ec779b8eSAndroid Build Coastguard Worker status = factory->createDrmPlugin(schemes.uuids[0], "DrmRkpAdapter", &mDrm);
61*ec779b8eSAndroid Build Coastguard Worker if (!status.isOk()) {
62*ec779b8eSAndroid Build Coastguard Worker ALOGE("createDrmPlugin failed.Detail: [%s].", status.getDescription().c_str());
63*ec779b8eSAndroid Build Coastguard Worker return;
64*ec779b8eSAndroid Build Coastguard Worker }
65*ec779b8eSAndroid Build Coastguard Worker
66*ec779b8eSAndroid Build Coastguard Worker std::string drmVendor;
67*ec779b8eSAndroid Build Coastguard Worker status = mDrm->getPropertyString("vendor", &drmVendor);
68*ec779b8eSAndroid Build Coastguard Worker if (!status.isOk()) {
69*ec779b8eSAndroid Build Coastguard Worker ALOGE("mDrm->getPropertyString(\"vendor\") failed.Detail: [%s].",
70*ec779b8eSAndroid Build Coastguard Worker status.getDescription().c_str());
71*ec779b8eSAndroid Build Coastguard Worker return;
72*ec779b8eSAndroid Build Coastguard Worker }
73*ec779b8eSAndroid Build Coastguard Worker
74*ec779b8eSAndroid Build Coastguard Worker std::string drmDesc;
75*ec779b8eSAndroid Build Coastguard Worker status = mDrm->getPropertyString("description", &drmDesc);
76*ec779b8eSAndroid Build Coastguard Worker if (!status.isOk()) {
77*ec779b8eSAndroid Build Coastguard Worker ALOGE("mDrm->getPropertyString(\"description\") failed.Detail: [%s].",
78*ec779b8eSAndroid Build Coastguard Worker status.getDescription().c_str());
79*ec779b8eSAndroid Build Coastguard Worker return;
80*ec779b8eSAndroid Build Coastguard Worker }
81*ec779b8eSAndroid Build Coastguard Worker
82*ec779b8eSAndroid Build Coastguard Worker std::vector<uint8_t> bcc;
83*ec779b8eSAndroid Build Coastguard Worker status = mDrm->getPropertyByteArray("bootCertificateChain", &bcc);
84*ec779b8eSAndroid Build Coastguard Worker if (!status.isOk()) {
85*ec779b8eSAndroid Build Coastguard Worker ALOGE("mDrm->getPropertyByteArray(\"bootCertificateChain\") failed."
86*ec779b8eSAndroid Build Coastguard Worker "Detail: [%s].",
87*ec779b8eSAndroid Build Coastguard Worker status.getDescription().c_str());
88*ec779b8eSAndroid Build Coastguard Worker return;
89*ec779b8eSAndroid Build Coastguard Worker }
90*ec779b8eSAndroid Build Coastguard Worker std::vector<uint8_t> bcc_signature;
91*ec779b8eSAndroid Build Coastguard Worker status =
92*ec779b8eSAndroid Build Coastguard Worker mDrm->getPropertyByteArray("bootCertificateChainSignature", &bcc_signature);
93*ec779b8eSAndroid Build Coastguard Worker if (!status.isOk()) {
94*ec779b8eSAndroid Build Coastguard Worker ALOGW("mDrm->getPropertyByteArray(\"bootCertificateChainSignature\") failed."
95*ec779b8eSAndroid Build Coastguard Worker "Detail: [%s].",
96*ec779b8eSAndroid Build Coastguard Worker status.getDescription().c_str());
97*ec779b8eSAndroid Build Coastguard Worker // bcc signature is optional, no need to return when it is unavailable.
98*ec779b8eSAndroid Build Coastguard Worker }
99*ec779b8eSAndroid Build Coastguard Worker std::string compName(instance);
100*ec779b8eSAndroid Build Coastguard Worker auto comps = static_cast<
101*ec779b8eSAndroid Build Coastguard Worker std::map<std::string, std::shared_ptr<IRemotelyProvisionedComponent>>*>(
102*ec779b8eSAndroid Build Coastguard Worker context);
103*ec779b8eSAndroid Build Coastguard Worker (*comps)[compName] = ::ndk::SharedRefBase::make<DrmRemotelyProvisionedComponent>(
104*ec779b8eSAndroid Build Coastguard Worker mDrm, drmVendor, drmDesc, bcc, bcc_signature);
105*ec779b8eSAndroid Build Coastguard Worker });
106*ec779b8eSAndroid Build Coastguard Worker return comps;
107*ec779b8eSAndroid Build Coastguard Worker }
108*ec779b8eSAndroid Build Coastguard Worker } // namespace android::mediadrm