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