xref: /aosp_15_r20/frameworks/av/drm/libmediadrm/CryptoHal.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright (C) 2017 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 "CryptoHal"
19*ec779b8eSAndroid Build Coastguard Worker #include <mediadrm/CryptoHal.h>
20*ec779b8eSAndroid Build Coastguard Worker #include <mediadrm/CryptoHalHidl.h>
21*ec779b8eSAndroid Build Coastguard Worker #include <mediadrm/CryptoHalAidl.h>
22*ec779b8eSAndroid Build Coastguard Worker #include <mediadrm/DrmUtils.h>
23*ec779b8eSAndroid Build Coastguard Worker 
24*ec779b8eSAndroid Build Coastguard Worker namespace android {
25*ec779b8eSAndroid Build Coastguard Worker 
CryptoHal()26*ec779b8eSAndroid Build Coastguard Worker CryptoHal::CryptoHal() {
27*ec779b8eSAndroid Build Coastguard Worker     mCryptoHalAidl = sp<CryptoHalAidl>::make();
28*ec779b8eSAndroid Build Coastguard Worker     mCryptoHalHidl = sp<CryptoHalHidl>::make();
29*ec779b8eSAndroid Build Coastguard Worker }
30*ec779b8eSAndroid Build Coastguard Worker 
~CryptoHal()31*ec779b8eSAndroid Build Coastguard Worker CryptoHal::~CryptoHal() {}
32*ec779b8eSAndroid Build Coastguard Worker 
initCheck() const33*ec779b8eSAndroid Build Coastguard Worker status_t CryptoHal::initCheck() const {
34*ec779b8eSAndroid Build Coastguard Worker     if (mCryptoHalAidl->initCheck() == OK || mCryptoHalHidl->initCheck() == OK) return OK;
35*ec779b8eSAndroid Build Coastguard Worker     if (mCryptoHalAidl->initCheck() == NO_INIT || mCryptoHalHidl->initCheck() == NO_INIT)
36*ec779b8eSAndroid Build Coastguard Worker         return NO_INIT;
37*ec779b8eSAndroid Build Coastguard Worker     return mCryptoHalHidl->initCheck();
38*ec779b8eSAndroid Build Coastguard Worker }
39*ec779b8eSAndroid Build Coastguard Worker 
isCryptoSchemeSupported(const uint8_t uuid[16])40*ec779b8eSAndroid Build Coastguard Worker bool CryptoHal::isCryptoSchemeSupported(const uint8_t uuid[16]) {
41*ec779b8eSAndroid Build Coastguard Worker     return mCryptoHalAidl->isCryptoSchemeSupported(uuid) ||
42*ec779b8eSAndroid Build Coastguard Worker            mCryptoHalHidl->isCryptoSchemeSupported(uuid);
43*ec779b8eSAndroid Build Coastguard Worker }
44*ec779b8eSAndroid Build Coastguard Worker 
createPlugin(const uint8_t uuid[16],const void * data,size_t size)45*ec779b8eSAndroid Build Coastguard Worker status_t CryptoHal::createPlugin(const uint8_t uuid[16], const void* data, size_t size) {
46*ec779b8eSAndroid Build Coastguard Worker     if (mCryptoHalAidl->createPlugin(uuid, data, size) != OK)
47*ec779b8eSAndroid Build Coastguard Worker         return mCryptoHalHidl->createPlugin(uuid, data, size);
48*ec779b8eSAndroid Build Coastguard Worker     return OK;
49*ec779b8eSAndroid Build Coastguard Worker }
50*ec779b8eSAndroid Build Coastguard Worker 
destroyPlugin()51*ec779b8eSAndroid Build Coastguard Worker status_t CryptoHal::destroyPlugin() {
52*ec779b8eSAndroid Build Coastguard Worker     // This requires plugin to be created.
53*ec779b8eSAndroid Build Coastguard Worker     if (mCryptoHalAidl->initCheck() == OK) return mCryptoHalAidl->destroyPlugin();
54*ec779b8eSAndroid Build Coastguard Worker     return mCryptoHalHidl->destroyPlugin();
55*ec779b8eSAndroid Build Coastguard Worker }
56*ec779b8eSAndroid Build Coastguard Worker 
requiresSecureDecoderComponent(const char * mime) const57*ec779b8eSAndroid Build Coastguard Worker bool CryptoHal::requiresSecureDecoderComponent(const char* mime) const {
58*ec779b8eSAndroid Build Coastguard Worker     // This requires plugin to be created.
59*ec779b8eSAndroid Build Coastguard Worker     if (mCryptoHalAidl->initCheck() == OK)
60*ec779b8eSAndroid Build Coastguard Worker         return mCryptoHalAidl->requiresSecureDecoderComponent(mime);
61*ec779b8eSAndroid Build Coastguard Worker     return mCryptoHalHidl->requiresSecureDecoderComponent(mime);
62*ec779b8eSAndroid Build Coastguard Worker }
63*ec779b8eSAndroid Build Coastguard Worker 
notifyResolution(uint32_t width,uint32_t height)64*ec779b8eSAndroid Build Coastguard Worker void CryptoHal::notifyResolution(uint32_t width, uint32_t height) {
65*ec779b8eSAndroid Build Coastguard Worker     // This requires plugin to be created.
66*ec779b8eSAndroid Build Coastguard Worker     if (mCryptoHalAidl->initCheck() == OK) {
67*ec779b8eSAndroid Build Coastguard Worker         mCryptoHalAidl->notifyResolution(width, height);
68*ec779b8eSAndroid Build Coastguard Worker         return;
69*ec779b8eSAndroid Build Coastguard Worker     }
70*ec779b8eSAndroid Build Coastguard Worker 
71*ec779b8eSAndroid Build Coastguard Worker     mCryptoHalHidl->notifyResolution(width, height);
72*ec779b8eSAndroid Build Coastguard Worker }
73*ec779b8eSAndroid Build Coastguard Worker 
setMediaDrmSession(const Vector<uint8_t> & sessionId)74*ec779b8eSAndroid Build Coastguard Worker DrmStatus CryptoHal::setMediaDrmSession(const Vector<uint8_t>& sessionId) {
75*ec779b8eSAndroid Build Coastguard Worker     // This requires plugin to be created.
76*ec779b8eSAndroid Build Coastguard Worker     if (mCryptoHalAidl->initCheck() == OK) return mCryptoHalAidl->setMediaDrmSession(sessionId);
77*ec779b8eSAndroid Build Coastguard Worker     return mCryptoHalHidl->setMediaDrmSession(sessionId);
78*ec779b8eSAndroid Build Coastguard Worker }
79*ec779b8eSAndroid Build Coastguard Worker 
decrypt(const uint8_t key[16],const uint8_t iv[16],CryptoPlugin::Mode mode,const CryptoPlugin::Pattern & pattern,const::SharedBuffer & source,size_t offset,const CryptoPlugin::SubSample * subSamples,size_t numSubSamples,const::DestinationBuffer & destination,AString * errorDetailMsg)80*ec779b8eSAndroid Build Coastguard Worker ssize_t CryptoHal::decrypt(const uint8_t key[16], const uint8_t iv[16], CryptoPlugin::Mode mode,
81*ec779b8eSAndroid Build Coastguard Worker                            const CryptoPlugin::Pattern& pattern, const ::SharedBuffer& source,
82*ec779b8eSAndroid Build Coastguard Worker                            size_t offset, const CryptoPlugin::SubSample* subSamples,
83*ec779b8eSAndroid Build Coastguard Worker                            size_t numSubSamples, const ::DestinationBuffer& destination,
84*ec779b8eSAndroid Build Coastguard Worker                            AString* errorDetailMsg) {
85*ec779b8eSAndroid Build Coastguard Worker     // This requires plugin to be created.
86*ec779b8eSAndroid Build Coastguard Worker     if (mCryptoHalAidl->initCheck() == OK)
87*ec779b8eSAndroid Build Coastguard Worker         return mCryptoHalAidl->decrypt(key, iv, mode, pattern, source, offset, subSamples,
88*ec779b8eSAndroid Build Coastguard Worker                                        numSubSamples, destination, errorDetailMsg);
89*ec779b8eSAndroid Build Coastguard Worker     return mCryptoHalHidl->decrypt(key, iv, mode, pattern, source, offset, subSamples,
90*ec779b8eSAndroid Build Coastguard Worker                                    numSubSamples, destination, errorDetailMsg);
91*ec779b8eSAndroid Build Coastguard Worker }
92*ec779b8eSAndroid Build Coastguard Worker 
setHeap(const sp<HidlMemory> & heap)93*ec779b8eSAndroid Build Coastguard Worker int32_t CryptoHal::setHeap(const sp<HidlMemory>& heap) {
94*ec779b8eSAndroid Build Coastguard Worker     // This requires plugin to be created.
95*ec779b8eSAndroid Build Coastguard Worker     if (mCryptoHalAidl->initCheck() == OK) return mCryptoHalAidl->setHeap(heap);
96*ec779b8eSAndroid Build Coastguard Worker     return mCryptoHalHidl->setHeap(heap);
97*ec779b8eSAndroid Build Coastguard Worker }
98*ec779b8eSAndroid Build Coastguard Worker 
unsetHeap(int32_t seqNum)99*ec779b8eSAndroid Build Coastguard Worker void CryptoHal::unsetHeap(int32_t seqNum) {
100*ec779b8eSAndroid Build Coastguard Worker     // This requires plugin to be created.
101*ec779b8eSAndroid Build Coastguard Worker     if (mCryptoHalAidl->initCheck() == OK) {
102*ec779b8eSAndroid Build Coastguard Worker         mCryptoHalAidl->unsetHeap(seqNum);
103*ec779b8eSAndroid Build Coastguard Worker         return;
104*ec779b8eSAndroid Build Coastguard Worker     }
105*ec779b8eSAndroid Build Coastguard Worker 
106*ec779b8eSAndroid Build Coastguard Worker     mCryptoHalHidl->unsetHeap(seqNum);
107*ec779b8eSAndroid Build Coastguard Worker }
108*ec779b8eSAndroid Build Coastguard Worker 
getLogMessages(Vector<drm::V1_4::LogMessage> & logs) const109*ec779b8eSAndroid Build Coastguard Worker status_t CryptoHal::getLogMessages(Vector<drm::V1_4::LogMessage>& logs) const {
110*ec779b8eSAndroid Build Coastguard Worker     // This requires plugin to be created.
111*ec779b8eSAndroid Build Coastguard Worker     if (mCryptoHalAidl->initCheck() == OK) return mCryptoHalAidl->getLogMessages(logs);
112*ec779b8eSAndroid Build Coastguard Worker     return mCryptoHalHidl->getLogMessages(logs);
113*ec779b8eSAndroid Build Coastguard Worker }
114*ec779b8eSAndroid Build Coastguard Worker 
115*ec779b8eSAndroid Build Coastguard Worker }  // namespace android