blob: b30ab85ff660db49e6b8be4d934ff949dbe2794d [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,
57 UNPROVISION_DEVICE
Jeff Tinker441a78d2013-02-08 10:18:35 -080058};
59
60struct BpDrm : public BpInterface<IDrm> {
61 BpDrm(const sp<IBinder> &impl)
62 : BpInterface<IDrm>(impl) {
63 }
64
65 virtual status_t initCheck() const {
66 Parcel data, reply;
67 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
68 remote()->transact(INIT_CHECK, data, &reply);
69
70 return reply.readInt32();
71 }
72
Jeff Tinker9cf69e02013-08-21 11:59:23 -070073 virtual bool isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType) {
Jeff Tinker441a78d2013-02-08 10:18:35 -080074 Parcel data, reply;
75 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
76 data.write(uuid, 16);
Jeff Tinker9cf69e02013-08-21 11:59:23 -070077 data.writeString8(mimeType);
Jeff Tinker441a78d2013-02-08 10:18:35 -080078 remote()->transact(IS_CRYPTO_SUPPORTED, data, &reply);
79
80 return reply.readInt32() != 0;
81 }
82
83 virtual status_t createPlugin(const uint8_t uuid[16]) {
84 Parcel data, reply;
85 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
86 data.write(uuid, 16);
87
88 remote()->transact(CREATE_PLUGIN, data, &reply);
89
90 return reply.readInt32();
91 }
92
93 virtual status_t destroyPlugin() {
94 Parcel data, reply;
95 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
96 remote()->transact(DESTROY_PLUGIN, data, &reply);
97
98 return reply.readInt32();
99 }
100
101 virtual status_t openSession(Vector<uint8_t> &sessionId) {
102 Parcel data, reply;
103 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
104
105 remote()->transact(OPEN_SESSION, data, &reply);
Jeff Tinker4c63a232013-03-30 16:19:44 -0700106 readVector(reply, sessionId);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800107
108 return reply.readInt32();
109 }
110
111 virtual status_t closeSession(Vector<uint8_t> const &sessionId) {
112 Parcel data, reply;
113 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
114
Jeff Tinker4c63a232013-03-30 16:19:44 -0700115 writeVector(data, sessionId);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800116 remote()->transact(CLOSE_SESSION, data, &reply);
117
118 return reply.readInt32();
119 }
120
121 virtual status_t
Jeff Tinker4c63a232013-03-30 16:19:44 -0700122 getKeyRequest(Vector<uint8_t> const &sessionId,
123 Vector<uint8_t> const &initData,
124 String8 const &mimeType, DrmPlugin::KeyType keyType,
125 KeyedVector<String8, String8> const &optionalParameters,
126 Vector<uint8_t> &request, String8 &defaultUrl) {
Jeff Tinker441a78d2013-02-08 10:18:35 -0800127 Parcel data, reply;
128 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
129
Jeff Tinker4c63a232013-03-30 16:19:44 -0700130 writeVector(data, sessionId);
131 writeVector(data, initData);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800132 data.writeString8(mimeType);
Jeff Tinker4c63a232013-03-30 16:19:44 -0700133 data.writeInt32((uint32_t)keyType);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800134
135 data.writeInt32(optionalParameters.size());
136 for (size_t i = 0; i < optionalParameters.size(); ++i) {
137 data.writeString8(optionalParameters.keyAt(i));
138 data.writeString8(optionalParameters.valueAt(i));
139 }
Jeff Tinker4c63a232013-03-30 16:19:44 -0700140 remote()->transact(GET_KEY_REQUEST, data, &reply);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800141
Jeff Tinker4c63a232013-03-30 16:19:44 -0700142 readVector(reply, request);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800143 defaultUrl = reply.readString8();
144
145 return reply.readInt32();
146 }
147
Jeff Tinker4c63a232013-03-30 16:19:44 -0700148 virtual status_t provideKeyResponse(Vector<uint8_t> const &sessionId,
149 Vector<uint8_t> const &response,
150 Vector<uint8_t> &keySetId) {
Jeff Tinker441a78d2013-02-08 10:18:35 -0800151 Parcel data, reply;
152 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
Jeff Tinker4c63a232013-03-30 16:19:44 -0700153 writeVector(data, sessionId);
154 writeVector(data, response);
155 remote()->transact(PROVIDE_KEY_RESPONSE, data, &reply);
156 readVector(reply, keySetId);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800157
158 return reply.readInt32();
159 }
160
Jeff Tinker4c63a232013-03-30 16:19:44 -0700161 virtual status_t removeKeys(Vector<uint8_t> const &keySetId) {
Jeff Tinker441a78d2013-02-08 10:18:35 -0800162 Parcel data, reply;
163 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
164
Jeff Tinker4c63a232013-03-30 16:19:44 -0700165 writeVector(data, keySetId);
166 remote()->transact(REMOVE_KEYS, data, &reply);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800167
168 return reply.readInt32();
169 }
170
Jeff Tinker4c63a232013-03-30 16:19:44 -0700171 virtual status_t restoreKeys(Vector<uint8_t> const &sessionId,
172 Vector<uint8_t> const &keySetId) {
173 Parcel data, reply;
174 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
175
176 writeVector(data, sessionId);
177 writeVector(data, keySetId);
178 remote()->transact(RESTORE_KEYS, data, &reply);
179
180 return reply.readInt32();
181 }
182
183 virtual status_t queryKeyStatus(Vector<uint8_t> const &sessionId,
Jeff Tinker441a78d2013-02-08 10:18:35 -0800184 KeyedVector<String8, String8> &infoMap) const {
185 Parcel data, reply;
186 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
187
Jeff Tinker4c63a232013-03-30 16:19:44 -0700188 writeVector(data, sessionId);
189 remote()->transact(QUERY_KEY_STATUS, data, &reply);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800190
191 infoMap.clear();
192 size_t count = reply.readInt32();
193 for (size_t i = 0; i < count; i++) {
194 String8 key = reply.readString8();
195 String8 value = reply.readString8();
196 infoMap.add(key, value);
197 }
198 return reply.readInt32();
199 }
200
Jeff Tinker68d9d712014-03-04 13:21:31 -0800201 virtual status_t getProvisionRequest(String8 const &certType,
202 String8 const &certAuthority,
203 Vector<uint8_t> &request,
Jeff Tinker441a78d2013-02-08 10:18:35 -0800204 String8 &defaultUrl) {
205 Parcel data, reply;
206 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
207
Jeff Tinker68d9d712014-03-04 13:21:31 -0800208 data.writeString8(certType);
209 data.writeString8(certAuthority);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800210 remote()->transact(GET_PROVISION_REQUEST, data, &reply);
211
Jeff Tinker4c63a232013-03-30 16:19:44 -0700212 readVector(reply, request);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800213 defaultUrl = reply.readString8();
214
215 return reply.readInt32();
216 }
217
Jeff Tinker68d9d712014-03-04 13:21:31 -0800218 virtual status_t provideProvisionResponse(Vector<uint8_t> const &response,
219 Vector<uint8_t> &certificate,
220 Vector<uint8_t> &wrappedKey) {
Jeff Tinker441a78d2013-02-08 10:18:35 -0800221 Parcel data, reply;
222 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
223
Jeff Tinker4c63a232013-03-30 16:19:44 -0700224 writeVector(data, response);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800225 remote()->transact(PROVIDE_PROVISION_RESPONSE, data, &reply);
226
Jeff Tinker68d9d712014-03-04 13:21:31 -0800227 readVector(reply, certificate);
228 readVector(reply, wrappedKey);
229
Jeff Tinker441a78d2013-02-08 10:18:35 -0800230 return reply.readInt32();
231 }
232
Jeff Tinker68b15552014-04-30 10:19:03 -0700233 virtual status_t unprovisionDevice() {
234 Parcel data, reply;
235 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
236
237 remote()->transact(UNPROVISION_DEVICE, data, &reply);
238
239 return reply.readInt32();
240 }
241
Jeff Tinker441a78d2013-02-08 10:18:35 -0800242 virtual status_t getSecureStops(List<Vector<uint8_t> > &secureStops) {
243 Parcel data, reply;
244 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
245
246 remote()->transact(GET_SECURE_STOPS, data, &reply);
247
248 secureStops.clear();
249 uint32_t count = reply.readInt32();
250 for (size_t i = 0; i < count; i++) {
251 Vector<uint8_t> secureStop;
Jeff Tinker4c63a232013-03-30 16:19:44 -0700252 readVector(reply, secureStop);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800253 secureStops.push_back(secureStop);
254 }
255 return reply.readInt32();
256 }
257
258 virtual status_t releaseSecureStops(Vector<uint8_t> const &ssRelease) {
259 Parcel data, reply;
260 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
261
Jeff Tinker4c63a232013-03-30 16:19:44 -0700262 writeVector(data, ssRelease);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800263 remote()->transact(RELEASE_SECURE_STOPS, data, &reply);
264
265 return reply.readInt32();
266 }
267
268 virtual status_t getPropertyString(String8 const &name, String8 &value) const {
269 Parcel data, reply;
270 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
271
272 data.writeString8(name);
273 remote()->transact(GET_PROPERTY_STRING, data, &reply);
274
275 value = reply.readString8();
276 return reply.readInt32();
277 }
278
279 virtual status_t getPropertyByteArray(String8 const &name, Vector<uint8_t> &value) const {
280 Parcel data, reply;
281 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
282
283 data.writeString8(name);
284 remote()->transact(GET_PROPERTY_BYTE_ARRAY, data, &reply);
285
Jeff Tinker4c63a232013-03-30 16:19:44 -0700286 readVector(reply, value);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800287 return reply.readInt32();
288 }
289
290 virtual status_t setPropertyString(String8 const &name, String8 const &value) const {
291 Parcel data, reply;
292 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
293
294 data.writeString8(name);
295 data.writeString8(value);
296 remote()->transact(SET_PROPERTY_STRING, data, &reply);
297
298 return reply.readInt32();
299 }
300
301 virtual status_t setPropertyByteArray(String8 const &name,
302 Vector<uint8_t> const &value) const {
303 Parcel data, reply;
304 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
305
306 data.writeString8(name);
Jeff Tinker4c63a232013-03-30 16:19:44 -0700307 writeVector(data, value);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800308 remote()->transact(SET_PROPERTY_BYTE_ARRAY, data, &reply);
309
310 return reply.readInt32();
311 }
312
313
Jeff Tinker4c63a232013-03-30 16:19:44 -0700314 virtual status_t setCipherAlgorithm(Vector<uint8_t> const &sessionId,
315 String8 const &algorithm) {
316 Parcel data, reply;
317 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
318
319 writeVector(data, sessionId);
320 data.writeString8(algorithm);
321 remote()->transact(SET_CIPHER_ALGORITHM, data, &reply);
322 return reply.readInt32();
323 }
324
325 virtual status_t setMacAlgorithm(Vector<uint8_t> const &sessionId,
326 String8 const &algorithm) {
327 Parcel data, reply;
328 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
329
330 writeVector(data, sessionId);
331 data.writeString8(algorithm);
332 remote()->transact(SET_MAC_ALGORITHM, data, &reply);
333 return reply.readInt32();
334 }
335
336 virtual status_t encrypt(Vector<uint8_t> const &sessionId,
337 Vector<uint8_t> const &keyId,
338 Vector<uint8_t> const &input,
339 Vector<uint8_t> const &iv,
340 Vector<uint8_t> &output) {
341 Parcel data, reply;
342 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
343
344 writeVector(data, sessionId);
345 writeVector(data, keyId);
346 writeVector(data, input);
347 writeVector(data, iv);
348
349 remote()->transact(ENCRYPT, data, &reply);
350 readVector(reply, output);
351
352 return reply.readInt32();
353 }
354
355 virtual status_t decrypt(Vector<uint8_t> const &sessionId,
356 Vector<uint8_t> const &keyId,
357 Vector<uint8_t> const &input,
358 Vector<uint8_t> const &iv,
359 Vector<uint8_t> &output) {
360 Parcel data, reply;
361 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
362
363 writeVector(data, sessionId);
364 writeVector(data, keyId);
365 writeVector(data, input);
366 writeVector(data, iv);
367
368 remote()->transact(DECRYPT, data, &reply);
369 readVector(reply, output);
370
371 return reply.readInt32();
372 }
373
374 virtual status_t sign(Vector<uint8_t> const &sessionId,
375 Vector<uint8_t> const &keyId,
376 Vector<uint8_t> const &message,
377 Vector<uint8_t> &signature) {
378 Parcel data, reply;
379 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
380
381 writeVector(data, sessionId);
382 writeVector(data, keyId);
383 writeVector(data, message);
384
385 remote()->transact(SIGN, data, &reply);
386 readVector(reply, signature);
387
388 return reply.readInt32();
389 }
390
391 virtual status_t verify(Vector<uint8_t> const &sessionId,
392 Vector<uint8_t> const &keyId,
393 Vector<uint8_t> const &message,
394 Vector<uint8_t> const &signature,
395 bool &match) {
396 Parcel data, reply;
397 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
398
399 writeVector(data, sessionId);
400 writeVector(data, keyId);
401 writeVector(data, message);
402 writeVector(data, signature);
403
404 remote()->transact(VERIFY, data, &reply);
405 match = (bool)reply.readInt32();
406 return reply.readInt32();
407 }
408
Jeff Tinker68d9d712014-03-04 13:21:31 -0800409 virtual status_t signRSA(Vector<uint8_t> const &sessionId,
410 String8 const &algorithm,
411 Vector<uint8_t> const &message,
412 Vector<uint8_t> const &wrappedKey,
413 Vector<uint8_t> &signature) {
414 Parcel data, reply;
415 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
416
417 writeVector(data, sessionId);
418 data.writeString8(algorithm);
419 writeVector(data, message);
420 writeVector(data, wrappedKey);
421
422 remote()->transact(SIGN_RSA, data, &reply);
423 readVector(reply, signature);
424
425 return reply.readInt32();
426 }
427
Jeff Tinkerc0d5f1f2013-04-02 13:08:05 -0700428 virtual status_t setListener(const sp<IDrmClient>& listener) {
429 Parcel data, reply;
430 data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
431 data.writeStrongBinder(listener->asBinder());
432 remote()->transact(SET_LISTENER, data, &reply);
433 return reply.readInt32();
434 }
435
Jeff Tinker441a78d2013-02-08 10:18:35 -0800436private:
Jeff Tinker4c63a232013-03-30 16:19:44 -0700437 void readVector(Parcel &reply, Vector<uint8_t> &vector) const {
438 uint32_t size = reply.readInt32();
439 vector.insertAt((size_t)0, size);
440 reply.read(vector.editArray(), size);
441 }
442
443 void writeVector(Parcel &data, Vector<uint8_t> const &vector) const {
444 data.writeInt32(vector.size());
445 data.write(vector.array(), vector.size());
446 }
447
Jeff Tinker441a78d2013-02-08 10:18:35 -0800448 DISALLOW_EVIL_CONSTRUCTORS(BpDrm);
449};
450
451IMPLEMENT_META_INTERFACE(Drm, "android.drm.IDrm");
452
453////////////////////////////////////////////////////////////////////////////////
454
Jeff Tinker4c63a232013-03-30 16:19:44 -0700455void BnDrm::readVector(const Parcel &data, Vector<uint8_t> &vector) const {
456 uint32_t size = data.readInt32();
Jeff Tinkerb41a5272017-10-09 11:52:18 -0700457 if (vector.insertAt((size_t)0, size) < 0) {
458 vector.clear();
459 }
460 if (data.read(vector.editArray(), size) != NO_ERROR) {
461 vector.clear();
462 android_errorWriteWithInfoLog(0x534e4554, "62872384", -1, NULL, 0);
463 }
Jeff Tinker4c63a232013-03-30 16:19:44 -0700464}
465
466void BnDrm::writeVector(Parcel *reply, Vector<uint8_t> const &vector) const {
467 reply->writeInt32(vector.size());
468 reply->write(vector.array(), vector.size());
469}
470
Jeff Tinker441a78d2013-02-08 10:18:35 -0800471status_t BnDrm::onTransact(
472 uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
473 switch (code) {
474 case INIT_CHECK:
475 {
476 CHECK_INTERFACE(IDrm, data, reply);
477 reply->writeInt32(initCheck());
478 return OK;
479 }
480
481 case IS_CRYPTO_SUPPORTED:
482 {
483 CHECK_INTERFACE(IDrm, data, reply);
484 uint8_t uuid[16];
485 data.read(uuid, sizeof(uuid));
Jeff Tinker9cf69e02013-08-21 11:59:23 -0700486 String8 mimeType = data.readString8();
487 reply->writeInt32(isCryptoSchemeSupported(uuid, mimeType));
488
Jeff Tinker441a78d2013-02-08 10:18:35 -0800489 return OK;
490 }
491
492 case CREATE_PLUGIN:
493 {
494 CHECK_INTERFACE(IDrm, data, reply);
495 uint8_t uuid[16];
496 data.read(uuid, sizeof(uuid));
497 reply->writeInt32(createPlugin(uuid));
498 return OK;
499 }
500
501 case DESTROY_PLUGIN:
502 {
503 CHECK_INTERFACE(IDrm, data, reply);
504 reply->writeInt32(destroyPlugin());
505 return OK;
506 }
507
508 case OPEN_SESSION:
509 {
510 CHECK_INTERFACE(IDrm, data, reply);
511 Vector<uint8_t> sessionId;
512 status_t result = openSession(sessionId);
Jeff Tinker4c63a232013-03-30 16:19:44 -0700513 writeVector(reply, sessionId);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800514 reply->writeInt32(result);
515 return OK;
516 }
517
518 case CLOSE_SESSION:
519 {
520 CHECK_INTERFACE(IDrm, data, reply);
521 Vector<uint8_t> sessionId;
Jeff Tinker4c63a232013-03-30 16:19:44 -0700522 readVector(data, sessionId);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800523 reply->writeInt32(closeSession(sessionId));
524 return OK;
525 }
526
Jeff Tinker4c63a232013-03-30 16:19:44 -0700527 case GET_KEY_REQUEST:
Jeff Tinker441a78d2013-02-08 10:18:35 -0800528 {
529 CHECK_INTERFACE(IDrm, data, reply);
Jeff Tinker4c63a232013-03-30 16:19:44 -0700530 Vector<uint8_t> sessionId, initData;
Jeff Tinker441a78d2013-02-08 10:18:35 -0800531
Jeff Tinker4c63a232013-03-30 16:19:44 -0700532 readVector(data, sessionId);
533 readVector(data, initData);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800534 String8 mimeType = data.readString8();
Jeff Tinker4c63a232013-03-30 16:19:44 -0700535 DrmPlugin::KeyType keyType = (DrmPlugin::KeyType)data.readInt32();
Jeff Tinker441a78d2013-02-08 10:18:35 -0800536
537 KeyedVector<String8, String8> optionalParameters;
538 uint32_t count = data.readInt32();
539 for (size_t i = 0; i < count; ++i) {
540 String8 key, value;
541 key = data.readString8();
542 value = data.readString8();
543 optionalParameters.add(key, value);
544 }
545
546 Vector<uint8_t> request;
547 String8 defaultUrl;
548
Jeff Tinker4c63a232013-03-30 16:19:44 -0700549 status_t result = getKeyRequest(sessionId, initData,
550 mimeType, keyType,
551 optionalParameters,
552 request, defaultUrl);
553 writeVector(reply, request);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800554 reply->writeString8(defaultUrl);
555 reply->writeInt32(result);
556 return OK;
557 }
558
Jeff Tinker4c63a232013-03-30 16:19:44 -0700559 case PROVIDE_KEY_RESPONSE:
Jeff Tinker441a78d2013-02-08 10:18:35 -0800560 {
561 CHECK_INTERFACE(IDrm, data, reply);
Jeff Tinker4c63a232013-03-30 16:19:44 -0700562 Vector<uint8_t> sessionId, response, keySetId;
563 readVector(data, sessionId);
564 readVector(data, response);
565 uint32_t result = provideKeyResponse(sessionId, response, keySetId);
566 writeVector(reply, keySetId);
567 reply->writeInt32(result);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800568 return OK;
569 }
570
Jeff Tinker4c63a232013-03-30 16:19:44 -0700571 case REMOVE_KEYS:
Jeff Tinker441a78d2013-02-08 10:18:35 -0800572 {
573 CHECK_INTERFACE(IDrm, data, reply);
Jeff Tinker4c63a232013-03-30 16:19:44 -0700574 Vector<uint8_t> keySetId;
575 readVector(data, keySetId);
576 reply->writeInt32(removeKeys(keySetId));
Jeff Tinker441a78d2013-02-08 10:18:35 -0800577 return OK;
578 }
579
Jeff Tinker4c63a232013-03-30 16:19:44 -0700580 case RESTORE_KEYS:
581 {
582 CHECK_INTERFACE(IDrm, data, reply);
583 Vector<uint8_t> sessionId, keySetId;
584 readVector(data, sessionId);
585 readVector(data, keySetId);
586 reply->writeInt32(restoreKeys(sessionId, keySetId));
587 return OK;
588 }
589
590 case QUERY_KEY_STATUS:
Jeff Tinker441a78d2013-02-08 10:18:35 -0800591 {
592 CHECK_INTERFACE(IDrm, data, reply);
593 Vector<uint8_t> sessionId;
Jeff Tinker4c63a232013-03-30 16:19:44 -0700594 readVector(data, sessionId);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800595 KeyedVector<String8, String8> infoMap;
Jeff Tinker4c63a232013-03-30 16:19:44 -0700596 status_t result = queryKeyStatus(sessionId, infoMap);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800597 size_t count = infoMap.size();
598 reply->writeInt32(count);
599 for (size_t i = 0; i < count; ++i) {
600 reply->writeString8(infoMap.keyAt(i));
601 reply->writeString8(infoMap.valueAt(i));
602 }
603 reply->writeInt32(result);
604 return OK;
605 }
606
607 case GET_PROVISION_REQUEST:
608 {
609 CHECK_INTERFACE(IDrm, data, reply);
Jeff Tinker68d9d712014-03-04 13:21:31 -0800610 String8 certType = data.readString8();
611 String8 certAuthority = data.readString8();
612
Jeff Tinker441a78d2013-02-08 10:18:35 -0800613 Vector<uint8_t> request;
614 String8 defaultUrl;
Jeff Tinker68d9d712014-03-04 13:21:31 -0800615 status_t result = getProvisionRequest(certType, certAuthority,
616 request, defaultUrl);
Jeff Tinker4c63a232013-03-30 16:19:44 -0700617 writeVector(reply, request);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800618 reply->writeString8(defaultUrl);
619 reply->writeInt32(result);
620 return OK;
621 }
622
623 case PROVIDE_PROVISION_RESPONSE:
624 {
625 CHECK_INTERFACE(IDrm, data, reply);
626 Vector<uint8_t> response;
Jeff Tinker68d9d712014-03-04 13:21:31 -0800627 Vector<uint8_t> certificate;
628 Vector<uint8_t> wrappedKey;
Jeff Tinker4c63a232013-03-30 16:19:44 -0700629 readVector(data, response);
Jeff Tinker68d9d712014-03-04 13:21:31 -0800630 status_t result = provideProvisionResponse(response, certificate, wrappedKey);
631 writeVector(reply, certificate);
632 writeVector(reply, wrappedKey);
633 reply->writeInt32(result);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800634 return OK;
635 }
636
Jeff Tinker68b15552014-04-30 10:19:03 -0700637 case UNPROVISION_DEVICE:
638 {
639 CHECK_INTERFACE(IDrm, data, reply);
640 status_t result = unprovisionDevice();
641 reply->writeInt32(result);
642 return OK;
643 }
644
Jeff Tinker441a78d2013-02-08 10:18:35 -0800645 case GET_SECURE_STOPS:
646 {
647 CHECK_INTERFACE(IDrm, data, reply);
648 List<Vector<uint8_t> > secureStops;
649 status_t result = getSecureStops(secureStops);
650 size_t count = secureStops.size();
651 reply->writeInt32(count);
652 List<Vector<uint8_t> >::iterator iter = secureStops.begin();
653 while(iter != secureStops.end()) {
654 size_t size = iter->size();
655 reply->writeInt32(size);
656 reply->write(iter->array(), iter->size());
Jeff Tinker423e33c2013-04-08 15:23:17 -0700657 iter++;
Jeff Tinker441a78d2013-02-08 10:18:35 -0800658 }
659 reply->writeInt32(result);
660 return OK;
661 }
662
663 case RELEASE_SECURE_STOPS:
664 {
665 CHECK_INTERFACE(IDrm, data, reply);
666 Vector<uint8_t> ssRelease;
Jeff Tinker4c63a232013-03-30 16:19:44 -0700667 readVector(data, ssRelease);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800668 reply->writeInt32(releaseSecureStops(ssRelease));
669 return OK;
670 }
671
672 case GET_PROPERTY_STRING:
673 {
674 CHECK_INTERFACE(IDrm, data, reply);
675 String8 name = data.readString8();
676 String8 value;
677 status_t result = getPropertyString(name, value);
678 reply->writeString8(value);
679 reply->writeInt32(result);
680 return OK;
681 }
682
683 case GET_PROPERTY_BYTE_ARRAY:
684 {
685 CHECK_INTERFACE(IDrm, data, reply);
686 String8 name = data.readString8();
687 Vector<uint8_t> value;
688 status_t result = getPropertyByteArray(name, value);
Jeff Tinker4c63a232013-03-30 16:19:44 -0700689 writeVector(reply, value);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800690 reply->writeInt32(result);
691 return OK;
692 }
693
694 case SET_PROPERTY_STRING:
695 {
696 CHECK_INTERFACE(IDrm, data, reply);
697 String8 name = data.readString8();
698 String8 value = data.readString8();
699 reply->writeInt32(setPropertyString(name, value));
700 return OK;
701 }
702
703 case SET_PROPERTY_BYTE_ARRAY:
704 {
705 CHECK_INTERFACE(IDrm, data, reply);
706 String8 name = data.readString8();
707 Vector<uint8_t> value;
Jeff Tinker4c63a232013-03-30 16:19:44 -0700708 readVector(data, value);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800709 reply->writeInt32(setPropertyByteArray(name, value));
710 return OK;
711 }
712
Jeff Tinker4c63a232013-03-30 16:19:44 -0700713 case SET_CIPHER_ALGORITHM:
714 {
715 CHECK_INTERFACE(IDrm, data, reply);
716 Vector<uint8_t> sessionId;
717 readVector(data, sessionId);
718 String8 algorithm = data.readString8();
719 reply->writeInt32(setCipherAlgorithm(sessionId, algorithm));
720 return OK;
721 }
722
723 case SET_MAC_ALGORITHM:
724 {
725 CHECK_INTERFACE(IDrm, data, reply);
726 Vector<uint8_t> sessionId;
727 readVector(data, sessionId);
728 String8 algorithm = data.readString8();
729 reply->writeInt32(setMacAlgorithm(sessionId, algorithm));
730 return OK;
731 }
732
733 case ENCRYPT:
734 {
735 CHECK_INTERFACE(IDrm, data, reply);
736 Vector<uint8_t> sessionId, keyId, input, iv, output;
737 readVector(data, sessionId);
738 readVector(data, keyId);
739 readVector(data, input);
740 readVector(data, iv);
741 uint32_t result = encrypt(sessionId, keyId, input, iv, output);
742 writeVector(reply, output);
743 reply->writeInt32(result);
744 return OK;
745 }
746
747 case DECRYPT:
748 {
749 CHECK_INTERFACE(IDrm, data, reply);
750 Vector<uint8_t> sessionId, keyId, input, iv, output;
751 readVector(data, sessionId);
752 readVector(data, keyId);
753 readVector(data, input);
754 readVector(data, iv);
755 uint32_t result = decrypt(sessionId, keyId, input, iv, output);
756 writeVector(reply, output);
757 reply->writeInt32(result);
758 return OK;
759 }
760
761 case SIGN:
762 {
763 CHECK_INTERFACE(IDrm, data, reply);
764 Vector<uint8_t> sessionId, keyId, message, signature;
765 readVector(data, sessionId);
766 readVector(data, keyId);
767 readVector(data, message);
768 uint32_t result = sign(sessionId, keyId, message, signature);
769 writeVector(reply, signature);
770 reply->writeInt32(result);
771 return OK;
772 }
773
774 case VERIFY:
775 {
776 CHECK_INTERFACE(IDrm, data, reply);
777 Vector<uint8_t> sessionId, keyId, message, signature;
778 readVector(data, sessionId);
779 readVector(data, keyId);
780 readVector(data, message);
781 readVector(data, signature);
782 bool match;
783 uint32_t result = verify(sessionId, keyId, message, signature, match);
784 reply->writeInt32(match);
785 reply->writeInt32(result);
786 return OK;
787 }
788
Jeff Tinker68d9d712014-03-04 13:21:31 -0800789 case SIGN_RSA:
790 {
791 CHECK_INTERFACE(IDrm, data, reply);
792 Vector<uint8_t> sessionId, message, wrappedKey, signature;
793 readVector(data, sessionId);
794 String8 algorithm = data.readString8();
795 readVector(data, message);
796 readVector(data, wrappedKey);
797 uint32_t result = signRSA(sessionId, algorithm, message, wrappedKey, signature);
798 writeVector(reply, signature);
799 reply->writeInt32(result);
800 return OK;
801 }
802
Jeff Tinkerc0d5f1f2013-04-02 13:08:05 -0700803 case SET_LISTENER: {
804 CHECK_INTERFACE(IDrm, data, reply);
805 sp<IDrmClient> listener =
806 interface_cast<IDrmClient>(data.readStrongBinder());
807 reply->writeInt32(setListener(listener));
808 return NO_ERROR;
809 } break;
810
Jeff Tinker4c63a232013-03-30 16:19:44 -0700811 default:
812 return BBinder::onTransact(code, data, reply, flags);
Jeff Tinker441a78d2013-02-08 10:18:35 -0800813 }
814}
815
816} // namespace android
817