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