blob: 809f694f1a321adb5967d464bdb0d6f0c527fe85 [file] [log] [blame]
Jeff Tinkerb075caa2016-12-06 23:15:20 -08001/*
2 * Copyright (C) 2016 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 */
Jeff Tinker972a3e32017-01-23 14:02:50 -080016#define LOG_TAG "android.hardware.drm@1.0-impl"
Jeff Tinkerb075caa2016-12-06 23:15:20 -080017
18#include <utils/KeyedVector.h>
19#include <utils/String8.h>
20
21#include "DrmPlugin.h"
22#include "TypeConvert.h"
23
24namespace android {
25namespace hardware {
26namespace drm {
Jeff Tinkerb075caa2016-12-06 23:15:20 -080027namespace V1_0 {
28namespace implementation {
29
Jeff Tinkerda002fe2017-01-19 14:41:11 -080030 // Methods from ::android::hardware::drm::V1_0::IDrmPlugin follow.
Jeff Tinkerb075caa2016-12-06 23:15:20 -080031
32 Return<void> DrmPlugin::openSession(openSession_cb _hidl_cb) {
Jeff Tinkerb075caa2016-12-06 23:15:20 -080033 Vector<uint8_t> legacySessionId;
34 status_t status = mLegacyPlugin->openSession(legacySessionId);
35 _hidl_cb(toStatus(status), toHidlVec(legacySessionId));
36 return Void();
37 }
38
39 Return<Status> DrmPlugin::closeSession(const hidl_vec<uint8_t>& sessionId) {
40 return toStatus(mLegacyPlugin->closeSession(toVector(sessionId)));
41 }
42
43 Return<void> DrmPlugin::getKeyRequest(const hidl_vec<uint8_t>& scope,
44 const hidl_vec<uint8_t>& initData, const hidl_string& mimeType,
45 KeyType keyType, const hidl_vec<KeyValue>& optionalParameters,
46 getKeyRequest_cb _hidl_cb) {
47
48 status_t status = android::OK;
49
50 android::DrmPlugin::KeyType legacyKeyType;
51 switch(keyType) {
52 case KeyType::OFFLINE:
53 legacyKeyType = android::DrmPlugin::kKeyType_Offline;
54 break;
55 case KeyType::STREAMING:
56 legacyKeyType = android::DrmPlugin::kKeyType_Streaming;
57 break;
58 case KeyType::RELEASE:
59 legacyKeyType = android::DrmPlugin::kKeyType_Release;
60 break;
61 default:
62 status = android::BAD_VALUE;
63 break;
64 }
65
66 Vector<uint8_t> legacyRequest;
67 KeyRequestType requestType = KeyRequestType::UNKNOWN;
68 String8 defaultUrl;
69
70 if (status == android::OK) {
71 android::KeyedVector<String8, String8> legacyOptionalParameters;
72 for (size_t i = 0; i < optionalParameters.size(); i++) {
Scott Randolph89978802017-04-03 14:06:19 -070073 legacyOptionalParameters.add(String8(optionalParameters[i].key.c_str()),
74 String8(optionalParameters[i].value.c_str()));
Jeff Tinkerb075caa2016-12-06 23:15:20 -080075 }
76
77 android::DrmPlugin::KeyRequestType legacyRequestType =
78 android::DrmPlugin::kKeyRequestType_Unknown;
79
Jeff Tinkerfea340f2017-03-06 16:58:47 -080080 status = mLegacyPlugin->getKeyRequest(toVector(scope),
Scott Randolph89978802017-04-03 14:06:19 -070081 toVector(initData), String8(mimeType.c_str()), legacyKeyType,
Jeff Tinkerb075caa2016-12-06 23:15:20 -080082 legacyOptionalParameters, legacyRequest, defaultUrl,
83 &legacyRequestType);
84
85 switch(legacyRequestType) {
86 case android::DrmPlugin::kKeyRequestType_Initial:
87 requestType = KeyRequestType::INITIAL;
88 break;
89 case android::DrmPlugin::kKeyRequestType_Renewal:
90 requestType = KeyRequestType::RENEWAL;
91 break;
92 case android::DrmPlugin::kKeyRequestType_Release:
93 requestType = KeyRequestType::RELEASE;
94 break;
95 case android::DrmPlugin::kKeyRequestType_Unknown:
Rahul Frias173d4fb2018-01-22 23:32:36 -080096 default:
Jeff Tinkerfea340f2017-03-06 16:58:47 -080097 requestType = KeyRequestType::UNKNOWN;
Jeff Tinkerb075caa2016-12-06 23:15:20 -080098 break;
99 }
100 }
101 _hidl_cb(toStatus(status), toHidlVec(legacyRequest), requestType,
102 defaultUrl.string());
103 return Void();
104 }
105
106 Return<void> DrmPlugin::provideKeyResponse(const hidl_vec<uint8_t>& scope,
107 const hidl_vec<uint8_t>& response, provideKeyResponse_cb _hidl_cb) {
108
109 Vector<uint8_t> keySetId;
110 status_t status = mLegacyPlugin->provideKeyResponse(toVector(scope),
111 toVector(response), keySetId);
112 _hidl_cb(toStatus(status), toHidlVec(keySetId));
113 return Void();
114 }
115
116 Return<Status> DrmPlugin::removeKeys(const hidl_vec<uint8_t>& sessionId) {
117 return toStatus(mLegacyPlugin->removeKeys(toVector(sessionId)));
118 }
119
120 Return<Status> DrmPlugin::restoreKeys(const hidl_vec<uint8_t>& sessionId,
121 const hidl_vec<uint8_t>& keySetId) {
122 status_t legacyStatus = mLegacyPlugin->restoreKeys(toVector(sessionId),
123 toVector(keySetId));
124 return toStatus(legacyStatus);
125 }
126
127 Return<void> DrmPlugin::queryKeyStatus(const hidl_vec<uint8_t>& sessionId,
128 queryKeyStatus_cb _hidl_cb) {
129
130 android::KeyedVector<String8, String8> legacyInfoMap;
131 status_t status = mLegacyPlugin->queryKeyStatus(toVector(sessionId),
132 legacyInfoMap);
133
134 Vector<KeyValue> infoMapVec;
135 for (size_t i = 0; i < legacyInfoMap.size(); i++) {
136 KeyValue keyValuePair;
137 keyValuePair.key = String8(legacyInfoMap.keyAt(i));
138 keyValuePair.value = String8(legacyInfoMap.valueAt(i));
139 infoMapVec.push_back(keyValuePair);
140 }
141 _hidl_cb(toStatus(status), toHidlVec(infoMapVec));
142 return Void();
143 }
144
145 Return<void> DrmPlugin::getProvisionRequest(
146 const hidl_string& certificateType,
147 const hidl_string& certificateAuthority,
148 getProvisionRequest_cb _hidl_cb) {
149
150 Vector<uint8_t> legacyRequest;
151 String8 legacyDefaultUrl;
152 status_t status = mLegacyPlugin->getProvisionRequest(
Scott Randolph89978802017-04-03 14:06:19 -0700153 String8(certificateType.c_str()), String8(certificateAuthority.c_str()),
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800154 legacyRequest, legacyDefaultUrl);
155
156 _hidl_cb(toStatus(status), toHidlVec(legacyRequest),
157 hidl_string(legacyDefaultUrl));
158 return Void();
159 }
160
161 Return<void> DrmPlugin::provideProvisionResponse(
162 const hidl_vec<uint8_t>& response,
163 provideProvisionResponse_cb _hidl_cb) {
164
165 Vector<uint8_t> certificate;
166 Vector<uint8_t> wrappedKey;
167
168 status_t legacyStatus = mLegacyPlugin->provideProvisionResponse(
169 toVector(response), certificate, wrappedKey);
170
171 _hidl_cb(toStatus(legacyStatus), toHidlVec(certificate),
172 toHidlVec(wrappedKey));
173 return Void();
174 }
175
176 Return<void> DrmPlugin::getSecureStops(getSecureStops_cb _hidl_cb) {
177 List<Vector<uint8_t> > legacySecureStops;
178 status_t status = mLegacyPlugin->getSecureStops(legacySecureStops);
179
180 Vector<SecureStop> secureStopsVec;
181 List<Vector<uint8_t> >::iterator iter = legacySecureStops.begin();
182
183 while (iter != legacySecureStops.end()) {
184 SecureStop secureStop;
185 secureStop.opaqueData = toHidlVec(*iter++);
186 secureStopsVec.push_back(secureStop);
187 }
188
189 _hidl_cb(toStatus(status), toHidlVec(secureStopsVec));
190 return Void();
191 }
192
193 Return<void> DrmPlugin::getSecureStop(const hidl_vec<uint8_t>& secureStopId,
194 getSecureStop_cb _hidl_cb) {
195
196 Vector<uint8_t> legacySecureStop;
197 status_t status = mLegacyPlugin->getSecureStop(toVector(secureStopId),
198 legacySecureStop);
199
200 SecureStop secureStop;
201 secureStop.opaqueData = toHidlVec(legacySecureStop);
202 _hidl_cb(toStatus(status), secureStop);
203 return Void();
204 }
205
206 Return<Status> DrmPlugin::releaseAllSecureStops() {
207 return toStatus(mLegacyPlugin->releaseAllSecureStops());
208 }
209
210 Return<Status> DrmPlugin::releaseSecureStop(
211 const hidl_vec<uint8_t>& secureStopId) {
212 status_t legacyStatus =
213 mLegacyPlugin->releaseSecureStops(toVector(secureStopId));
214 return toStatus(legacyStatus);
215 }
216
217 Return<void> DrmPlugin::getPropertyString(const hidl_string& propertyName,
218 getPropertyString_cb _hidl_cb) {
219 String8 legacyValue;
220 status_t status = mLegacyPlugin->getPropertyString(
Scott Randolph89978802017-04-03 14:06:19 -0700221 String8(propertyName.c_str()), legacyValue);
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800222 _hidl_cb(toStatus(status), legacyValue.string());
223 return Void();
224 }
225
226 Return<void> DrmPlugin::getPropertyByteArray(const hidl_string& propertyName,
227 getPropertyByteArray_cb _hidl_cb) {
228 Vector<uint8_t> legacyValue;
229 status_t status = mLegacyPlugin->getPropertyByteArray(
Scott Randolph89978802017-04-03 14:06:19 -0700230 String8(propertyName.c_str()), legacyValue);
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800231 _hidl_cb(toStatus(status), toHidlVec(legacyValue));
232 return Void();
233 }
234
235 Return<Status> DrmPlugin::setPropertyString(const hidl_string& propertyName,
236 const hidl_string& value) {
237 status_t legacyStatus =
Scott Randolph89978802017-04-03 14:06:19 -0700238 mLegacyPlugin->setPropertyString(String8(propertyName.c_str()),
239 String8(value.c_str()));
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800240 return toStatus(legacyStatus);
241 }
242
243 Return<Status> DrmPlugin::setPropertyByteArray(
244 const hidl_string& propertyName, const hidl_vec<uint8_t>& value) {
245 status_t legacyStatus =
Scott Randolph89978802017-04-03 14:06:19 -0700246 mLegacyPlugin->setPropertyByteArray(String8(propertyName.c_str()),
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800247 toVector(value));
248 return toStatus(legacyStatus);
249 }
250
251 Return<Status> DrmPlugin::setCipherAlgorithm(
252 const hidl_vec<uint8_t>& sessionId, const hidl_string& algorithm) {
253 status_t legacyStatus =
254 mLegacyPlugin->setCipherAlgorithm(toVector(sessionId),
Scott Randolph89978802017-04-03 14:06:19 -0700255 String8(algorithm.c_str()));
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800256 return toStatus(legacyStatus);
257 }
258
259 Return<Status> DrmPlugin::setMacAlgorithm(
260 const hidl_vec<uint8_t>& sessionId, const hidl_string& algorithm) {
261 status_t legacyStatus =
262 mLegacyPlugin->setMacAlgorithm(toVector(sessionId),
Scott Randolph89978802017-04-03 14:06:19 -0700263 String8(algorithm.c_str()));
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800264 return toStatus(legacyStatus);
265 }
266
267 Return<void> DrmPlugin::encrypt(const hidl_vec<uint8_t>& sessionId,
268 const hidl_vec<uint8_t>& keyId, const hidl_vec<uint8_t>& input,
269 const hidl_vec<uint8_t>& iv, encrypt_cb _hidl_cb) {
270
271 Vector<uint8_t> legacyOutput;
272 status_t status = mLegacyPlugin->encrypt(toVector(sessionId),
273 toVector(keyId), toVector(input), toVector(iv), legacyOutput);
274 _hidl_cb(toStatus(status), toHidlVec(legacyOutput));
275 return Void();
276 }
277
278 Return<void> DrmPlugin::decrypt(const hidl_vec<uint8_t>& sessionId,
279 const hidl_vec<uint8_t>& keyId, const hidl_vec<uint8_t>& input,
280 const hidl_vec<uint8_t>& iv, decrypt_cb _hidl_cb) {
281
282 Vector<uint8_t> legacyOutput;
283 status_t status = mLegacyPlugin->decrypt(toVector(sessionId),
284 toVector(keyId), toVector(input), toVector(iv), legacyOutput);
285 _hidl_cb(toStatus(status), toHidlVec(legacyOutput));
286 return Void();
287 }
288
289 Return<void> DrmPlugin::sign(const hidl_vec<uint8_t>& sessionId,
290 const hidl_vec<uint8_t>& keyId, const hidl_vec<uint8_t>& message,
291 sign_cb _hidl_cb) {
292 Vector<uint8_t> legacySignature;
293 status_t status = mLegacyPlugin->sign(toVector(sessionId),
294 toVector(keyId), toVector(message), legacySignature);
295 _hidl_cb(toStatus(status), toHidlVec(legacySignature));
296 return Void();
297 }
298
299 Return<void> DrmPlugin::verify(const hidl_vec<uint8_t>& sessionId,
300 const hidl_vec<uint8_t>& keyId, const hidl_vec<uint8_t>& message,
301 const hidl_vec<uint8_t>& signature, verify_cb _hidl_cb) {
302
303 bool match;
304 status_t status = mLegacyPlugin->verify(toVector(sessionId),
305 toVector(keyId), toVector(message), toVector(signature),
306 match);
307 _hidl_cb(toStatus(status), match);
308 return Void();
309 }
310
311 Return<void> DrmPlugin::signRSA(const hidl_vec<uint8_t>& sessionId,
312 const hidl_string& algorithm, const hidl_vec<uint8_t>& message,
313 const hidl_vec<uint8_t>& wrappedKey, signRSA_cb _hidl_cb) {
314
315 Vector<uint8_t> legacySignature;
316 status_t status = mLegacyPlugin->signRSA(toVector(sessionId),
Scott Randolph89978802017-04-03 14:06:19 -0700317 String8(algorithm.c_str()), toVector(message), toVector(wrappedKey),
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800318 legacySignature);
319 _hidl_cb(toStatus(status), toHidlVec(legacySignature));
320 return Void();
321 }
322
323 Return<void> DrmPlugin::setListener(const sp<IDrmPluginListener>& listener) {
324 mListener = listener;
Rahul Frias89437fb2017-02-27 14:07:44 -0800325 mLegacyPlugin->setListener(listener == NULL ? NULL : this);
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800326 return Void();
327 }
328
329 Return<void> DrmPlugin::sendEvent(EventType eventType,
330 const hidl_vec<uint8_t>& sessionId, const hidl_vec<uint8_t>& data) {
Jeff Tinkere3b6ae12017-05-16 18:21:39 +0000331 if (mListener != nullptr) {
332 mListener->sendEvent(eventType, sessionId, data);
Jeff Tinkerf20aa0c2017-03-31 15:32:12 -0700333 }
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800334 return Void();
335 }
336
337 Return<void> DrmPlugin::sendExpirationUpdate(
338 const hidl_vec<uint8_t>& sessionId, int64_t expiryTimeInMS) {
Jeff Tinkere3b6ae12017-05-16 18:21:39 +0000339 if (mListener != nullptr) {
340 mListener->sendExpirationUpdate(sessionId, expiryTimeInMS);
Jeff Tinkerf20aa0c2017-03-31 15:32:12 -0700341 }
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800342 return Void();
343 }
344
345 Return<void> DrmPlugin::sendKeysChange(const hidl_vec<uint8_t>& sessionId,
346 const hidl_vec<KeyStatus>& keyStatusList, bool hasNewUsableKey) {
Jeff Tinkere3b6ae12017-05-16 18:21:39 +0000347 if (mListener != nullptr) {
348 mListener->sendKeysChange(sessionId, keyStatusList, hasNewUsableKey);
Jeff Tinkerf20aa0c2017-03-31 15:32:12 -0700349 }
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800350 return Void();
351 }
352
353
354 // Methods from android::DrmPluginListener
355
356 void DrmPlugin::sendEvent(android::DrmPlugin::EventType legacyEventType,
357 int /*unused*/, Vector<uint8_t> const *sessionId,
358 Vector<uint8_t> const *data) {
359
360 EventType eventType;
361 bool sendEvent = true;
362 switch(legacyEventType) {
363 case android::DrmPlugin::kDrmPluginEventProvisionRequired:
364 eventType = EventType::PROVISION_REQUIRED;
365 break;
366 case android::DrmPlugin::kDrmPluginEventKeyNeeded:
367 eventType = EventType::KEY_NEEDED;
368 break;
369 case android::DrmPlugin::kDrmPluginEventKeyExpired:
370 eventType = EventType::KEY_EXPIRED;
371 break;
372 case android::DrmPlugin::kDrmPluginEventVendorDefined:
373 eventType = EventType::VENDOR_DEFINED;
374 break;
375 case android::DrmPlugin::kDrmPluginEventSessionReclaimed:
376 eventType = EventType::SESSION_RECLAIMED;
377 break;
378 default:
379 sendEvent = false;
380 break;
381 }
382 if (sendEvent) {
Rahul Frias89437fb2017-02-27 14:07:44 -0800383 Vector<uint8_t> emptyVector;
Jeff Tinkere3b6ae12017-05-16 18:21:39 +0000384 mListener->sendEvent(eventType,
385 toHidlVec(sessionId == NULL ? emptyVector: *sessionId),
386 toHidlVec(data == NULL ? emptyVector: *data));
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800387 }
388 }
389
390 void DrmPlugin::sendExpirationUpdate(Vector<uint8_t> const *sessionId,
391 int64_t expiryTimeInMS) {
Jeff Tinkere3b6ae12017-05-16 18:21:39 +0000392 mListener->sendExpirationUpdate(toHidlVec(*sessionId), expiryTimeInMS);
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800393 }
394
395 void DrmPlugin::sendKeysChange(Vector<uint8_t> const *sessionId,
396 Vector<android::DrmPlugin::KeyStatus> const *legacyKeyStatusList,
397 bool hasNewUsableKey) {
398
399 Vector<KeyStatus> keyStatusVec;
400 for (size_t i = 0; i < legacyKeyStatusList->size(); i++) {
401 const android::DrmPlugin::KeyStatus &legacyKeyStatus =
402 legacyKeyStatusList->itemAt(i);
403
404 KeyStatus keyStatus;
405
406 switch(legacyKeyStatus.mType) {
407 case android::DrmPlugin::kKeyStatusType_Usable:
408 keyStatus.type = KeyStatusType::USABLE;
409 break;
410 case android::DrmPlugin::kKeyStatusType_Expired:
411 keyStatus.type = KeyStatusType::EXPIRED;
412 break;
413 case android::DrmPlugin::kKeyStatusType_OutputNotAllowed:
414 keyStatus.type = KeyStatusType::OUTPUTNOTALLOWED;
415 break;
416 case android::DrmPlugin::kKeyStatusType_StatusPending:
417 keyStatus.type = KeyStatusType::STATUSPENDING;
418 break;
419 case android::DrmPlugin::kKeyStatusType_InternalError:
420 default:
421 keyStatus.type = KeyStatusType::INTERNALERROR;
422 break;
423 }
424
425 keyStatus.keyId = toHidlVec(legacyKeyStatus.mKeyId);
426 keyStatusVec.push_back(keyStatus);
427 }
Jeff Tinkere3b6ae12017-05-16 18:21:39 +0000428 mListener->sendKeysChange(toHidlVec(*sessionId),
429 toHidlVec(keyStatusVec), hasNewUsableKey);
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800430 }
431
432} // namespace implementation
433} // namespace V1_0
434} // namespace drm
Jeff Tinkerb075caa2016-12-06 23:15:20 -0800435} // namespace hardware
436} // namespace android