xref: /aosp_15_r20/frameworks/av/drm/libmediadrmrkp/src/DrmRkpAdapter.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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