blob: 4e47112057b0c9027df721ed34a401731bd282bf [file] [log] [blame]
Jeff Tinker441a78d2013-02-08 10:18:35 -08001/*
2 * Copyright (C) 2013 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 "IDrm"
19#include <utils/Log.h>
20
21#include <binder/Parcel.h>
22#include <media/IDrm.h>
23#include <media/stagefright/MediaErrors.h>
24#include <media/stagefright/foundation/ADebug.h>
25#include <media/stagefright/foundation/AString.h>
26
27namespace android {
28
29enum {
30 INIT_CHECK = IBinder::FIRST_CALL_TRANSACTION,
31 IS_CRYPTO_SUPPORTED,
32 CREATE_PLUGIN,
33 DESTROY_PLUGIN,
34 OPEN_SESSION,
35 CLOSE_SESSION,
Jeff Tinker4c63a232013-03-30 16:19:44 -070036 GET_KEY_REQUEST,
37 PROVIDE_KEY_RESPONSE,
38 REMOVE_KEYS,
39 RESTORE_KEYS,
40 QUERY_KEY_STATUS,
Jeff Tinker441a78d2013-02-08 10:18:35 -080041 GET_PROVISION_REQUEST,
42 PROVIDE_PROVISION_RESPONSE,
43 GET_SECURE_STOPS,
44 RELEASE_SECURE_STOPS,
45 GET_PROPERTY_STRING,
46 GET_PROPERTY_BYTE_ARRAY,
47 SET_PROPERTY_STRING,
Jeff Tinker4c63a232013-03-30 16:19:44 -070048 SET_PROPERTY_BYTE_ARRAY,
49 SET_CIPHER_ALGORITHM,
50 SET_MAC_ALGORITHM,
51 ENCRYPT,
52 DECRYPT,
53 SIGN,
Jeff Tinker68d9d712014-03-04 13:21:31 -080054 SIGN_RSA,
Jeff Tinkerc0d5f1f2013-04-02 13:08:05 -070055 VERIFY,
Jeff Tinker68b15552014-04-30 10:19:03 -070056 SET_LISTENER,
Jeff Tinker3c1285e2014-10-31 00:55:16 -070057 GET_SECURE_STOP,
58 RELEASE_ALL_SECURE_STOPS
Jeff Tinker441a78d2013-02-08 10:18:35 -080059};
60
61struct BpDrm : public BpInterface<IDrm> {
Chih-Hung Hsieh090ef602016-04-27 10:39:54 -070062 explicit BpDrm(const sp<IBinder> &impl)
Jeff Tinker441a78d2013-02-08 10:18:35 -080063 : BpInterface<IDrm>(impl) {
64 }
65
66 virtual status_t initCheck() const {
67 Parcel data, reply;
68 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
Jeff Tinker3b5401a2015-06-15 17:42:10 -070069 status_t status = remote()->transact(INIT_CHECK, data, &reply);
70 if (status != OK) {
71 return status;
72 }
Jeff Tinker441a78d2013-02-08 10:18:35 -080073
74 return reply.readInt32();
75 }
76
Jeff Tinker9cf69e02013-08-21 11:59:23 -070077 virtual bool isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType) {
Jeff Tinker441a78d2013-02-08 10:18:35 -080078 Parcel data, reply;
79 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
80 data.write(uuid, 16);
Jeff Tinker9cf69e02013-08-21 11:59:23 -070081 data.writeString8(mimeType);
Jeff Tinker3b5401a2015-06-15 17:42:10 -070082 status_t status = remote()->transact(IS_CRYPTO_SUPPORTED, data, &reply);
83 if (status != OK) {
84 ALOGE("isCryptoSchemeSupported: binder call failed: %d", status);
85 return false;
86 }
Jeff Tinker441a78d2013-02-08 10:18:35 -080087
88 return reply.readInt32() != 0;
89 }
90
Edwin Wong68b3d9f2017-01-06 19:07:54 -080091 virtual status_t createPlugin(const uint8_t uuid[16],
92 const String8& appPackageName) {
Jeff Tinker441a78d2013-02-08 10:18:35 -080093 Parcel data, reply;
94 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
95 data.write(uuid, 16);
Edwin Wong68b3d9f2017-01-06 19:07:54 -080096 data.writeString8(appPackageName);
Jeff Tinker3b5401a2015-06-15 17:42:10 -070097 status_t status = remote()->transact(CREATE_PLUGIN, data, &reply);
98 if (status != OK) {
Edwin Wong68b3d9f2017-01-06 19:07:54 -080099 ALOGE("createPlugin: binder call failed: %d", status);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700100 return status;
101 }
Jeff Tinker441a78d2013-02-08 10:18:35 -0800102
103 return reply.readInt32();
104 }
105
106 virtual status_t destroyPlugin() {
107 Parcel data, reply;
108 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700109 status_t status = remote()->transact(DESTROY_PLUGIN, data, &reply);
110 if (status != OK) {
111 return status;
112 }
Jeff Tinker441a78d2013-02-08 10:18:35 -0800113
114 return reply.readInt32();
115 }
116
117 virtual status_t openSession(Vector<uint8_t> &sessionId) {
118 Parcel data, reply;
119 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
120
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700121 status_t status = remote()->transact(OPEN_SESSION, data, &reply);
122 if (status != OK) {
123 return status;
124 }
Jeff Tinker4c63a232013-03-30 16:19:44 -0700125 readVector(reply, sessionId);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800126
127 return reply.readInt32();
128 }
129
130 virtual status_t closeSession(Vector<uint8_t> const &sessionId) {
131 Parcel data, reply;
132 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
133
Jeff Tinker4c63a232013-03-30 16:19:44 -0700134 writeVector(data, sessionId);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700135 status_t status = remote()->transact(CLOSE_SESSION, data, &reply);
136 if (status != OK) {
137 return status;
138 }
Jeff Tinker441a78d2013-02-08 10:18:35 -0800139
140 return reply.readInt32();
141 }
142
143 virtual status_t
Jeff Tinker4c63a232013-03-30 16:19:44 -0700144 getKeyRequest(Vector<uint8_t> const &sessionId,
145 Vector<uint8_t> const &initData,
146 String8 const &mimeType, DrmPlugin::KeyType keyType,
147 KeyedVector<String8, String8> const &optionalParameters,
Jeff Tinkerd072c902015-03-16 13:39:29 -0700148 Vector<uint8_t> &request, String8 &defaultUrl,
149 DrmPlugin::KeyRequestType *keyRequestType) {
Jeff Tinker441a78d2013-02-08 10:18:35 -0800150 Parcel data, reply;
151 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
152
Jeff Tinker4c63a232013-03-30 16:19:44 -0700153 writeVector(data, sessionId);
154 writeVector(data, initData);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800155 data.writeString8(mimeType);
Jeff Tinker4c63a232013-03-30 16:19:44 -0700156 data.writeInt32((uint32_t)keyType);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800157
158 data.writeInt32(optionalParameters.size());
159 for (size_t i = 0; i < optionalParameters.size(); ++i) {
160 data.writeString8(optionalParameters.keyAt(i));
161 data.writeString8(optionalParameters.valueAt(i));
162 }
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700163
164 status_t status = remote()->transact(GET_KEY_REQUEST, data, &reply);
165 if (status != OK) {
166 return status;
167 }
Jeff Tinker441a78d2013-02-08 10:18:35 -0800168
Jeff Tinker4c63a232013-03-30 16:19:44 -0700169 readVector(reply, request);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800170 defaultUrl = reply.readString8();
Jeff Tinkerd072c902015-03-16 13:39:29 -0700171 *keyRequestType = static_cast<DrmPlugin::KeyRequestType>(reply.readInt32());
Jeff Tinker441a78d2013-02-08 10:18:35 -0800172
173 return reply.readInt32();
174 }
175
Jeff Tinker4c63a232013-03-30 16:19:44 -0700176 virtual status_t provideKeyResponse(Vector<uint8_t> const &sessionId,
177 Vector<uint8_t> const &response,
178 Vector<uint8_t> &keySetId) {
Jeff Tinker441a78d2013-02-08 10:18:35 -0800179 Parcel data, reply;
180 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
Jeff Tinker4c63a232013-03-30 16:19:44 -0700181 writeVector(data, sessionId);
182 writeVector(data, response);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700183
184 status_t status = remote()->transact(PROVIDE_KEY_RESPONSE, data, &reply);
185 if (status != OK) {
186 return status;
187 }
188
Jeff Tinker4c63a232013-03-30 16:19:44 -0700189 readVector(reply, keySetId);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800190
191 return reply.readInt32();
192 }
193
Jeff Tinker4c63a232013-03-30 16:19:44 -0700194 virtual status_t removeKeys(Vector<uint8_t> const &keySetId) {
Jeff Tinker441a78d2013-02-08 10:18:35 -0800195 Parcel data, reply;
196 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
197
Jeff Tinker4c63a232013-03-30 16:19:44 -0700198 writeVector(data, keySetId);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700199 status_t status = remote()->transact(REMOVE_KEYS, data, &reply);
200 if (status != OK) {
201 return status;
202 }
Jeff Tinker441a78d2013-02-08 10:18:35 -0800203
204 return reply.readInt32();
205 }
206
Jeff Tinker4c63a232013-03-30 16:19:44 -0700207 virtual status_t restoreKeys(Vector<uint8_t> const &sessionId,
208 Vector<uint8_t> const &keySetId) {
209 Parcel data, reply;
210 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
211
212 writeVector(data, sessionId);
213 writeVector(data, keySetId);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700214 status_t status = remote()->transact(RESTORE_KEYS, data, &reply);
215 if (status != OK) {
216 return status;
217 }
Jeff Tinker4c63a232013-03-30 16:19:44 -0700218
219 return reply.readInt32();
220 }
221
222 virtual status_t queryKeyStatus(Vector<uint8_t> const &sessionId,
Jeff Tinker441a78d2013-02-08 10:18:35 -0800223 KeyedVector<String8, String8> &infoMap) const {
224 Parcel data, reply;
225 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
226
Jeff Tinker4c63a232013-03-30 16:19:44 -0700227 writeVector(data, sessionId);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700228 status_t status = remote()->transact(QUERY_KEY_STATUS, data, &reply);
229 if (status != OK) {
230 return status;
231 }
Jeff Tinker441a78d2013-02-08 10:18:35 -0800232
233 infoMap.clear();
234 size_t count = reply.readInt32();
235 for (size_t i = 0; i < count; i++) {
236 String8 key = reply.readString8();
237 String8 value = reply.readString8();
238 infoMap.add(key, value);
239 }
240 return reply.readInt32();
241 }
242
Jeff Tinker68d9d712014-03-04 13:21:31 -0800243 virtual status_t getProvisionRequest(String8 const &certType,
244 String8 const &certAuthority,
245 Vector<uint8_t> &request,
Jeff Tinker441a78d2013-02-08 10:18:35 -0800246 String8 &defaultUrl) {
247 Parcel data, reply;
248 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
249
Jeff Tinker68d9d712014-03-04 13:21:31 -0800250 data.writeString8(certType);
251 data.writeString8(certAuthority);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700252 status_t status = remote()->transact(GET_PROVISION_REQUEST, data, &reply);
253 if (status != OK) {
254 return status;
255 }
Jeff Tinker441a78d2013-02-08 10:18:35 -0800256
Jeff Tinker4c63a232013-03-30 16:19:44 -0700257 readVector(reply, request);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800258 defaultUrl = reply.readString8();
259
260 return reply.readInt32();
261 }
262
Jeff Tinker68d9d712014-03-04 13:21:31 -0800263 virtual status_t provideProvisionResponse(Vector<uint8_t> const &response,
264 Vector<uint8_t> &certificate,
265 Vector<uint8_t> &wrappedKey) {
Jeff Tinker441a78d2013-02-08 10:18:35 -0800266 Parcel data, reply;
267 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
268
Jeff Tinker4c63a232013-03-30 16:19:44 -0700269 writeVector(data, response);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700270 status_t status = remote()->transact(PROVIDE_PROVISION_RESPONSE, data, &reply);
271 if (status != OK) {
272 return status;
273 }
Jeff Tinker441a78d2013-02-08 10:18:35 -0800274
Jeff Tinker68d9d712014-03-04 13:21:31 -0800275 readVector(reply, certificate);
276 readVector(reply, wrappedKey);
277
Jeff Tinker441a78d2013-02-08 10:18:35 -0800278 return reply.readInt32();
279 }
280
281 virtual status_t getSecureStops(List<Vector<uint8_t> > &secureStops) {
282 Parcel data, reply;
283 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
284
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700285 status_t status = remote()->transact(GET_SECURE_STOPS, data, &reply);
286 if (status != OK) {
287 return status;
288 }
Jeff Tinker441a78d2013-02-08 10:18:35 -0800289
290 secureStops.clear();
291 uint32_t count = reply.readInt32();
292 for (size_t i = 0; i < count; i++) {
293 Vector<uint8_t> secureStop;
Jeff Tinker4c63a232013-03-30 16:19:44 -0700294 readVector(reply, secureStop);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800295 secureStops.push_back(secureStop);
296 }
297 return reply.readInt32();
298 }
299
Jeff Tinker3c1285e2014-10-31 00:55:16 -0700300 virtual status_t getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop) {
301 Parcel data, reply;
302 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
303
304 writeVector(data, ssid);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700305 status_t status = remote()->transact(GET_SECURE_STOP, data, &reply);
306 if (status != OK) {
307 return status;
308 }
Jeff Tinker3c1285e2014-10-31 00:55:16 -0700309
310 readVector(reply, secureStop);
311 return reply.readInt32();
312 }
313
Jeff Tinker441a78d2013-02-08 10:18:35 -0800314 virtual status_t releaseSecureStops(Vector<uint8_t> const &ssRelease) {
315 Parcel data, reply;
316 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
317
Jeff Tinker4c63a232013-03-30 16:19:44 -0700318 writeVector(data, ssRelease);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700319 status_t status = remote()->transact(RELEASE_SECURE_STOPS, data, &reply);
320 if (status != OK) {
321 return status;
322 }
Jeff Tinker441a78d2013-02-08 10:18:35 -0800323
324 return reply.readInt32();
325 }
326
Jeff Tinker3c1285e2014-10-31 00:55:16 -0700327 virtual status_t releaseAllSecureStops() {
328 Parcel data, reply;
329 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
330
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700331 status_t status = remote()->transact(RELEASE_ALL_SECURE_STOPS, data, &reply);
332 if (status != OK) {
333 return status;
334 }
Jeff Tinker3c1285e2014-10-31 00:55:16 -0700335
336 return reply.readInt32();
337 }
338
Jeff Tinker441a78d2013-02-08 10:18:35 -0800339 virtual status_t getPropertyString(String8 const &name, String8 &value) const {
340 Parcel data, reply;
341 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
342
343 data.writeString8(name);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700344 status_t status = remote()->transact(GET_PROPERTY_STRING, data, &reply);
345 if (status != OK) {
346 return status;
347 }
Jeff Tinker441a78d2013-02-08 10:18:35 -0800348
349 value = reply.readString8();
350 return reply.readInt32();
351 }
352
353 virtual status_t getPropertyByteArray(String8 const &name, Vector<uint8_t> &value) const {
354 Parcel data, reply;
355 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
356
357 data.writeString8(name);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700358 status_t status = remote()->transact(GET_PROPERTY_BYTE_ARRAY, data, &reply);
359 if (status != OK) {
360 return status;
361 }
Jeff Tinker441a78d2013-02-08 10:18:35 -0800362
Jeff Tinker4c63a232013-03-30 16:19:44 -0700363 readVector(reply, value);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800364 return reply.readInt32();
365 }
366
367 virtual status_t setPropertyString(String8 const &name, String8 const &value) const {
368 Parcel data, reply;
369 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
370
371 data.writeString8(name);
372 data.writeString8(value);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700373 status_t status = remote()->transact(SET_PROPERTY_STRING, data, &reply);
374 if (status != OK) {
375 return status;
376 }
Jeff Tinker441a78d2013-02-08 10:18:35 -0800377
378 return reply.readInt32();
379 }
380
381 virtual status_t setPropertyByteArray(String8 const &name,
382 Vector<uint8_t> const &value) const {
383 Parcel data, reply;
384 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
385
386 data.writeString8(name);
Jeff Tinker4c63a232013-03-30 16:19:44 -0700387 writeVector(data, value);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700388 status_t status = remote()->transact(SET_PROPERTY_BYTE_ARRAY, data, &reply);
389 if (status != OK) {
390 return status;
391 }
Jeff Tinker441a78d2013-02-08 10:18:35 -0800392
393 return reply.readInt32();
394 }
395
396
Jeff Tinker4c63a232013-03-30 16:19:44 -0700397 virtual status_t setCipherAlgorithm(Vector<uint8_t> const &sessionId,
398 String8 const &algorithm) {
399 Parcel data, reply;
400 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
401
402 writeVector(data, sessionId);
403 data.writeString8(algorithm);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700404 status_t status = remote()->transact(SET_CIPHER_ALGORITHM, data, &reply);
405 if (status != OK) {
406 return status;
407 }
Jeff Tinker4c63a232013-03-30 16:19:44 -0700408 return reply.readInt32();
409 }
410
411 virtual status_t setMacAlgorithm(Vector<uint8_t> const &sessionId,
412 String8 const &algorithm) {
413 Parcel data, reply;
414 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
415
416 writeVector(data, sessionId);
417 data.writeString8(algorithm);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700418 status_t status = remote()->transact(SET_MAC_ALGORITHM, data, &reply);
419 if (status != OK) {
420 return status;
421 }
Jeff Tinker4c63a232013-03-30 16:19:44 -0700422 return reply.readInt32();
423 }
424
425 virtual status_t encrypt(Vector<uint8_t> const &sessionId,
426 Vector<uint8_t> const &keyId,
427 Vector<uint8_t> const &input,
428 Vector<uint8_t> const &iv,
429 Vector<uint8_t> &output) {
430 Parcel data, reply;
431 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
432
433 writeVector(data, sessionId);
434 writeVector(data, keyId);
435 writeVector(data, input);
436 writeVector(data, iv);
437
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700438 status_t status = remote()->transact(ENCRYPT, data, &reply);
439 if (status != OK) {
440 return status;
441 }
Jeff Tinker4c63a232013-03-30 16:19:44 -0700442 readVector(reply, output);
443
444 return reply.readInt32();
445 }
446
447 virtual status_t decrypt(Vector<uint8_t> const &sessionId,
448 Vector<uint8_t> const &keyId,
449 Vector<uint8_t> const &input,
450 Vector<uint8_t> const &iv,
451 Vector<uint8_t> &output) {
452 Parcel data, reply;
453 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
454
455 writeVector(data, sessionId);
456 writeVector(data, keyId);
457 writeVector(data, input);
458 writeVector(data, iv);
459
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700460 status_t status = remote()->transact(DECRYPT, data, &reply);
461 if (status != OK) {
462 return status;
463 }
Jeff Tinker4c63a232013-03-30 16:19:44 -0700464 readVector(reply, output);
465
466 return reply.readInt32();
467 }
468
469 virtual status_t sign(Vector<uint8_t> const &sessionId,
470 Vector<uint8_t> const &keyId,
471 Vector<uint8_t> const &message,
472 Vector<uint8_t> &signature) {
473 Parcel data, reply;
474 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
475
476 writeVector(data, sessionId);
477 writeVector(data, keyId);
478 writeVector(data, message);
479
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700480 status_t status = remote()->transact(SIGN, data, &reply);
481 if (status != OK) {
482 return status;
483 }
Jeff Tinker4c63a232013-03-30 16:19:44 -0700484 readVector(reply, signature);
485
486 return reply.readInt32();
487 }
488
489 virtual status_t verify(Vector<uint8_t> const &sessionId,
490 Vector<uint8_t> const &keyId,
491 Vector<uint8_t> const &message,
492 Vector<uint8_t> const &signature,
493 bool &match) {
494 Parcel data, reply;
495 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
496
497 writeVector(data, sessionId);
498 writeVector(data, keyId);
499 writeVector(data, message);
500 writeVector(data, signature);
501
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700502 status_t status = remote()->transact(VERIFY, data, &reply);
503 if (status != OK) {
504 return status;
505 }
Jeff Tinker4c63a232013-03-30 16:19:44 -0700506 match = (bool)reply.readInt32();
507 return reply.readInt32();
508 }
509
Jeff Tinker68d9d712014-03-04 13:21:31 -0800510 virtual status_t signRSA(Vector<uint8_t> const &sessionId,
511 String8 const &algorithm,
512 Vector<uint8_t> const &message,
513 Vector<uint8_t> const &wrappedKey,
514 Vector<uint8_t> &signature) {
515 Parcel data, reply;
516 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
517
518 writeVector(data, sessionId);
519 data.writeString8(algorithm);
520 writeVector(data, message);
521 writeVector(data, wrappedKey);
522
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700523 status_t status = remote()->transact(SIGN_RSA, data, &reply);
524 if (status != OK) {
525 return status;
526 }
Jeff Tinker68d9d712014-03-04 13:21:31 -0800527 readVector(reply, signature);
528
529 return reply.readInt32();
530 }
531
Jeff Tinkerc0d5f1f2013-04-02 13:08:05 -0700532 virtual status_t setListener(const sp<IDrmClient>& listener) {
533 Parcel data, reply;
534 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800535 data.writeStrongBinder(IInterface::asBinder(listener));
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700536 status_t status = remote()->transact(SET_LISTENER, data, &reply);
537 if (status != OK) {
538 return status;
539 }
Jeff Tinkerc0d5f1f2013-04-02 13:08:05 -0700540 return reply.readInt32();
541 }
542
Jeff Tinker441a78d2013-02-08 10:18:35 -0800543private:
Jeff Tinker4c63a232013-03-30 16:19:44 -0700544 void readVector(Parcel &reply, Vector<uint8_t> &vector) const {
545 uint32_t size = reply.readInt32();
546 vector.insertAt((size_t)0, size);
547 reply.read(vector.editArray(), size);
548 }
549
550 void writeVector(Parcel &data, Vector<uint8_t> const &vector) const {
551 data.writeInt32(vector.size());
552 data.write(vector.array(), vector.size());
553 }
554
Jeff Tinker441a78d2013-02-08 10:18:35 -0800555 DISALLOW_EVIL_CONSTRUCTORS(BpDrm);
556};
557
558IMPLEMENT_META_INTERFACE(Drm, "android.drm.IDrm");
559
560////////////////////////////////////////////////////////////////////////////////
561
Jeff Tinker4c63a232013-03-30 16:19:44 -0700562void BnDrm::readVector(const Parcel &data, Vector<uint8_t> &vector) const {
563 uint32_t size = data.readInt32();
564 vector.insertAt((size_t)0, size);
565 data.read(vector.editArray(), size);
566}
567
568void BnDrm::writeVector(Parcel *reply, Vector<uint8_t> const &vector) const {
569 reply->writeInt32(vector.size());
570 reply->write(vector.array(), vector.size());
571}
572
Jeff Tinker441a78d2013-02-08 10:18:35 -0800573status_t BnDrm::onTransact(
574 uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
575 switch (code) {
576 case INIT_CHECK:
577 {
578 CHECK_INTERFACE(IDrm, data, reply);
579 reply->writeInt32(initCheck());
580 return OK;
581 }
582
583 case IS_CRYPTO_SUPPORTED:
584 {
585 CHECK_INTERFACE(IDrm, data, reply);
586 uint8_t uuid[16];
587 data.read(uuid, sizeof(uuid));
Jeff Tinker9cf69e02013-08-21 11:59:23 -0700588 String8 mimeType = data.readString8();
589 reply->writeInt32(isCryptoSchemeSupported(uuid, mimeType));
Jeff Tinker441a78d2013-02-08 10:18:35 -0800590 return OK;
591 }
592
593 case CREATE_PLUGIN:
594 {
595 CHECK_INTERFACE(IDrm, data, reply);
596 uint8_t uuid[16];
597 data.read(uuid, sizeof(uuid));
Edwin Wong68b3d9f2017-01-06 19:07:54 -0800598 String8 appPackageName = data.readString8();
599 reply->writeInt32(createPlugin(uuid, appPackageName));
Jeff Tinker441a78d2013-02-08 10:18:35 -0800600 return OK;
601 }
602
603 case DESTROY_PLUGIN:
604 {
605 CHECK_INTERFACE(IDrm, data, reply);
606 reply->writeInt32(destroyPlugin());
607 return OK;
608 }
609
610 case OPEN_SESSION:
611 {
612 CHECK_INTERFACE(IDrm, data, reply);
613 Vector<uint8_t> sessionId;
614 status_t result = openSession(sessionId);
Jeff Tinker4c63a232013-03-30 16:19:44 -0700615 writeVector(reply, sessionId);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800616 reply->writeInt32(result);
617 return OK;
618 }
619
620 case CLOSE_SESSION:
621 {
622 CHECK_INTERFACE(IDrm, data, reply);
623 Vector<uint8_t> sessionId;
Jeff Tinker4c63a232013-03-30 16:19:44 -0700624 readVector(data, sessionId);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800625 reply->writeInt32(closeSession(sessionId));
626 return OK;
627 }
628
Jeff Tinker4c63a232013-03-30 16:19:44 -0700629 case GET_KEY_REQUEST:
Jeff Tinker441a78d2013-02-08 10:18:35 -0800630 {
631 CHECK_INTERFACE(IDrm, data, reply);
Jeff Tinker4c63a232013-03-30 16:19:44 -0700632 Vector<uint8_t> sessionId, initData;
Jeff Tinker441a78d2013-02-08 10:18:35 -0800633
Jeff Tinker4c63a232013-03-30 16:19:44 -0700634 readVector(data, sessionId);
635 readVector(data, initData);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800636 String8 mimeType = data.readString8();
Jeff Tinker4c63a232013-03-30 16:19:44 -0700637 DrmPlugin::KeyType keyType = (DrmPlugin::KeyType)data.readInt32();
Jeff Tinker441a78d2013-02-08 10:18:35 -0800638
639 KeyedVector<String8, String8> optionalParameters;
640 uint32_t count = data.readInt32();
641 for (size_t i = 0; i < count; ++i) {
642 String8 key, value;
643 key = data.readString8();
644 value = data.readString8();
645 optionalParameters.add(key, value);
646 }
647
648 Vector<uint8_t> request;
649 String8 defaultUrl;
Jeff Tinker8aff7772016-02-08 17:52:25 -0800650 DrmPlugin::KeyRequestType keyRequestType = DrmPlugin::kKeyRequestType_Unknown;
Jeff Tinker441a78d2013-02-08 10:18:35 -0800651
Jeff Tinkerd072c902015-03-16 13:39:29 -0700652 status_t result = getKeyRequest(sessionId, initData, mimeType,
653 keyType, optionalParameters, request, defaultUrl,
654 &keyRequestType);
655
Jeff Tinker4c63a232013-03-30 16:19:44 -0700656 writeVector(reply, request);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800657 reply->writeString8(defaultUrl);
Jeff Tinkerd072c902015-03-16 13:39:29 -0700658 reply->writeInt32(static_cast<int32_t>(keyRequestType));
Jeff Tinker441a78d2013-02-08 10:18:35 -0800659 reply->writeInt32(result);
660 return OK;
661 }
662
Jeff Tinker4c63a232013-03-30 16:19:44 -0700663 case PROVIDE_KEY_RESPONSE:
Jeff Tinker441a78d2013-02-08 10:18:35 -0800664 {
665 CHECK_INTERFACE(IDrm, data, reply);
Jeff Tinker4c63a232013-03-30 16:19:44 -0700666 Vector<uint8_t> sessionId, response, keySetId;
667 readVector(data, sessionId);
668 readVector(data, response);
669 uint32_t result = provideKeyResponse(sessionId, response, keySetId);
670 writeVector(reply, keySetId);
671 reply->writeInt32(result);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800672 return OK;
673 }
674
Jeff Tinker4c63a232013-03-30 16:19:44 -0700675 case REMOVE_KEYS:
Jeff Tinker441a78d2013-02-08 10:18:35 -0800676 {
677 CHECK_INTERFACE(IDrm, data, reply);
Jeff Tinker4c63a232013-03-30 16:19:44 -0700678 Vector<uint8_t> keySetId;
679 readVector(data, keySetId);
680 reply->writeInt32(removeKeys(keySetId));
Jeff Tinker441a78d2013-02-08 10:18:35 -0800681 return OK;
682 }
683
Jeff Tinker4c63a232013-03-30 16:19:44 -0700684 case RESTORE_KEYS:
685 {
686 CHECK_INTERFACE(IDrm, data, reply);
687 Vector<uint8_t> sessionId, keySetId;
688 readVector(data, sessionId);
689 readVector(data, keySetId);
690 reply->writeInt32(restoreKeys(sessionId, keySetId));
691 return OK;
692 }
693
694 case QUERY_KEY_STATUS:
Jeff Tinker441a78d2013-02-08 10:18:35 -0800695 {
696 CHECK_INTERFACE(IDrm, data, reply);
697 Vector<uint8_t> sessionId;
Jeff Tinker4c63a232013-03-30 16:19:44 -0700698 readVector(data, sessionId);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800699 KeyedVector<String8, String8> infoMap;
Jeff Tinker4c63a232013-03-30 16:19:44 -0700700 status_t result = queryKeyStatus(sessionId, infoMap);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800701 size_t count = infoMap.size();
702 reply->writeInt32(count);
703 for (size_t i = 0; i < count; ++i) {
704 reply->writeString8(infoMap.keyAt(i));
705 reply->writeString8(infoMap.valueAt(i));
706 }
707 reply->writeInt32(result);
708 return OK;
709 }
710
711 case GET_PROVISION_REQUEST:
712 {
713 CHECK_INTERFACE(IDrm, data, reply);
Jeff Tinker68d9d712014-03-04 13:21:31 -0800714 String8 certType = data.readString8();
715 String8 certAuthority = data.readString8();
716
Jeff Tinker441a78d2013-02-08 10:18:35 -0800717 Vector<uint8_t> request;
718 String8 defaultUrl;
Jeff Tinker68d9d712014-03-04 13:21:31 -0800719 status_t result = getProvisionRequest(certType, certAuthority,
720 request, defaultUrl);
Jeff Tinker4c63a232013-03-30 16:19:44 -0700721 writeVector(reply, request);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800722 reply->writeString8(defaultUrl);
723 reply->writeInt32(result);
724 return OK;
725 }
726
727 case PROVIDE_PROVISION_RESPONSE:
728 {
729 CHECK_INTERFACE(IDrm, data, reply);
730 Vector<uint8_t> response;
Jeff Tinker68d9d712014-03-04 13:21:31 -0800731 Vector<uint8_t> certificate;
732 Vector<uint8_t> wrappedKey;
Jeff Tinker4c63a232013-03-30 16:19:44 -0700733 readVector(data, response);
Jeff Tinker68d9d712014-03-04 13:21:31 -0800734 status_t result = provideProvisionResponse(response, certificate, wrappedKey);
735 writeVector(reply, certificate);
736 writeVector(reply, wrappedKey);
737 reply->writeInt32(result);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800738 return OK;
739 }
740
741 case GET_SECURE_STOPS:
742 {
743 CHECK_INTERFACE(IDrm, data, reply);
744 List<Vector<uint8_t> > secureStops;
745 status_t result = getSecureStops(secureStops);
746 size_t count = secureStops.size();
747 reply->writeInt32(count);
748 List<Vector<uint8_t> >::iterator iter = secureStops.begin();
749 while(iter != secureStops.end()) {
750 size_t size = iter->size();
751 reply->writeInt32(size);
752 reply->write(iter->array(), iter->size());
Jeff Tinker423e33c2013-04-08 15:23:17 -0700753 iter++;
Jeff Tinker441a78d2013-02-08 10:18:35 -0800754 }
755 reply->writeInt32(result);
756 return OK;
757 }
758
Jeff Tinker3c1285e2014-10-31 00:55:16 -0700759 case GET_SECURE_STOP:
760 {
761 CHECK_INTERFACE(IDrm, data, reply);
762 Vector<uint8_t> ssid, secureStop;
763 readVector(data, ssid);
764 status_t result = getSecureStop(ssid, secureStop);
765 writeVector(reply, secureStop);
766 reply->writeInt32(result);
767 return OK;
768 }
769
Jeff Tinker441a78d2013-02-08 10:18:35 -0800770 case RELEASE_SECURE_STOPS:
771 {
772 CHECK_INTERFACE(IDrm, data, reply);
773 Vector<uint8_t> ssRelease;
Jeff Tinker4c63a232013-03-30 16:19:44 -0700774 readVector(data, ssRelease);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800775 reply->writeInt32(releaseSecureStops(ssRelease));
776 return OK;
777 }
778
Jeff Tinker3c1285e2014-10-31 00:55:16 -0700779 case RELEASE_ALL_SECURE_STOPS:
780 {
781 CHECK_INTERFACE(IDrm, data, reply);
782 reply->writeInt32(releaseAllSecureStops());
783 return OK;
784 }
785
Jeff Tinker441a78d2013-02-08 10:18:35 -0800786 case GET_PROPERTY_STRING:
787 {
788 CHECK_INTERFACE(IDrm, data, reply);
789 String8 name = data.readString8();
790 String8 value;
791 status_t result = getPropertyString(name, value);
792 reply->writeString8(value);
793 reply->writeInt32(result);
794 return OK;
795 }
796
797 case GET_PROPERTY_BYTE_ARRAY:
798 {
799 CHECK_INTERFACE(IDrm, data, reply);
800 String8 name = data.readString8();
801 Vector<uint8_t> value;
802 status_t result = getPropertyByteArray(name, value);
Jeff Tinker4c63a232013-03-30 16:19:44 -0700803 writeVector(reply, value);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800804 reply->writeInt32(result);
805 return OK;
806 }
807
808 case SET_PROPERTY_STRING:
809 {
810 CHECK_INTERFACE(IDrm, data, reply);
811 String8 name = data.readString8();
812 String8 value = data.readString8();
813 reply->writeInt32(setPropertyString(name, value));
814 return OK;
815 }
816
817 case SET_PROPERTY_BYTE_ARRAY:
818 {
819 CHECK_INTERFACE(IDrm, data, reply);
820 String8 name = data.readString8();
821 Vector<uint8_t> value;
Jeff Tinker4c63a232013-03-30 16:19:44 -0700822 readVector(data, value);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800823 reply->writeInt32(setPropertyByteArray(name, value));
824 return OK;
825 }
826
Jeff Tinker4c63a232013-03-30 16:19:44 -0700827 case SET_CIPHER_ALGORITHM:
828 {
829 CHECK_INTERFACE(IDrm, data, reply);
830 Vector<uint8_t> sessionId;
831 readVector(data, sessionId);
832 String8 algorithm = data.readString8();
833 reply->writeInt32(setCipherAlgorithm(sessionId, algorithm));
834 return OK;
835 }
836
837 case SET_MAC_ALGORITHM:
838 {
839 CHECK_INTERFACE(IDrm, data, reply);
840 Vector<uint8_t> sessionId;
841 readVector(data, sessionId);
842 String8 algorithm = data.readString8();
843 reply->writeInt32(setMacAlgorithm(sessionId, algorithm));
844 return OK;
845 }
846
847 case ENCRYPT:
848 {
849 CHECK_INTERFACE(IDrm, data, reply);
850 Vector<uint8_t> sessionId, keyId, input, iv, output;
851 readVector(data, sessionId);
852 readVector(data, keyId);
853 readVector(data, input);
854 readVector(data, iv);
855 uint32_t result = encrypt(sessionId, keyId, input, iv, output);
856 writeVector(reply, output);
857 reply->writeInt32(result);
858 return OK;
859 }
860
861 case DECRYPT:
862 {
863 CHECK_INTERFACE(IDrm, data, reply);
864 Vector<uint8_t> sessionId, keyId, input, iv, output;
865 readVector(data, sessionId);
866 readVector(data, keyId);
867 readVector(data, input);
868 readVector(data, iv);
869 uint32_t result = decrypt(sessionId, keyId, input, iv, output);
870 writeVector(reply, output);
871 reply->writeInt32(result);
872 return OK;
873 }
874
875 case SIGN:
876 {
877 CHECK_INTERFACE(IDrm, data, reply);
878 Vector<uint8_t> sessionId, keyId, message, signature;
879 readVector(data, sessionId);
880 readVector(data, keyId);
881 readVector(data, message);
882 uint32_t result = sign(sessionId, keyId, message, signature);
883 writeVector(reply, signature);
884 reply->writeInt32(result);
885 return OK;
886 }
887
888 case VERIFY:
889 {
890 CHECK_INTERFACE(IDrm, data, reply);
891 Vector<uint8_t> sessionId, keyId, message, signature;
892 readVector(data, sessionId);
893 readVector(data, keyId);
894 readVector(data, message);
895 readVector(data, signature);
Jeff Tinker9a6861c2016-09-02 11:36:46 -0700896 bool match = false;
Jeff Tinker4c63a232013-03-30 16:19:44 -0700897 uint32_t result = verify(sessionId, keyId, message, signature, match);
898 reply->writeInt32(match);
899 reply->writeInt32(result);
900 return OK;
901 }
902
Jeff Tinker68d9d712014-03-04 13:21:31 -0800903 case SIGN_RSA:
904 {
905 CHECK_INTERFACE(IDrm, data, reply);
906 Vector<uint8_t> sessionId, message, wrappedKey, signature;
907 readVector(data, sessionId);
908 String8 algorithm = data.readString8();
909 readVector(data, message);
910 readVector(data, wrappedKey);
911 uint32_t result = signRSA(sessionId, algorithm, message, wrappedKey, signature);
912 writeVector(reply, signature);
913 reply->writeInt32(result);
914 return OK;
915 }
916
Jeff Tinkerc0d5f1f2013-04-02 13:08:05 -0700917 case SET_LISTENER: {
918 CHECK_INTERFACE(IDrm, data, reply);
919 sp<IDrmClient> listener =
920 interface_cast<IDrmClient>(data.readStrongBinder());
921 reply->writeInt32(setListener(listener));
922 return NO_ERROR;
923 } break;
924
Jeff Tinker4c63a232013-03-30 16:19:44 -0700925 default:
926 return BBinder::onTransact(code, data, reply, flags);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800927 }
928}
929
930} // namespace android