blob: 393286dcf8c4bfaeb0d0b97ac155fac77cd42159 [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> {
62 BpDrm(const sp<IBinder> &impl)
63 : 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
91 virtual status_t createPlugin(const uint8_t uuid[16]) {
92 Parcel data, reply;
93 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
94 data.write(uuid, 16);
95
Jeff Tinker3b5401a2015-06-15 17:42:10 -070096 status_t status = remote()->transact(CREATE_PLUGIN, data, &reply);
97 if (status != OK) {
98 return status;
99 }
Jeff Tinker441a78d2013-02-08 10:18:35 -0800100
101 return reply.readInt32();
102 }
103
104 virtual status_t destroyPlugin() {
105 Parcel data, reply;
106 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700107 status_t status = remote()->transact(DESTROY_PLUGIN, data, &reply);
108 if (status != OK) {
109 return status;
110 }
Jeff Tinker441a78d2013-02-08 10:18:35 -0800111
112 return reply.readInt32();
113 }
114
115 virtual status_t openSession(Vector<uint8_t> &sessionId) {
116 Parcel data, reply;
117 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
118
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700119 status_t status = remote()->transact(OPEN_SESSION, data, &reply);
120 if (status != OK) {
121 return status;
122 }
Jeff Tinker4c63a232013-03-30 16:19:44 -0700123 readVector(reply, sessionId);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800124
125 return reply.readInt32();
126 }
127
128 virtual status_t closeSession(Vector<uint8_t> const &sessionId) {
129 Parcel data, reply;
130 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
131
Jeff Tinker4c63a232013-03-30 16:19:44 -0700132 writeVector(data, sessionId);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700133 status_t status = remote()->transact(CLOSE_SESSION, data, &reply);
134 if (status != OK) {
135 return status;
136 }
Jeff Tinker441a78d2013-02-08 10:18:35 -0800137
138 return reply.readInt32();
139 }
140
141 virtual status_t
Jeff Tinker4c63a232013-03-30 16:19:44 -0700142 getKeyRequest(Vector<uint8_t> const &sessionId,
143 Vector<uint8_t> const &initData,
144 String8 const &mimeType, DrmPlugin::KeyType keyType,
145 KeyedVector<String8, String8> const &optionalParameters,
Jeff Tinkerd072c902015-03-16 13:39:29 -0700146 Vector<uint8_t> &request, String8 &defaultUrl,
147 DrmPlugin::KeyRequestType *keyRequestType) {
Jeff Tinker441a78d2013-02-08 10:18:35 -0800148 Parcel data, reply;
149 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
150
Jeff Tinker4c63a232013-03-30 16:19:44 -0700151 writeVector(data, sessionId);
152 writeVector(data, initData);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800153 data.writeString8(mimeType);
Jeff Tinker4c63a232013-03-30 16:19:44 -0700154 data.writeInt32((uint32_t)keyType);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800155
156 data.writeInt32(optionalParameters.size());
157 for (size_t i = 0; i < optionalParameters.size(); ++i) {
158 data.writeString8(optionalParameters.keyAt(i));
159 data.writeString8(optionalParameters.valueAt(i));
160 }
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700161
162 status_t status = remote()->transact(GET_KEY_REQUEST, data, &reply);
163 if (status != OK) {
164 return status;
165 }
Jeff Tinker441a78d2013-02-08 10:18:35 -0800166
Jeff Tinker4c63a232013-03-30 16:19:44 -0700167 readVector(reply, request);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800168 defaultUrl = reply.readString8();
Jeff Tinkerd072c902015-03-16 13:39:29 -0700169 *keyRequestType = static_cast<DrmPlugin::KeyRequestType>(reply.readInt32());
Jeff Tinker441a78d2013-02-08 10:18:35 -0800170
171 return reply.readInt32();
172 }
173
Jeff Tinker4c63a232013-03-30 16:19:44 -0700174 virtual status_t provideKeyResponse(Vector<uint8_t> const &sessionId,
175 Vector<uint8_t> const &response,
176 Vector<uint8_t> &keySetId) {
Jeff Tinker441a78d2013-02-08 10:18:35 -0800177 Parcel data, reply;
178 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
Jeff Tinker4c63a232013-03-30 16:19:44 -0700179 writeVector(data, sessionId);
180 writeVector(data, response);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700181
182 status_t status = remote()->transact(PROVIDE_KEY_RESPONSE, data, &reply);
183 if (status != OK) {
184 return status;
185 }
186
Jeff Tinker4c63a232013-03-30 16:19:44 -0700187 readVector(reply, keySetId);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800188
189 return reply.readInt32();
190 }
191
Jeff Tinker4c63a232013-03-30 16:19:44 -0700192 virtual status_t removeKeys(Vector<uint8_t> const &keySetId) {
Jeff Tinker441a78d2013-02-08 10:18:35 -0800193 Parcel data, reply;
194 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
195
Jeff Tinker4c63a232013-03-30 16:19:44 -0700196 writeVector(data, keySetId);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700197 status_t status = remote()->transact(REMOVE_KEYS, data, &reply);
198 if (status != OK) {
199 return status;
200 }
Jeff Tinker441a78d2013-02-08 10:18:35 -0800201
202 return reply.readInt32();
203 }
204
Jeff Tinker4c63a232013-03-30 16:19:44 -0700205 virtual status_t restoreKeys(Vector<uint8_t> const &sessionId,
206 Vector<uint8_t> const &keySetId) {
207 Parcel data, reply;
208 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
209
210 writeVector(data, sessionId);
211 writeVector(data, keySetId);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700212 status_t status = remote()->transact(RESTORE_KEYS, data, &reply);
213 if (status != OK) {
214 return status;
215 }
Jeff Tinker4c63a232013-03-30 16:19:44 -0700216
217 return reply.readInt32();
218 }
219
220 virtual status_t queryKeyStatus(Vector<uint8_t> const &sessionId,
Jeff Tinker441a78d2013-02-08 10:18:35 -0800221 KeyedVector<String8, String8> &infoMap) const {
222 Parcel data, reply;
223 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
224
Jeff Tinker4c63a232013-03-30 16:19:44 -0700225 writeVector(data, sessionId);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700226 status_t status = remote()->transact(QUERY_KEY_STATUS, data, &reply);
227 if (status != OK) {
228 return status;
229 }
Jeff Tinker441a78d2013-02-08 10:18:35 -0800230
231 infoMap.clear();
232 size_t count = reply.readInt32();
233 for (size_t i = 0; i < count; i++) {
234 String8 key = reply.readString8();
235 String8 value = reply.readString8();
236 infoMap.add(key, value);
237 }
238 return reply.readInt32();
239 }
240
Jeff Tinker68d9d712014-03-04 13:21:31 -0800241 virtual status_t getProvisionRequest(String8 const &certType,
242 String8 const &certAuthority,
243 Vector<uint8_t> &request,
Jeff Tinker441a78d2013-02-08 10:18:35 -0800244 String8 &defaultUrl) {
245 Parcel data, reply;
246 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
247
Jeff Tinker68d9d712014-03-04 13:21:31 -0800248 data.writeString8(certType);
249 data.writeString8(certAuthority);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700250 status_t status = remote()->transact(GET_PROVISION_REQUEST, data, &reply);
251 if (status != OK) {
252 return status;
253 }
Jeff Tinker441a78d2013-02-08 10:18:35 -0800254
Jeff Tinker4c63a232013-03-30 16:19:44 -0700255 readVector(reply, request);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800256 defaultUrl = reply.readString8();
257
258 return reply.readInt32();
259 }
260
Jeff Tinker68d9d712014-03-04 13:21:31 -0800261 virtual status_t provideProvisionResponse(Vector<uint8_t> const &response,
262 Vector<uint8_t> &certificate,
263 Vector<uint8_t> &wrappedKey) {
Jeff Tinker441a78d2013-02-08 10:18:35 -0800264 Parcel data, reply;
265 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
266
Jeff Tinker4c63a232013-03-30 16:19:44 -0700267 writeVector(data, response);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700268 status_t status = remote()->transact(PROVIDE_PROVISION_RESPONSE, data, &reply);
269 if (status != OK) {
270 return status;
271 }
Jeff Tinker441a78d2013-02-08 10:18:35 -0800272
Jeff Tinker68d9d712014-03-04 13:21:31 -0800273 readVector(reply, certificate);
274 readVector(reply, wrappedKey);
275
Jeff Tinker441a78d2013-02-08 10:18:35 -0800276 return reply.readInt32();
277 }
278
279 virtual status_t getSecureStops(List<Vector<uint8_t> > &secureStops) {
280 Parcel data, reply;
281 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
282
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700283 status_t status = remote()->transact(GET_SECURE_STOPS, data, &reply);
284 if (status != OK) {
285 return status;
286 }
Jeff Tinker441a78d2013-02-08 10:18:35 -0800287
288 secureStops.clear();
289 uint32_t count = reply.readInt32();
290 for (size_t i = 0; i < count; i++) {
291 Vector<uint8_t> secureStop;
Jeff Tinker4c63a232013-03-30 16:19:44 -0700292 readVector(reply, secureStop);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800293 secureStops.push_back(secureStop);
294 }
295 return reply.readInt32();
296 }
297
Jeff Tinker3c1285e2014-10-31 00:55:16 -0700298 virtual status_t getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop) {
299 Parcel data, reply;
300 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
301
302 writeVector(data, ssid);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700303 status_t status = remote()->transact(GET_SECURE_STOP, data, &reply);
304 if (status != OK) {
305 return status;
306 }
Jeff Tinker3c1285e2014-10-31 00:55:16 -0700307
308 readVector(reply, secureStop);
309 return reply.readInt32();
310 }
311
Jeff Tinker441a78d2013-02-08 10:18:35 -0800312 virtual status_t releaseSecureStops(Vector<uint8_t> const &ssRelease) {
313 Parcel data, reply;
314 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
315
Jeff Tinker4c63a232013-03-30 16:19:44 -0700316 writeVector(data, ssRelease);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700317 status_t status = remote()->transact(RELEASE_SECURE_STOPS, data, &reply);
318 if (status != OK) {
319 return status;
320 }
Jeff Tinker441a78d2013-02-08 10:18:35 -0800321
322 return reply.readInt32();
323 }
324
Jeff Tinker3c1285e2014-10-31 00:55:16 -0700325 virtual status_t releaseAllSecureStops() {
326 Parcel data, reply;
327 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
328
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700329 status_t status = remote()->transact(RELEASE_ALL_SECURE_STOPS, data, &reply);
330 if (status != OK) {
331 return status;
332 }
Jeff Tinker3c1285e2014-10-31 00:55:16 -0700333
334 return reply.readInt32();
335 }
336
Jeff Tinker441a78d2013-02-08 10:18:35 -0800337 virtual status_t getPropertyString(String8 const &name, String8 &value) const {
338 Parcel data, reply;
339 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
340
341 data.writeString8(name);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700342 status_t status = remote()->transact(GET_PROPERTY_STRING, data, &reply);
343 if (status != OK) {
344 return status;
345 }
Jeff Tinker441a78d2013-02-08 10:18:35 -0800346
347 value = reply.readString8();
348 return reply.readInt32();
349 }
350
351 virtual status_t getPropertyByteArray(String8 const &name, Vector<uint8_t> &value) const {
352 Parcel data, reply;
353 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
354
355 data.writeString8(name);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700356 status_t status = remote()->transact(GET_PROPERTY_BYTE_ARRAY, data, &reply);
357 if (status != OK) {
358 return status;
359 }
Jeff Tinker441a78d2013-02-08 10:18:35 -0800360
Jeff Tinker4c63a232013-03-30 16:19:44 -0700361 readVector(reply, value);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800362 return reply.readInt32();
363 }
364
365 virtual status_t setPropertyString(String8 const &name, String8 const &value) const {
366 Parcel data, reply;
367 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
368
369 data.writeString8(name);
370 data.writeString8(value);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700371 status_t status = remote()->transact(SET_PROPERTY_STRING, data, &reply);
372 if (status != OK) {
373 return status;
374 }
Jeff Tinker441a78d2013-02-08 10:18:35 -0800375
376 return reply.readInt32();
377 }
378
379 virtual status_t setPropertyByteArray(String8 const &name,
380 Vector<uint8_t> const &value) const {
381 Parcel data, reply;
382 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
383
384 data.writeString8(name);
Jeff Tinker4c63a232013-03-30 16:19:44 -0700385 writeVector(data, value);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700386 status_t status = remote()->transact(SET_PROPERTY_BYTE_ARRAY, data, &reply);
387 if (status != OK) {
388 return status;
389 }
Jeff Tinker441a78d2013-02-08 10:18:35 -0800390
391 return reply.readInt32();
392 }
393
394
Jeff Tinker4c63a232013-03-30 16:19:44 -0700395 virtual status_t setCipherAlgorithm(Vector<uint8_t> const &sessionId,
396 String8 const &algorithm) {
397 Parcel data, reply;
398 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
399
400 writeVector(data, sessionId);
401 data.writeString8(algorithm);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700402 status_t status = remote()->transact(SET_CIPHER_ALGORITHM, data, &reply);
403 if (status != OK) {
404 return status;
405 }
Jeff Tinker4c63a232013-03-30 16:19:44 -0700406 return reply.readInt32();
407 }
408
409 virtual status_t setMacAlgorithm(Vector<uint8_t> const &sessionId,
410 String8 const &algorithm) {
411 Parcel data, reply;
412 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
413
414 writeVector(data, sessionId);
415 data.writeString8(algorithm);
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700416 status_t status = remote()->transact(SET_MAC_ALGORITHM, data, &reply);
417 if (status != OK) {
418 return status;
419 }
Jeff Tinker4c63a232013-03-30 16:19:44 -0700420 return reply.readInt32();
421 }
422
423 virtual status_t encrypt(Vector<uint8_t> const &sessionId,
424 Vector<uint8_t> const &keyId,
425 Vector<uint8_t> const &input,
426 Vector<uint8_t> const &iv,
427 Vector<uint8_t> &output) {
428 Parcel data, reply;
429 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
430
431 writeVector(data, sessionId);
432 writeVector(data, keyId);
433 writeVector(data, input);
434 writeVector(data, iv);
435
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700436 status_t status = remote()->transact(ENCRYPT, data, &reply);
437 if (status != OK) {
438 return status;
439 }
Jeff Tinker4c63a232013-03-30 16:19:44 -0700440 readVector(reply, output);
441
442 return reply.readInt32();
443 }
444
445 virtual status_t decrypt(Vector<uint8_t> const &sessionId,
446 Vector<uint8_t> const &keyId,
447 Vector<uint8_t> const &input,
448 Vector<uint8_t> const &iv,
449 Vector<uint8_t> &output) {
450 Parcel data, reply;
451 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
452
453 writeVector(data, sessionId);
454 writeVector(data, keyId);
455 writeVector(data, input);
456 writeVector(data, iv);
457
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700458 status_t status = remote()->transact(DECRYPT, data, &reply);
459 if (status != OK) {
460 return status;
461 }
Jeff Tinker4c63a232013-03-30 16:19:44 -0700462 readVector(reply, output);
463
464 return reply.readInt32();
465 }
466
467 virtual status_t sign(Vector<uint8_t> const &sessionId,
468 Vector<uint8_t> const &keyId,
469 Vector<uint8_t> const &message,
470 Vector<uint8_t> &signature) {
471 Parcel data, reply;
472 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
473
474 writeVector(data, sessionId);
475 writeVector(data, keyId);
476 writeVector(data, message);
477
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700478 status_t status = remote()->transact(SIGN, data, &reply);
479 if (status != OK) {
480 return status;
481 }
Jeff Tinker4c63a232013-03-30 16:19:44 -0700482 readVector(reply, signature);
483
484 return reply.readInt32();
485 }
486
487 virtual status_t verify(Vector<uint8_t> const &sessionId,
488 Vector<uint8_t> const &keyId,
489 Vector<uint8_t> const &message,
490 Vector<uint8_t> const &signature,
491 bool &match) {
492 Parcel data, reply;
493 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
494
495 writeVector(data, sessionId);
496 writeVector(data, keyId);
497 writeVector(data, message);
498 writeVector(data, signature);
499
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700500 status_t status = remote()->transact(VERIFY, data, &reply);
501 if (status != OK) {
502 return status;
503 }
Jeff Tinker4c63a232013-03-30 16:19:44 -0700504 match = (bool)reply.readInt32();
505 return reply.readInt32();
506 }
507
Jeff Tinker68d9d712014-03-04 13:21:31 -0800508 virtual status_t signRSA(Vector<uint8_t> const &sessionId,
509 String8 const &algorithm,
510 Vector<uint8_t> const &message,
511 Vector<uint8_t> const &wrappedKey,
512 Vector<uint8_t> &signature) {
513 Parcel data, reply;
514 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
515
516 writeVector(data, sessionId);
517 data.writeString8(algorithm);
518 writeVector(data, message);
519 writeVector(data, wrappedKey);
520
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700521 status_t status = remote()->transact(SIGN_RSA, data, &reply);
522 if (status != OK) {
523 return status;
524 }
Jeff Tinker68d9d712014-03-04 13:21:31 -0800525 readVector(reply, signature);
526
527 return reply.readInt32();
528 }
529
Jeff Tinkerc0d5f1f2013-04-02 13:08:05 -0700530 virtual status_t setListener(const sp<IDrmClient>& listener) {
531 Parcel data, reply;
532 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800533 data.writeStrongBinder(IInterface::asBinder(listener));
Jeff Tinker3b5401a2015-06-15 17:42:10 -0700534 status_t status = remote()->transact(SET_LISTENER, data, &reply);
535 if (status != OK) {
536 return status;
537 }
Jeff Tinkerc0d5f1f2013-04-02 13:08:05 -0700538 return reply.readInt32();
539 }
540
Jeff Tinker441a78d2013-02-08 10:18:35 -0800541private:
Jeff Tinker4c63a232013-03-30 16:19:44 -0700542 void readVector(Parcel &reply, Vector<uint8_t> &vector) const {
543 uint32_t size = reply.readInt32();
544 vector.insertAt((size_t)0, size);
545 reply.read(vector.editArray(), size);
546 }
547
548 void writeVector(Parcel &data, Vector<uint8_t> const &vector) const {
549 data.writeInt32(vector.size());
550 data.write(vector.array(), vector.size());
551 }
552
Jeff Tinker441a78d2013-02-08 10:18:35 -0800553 DISALLOW_EVIL_CONSTRUCTORS(BpDrm);
554};
555
556IMPLEMENT_META_INTERFACE(Drm, "android.drm.IDrm");
557
558////////////////////////////////////////////////////////////////////////////////
559
Jeff Tinker4c63a232013-03-30 16:19:44 -0700560void BnDrm::readVector(const Parcel &data, Vector<uint8_t> &vector) const {
561 uint32_t size = data.readInt32();
Jeff Tinkerb41a5272017-10-09 11:52:18 -0700562 if (vector.insertAt((size_t)0, size) < 0) {
563 vector.clear();
564 }
565 if (data.read(vector.editArray(), size) != NO_ERROR) {
566 vector.clear();
567 android_errorWriteWithInfoLog(0x534e4554, "62872384", -1, NULL, 0);
568 }
Jeff Tinker4c63a232013-03-30 16:19:44 -0700569}
570
571void BnDrm::writeVector(Parcel *reply, Vector<uint8_t> const &vector) const {
572 reply->writeInt32(vector.size());
573 reply->write(vector.array(), vector.size());
574}
575
Jeff Tinker441a78d2013-02-08 10:18:35 -0800576status_t BnDrm::onTransact(
577 uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
578 switch (code) {
579 case INIT_CHECK:
580 {
581 CHECK_INTERFACE(IDrm, data, reply);
582 reply->writeInt32(initCheck());
583 return OK;
584 }
585
586 case IS_CRYPTO_SUPPORTED:
587 {
588 CHECK_INTERFACE(IDrm, data, reply);
589 uint8_t uuid[16];
590 data.read(uuid, sizeof(uuid));
Jeff Tinker9cf69e02013-08-21 11:59:23 -0700591 String8 mimeType = data.readString8();
592 reply->writeInt32(isCryptoSchemeSupported(uuid, mimeType));
593
Jeff Tinker441a78d2013-02-08 10:18:35 -0800594 return OK;
595 }
596
597 case CREATE_PLUGIN:
598 {
599 CHECK_INTERFACE(IDrm, data, reply);
600 uint8_t uuid[16];
601 data.read(uuid, sizeof(uuid));
602 reply->writeInt32(createPlugin(uuid));
603 return OK;
604 }
605
606 case DESTROY_PLUGIN:
607 {
608 CHECK_INTERFACE(IDrm, data, reply);
609 reply->writeInt32(destroyPlugin());
610 return OK;
611 }
612
613 case OPEN_SESSION:
614 {
615 CHECK_INTERFACE(IDrm, data, reply);
616 Vector<uint8_t> sessionId;
617 status_t result = openSession(sessionId);
Jeff Tinker4c63a232013-03-30 16:19:44 -0700618 writeVector(reply, sessionId);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800619 reply->writeInt32(result);
620 return OK;
621 }
622
623 case CLOSE_SESSION:
624 {
625 CHECK_INTERFACE(IDrm, data, reply);
626 Vector<uint8_t> sessionId;
Jeff Tinker4c63a232013-03-30 16:19:44 -0700627 readVector(data, sessionId);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800628 reply->writeInt32(closeSession(sessionId));
629 return OK;
630 }
631
Jeff Tinker4c63a232013-03-30 16:19:44 -0700632 case GET_KEY_REQUEST:
Jeff Tinker441a78d2013-02-08 10:18:35 -0800633 {
634 CHECK_INTERFACE(IDrm, data, reply);
Jeff Tinker4c63a232013-03-30 16:19:44 -0700635 Vector<uint8_t> sessionId, initData;
Jeff Tinker441a78d2013-02-08 10:18:35 -0800636
Jeff Tinker4c63a232013-03-30 16:19:44 -0700637 readVector(data, sessionId);
638 readVector(data, initData);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800639 String8 mimeType = data.readString8();
Jeff Tinker4c63a232013-03-30 16:19:44 -0700640 DrmPlugin::KeyType keyType = (DrmPlugin::KeyType)data.readInt32();
Jeff Tinker441a78d2013-02-08 10:18:35 -0800641
642 KeyedVector<String8, String8> optionalParameters;
643 uint32_t count = data.readInt32();
644 for (size_t i = 0; i < count; ++i) {
645 String8 key, value;
646 key = data.readString8();
647 value = data.readString8();
648 optionalParameters.add(key, value);
649 }
650
651 Vector<uint8_t> request;
652 String8 defaultUrl;
Jeff Tinker8aff7772016-02-08 17:52:25 -0800653 DrmPlugin::KeyRequestType keyRequestType = DrmPlugin::kKeyRequestType_Unknown;
Jeff Tinker441a78d2013-02-08 10:18:35 -0800654
Jeff Tinkerd072c902015-03-16 13:39:29 -0700655 status_t result = getKeyRequest(sessionId, initData, mimeType,
656 keyType, optionalParameters, request, defaultUrl,
657 &keyRequestType);
658
Jeff Tinker4c63a232013-03-30 16:19:44 -0700659 writeVector(reply, request);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800660 reply->writeString8(defaultUrl);
Jeff Tinkerd072c902015-03-16 13:39:29 -0700661 reply->writeInt32(static_cast<int32_t>(keyRequestType));
Jeff Tinker441a78d2013-02-08 10:18:35 -0800662 reply->writeInt32(result);
663 return OK;
664 }
665
Jeff Tinker4c63a232013-03-30 16:19:44 -0700666 case PROVIDE_KEY_RESPONSE:
Jeff Tinker441a78d2013-02-08 10:18:35 -0800667 {
668 CHECK_INTERFACE(IDrm, data, reply);
Jeff Tinker4c63a232013-03-30 16:19:44 -0700669 Vector<uint8_t> sessionId, response, keySetId;
670 readVector(data, sessionId);
671 readVector(data, response);
672 uint32_t result = provideKeyResponse(sessionId, response, keySetId);
673 writeVector(reply, keySetId);
674 reply->writeInt32(result);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800675 return OK;
676 }
677
Jeff Tinker4c63a232013-03-30 16:19:44 -0700678 case REMOVE_KEYS:
Jeff Tinker441a78d2013-02-08 10:18:35 -0800679 {
680 CHECK_INTERFACE(IDrm, data, reply);
Jeff Tinker4c63a232013-03-30 16:19:44 -0700681 Vector<uint8_t> keySetId;
682 readVector(data, keySetId);
683 reply->writeInt32(removeKeys(keySetId));
Jeff Tinker441a78d2013-02-08 10:18:35 -0800684 return OK;
685 }
686
Jeff Tinker4c63a232013-03-30 16:19:44 -0700687 case RESTORE_KEYS:
688 {
689 CHECK_INTERFACE(IDrm, data, reply);
690 Vector<uint8_t> sessionId, keySetId;
691 readVector(data, sessionId);
692 readVector(data, keySetId);
693 reply->writeInt32(restoreKeys(sessionId, keySetId));
694 return OK;
695 }
696
697 case QUERY_KEY_STATUS:
Jeff Tinker441a78d2013-02-08 10:18:35 -0800698 {
699 CHECK_INTERFACE(IDrm, data, reply);
700 Vector<uint8_t> sessionId;
Jeff Tinker4c63a232013-03-30 16:19:44 -0700701 readVector(data, sessionId);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800702 KeyedVector<String8, String8> infoMap;
Jeff Tinker4c63a232013-03-30 16:19:44 -0700703 status_t result = queryKeyStatus(sessionId, infoMap);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800704 size_t count = infoMap.size();
705 reply->writeInt32(count);
706 for (size_t i = 0; i < count; ++i) {
707 reply->writeString8(infoMap.keyAt(i));
708 reply->writeString8(infoMap.valueAt(i));
709 }
710 reply->writeInt32(result);
711 return OK;
712 }
713
714 case GET_PROVISION_REQUEST:
715 {
716 CHECK_INTERFACE(IDrm, data, reply);
Jeff Tinker68d9d712014-03-04 13:21:31 -0800717 String8 certType = data.readString8();
718 String8 certAuthority = data.readString8();
719
Jeff Tinker441a78d2013-02-08 10:18:35 -0800720 Vector<uint8_t> request;
721 String8 defaultUrl;
Jeff Tinker68d9d712014-03-04 13:21:31 -0800722 status_t result = getProvisionRequest(certType, certAuthority,
723 request, defaultUrl);
Jeff Tinker4c63a232013-03-30 16:19:44 -0700724 writeVector(reply, request);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800725 reply->writeString8(defaultUrl);
726 reply->writeInt32(result);
727 return OK;
728 }
729
730 case PROVIDE_PROVISION_RESPONSE:
731 {
732 CHECK_INTERFACE(IDrm, data, reply);
733 Vector<uint8_t> response;
Jeff Tinker68d9d712014-03-04 13:21:31 -0800734 Vector<uint8_t> certificate;
735 Vector<uint8_t> wrappedKey;
Jeff Tinker4c63a232013-03-30 16:19:44 -0700736 readVector(data, response);
Jeff Tinker68d9d712014-03-04 13:21:31 -0800737 status_t result = provideProvisionResponse(response, certificate, wrappedKey);
738 writeVector(reply, certificate);
739 writeVector(reply, wrappedKey);
740 reply->writeInt32(result);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800741 return OK;
742 }
743
744 case GET_SECURE_STOPS:
745 {
746 CHECK_INTERFACE(IDrm, data, reply);
747 List<Vector<uint8_t> > secureStops;
748 status_t result = getSecureStops(secureStops);
749 size_t count = secureStops.size();
750 reply->writeInt32(count);
751 List<Vector<uint8_t> >::iterator iter = secureStops.begin();
752 while(iter != secureStops.end()) {
753 size_t size = iter->size();
754 reply->writeInt32(size);
755 reply->write(iter->array(), iter->size());
Jeff Tinker423e33c2013-04-08 15:23:17 -0700756 iter++;
Jeff Tinker441a78d2013-02-08 10:18:35 -0800757 }
758 reply->writeInt32(result);
759 return OK;
760 }
761
Jeff Tinker3c1285e2014-10-31 00:55:16 -0700762 case GET_SECURE_STOP:
763 {
764 CHECK_INTERFACE(IDrm, data, reply);
765 Vector<uint8_t> ssid, secureStop;
766 readVector(data, ssid);
767 status_t result = getSecureStop(ssid, secureStop);
768 writeVector(reply, secureStop);
769 reply->writeInt32(result);
770 return OK;
771 }
772
Jeff Tinker441a78d2013-02-08 10:18:35 -0800773 case RELEASE_SECURE_STOPS:
774 {
775 CHECK_INTERFACE(IDrm, data, reply);
776 Vector<uint8_t> ssRelease;
Jeff Tinker4c63a232013-03-30 16:19:44 -0700777 readVector(data, ssRelease);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800778 reply->writeInt32(releaseSecureStops(ssRelease));
779 return OK;
780 }
781
Jeff Tinker3c1285e2014-10-31 00:55:16 -0700782 case RELEASE_ALL_SECURE_STOPS:
783 {
784 CHECK_INTERFACE(IDrm, data, reply);
785 reply->writeInt32(releaseAllSecureStops());
786 return OK;
787 }
788
Jeff Tinker441a78d2013-02-08 10:18:35 -0800789 case GET_PROPERTY_STRING:
790 {
791 CHECK_INTERFACE(IDrm, data, reply);
792 String8 name = data.readString8();
793 String8 value;
794 status_t result = getPropertyString(name, value);
795 reply->writeString8(value);
796 reply->writeInt32(result);
797 return OK;
798 }
799
800 case GET_PROPERTY_BYTE_ARRAY:
801 {
802 CHECK_INTERFACE(IDrm, data, reply);
803 String8 name = data.readString8();
804 Vector<uint8_t> value;
805 status_t result = getPropertyByteArray(name, value);
Jeff Tinker4c63a232013-03-30 16:19:44 -0700806 writeVector(reply, value);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800807 reply->writeInt32(result);
808 return OK;
809 }
810
811 case SET_PROPERTY_STRING:
812 {
813 CHECK_INTERFACE(IDrm, data, reply);
814 String8 name = data.readString8();
815 String8 value = data.readString8();
816 reply->writeInt32(setPropertyString(name, value));
817 return OK;
818 }
819
820 case SET_PROPERTY_BYTE_ARRAY:
821 {
822 CHECK_INTERFACE(IDrm, data, reply);
823 String8 name = data.readString8();
824 Vector<uint8_t> value;
Jeff Tinker4c63a232013-03-30 16:19:44 -0700825 readVector(data, value);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800826 reply->writeInt32(setPropertyByteArray(name, value));
827 return OK;
828 }
829
Jeff Tinker4c63a232013-03-30 16:19:44 -0700830 case SET_CIPHER_ALGORITHM:
831 {
832 CHECK_INTERFACE(IDrm, data, reply);
833 Vector<uint8_t> sessionId;
834 readVector(data, sessionId);
835 String8 algorithm = data.readString8();
836 reply->writeInt32(setCipherAlgorithm(sessionId, algorithm));
837 return OK;
838 }
839
840 case SET_MAC_ALGORITHM:
841 {
842 CHECK_INTERFACE(IDrm, data, reply);
843 Vector<uint8_t> sessionId;
844 readVector(data, sessionId);
845 String8 algorithm = data.readString8();
846 reply->writeInt32(setMacAlgorithm(sessionId, algorithm));
847 return OK;
848 }
849
850 case ENCRYPT:
851 {
852 CHECK_INTERFACE(IDrm, data, reply);
853 Vector<uint8_t> sessionId, keyId, input, iv, output;
854 readVector(data, sessionId);
855 readVector(data, keyId);
856 readVector(data, input);
857 readVector(data, iv);
858 uint32_t result = encrypt(sessionId, keyId, input, iv, output);
859 writeVector(reply, output);
860 reply->writeInt32(result);
861 return OK;
862 }
863
864 case DECRYPT:
865 {
866 CHECK_INTERFACE(IDrm, data, reply);
867 Vector<uint8_t> sessionId, keyId, input, iv, output;
868 readVector(data, sessionId);
869 readVector(data, keyId);
870 readVector(data, input);
871 readVector(data, iv);
872 uint32_t result = decrypt(sessionId, keyId, input, iv, output);
873 writeVector(reply, output);
874 reply->writeInt32(result);
875 return OK;
876 }
877
878 case SIGN:
879 {
880 CHECK_INTERFACE(IDrm, data, reply);
881 Vector<uint8_t> sessionId, keyId, message, signature;
882 readVector(data, sessionId);
883 readVector(data, keyId);
884 readVector(data, message);
885 uint32_t result = sign(sessionId, keyId, message, signature);
886 writeVector(reply, signature);
887 reply->writeInt32(result);
888 return OK;
889 }
890
891 case VERIFY:
892 {
893 CHECK_INTERFACE(IDrm, data, reply);
894 Vector<uint8_t> sessionId, keyId, message, signature;
895 readVector(data, sessionId);
896 readVector(data, keyId);
897 readVector(data, message);
898 readVector(data, signature);
Jeff Tinker9a6861c2016-09-02 11:36:46 -0700899 bool match = false;
Jeff Tinker4c63a232013-03-30 16:19:44 -0700900 uint32_t result = verify(sessionId, keyId, message, signature, match);
901 reply->writeInt32(match);
902 reply->writeInt32(result);
903 return OK;
904 }
905
Jeff Tinker68d9d712014-03-04 13:21:31 -0800906 case SIGN_RSA:
907 {
908 CHECK_INTERFACE(IDrm, data, reply);
909 Vector<uint8_t> sessionId, message, wrappedKey, signature;
910 readVector(data, sessionId);
911 String8 algorithm = data.readString8();
912 readVector(data, message);
913 readVector(data, wrappedKey);
914 uint32_t result = signRSA(sessionId, algorithm, message, wrappedKey, signature);
915 writeVector(reply, signature);
916 reply->writeInt32(result);
917 return OK;
918 }
919
Jeff Tinkerc0d5f1f2013-04-02 13:08:05 -0700920 case SET_LISTENER: {
921 CHECK_INTERFACE(IDrm, data, reply);
922 sp<IDrmClient> listener =
923 interface_cast<IDrmClient>(data.readStrongBinder());
924 reply->writeInt32(setListener(listener));
925 return NO_ERROR;
926 } break;
927
Jeff Tinker4c63a232013-03-30 16:19:44 -0700928 default:
929 return BBinder::onTransact(code, data, reply, flags);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800930 }
931}
932
933} // namespace android