xref: /aosp_15_r20/frameworks/av/drm/libmediadrm/CryptoHalAidl.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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 "CryptoHalAidl"
19*ec779b8eSAndroid Build Coastguard Worker 
20*ec779b8eSAndroid Build Coastguard Worker #include <aidlcommonsupport/NativeHandle.h>
21*ec779b8eSAndroid Build Coastguard Worker #include <android/binder_auto_utils.h>
22*ec779b8eSAndroid Build Coastguard Worker #include <android/binder_manager.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <media/hardware/CryptoAPI.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/MediaErrors.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/ADebug.h>
26*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/AString.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/hexdump.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <mediadrm/CryptoHalAidl.h>
29*ec779b8eSAndroid Build Coastguard Worker #include <mediadrm/DrmUtils.h>
30*ec779b8eSAndroid Build Coastguard Worker 
31*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::CryptoSchemes;
32*ec779b8eSAndroid Build Coastguard Worker using DestinationBufferAidl = ::aidl::android::hardware::drm::DestinationBuffer;
33*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::Mode;
34*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::Pattern;
35*ec779b8eSAndroid Build Coastguard Worker using SharedBufferAidl = ::aidl::android::hardware::drm::SharedBuffer;
36*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::Status;
37*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::SubSample;
38*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::Uuid;
39*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::SecurityLevel;
40*ec779b8eSAndroid Build Coastguard Worker using NativeHandleAidlCommon = ::aidl::android::hardware::common::NativeHandle;
41*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::DecryptArgs;
42*ec779b8eSAndroid Build Coastguard Worker 
43*ec779b8eSAndroid Build Coastguard Worker using ::android::sp;
44*ec779b8eSAndroid Build Coastguard Worker using ::android::DrmUtils::statusAidlToDrmStatus;
45*ec779b8eSAndroid Build Coastguard Worker using ::android::hardware::hidl_array;
46*ec779b8eSAndroid Build Coastguard Worker using ::android::hardware::hidl_handle;
47*ec779b8eSAndroid Build Coastguard Worker using ::android::hardware::hidl_memory;
48*ec779b8eSAndroid Build Coastguard Worker using ::android::hardware::hidl_string;
49*ec779b8eSAndroid Build Coastguard Worker using ::android::hardware::hidl_vec;
50*ec779b8eSAndroid Build Coastguard Worker using ::android::hardware::HidlMemory;
51*ec779b8eSAndroid Build Coastguard Worker using ::android::hardware::Return;
52*ec779b8eSAndroid Build Coastguard Worker using ::android::hardware::Void;
53*ec779b8eSAndroid Build Coastguard Worker 
54*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::drm::Uuid;
55*ec779b8eSAndroid Build Coastguard Worker // -------Hidl interface related-----------------
56*ec779b8eSAndroid Build Coastguard Worker // TODO: replace before removing hidl interface
57*ec779b8eSAndroid Build Coastguard Worker 
58*ec779b8eSAndroid Build Coastguard Worker using BufferTypeHidl = ::android::hardware::drm::V1_0::BufferType;
59*ec779b8eSAndroid Build Coastguard Worker using SharedBufferHidl = ::android::hardware::drm::V1_0::SharedBuffer;
60*ec779b8eSAndroid Build Coastguard Worker using DestinationBufferHidl = ::android::hardware::drm::V1_0::DestinationBuffer;
61*ec779b8eSAndroid Build Coastguard Worker 
62*ec779b8eSAndroid Build Coastguard Worker // -------Hidl interface related end-------------
63*ec779b8eSAndroid Build Coastguard Worker 
64*ec779b8eSAndroid Build Coastguard Worker namespace android {
65*ec779b8eSAndroid Build Coastguard Worker 
66*ec779b8eSAndroid Build Coastguard Worker template <typename Byte = uint8_t>
toStdVec(const Vector<uint8_t> & vector)67*ec779b8eSAndroid Build Coastguard Worker static std::vector<Byte> toStdVec(const Vector<uint8_t>& vector) {
68*ec779b8eSAndroid Build Coastguard Worker     auto v = reinterpret_cast<const Byte*>(vector.array());
69*ec779b8eSAndroid Build Coastguard Worker     std::vector<Byte> vec(v, v + vector.size());
70*ec779b8eSAndroid Build Coastguard Worker     return vec;
71*ec779b8eSAndroid Build Coastguard Worker }
72*ec779b8eSAndroid Build Coastguard Worker 
73*ec779b8eSAndroid Build Coastguard Worker // -------Hidl interface related-----------------
74*ec779b8eSAndroid Build Coastguard Worker // TODO: replace before removing hidl interface
checkSharedBuffer(const SharedBufferHidl & buffer)75*ec779b8eSAndroid Build Coastguard Worker status_t CryptoHalAidl::checkSharedBuffer(const SharedBufferHidl& buffer) {
76*ec779b8eSAndroid Build Coastguard Worker     int32_t seqNum = static_cast<int32_t>(buffer.bufferId);
77*ec779b8eSAndroid Build Coastguard Worker     // memory must be in one of the heaps that have been set
78*ec779b8eSAndroid Build Coastguard Worker     if (mHeapSizes.indexOfKey(seqNum) < 0) {
79*ec779b8eSAndroid Build Coastguard Worker         return UNKNOWN_ERROR;
80*ec779b8eSAndroid Build Coastguard Worker     }
81*ec779b8eSAndroid Build Coastguard Worker 
82*ec779b8eSAndroid Build Coastguard Worker     // memory must be within the address space of the heap
83*ec779b8eSAndroid Build Coastguard Worker     size_t heapSize = mHeapSizes.valueFor(seqNum);
84*ec779b8eSAndroid Build Coastguard Worker     if (heapSize < buffer.offset + buffer.size || SIZE_MAX - buffer.offset < buffer.size) {
85*ec779b8eSAndroid Build Coastguard Worker         android_errorWriteLog(0x534e4554, "76221123");
86*ec779b8eSAndroid Build Coastguard Worker         return UNKNOWN_ERROR;
87*ec779b8eSAndroid Build Coastguard Worker     }
88*ec779b8eSAndroid Build Coastguard Worker 
89*ec779b8eSAndroid Build Coastguard Worker     return OK;
90*ec779b8eSAndroid Build Coastguard Worker }
91*ec779b8eSAndroid Build Coastguard Worker 
hidlSharedBufferToAidlSharedBuffer(const SharedBufferHidl & buffer)92*ec779b8eSAndroid Build Coastguard Worker static SharedBufferAidl hidlSharedBufferToAidlSharedBuffer(const SharedBufferHidl& buffer) {
93*ec779b8eSAndroid Build Coastguard Worker     SharedBufferAidl aidlsb;
94*ec779b8eSAndroid Build Coastguard Worker     aidlsb.bufferId = buffer.bufferId;
95*ec779b8eSAndroid Build Coastguard Worker     aidlsb.offset = buffer.offset;
96*ec779b8eSAndroid Build Coastguard Worker     aidlsb.size = buffer.size;
97*ec779b8eSAndroid Build Coastguard Worker     return aidlsb;
98*ec779b8eSAndroid Build Coastguard Worker }
99*ec779b8eSAndroid Build Coastguard Worker 
hidlDestinationBufferToAidlDestinationBuffer(const DestinationBufferHidl & buffer)100*ec779b8eSAndroid Build Coastguard Worker static DestinationBufferAidl hidlDestinationBufferToAidlDestinationBuffer(
101*ec779b8eSAndroid Build Coastguard Worker         const DestinationBufferHidl& buffer) {
102*ec779b8eSAndroid Build Coastguard Worker     DestinationBufferAidl aidldb;
103*ec779b8eSAndroid Build Coastguard Worker     // skip negative convert check as count of enum elements are 2
104*ec779b8eSAndroid Build Coastguard Worker     switch(buffer.type) {
105*ec779b8eSAndroid Build Coastguard Worker         case BufferTypeHidl::SHARED_MEMORY:
106*ec779b8eSAndroid Build Coastguard Worker             aidldb.set<DestinationBufferAidl::Tag::nonsecureMemory>(
107*ec779b8eSAndroid Build Coastguard Worker                 hidlSharedBufferToAidlSharedBuffer(buffer.nonsecureMemory));
108*ec779b8eSAndroid Build Coastguard Worker             break;
109*ec779b8eSAndroid Build Coastguard Worker         default:
110*ec779b8eSAndroid Build Coastguard Worker             auto handle = buffer.secureMemory.getNativeHandle();
111*ec779b8eSAndroid Build Coastguard Worker             if (handle) {
112*ec779b8eSAndroid Build Coastguard Worker                 aidldb.set<DestinationBufferAidl::Tag::secureMemory>(
113*ec779b8eSAndroid Build Coastguard Worker                     ::android::dupToAidl(handle));
114*ec779b8eSAndroid Build Coastguard Worker             } else {
115*ec779b8eSAndroid Build Coastguard Worker                 NativeHandleAidlCommon emptyhandle;
116*ec779b8eSAndroid Build Coastguard Worker                 aidldb.set<DestinationBufferAidl::Tag::secureMemory>(
117*ec779b8eSAndroid Build Coastguard Worker                     std::move(emptyhandle));
118*ec779b8eSAndroid Build Coastguard Worker             }
119*ec779b8eSAndroid Build Coastguard Worker             break;
120*ec779b8eSAndroid Build Coastguard Worker     }
121*ec779b8eSAndroid Build Coastguard Worker 
122*ec779b8eSAndroid Build Coastguard Worker     return aidldb;
123*ec779b8eSAndroid Build Coastguard Worker }
124*ec779b8eSAndroid Build Coastguard Worker 
toHidlVec(const void * ptr,size_t size)125*ec779b8eSAndroid Build Coastguard Worker static hidl_vec<uint8_t> toHidlVec(const void* ptr, size_t size) {
126*ec779b8eSAndroid Build Coastguard Worker     hidl_vec<uint8_t> vec;
127*ec779b8eSAndroid Build Coastguard Worker     vec.resize(size);
128*ec779b8eSAndroid Build Coastguard Worker     memcpy(vec.data(), ptr, size);
129*ec779b8eSAndroid Build Coastguard Worker     return vec;
130*ec779b8eSAndroid Build Coastguard Worker }
131*ec779b8eSAndroid Build Coastguard Worker 
toVector(const std::vector<uint8_t> & vec)132*ec779b8eSAndroid Build Coastguard Worker static const Vector<uint8_t> toVector(const std::vector<uint8_t>& vec) {
133*ec779b8eSAndroid Build Coastguard Worker     Vector<uint8_t> vector;
134*ec779b8eSAndroid Build Coastguard Worker     vector.appendArray(vec.data(), vec.size());
135*ec779b8eSAndroid Build Coastguard Worker     return *const_cast<const Vector<uint8_t>*>(&vector);
136*ec779b8eSAndroid Build Coastguard Worker }
137*ec779b8eSAndroid Build Coastguard Worker 
toString8(const std::string & string)138*ec779b8eSAndroid Build Coastguard Worker static String8 toString8(const std::string& string) {
139*ec779b8eSAndroid Build Coastguard Worker     return String8(string.c_str());
140*ec779b8eSAndroid Build Coastguard Worker }
141*ec779b8eSAndroid Build Coastguard Worker 
toStdVec(const uint8_t * ptr,size_t n)142*ec779b8eSAndroid Build Coastguard Worker static std::vector<uint8_t> toStdVec(const uint8_t* ptr, size_t n) {
143*ec779b8eSAndroid Build Coastguard Worker     if (!ptr) {
144*ec779b8eSAndroid Build Coastguard Worker         return std::vector<uint8_t>();
145*ec779b8eSAndroid Build Coastguard Worker     }
146*ec779b8eSAndroid Build Coastguard Worker     return std::vector<uint8_t>(ptr, ptr + n);
147*ec779b8eSAndroid Build Coastguard Worker }
148*ec779b8eSAndroid Build Coastguard Worker 
149*ec779b8eSAndroid Build Coastguard Worker // -------Hidl interface related end--------------
150*ec779b8eSAndroid Build Coastguard Worker 
isCryptoSchemeSupportedInternal(const uint8_t uuid[16],int * factoryIdx)151*ec779b8eSAndroid Build Coastguard Worker bool CryptoHalAidl::isCryptoSchemeSupportedInternal(const uint8_t uuid[16], int* factoryIdx) {
152*ec779b8eSAndroid Build Coastguard Worker     Uuid uuidAidl = DrmUtils::toAidlUuid(uuid);
153*ec779b8eSAndroid Build Coastguard Worker     for (size_t i = 0; i < mFactories.size(); i++) {
154*ec779b8eSAndroid Build Coastguard Worker         CryptoSchemes schemes{};
155*ec779b8eSAndroid Build Coastguard Worker         if (mFactories[i]->getSupportedCryptoSchemes(&schemes).isOk()) {
156*ec779b8eSAndroid Build Coastguard Worker             if (std::count(schemes.uuids.begin(), schemes.uuids.end(), uuidAidl)) {
157*ec779b8eSAndroid Build Coastguard Worker                 if (factoryIdx != NULL) *factoryIdx = i;
158*ec779b8eSAndroid Build Coastguard Worker                 return true;
159*ec779b8eSAndroid Build Coastguard Worker             }
160*ec779b8eSAndroid Build Coastguard Worker         }
161*ec779b8eSAndroid Build Coastguard Worker     }
162*ec779b8eSAndroid Build Coastguard Worker 
163*ec779b8eSAndroid Build Coastguard Worker     return false;
164*ec779b8eSAndroid Build Coastguard Worker }
165*ec779b8eSAndroid Build Coastguard Worker 
CryptoHalAidl()166*ec779b8eSAndroid Build Coastguard Worker CryptoHalAidl::CryptoHalAidl()
167*ec779b8eSAndroid Build Coastguard Worker     : mFactories(DrmUtils::makeDrmFactoriesAidl()),
168*ec779b8eSAndroid Build Coastguard Worker       mInitCheck((mFactories.size() == 0) ? ERROR_UNSUPPORTED : NO_INIT),
169*ec779b8eSAndroid Build Coastguard Worker       mHeapSeqNum(0) {}
170*ec779b8eSAndroid Build Coastguard Worker 
~CryptoHalAidl()171*ec779b8eSAndroid Build Coastguard Worker CryptoHalAidl::~CryptoHalAidl() {}
172*ec779b8eSAndroid Build Coastguard Worker 
initCheck() const173*ec779b8eSAndroid Build Coastguard Worker status_t CryptoHalAidl::initCheck() const {
174*ec779b8eSAndroid Build Coastguard Worker     return mInitCheck;
175*ec779b8eSAndroid Build Coastguard Worker }
176*ec779b8eSAndroid Build Coastguard Worker 
isCryptoSchemeSupported(const uint8_t uuid[16])177*ec779b8eSAndroid Build Coastguard Worker bool CryptoHalAidl::isCryptoSchemeSupported(const uint8_t uuid[16]) {
178*ec779b8eSAndroid Build Coastguard Worker     Mutex::Autolock autoLock(mLock);
179*ec779b8eSAndroid Build Coastguard Worker 
180*ec779b8eSAndroid Build Coastguard Worker     return isCryptoSchemeSupportedInternal(uuid, NULL);
181*ec779b8eSAndroid Build Coastguard Worker }
182*ec779b8eSAndroid Build Coastguard Worker 
createPlugin(const uint8_t uuid[16],const void * data,size_t size)183*ec779b8eSAndroid Build Coastguard Worker status_t CryptoHalAidl::createPlugin(const uint8_t uuid[16], const void* data, size_t size) {
184*ec779b8eSAndroid Build Coastguard Worker     Mutex::Autolock autoLock(mLock);
185*ec779b8eSAndroid Build Coastguard Worker 
186*ec779b8eSAndroid Build Coastguard Worker     Uuid uuidAidl = DrmUtils::toAidlUuid(uuid);
187*ec779b8eSAndroid Build Coastguard Worker     std::vector<uint8_t> dataAidl = toStdVec(toVector(toHidlVec(data, size)));
188*ec779b8eSAndroid Build Coastguard Worker     int i = 0;
189*ec779b8eSAndroid Build Coastguard Worker     if (isCryptoSchemeSupportedInternal(uuid, &i)) {
190*ec779b8eSAndroid Build Coastguard Worker         mPlugin = makeCryptoPlugin(mFactories[i], uuidAidl, dataAidl);
191*ec779b8eSAndroid Build Coastguard Worker     }
192*ec779b8eSAndroid Build Coastguard Worker 
193*ec779b8eSAndroid Build Coastguard Worker     if (mInitCheck == NO_INIT) {
194*ec779b8eSAndroid Build Coastguard Worker         mInitCheck = mPlugin == NULL ? ERROR_UNSUPPORTED : OK;
195*ec779b8eSAndroid Build Coastguard Worker     }
196*ec779b8eSAndroid Build Coastguard Worker 
197*ec779b8eSAndroid Build Coastguard Worker     return mInitCheck;
198*ec779b8eSAndroid Build Coastguard Worker }
199*ec779b8eSAndroid Build Coastguard Worker 
makeCryptoPlugin(const std::shared_ptr<IDrmFactoryAidl> & factory,const Uuid & uuidAidl,const std::vector<uint8_t> initData)200*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<ICryptoPluginAidl> CryptoHalAidl::makeCryptoPlugin(
201*ec779b8eSAndroid Build Coastguard Worker         const std::shared_ptr<IDrmFactoryAidl>& factory, const Uuid& uuidAidl,
202*ec779b8eSAndroid Build Coastguard Worker         const std::vector<uint8_t> initData) {
203*ec779b8eSAndroid Build Coastguard Worker     std::shared_ptr<ICryptoPluginAidl> pluginAidl;
204*ec779b8eSAndroid Build Coastguard Worker     if (factory->createCryptoPlugin(uuidAidl, initData, &pluginAidl).isOk()) {
205*ec779b8eSAndroid Build Coastguard Worker         ALOGI("Create ICryptoPluginAidl. UUID:[%s]", uuidAidl.toString().c_str());
206*ec779b8eSAndroid Build Coastguard Worker     } else {
207*ec779b8eSAndroid Build Coastguard Worker         mInitCheck = DEAD_OBJECT;
208*ec779b8eSAndroid Build Coastguard Worker         ALOGE("Failed to create ICryptoPluginAidl. UUID:[%s]", uuidAidl.toString().c_str());
209*ec779b8eSAndroid Build Coastguard Worker     }
210*ec779b8eSAndroid Build Coastguard Worker 
211*ec779b8eSAndroid Build Coastguard Worker     return pluginAidl;
212*ec779b8eSAndroid Build Coastguard Worker }
213*ec779b8eSAndroid Build Coastguard Worker 
destroyPlugin()214*ec779b8eSAndroid Build Coastguard Worker status_t CryptoHalAidl::destroyPlugin() {
215*ec779b8eSAndroid Build Coastguard Worker     Mutex::Autolock autoLock(mLock);
216*ec779b8eSAndroid Build Coastguard Worker 
217*ec779b8eSAndroid Build Coastguard Worker     if (mInitCheck != OK) {
218*ec779b8eSAndroid Build Coastguard Worker         return mInitCheck;
219*ec779b8eSAndroid Build Coastguard Worker     }
220*ec779b8eSAndroid Build Coastguard Worker 
221*ec779b8eSAndroid Build Coastguard Worker     mPlugin.reset();
222*ec779b8eSAndroid Build Coastguard Worker     mInitCheck = NO_INIT;
223*ec779b8eSAndroid Build Coastguard Worker     return OK;
224*ec779b8eSAndroid Build Coastguard Worker }
225*ec779b8eSAndroid Build Coastguard Worker 
requiresSecureDecoderComponent(const char * mime) const226*ec779b8eSAndroid Build Coastguard Worker bool CryptoHalAidl::requiresSecureDecoderComponent(const char* mime) const {
227*ec779b8eSAndroid Build Coastguard Worker     Mutex::Autolock autoLock(mLock);
228*ec779b8eSAndroid Build Coastguard Worker 
229*ec779b8eSAndroid Build Coastguard Worker     if (mInitCheck != OK) {
230*ec779b8eSAndroid Build Coastguard Worker         return false;
231*ec779b8eSAndroid Build Coastguard Worker     }
232*ec779b8eSAndroid Build Coastguard Worker 
233*ec779b8eSAndroid Build Coastguard Worker     std::string mimeStr = std::string(mime);
234*ec779b8eSAndroid Build Coastguard Worker     bool result;
235*ec779b8eSAndroid Build Coastguard Worker     if (!mPlugin->requiresSecureDecoderComponent(mimeStr, &result).isOk()) {
236*ec779b8eSAndroid Build Coastguard Worker         ALOGE("Failed to requiresSecureDecoderComponent. mime:[%s]", mime);
237*ec779b8eSAndroid Build Coastguard Worker         return false;
238*ec779b8eSAndroid Build Coastguard Worker     }
239*ec779b8eSAndroid Build Coastguard Worker 
240*ec779b8eSAndroid Build Coastguard Worker     return result;
241*ec779b8eSAndroid Build Coastguard Worker }
242*ec779b8eSAndroid Build Coastguard Worker 
notifyResolution(uint32_t width,uint32_t height)243*ec779b8eSAndroid Build Coastguard Worker void CryptoHalAidl::notifyResolution(uint32_t width, uint32_t height) {
244*ec779b8eSAndroid Build Coastguard Worker     Mutex::Autolock autoLock(mLock);
245*ec779b8eSAndroid Build Coastguard Worker 
246*ec779b8eSAndroid Build Coastguard Worker     if (mInitCheck != OK) {
247*ec779b8eSAndroid Build Coastguard Worker         return;
248*ec779b8eSAndroid Build Coastguard Worker     }
249*ec779b8eSAndroid Build Coastguard Worker 
250*ec779b8eSAndroid Build Coastguard Worker     // Check negative width and height after type conversion
251*ec779b8eSAndroid Build Coastguard Worker     // Log error and return if any is negative
252*ec779b8eSAndroid Build Coastguard Worker     if ((int32_t)width < 0 || (int32_t)height < 0) {
253*ec779b8eSAndroid Build Coastguard Worker         ALOGE("Negative width: %d or height %d in notifyResolution", width, height);
254*ec779b8eSAndroid Build Coastguard Worker         return;
255*ec779b8eSAndroid Build Coastguard Worker     }
256*ec779b8eSAndroid Build Coastguard Worker 
257*ec779b8eSAndroid Build Coastguard Worker     ::ndk::ScopedAStatus status = mPlugin->notifyResolution(width, height);
258*ec779b8eSAndroid Build Coastguard Worker     if (!status.isOk()) {
259*ec779b8eSAndroid Build Coastguard Worker         ALOGE("notifyResolution txn failed status code: %d", status.getServiceSpecificError());
260*ec779b8eSAndroid Build Coastguard Worker     }
261*ec779b8eSAndroid Build Coastguard Worker }
262*ec779b8eSAndroid Build Coastguard Worker 
setMediaDrmSession(const Vector<uint8_t> & sessionId)263*ec779b8eSAndroid Build Coastguard Worker DrmStatus CryptoHalAidl::setMediaDrmSession(const Vector<uint8_t>& sessionId) {
264*ec779b8eSAndroid Build Coastguard Worker     Mutex::Autolock autoLock(mLock);
265*ec779b8eSAndroid Build Coastguard Worker 
266*ec779b8eSAndroid Build Coastguard Worker     if (mInitCheck != OK) {
267*ec779b8eSAndroid Build Coastguard Worker         return mInitCheck;
268*ec779b8eSAndroid Build Coastguard Worker     }
269*ec779b8eSAndroid Build Coastguard Worker 
270*ec779b8eSAndroid Build Coastguard Worker     auto err = mPlugin->setMediaDrmSession(toStdVec(sessionId));
271*ec779b8eSAndroid Build Coastguard Worker     return statusAidlToDrmStatus(err);
272*ec779b8eSAndroid Build Coastguard Worker }
273*ec779b8eSAndroid Build Coastguard Worker 
decrypt(const uint8_t keyId[16],const uint8_t iv[16],CryptoPlugin::Mode mode,const CryptoPlugin::Pattern & pattern,const SharedBufferHidl & hSource,size_t offset,const CryptoPlugin::SubSample * subSamples,size_t numSubSamples,const DestinationBufferHidl & hDestination,AString * errorDetailMsg)274*ec779b8eSAndroid Build Coastguard Worker ssize_t CryptoHalAidl::decrypt(const uint8_t keyId[16], const uint8_t iv[16],
275*ec779b8eSAndroid Build Coastguard Worker                                CryptoPlugin::Mode mode, const CryptoPlugin::Pattern& pattern,
276*ec779b8eSAndroid Build Coastguard Worker                                const SharedBufferHidl& hSource, size_t offset,
277*ec779b8eSAndroid Build Coastguard Worker                                const CryptoPlugin::SubSample* subSamples, size_t numSubSamples,
278*ec779b8eSAndroid Build Coastguard Worker                                const DestinationBufferHidl& hDestination, AString* errorDetailMsg) {
279*ec779b8eSAndroid Build Coastguard Worker     Mutex::Autolock autoLock(mLock);
280*ec779b8eSAndroid Build Coastguard Worker 
281*ec779b8eSAndroid Build Coastguard Worker     if (mInitCheck != OK) {
282*ec779b8eSAndroid Build Coastguard Worker         return mInitCheck;
283*ec779b8eSAndroid Build Coastguard Worker     }
284*ec779b8eSAndroid Build Coastguard Worker 
285*ec779b8eSAndroid Build Coastguard Worker     Mode aMode;
286*ec779b8eSAndroid Build Coastguard Worker     switch (mode) {
287*ec779b8eSAndroid Build Coastguard Worker         case CryptoPlugin::kMode_Unencrypted:
288*ec779b8eSAndroid Build Coastguard Worker             aMode = Mode::UNENCRYPTED;
289*ec779b8eSAndroid Build Coastguard Worker             break;
290*ec779b8eSAndroid Build Coastguard Worker         case CryptoPlugin::kMode_AES_CTR:
291*ec779b8eSAndroid Build Coastguard Worker             aMode = Mode::AES_CTR;
292*ec779b8eSAndroid Build Coastguard Worker             break;
293*ec779b8eSAndroid Build Coastguard Worker         case CryptoPlugin::kMode_AES_WV:
294*ec779b8eSAndroid Build Coastguard Worker             aMode = Mode::AES_CBC_CTS;
295*ec779b8eSAndroid Build Coastguard Worker             break;
296*ec779b8eSAndroid Build Coastguard Worker         case CryptoPlugin::kMode_AES_CBC:
297*ec779b8eSAndroid Build Coastguard Worker             aMode = Mode::AES_CBC;
298*ec779b8eSAndroid Build Coastguard Worker             break;
299*ec779b8eSAndroid Build Coastguard Worker         default:
300*ec779b8eSAndroid Build Coastguard Worker             return UNKNOWN_ERROR;
301*ec779b8eSAndroid Build Coastguard Worker     }
302*ec779b8eSAndroid Build Coastguard Worker 
303*ec779b8eSAndroid Build Coastguard Worker     Pattern aPattern;
304*ec779b8eSAndroid Build Coastguard Worker     aPattern.encryptBlocks = pattern.mEncryptBlocks;
305*ec779b8eSAndroid Build Coastguard Worker     aPattern.skipBlocks = pattern.mSkipBlocks;
306*ec779b8eSAndroid Build Coastguard Worker 
307*ec779b8eSAndroid Build Coastguard Worker     std::vector<SubSample> stdSubSamples;
308*ec779b8eSAndroid Build Coastguard Worker     for (size_t i = 0; i < numSubSamples; i++) {
309*ec779b8eSAndroid Build Coastguard Worker         SubSample subSample;
310*ec779b8eSAndroid Build Coastguard Worker         subSample.numBytesOfClearData = subSamples[i].mNumBytesOfClearData;
311*ec779b8eSAndroid Build Coastguard Worker         subSample.numBytesOfEncryptedData = subSamples[i].mNumBytesOfEncryptedData;
312*ec779b8eSAndroid Build Coastguard Worker         stdSubSamples.push_back(subSample);
313*ec779b8eSAndroid Build Coastguard Worker     }
314*ec779b8eSAndroid Build Coastguard Worker 
315*ec779b8eSAndroid Build Coastguard Worker     bool secure;
316*ec779b8eSAndroid Build Coastguard Worker     if (hDestination.type == BufferTypeHidl::SHARED_MEMORY) {
317*ec779b8eSAndroid Build Coastguard Worker         status_t status = checkSharedBuffer(hDestination.nonsecureMemory);
318*ec779b8eSAndroid Build Coastguard Worker         if (status != OK) {
319*ec779b8eSAndroid Build Coastguard Worker             return status;
320*ec779b8eSAndroid Build Coastguard Worker         }
321*ec779b8eSAndroid Build Coastguard Worker         secure = false;
322*ec779b8eSAndroid Build Coastguard Worker     } else if (hDestination.type == BufferTypeHidl::NATIVE_HANDLE) {
323*ec779b8eSAndroid Build Coastguard Worker         secure = true;
324*ec779b8eSAndroid Build Coastguard Worker     } else {
325*ec779b8eSAndroid Build Coastguard Worker         android_errorWriteLog(0x534e4554, "70526702");
326*ec779b8eSAndroid Build Coastguard Worker         return UNKNOWN_ERROR;
327*ec779b8eSAndroid Build Coastguard Worker     }
328*ec779b8eSAndroid Build Coastguard Worker 
329*ec779b8eSAndroid Build Coastguard Worker     status_t status = checkSharedBuffer(hSource);
330*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
331*ec779b8eSAndroid Build Coastguard Worker         return status;
332*ec779b8eSAndroid Build Coastguard Worker     }
333*ec779b8eSAndroid Build Coastguard Worker 
334*ec779b8eSAndroid Build Coastguard Worker     status_t err = UNKNOWN_ERROR;
335*ec779b8eSAndroid Build Coastguard Worker     mLock.unlock();
336*ec779b8eSAndroid Build Coastguard Worker 
337*ec779b8eSAndroid Build Coastguard Worker     std::vector<uint8_t> keyIdAidl(toStdVec(keyId, 16));
338*ec779b8eSAndroid Build Coastguard Worker     std::vector<uint8_t> ivAidl(toStdVec(iv, 16));
339*ec779b8eSAndroid Build Coastguard Worker 
340*ec779b8eSAndroid Build Coastguard Worker     DecryptArgs args;
341*ec779b8eSAndroid Build Coastguard Worker     args.secure = secure;
342*ec779b8eSAndroid Build Coastguard Worker     args.keyId = keyIdAidl;
343*ec779b8eSAndroid Build Coastguard Worker     args.iv = ivAidl;
344*ec779b8eSAndroid Build Coastguard Worker     args.mode = aMode;
345*ec779b8eSAndroid Build Coastguard Worker     args.pattern = aPattern;
346*ec779b8eSAndroid Build Coastguard Worker     args.subSamples = std::move(stdSubSamples);
347*ec779b8eSAndroid Build Coastguard Worker     args.source = hidlSharedBufferToAidlSharedBuffer(hSource);
348*ec779b8eSAndroid Build Coastguard Worker     args.offset = offset;
349*ec779b8eSAndroid Build Coastguard Worker     args.destination = hidlDestinationBufferToAidlDestinationBuffer(hDestination);
350*ec779b8eSAndroid Build Coastguard Worker 
351*ec779b8eSAndroid Build Coastguard Worker 
352*ec779b8eSAndroid Build Coastguard Worker     int32_t result = 0;
353*ec779b8eSAndroid Build Coastguard Worker     ::ndk::ScopedAStatus statusAidl = mPlugin->decrypt(args, &result);
354*ec779b8eSAndroid Build Coastguard Worker 
355*ec779b8eSAndroid Build Coastguard Worker     err = statusAidlToDrmStatus(statusAidl);
356*ec779b8eSAndroid Build Coastguard Worker     std::string msgStr(statusAidl.getMessage());
357*ec779b8eSAndroid Build Coastguard Worker     if (errorDetailMsg != nullptr) {
358*ec779b8eSAndroid Build Coastguard Worker         *errorDetailMsg = toString8(msgStr);
359*ec779b8eSAndroid Build Coastguard Worker     }
360*ec779b8eSAndroid Build Coastguard Worker     if (err != OK) {
361*ec779b8eSAndroid Build Coastguard Worker         ALOGE("Failed on decrypt, error description:%s", statusAidl.getDescription().c_str());
362*ec779b8eSAndroid Build Coastguard Worker         return err;
363*ec779b8eSAndroid Build Coastguard Worker     }
364*ec779b8eSAndroid Build Coastguard Worker 
365*ec779b8eSAndroid Build Coastguard Worker     return result;
366*ec779b8eSAndroid Build Coastguard Worker }
367*ec779b8eSAndroid Build Coastguard Worker 
setHeap(const sp<HidlMemory> & heap)368*ec779b8eSAndroid Build Coastguard Worker int32_t CryptoHalAidl::setHeap(const sp<HidlMemory>& heap) {
369*ec779b8eSAndroid Build Coastguard Worker     if (heap == NULL || mHeapSeqNum < 0) {
370*ec779b8eSAndroid Build Coastguard Worker         ALOGE("setHeap(): heap %p mHeapSeqNum %d", heap.get(), mHeapSeqNum);
371*ec779b8eSAndroid Build Coastguard Worker         return -1;
372*ec779b8eSAndroid Build Coastguard Worker     }
373*ec779b8eSAndroid Build Coastguard Worker 
374*ec779b8eSAndroid Build Coastguard Worker     Mutex::Autolock autoLock(mLock);
375*ec779b8eSAndroid Build Coastguard Worker 
376*ec779b8eSAndroid Build Coastguard Worker     if (mInitCheck != OK) {
377*ec779b8eSAndroid Build Coastguard Worker         return -1;
378*ec779b8eSAndroid Build Coastguard Worker     }
379*ec779b8eSAndroid Build Coastguard Worker 
380*ec779b8eSAndroid Build Coastguard Worker     int32_t seqNum = mHeapSeqNum++;
381*ec779b8eSAndroid Build Coastguard Worker     uint32_t bufferId = static_cast<uint32_t>(seqNum);
382*ec779b8eSAndroid Build Coastguard Worker     mHeapSizes.add(seqNum, heap->size());
383*ec779b8eSAndroid Build Coastguard Worker 
384*ec779b8eSAndroid Build Coastguard Worker     SharedBufferAidl memAidl;
385*ec779b8eSAndroid Build Coastguard Worker     memAidl.handle = ::android::dupToAidl(heap->handle());
386*ec779b8eSAndroid Build Coastguard Worker     memAidl.size = heap->size();
387*ec779b8eSAndroid Build Coastguard Worker     memAidl.bufferId = bufferId;
388*ec779b8eSAndroid Build Coastguard Worker 
389*ec779b8eSAndroid Build Coastguard Worker     auto status = mPlugin->setSharedBufferBase(memAidl);
390*ec779b8eSAndroid Build Coastguard Worker        ALOGE_IF(!status.isOk(),
391*ec779b8eSAndroid Build Coastguard Worker              "setSharedBufferBase(): remote call failed");
392*ec779b8eSAndroid Build Coastguard Worker     return seqNum;
393*ec779b8eSAndroid Build Coastguard Worker }
394*ec779b8eSAndroid Build Coastguard Worker 
unsetHeap(int32_t seqNum)395*ec779b8eSAndroid Build Coastguard Worker void CryptoHalAidl::unsetHeap(int32_t seqNum) {
396*ec779b8eSAndroid Build Coastguard Worker     Mutex::Autolock autoLock(mLock);
397*ec779b8eSAndroid Build Coastguard Worker 
398*ec779b8eSAndroid Build Coastguard Worker     /*
399*ec779b8eSAndroid Build Coastguard Worker      * Clear the remote shared memory mapping by setting the shared
400*ec779b8eSAndroid Build Coastguard Worker      * buffer base to a null hidl_memory.
401*ec779b8eSAndroid Build Coastguard Worker      *
402*ec779b8eSAndroid Build Coastguard Worker      * TODO: Add a releaseSharedBuffer method in a future DRM HAL
403*ec779b8eSAndroid Build Coastguard Worker      * API version to make this explicit.
404*ec779b8eSAndroid Build Coastguard Worker      */
405*ec779b8eSAndroid Build Coastguard Worker     ssize_t index = mHeapSizes.indexOfKey(seqNum);
406*ec779b8eSAndroid Build Coastguard Worker     if (index >= 0) {
407*ec779b8eSAndroid Build Coastguard Worker         if (mPlugin != NULL) {
408*ec779b8eSAndroid Build Coastguard Worker             uint32_t bufferId = static_cast<uint32_t>(seqNum);
409*ec779b8eSAndroid Build Coastguard Worker             SharedBufferAidl memAidl{};
410*ec779b8eSAndroid Build Coastguard Worker             memAidl.bufferId = bufferId;
411*ec779b8eSAndroid Build Coastguard Worker             auto status = mPlugin->setSharedBufferBase(memAidl);
412*ec779b8eSAndroid Build Coastguard Worker             ALOGE_IF(!status.isOk(),
413*ec779b8eSAndroid Build Coastguard Worker                      "setSharedBufferBase(): remote call failed");
414*ec779b8eSAndroid Build Coastguard Worker         }
415*ec779b8eSAndroid Build Coastguard Worker         mHeapSizes.removeItem(seqNum);
416*ec779b8eSAndroid Build Coastguard Worker     }
417*ec779b8eSAndroid Build Coastguard Worker }
418*ec779b8eSAndroid Build Coastguard Worker 
getLogMessages(Vector<drm::V1_4::LogMessage> & logs) const419*ec779b8eSAndroid Build Coastguard Worker status_t CryptoHalAidl::getLogMessages(Vector<drm::V1_4::LogMessage>& logs) const {
420*ec779b8eSAndroid Build Coastguard Worker     Mutex::Autolock autoLock(mLock);
421*ec779b8eSAndroid Build Coastguard Worker     // Need to convert logmessage
422*ec779b8eSAndroid Build Coastguard Worker 
423*ec779b8eSAndroid Build Coastguard Worker     return DrmUtils::GetLogMessagesAidl<ICryptoPluginAidl>(mPlugin, logs);
424*ec779b8eSAndroid Build Coastguard Worker }
425*ec779b8eSAndroid Build Coastguard Worker }  // namespace android
426