• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 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 "DrmHal"
19 
20 #include <mediadrm/DrmHal.h>
21 #include <mediadrm/DrmHalAidl.h>
22 #include <mediadrm/DrmHalHidl.h>
23 #include <mediadrm/DrmUtils.h>
24 
25 namespace android {
26 
DrmHal()27 DrmHal::DrmHal() {
28     mDrmHalHidl = sp<DrmHalHidl>::make();
29     mDrmHalAidl = sp<DrmHalAidl>::make();
30 }
31 
~DrmHal()32 DrmHal::~DrmHal() {}
33 
initCheck() const34 status_t DrmHal::initCheck() const {
35     if (mDrmHalAidl->initCheck() == OK || mDrmHalHidl->initCheck() == OK) return OK;
36     if (mDrmHalAidl->initCheck() == NO_INIT || mDrmHalHidl->initCheck() == NO_INIT) return NO_INIT;
37     return mDrmHalHidl->initCheck();
38 }
39 
isCryptoSchemeSupported(const uint8_t uuid[16],const String8 & mimeType,DrmPlugin::SecurityLevel securityLevel,bool * result)40 status_t DrmHal::isCryptoSchemeSupported(const uint8_t uuid[16], const String8& mimeType,
41                                          DrmPlugin::SecurityLevel securityLevel, bool* result) {
42     status_t statusResult;
43     statusResult = mDrmHalAidl->isCryptoSchemeSupported(uuid, mimeType, securityLevel, result);
44     if (*result) return statusResult;
45     return mDrmHalHidl->isCryptoSchemeSupported(uuid, mimeType, securityLevel, result);
46 }
47 
createPlugin(const uint8_t uuid[16],const String8 & appPackageName)48 status_t DrmHal::createPlugin(const uint8_t uuid[16], const String8& appPackageName) {
49     status_t statusResult;
50     statusResult = mDrmHalAidl->createPlugin(uuid, appPackageName);
51     if (statusResult != OK) return mDrmHalHidl->createPlugin(uuid, appPackageName);
52     return statusResult;
53 }
54 
destroyPlugin()55 status_t DrmHal::destroyPlugin() {
56     status_t statusResult = mDrmHalAidl->destroyPlugin();
57     status_t statusResultHidl = mDrmHalHidl->destroyPlugin();
58     if (statusResult != OK) return statusResult;
59     return statusResultHidl;
60 }
61 
openSession(DrmPlugin::SecurityLevel securityLevel,Vector<uint8_t> & sessionId)62 status_t DrmHal::openSession(DrmPlugin::SecurityLevel securityLevel, Vector<uint8_t>& sessionId) {
63     if (mDrmHalAidl->initCheck() == OK) return mDrmHalAidl->openSession(securityLevel, sessionId);
64     return mDrmHalHidl->openSession(securityLevel, sessionId);
65 }
66 
closeSession(Vector<uint8_t> const & sessionId)67 status_t DrmHal::closeSession(Vector<uint8_t> const& sessionId) {
68     if (mDrmHalAidl->initCheck() == OK) return mDrmHalAidl->closeSession(sessionId);
69     return mDrmHalHidl->closeSession(sessionId);
70 }
71 
getKeyRequest(Vector<uint8_t> const & sessionId,Vector<uint8_t> const & initData,String8 const & mimeType,DrmPlugin::KeyType keyType,KeyedVector<String8,String8> const & optionalParameters,Vector<uint8_t> & request,String8 & defaultUrl,DrmPlugin::KeyRequestType * keyRequestType)72 status_t DrmHal::getKeyRequest(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& initData,
73                                String8 const& mimeType, DrmPlugin::KeyType keyType,
74                                KeyedVector<String8, String8> const& optionalParameters,
75                                Vector<uint8_t>& request, String8& defaultUrl,
76                                DrmPlugin::KeyRequestType* keyRequestType) {
77     if (mDrmHalAidl->initCheck() == OK)
78         return mDrmHalAidl->getKeyRequest(sessionId, initData, mimeType, keyType,
79                                           optionalParameters, request, defaultUrl, keyRequestType);
80     return mDrmHalHidl->getKeyRequest(sessionId, initData, mimeType, keyType, optionalParameters,
81                                       request, defaultUrl, keyRequestType);
82 }
83 
provideKeyResponse(Vector<uint8_t> const & sessionId,Vector<uint8_t> const & response,Vector<uint8_t> & keySetId)84 status_t DrmHal::provideKeyResponse(Vector<uint8_t> const& sessionId,
85                                     Vector<uint8_t> const& response, Vector<uint8_t>& keySetId) {
86     if (mDrmHalAidl->initCheck() == OK)
87         return mDrmHalAidl->provideKeyResponse(sessionId, response, keySetId);
88     return mDrmHalHidl->provideKeyResponse(sessionId, response, keySetId);
89 }
90 
removeKeys(Vector<uint8_t> const & keySetId)91 status_t DrmHal::removeKeys(Vector<uint8_t> const& keySetId) {
92     if (mDrmHalAidl->initCheck() == OK) return mDrmHalAidl->removeKeys(keySetId);
93     return mDrmHalHidl->removeKeys(keySetId);
94 }
95 
restoreKeys(Vector<uint8_t> const & sessionId,Vector<uint8_t> const & keySetId)96 status_t DrmHal::restoreKeys(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keySetId) {
97     if (mDrmHalAidl->initCheck() == OK) return mDrmHalAidl->restoreKeys(sessionId, keySetId);
98     return mDrmHalHidl->restoreKeys(sessionId, keySetId);
99 }
100 
queryKeyStatus(Vector<uint8_t> const & sessionId,KeyedVector<String8,String8> & infoMap) const101 status_t DrmHal::queryKeyStatus(Vector<uint8_t> const& sessionId,
102                                 KeyedVector<String8, String8>& infoMap) const {
103     if (mDrmHalAidl->initCheck() == OK) return mDrmHalAidl->queryKeyStatus(sessionId, infoMap);
104     return mDrmHalHidl->queryKeyStatus(sessionId, infoMap);
105 }
106 
getProvisionRequest(String8 const & certType,String8 const & certAuthority,Vector<uint8_t> & request,String8 & defaultUrl)107 status_t DrmHal::getProvisionRequest(String8 const& certType, String8 const& certAuthority,
108                                      Vector<uint8_t>& request, String8& defaultUrl) {
109     if (mDrmHalAidl->initCheck() == OK)
110         return mDrmHalAidl->getProvisionRequest(certType, certAuthority, request, defaultUrl);
111     return mDrmHalHidl->getProvisionRequest(certType, certAuthority, request, defaultUrl);
112 }
113 
provideProvisionResponse(Vector<uint8_t> const & response,Vector<uint8_t> & certificate,Vector<uint8_t> & wrappedKey)114 status_t DrmHal::provideProvisionResponse(Vector<uint8_t> const& response,
115                                           Vector<uint8_t>& certificate,
116                                           Vector<uint8_t>& wrappedKey) {
117     if (mDrmHalAidl->initCheck() == OK)
118         return mDrmHalAidl->provideProvisionResponse(response, certificate, wrappedKey);
119     return mDrmHalHidl->provideProvisionResponse(response, certificate, wrappedKey);
120 }
121 
getSecureStops(List<Vector<uint8_t>> & secureStops)122 status_t DrmHal::getSecureStops(List<Vector<uint8_t>>& secureStops) {
123     if (mDrmHalAidl->initCheck() == OK) return mDrmHalAidl->getSecureStops(secureStops);
124     return mDrmHalHidl->getSecureStops(secureStops);
125 }
126 
getSecureStopIds(List<Vector<uint8_t>> & secureStopIds)127 status_t DrmHal::getSecureStopIds(List<Vector<uint8_t>>& secureStopIds) {
128     if (mDrmHalAidl->initCheck() == OK) return mDrmHalAidl->getSecureStopIds(secureStopIds);
129     return mDrmHalHidl->getSecureStopIds(secureStopIds);
130 }
131 
getSecureStop(Vector<uint8_t> const & ssid,Vector<uint8_t> & secureStop)132 status_t DrmHal::getSecureStop(Vector<uint8_t> const& ssid, Vector<uint8_t>& secureStop) {
133     if (mDrmHalAidl->initCheck() == OK) return mDrmHalAidl->getSecureStop(ssid, secureStop);
134     return mDrmHalHidl->getSecureStop(ssid, secureStop);
135 }
136 
releaseSecureStops(Vector<uint8_t> const & ssRelease)137 status_t DrmHal::releaseSecureStops(Vector<uint8_t> const& ssRelease) {
138     if (mDrmHalAidl->initCheck() == OK) return mDrmHalAidl->releaseSecureStops(ssRelease);
139     return mDrmHalHidl->releaseSecureStops(ssRelease);
140 }
141 
removeSecureStop(Vector<uint8_t> const & ssid)142 status_t DrmHal::removeSecureStop(Vector<uint8_t> const& ssid) {
143     if (mDrmHalAidl->initCheck() == OK) return mDrmHalAidl->removeSecureStop(ssid);
144     return mDrmHalHidl->removeSecureStop(ssid);
145 }
146 
removeAllSecureStops()147 status_t DrmHal::removeAllSecureStops() {
148     if (mDrmHalAidl->initCheck() == OK) return mDrmHalAidl->removeAllSecureStops();
149     return mDrmHalHidl->removeAllSecureStops();
150 }
151 
getHdcpLevels(DrmPlugin::HdcpLevel * connectedLevel,DrmPlugin::HdcpLevel * maxLevel) const152 status_t DrmHal::getHdcpLevels(DrmPlugin::HdcpLevel* connectedLevel,
153                                DrmPlugin::HdcpLevel* maxLevel) const {
154     if (mDrmHalAidl->initCheck() == OK) return mDrmHalAidl->getHdcpLevels(connectedLevel, maxLevel);
155     return mDrmHalHidl->getHdcpLevels(connectedLevel, maxLevel);
156 }
157 
getNumberOfSessions(uint32_t * currentSessions,uint32_t * maxSessions) const158 status_t DrmHal::getNumberOfSessions(uint32_t* currentSessions, uint32_t* maxSessions) const {
159     if (mDrmHalAidl->initCheck() == OK)
160         return mDrmHalAidl->getNumberOfSessions(currentSessions, maxSessions);
161     return mDrmHalHidl->getNumberOfSessions(currentSessions, maxSessions);
162 }
163 
getSecurityLevel(Vector<uint8_t> const & sessionId,DrmPlugin::SecurityLevel * level) const164 status_t DrmHal::getSecurityLevel(Vector<uint8_t> const& sessionId,
165                                   DrmPlugin::SecurityLevel* level) const {
166     if (mDrmHalAidl->initCheck() == OK) return mDrmHalAidl->getSecurityLevel(sessionId, level);
167     return mDrmHalHidl->getSecurityLevel(sessionId, level);
168 }
169 
getOfflineLicenseKeySetIds(List<Vector<uint8_t>> & keySetIds) const170 status_t DrmHal::getOfflineLicenseKeySetIds(List<Vector<uint8_t>>& keySetIds) const {
171     if (mDrmHalAidl->initCheck() == OK) return mDrmHalAidl->getOfflineLicenseKeySetIds(keySetIds);
172     return mDrmHalHidl->getOfflineLicenseKeySetIds(keySetIds);
173 }
174 
removeOfflineLicense(Vector<uint8_t> const & keySetId)175 status_t DrmHal::removeOfflineLicense(Vector<uint8_t> const& keySetId) {
176     if (mDrmHalAidl->initCheck() == OK) return mDrmHalAidl->removeOfflineLicense(keySetId);
177     return mDrmHalHidl->removeOfflineLicense(keySetId);
178 }
179 
getOfflineLicenseState(Vector<uint8_t> const & keySetId,DrmPlugin::OfflineLicenseState * licenseState) const180 status_t DrmHal::getOfflineLicenseState(Vector<uint8_t> const& keySetId,
181                                         DrmPlugin::OfflineLicenseState* licenseState) const {
182     if (mDrmHalAidl->initCheck() == OK)
183         return mDrmHalAidl->getOfflineLicenseState(keySetId, licenseState);
184     return mDrmHalHidl->getOfflineLicenseState(keySetId, licenseState);
185 }
186 
getPropertyString(String8 const & name,String8 & value) const187 status_t DrmHal::getPropertyString(String8 const& name, String8& value) const {
188     if (mDrmHalAidl->initCheck() == OK) return mDrmHalAidl->getPropertyString(name, value);
189     return mDrmHalHidl->getPropertyString(name, value);
190 }
191 
getPropertyByteArray(String8 const & name,Vector<uint8_t> & value) const192 status_t DrmHal::getPropertyByteArray(String8 const& name, Vector<uint8_t>& value) const {
193     if (mDrmHalAidl->initCheck() == OK) return mDrmHalAidl->getPropertyByteArray(name, value);
194     return mDrmHalHidl->getPropertyByteArray(name, value);
195 }
196 
setPropertyString(String8 const & name,String8 const & value) const197 status_t DrmHal::setPropertyString(String8 const& name, String8 const& value) const {
198     if (mDrmHalAidl->initCheck() == OK) return mDrmHalAidl->setPropertyString(name, value);
199     return mDrmHalHidl->setPropertyString(name, value);
200 }
201 
setPropertyByteArray(String8 const & name,Vector<uint8_t> const & value) const202 status_t DrmHal::setPropertyByteArray(String8 const& name, Vector<uint8_t> const& value) const {
203     if (mDrmHalAidl->initCheck() == OK) return mDrmHalAidl->setPropertyByteArray(name, value);
204     return mDrmHalHidl->setPropertyByteArray(name, value);
205 }
206 
getMetrics(const sp<IDrmMetricsConsumer> & consumer)207 status_t DrmHal::getMetrics(const sp<IDrmMetricsConsumer>& consumer) {
208     if (mDrmHalAidl->initCheck() == OK) return mDrmHalAidl->getMetrics(consumer);
209     return mDrmHalHidl->getMetrics(consumer);
210 }
211 
setCipherAlgorithm(Vector<uint8_t> const & sessionId,String8 const & algorithm)212 status_t DrmHal::setCipherAlgorithm(Vector<uint8_t> const& sessionId, String8 const& algorithm) {
213     if (mDrmHalAidl->initCheck() == OK)
214         return mDrmHalAidl->setCipherAlgorithm(sessionId, algorithm);
215     return mDrmHalHidl->setCipherAlgorithm(sessionId, algorithm);
216 }
217 
setMacAlgorithm(Vector<uint8_t> const & sessionId,String8 const & algorithm)218 status_t DrmHal::setMacAlgorithm(Vector<uint8_t> const& sessionId, String8 const& algorithm) {
219     if (mDrmHalAidl->initCheck() == OK) return mDrmHalAidl->setMacAlgorithm(sessionId, algorithm);
220     return mDrmHalHidl->setMacAlgorithm(sessionId, algorithm);
221 }
222 
encrypt(Vector<uint8_t> const & sessionId,Vector<uint8_t> const & keyId,Vector<uint8_t> const & input,Vector<uint8_t> const & iv,Vector<uint8_t> & output)223 status_t DrmHal::encrypt(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keyId,
224                          Vector<uint8_t> const& input, Vector<uint8_t> const& iv,
225                          Vector<uint8_t>& output) {
226     if (mDrmHalAidl->initCheck() == OK)
227         return mDrmHalAidl->encrypt(sessionId, keyId, input, iv, output);
228     return mDrmHalHidl->encrypt(sessionId, keyId, input, iv, output);
229 }
230 
decrypt(Vector<uint8_t> const & sessionId,Vector<uint8_t> const & keyId,Vector<uint8_t> const & input,Vector<uint8_t> const & iv,Vector<uint8_t> & output)231 status_t DrmHal::decrypt(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keyId,
232                          Vector<uint8_t> const& input, Vector<uint8_t> const& iv,
233                          Vector<uint8_t>& output) {
234     if (mDrmHalAidl->initCheck() == OK)
235         return mDrmHalAidl->decrypt(sessionId, keyId, input, iv, output);
236     return mDrmHalHidl->decrypt(sessionId, keyId, input, iv, output);
237 }
238 
sign(Vector<uint8_t> const & sessionId,Vector<uint8_t> const & keyId,Vector<uint8_t> const & message,Vector<uint8_t> & signature)239 status_t DrmHal::sign(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keyId,
240                       Vector<uint8_t> const& message, Vector<uint8_t>& signature) {
241     if (mDrmHalAidl->initCheck() == OK)
242         return mDrmHalAidl->sign(sessionId, keyId, message, signature);
243     return mDrmHalHidl->sign(sessionId, keyId, message, signature);
244 }
245 
verify(Vector<uint8_t> const & sessionId,Vector<uint8_t> const & keyId,Vector<uint8_t> const & message,Vector<uint8_t> const & signature,bool & match)246 status_t DrmHal::verify(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keyId,
247                         Vector<uint8_t> const& message, Vector<uint8_t> const& signature,
248                         bool& match) {
249     if (mDrmHalAidl->initCheck() == OK)
250         return mDrmHalAidl->verify(sessionId, keyId, message, signature, match);
251     return mDrmHalHidl->verify(sessionId, keyId, message, signature, match);
252 }
253 
signRSA(Vector<uint8_t> const & sessionId,String8 const & algorithm,Vector<uint8_t> const & message,Vector<uint8_t> const & wrappedKey,Vector<uint8_t> & signature)254 status_t DrmHal::signRSA(Vector<uint8_t> const& sessionId, String8 const& algorithm,
255                          Vector<uint8_t> const& message, Vector<uint8_t> const& wrappedKey,
256                          Vector<uint8_t>& signature) {
257     if (mDrmHalAidl->initCheck() == OK)
258         return mDrmHalAidl->signRSA(sessionId, algorithm, message, wrappedKey, signature);
259     return mDrmHalHidl->signRSA(sessionId, algorithm, message, wrappedKey, signature);
260 }
261 
setListener(const sp<IDrmClient> & listener)262 status_t DrmHal::setListener(const sp<IDrmClient>& listener) {
263     if (mDrmHalAidl->initCheck() == OK) return mDrmHalAidl->setListener(listener);
264     return mDrmHalHidl->setListener(listener);
265 }
266 
requiresSecureDecoder(const char * mime,bool * required) const267 status_t DrmHal::requiresSecureDecoder(const char* mime, bool* required) const {
268     if (mDrmHalAidl->initCheck() == OK) return mDrmHalAidl->requiresSecureDecoder(mime, required);
269     return mDrmHalHidl->requiresSecureDecoder(mime, required);
270 }
271 
requiresSecureDecoder(const char * mime,DrmPlugin::SecurityLevel securityLevel,bool * required) const272 status_t DrmHal::requiresSecureDecoder(const char* mime, DrmPlugin::SecurityLevel securityLevel,
273                                        bool* required) const {
274     if (mDrmHalAidl->initCheck() == OK)
275         return mDrmHalAidl->requiresSecureDecoder(mime, securityLevel, required);
276     return mDrmHalHidl->requiresSecureDecoder(mime, securityLevel, required);
277 }
278 
setPlaybackId(Vector<uint8_t> const & sessionId,const char * playbackId)279 status_t DrmHal::setPlaybackId(Vector<uint8_t> const& sessionId, const char* playbackId) {
280     if (mDrmHalAidl->initCheck() == OK) return mDrmHalAidl->setPlaybackId(sessionId, playbackId);
281     return mDrmHalHidl->setPlaybackId(sessionId, playbackId);
282 }
283 
getLogMessages(Vector<drm::V1_4::LogMessage> & logs) const284 status_t DrmHal::getLogMessages(Vector<drm::V1_4::LogMessage>& logs) const {
285     if (mDrmHalAidl->initCheck() == OK) return mDrmHalAidl->getLogMessages(logs);
286     return mDrmHalHidl->getLogMessages(logs);
287 }
288 
getSupportedSchemes(std::vector<uint8_t> & schemes) const289 status_t DrmHal::getSupportedSchemes(std::vector<uint8_t> &schemes) const {
290     status_t statusResult;
291     statusResult = mDrmHalAidl->getSupportedSchemes(schemes);
292     if (statusResult == OK) return statusResult;
293     return mDrmHalHidl->getSupportedSchemes(schemes);
294 }
295 
296 }  // namespace android
297