blob: 21dce27e1f07ef4d27643696baedf4a5c1eb9ed8 [file] [log] [blame]
Kenny Root07438c82012-11-02 15:41:02 -07001/*
2**
3** Copyright 2008, The Android Open Source Project
4**
5** Licensed under the Apache License, Version 2.0 (the "License");
6** you may not use this file except in compliance with the License.
7** You may obtain a copy of the License at
8**
9** http://www.apache.org/licenses/LICENSE-2.0
10**
11** Unless required by applicable law or agreed to in writing, software
12** distributed under the License is distributed on an "AS IS" BASIS,
13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14** See the License for the specific language governing permissions and
15** limitations under the License.
16*/
17
18#include <stdint.h>
19#include <sys/types.h>
20
21#define LOG_TAG "KeystoreService"
22#include <utils/Log.h>
23
24#include <binder/Parcel.h>
25#include <binder/IPCThreadState.h>
26#include <binder/IServiceManager.h>
27
28#include <keystore/IKeystoreService.h>
29
30namespace android {
31
Kenny Root96427ba2013-08-16 14:02:41 -070032KeystoreArg::KeystoreArg(const void* data, size_t len)
33 : mData(data), mSize(len) {
34}
35
36KeystoreArg::~KeystoreArg() {
37}
38
39const void *KeystoreArg::data() const {
40 return mData;
41}
42
43size_t KeystoreArg::size() const {
44 return mSize;
45}
46
Kenny Root07438c82012-11-02 15:41:02 -070047class BpKeystoreService: public BpInterface<IKeystoreService>
48{
49public:
50 BpKeystoreService(const sp<IBinder>& impl)
51 : BpInterface<IKeystoreService>(impl)
52 {
53 }
54
55 // test ping
56 virtual int32_t test()
57 {
58 Parcel data, reply;
59 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
60 status_t status = remote()->transact(BnKeystoreService::TEST, data, &reply);
61 if (status != NO_ERROR) {
62 ALOGD("test() could not contact remote: %d\n", status);
63 return -1;
64 }
65 int32_t err = reply.readExceptionCode();
66 int32_t ret = reply.readInt32();
67 if (err < 0) {
68 ALOGD("test() caught exception %d\n", err);
69 return -1;
70 }
71 return ret;
72 }
73
74 virtual int32_t get(const String16& name, uint8_t** item, size_t* itemLength)
75 {
76 Parcel data, reply;
77 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
78 data.writeString16(name);
79 status_t status = remote()->transact(BnKeystoreService::GET, data, &reply);
80 if (status != NO_ERROR) {
81 ALOGD("get() could not contact remote: %d\n", status);
82 return -1;
83 }
84 int32_t err = reply.readExceptionCode();
85 ssize_t len = reply.readInt32();
86 if (len >= 0 && (size_t) len <= reply.dataAvail()) {
87 size_t ulen = (size_t) len;
88 const void* buf = reply.readInplace(ulen);
89 *item = (uint8_t*) malloc(ulen);
90 if (*item != NULL) {
91 memcpy(*item, buf, ulen);
92 *itemLength = ulen;
93 } else {
94 ALOGE("out of memory allocating output array in get");
95 *itemLength = 0;
96 }
97 } else {
98 *itemLength = 0;
99 }
100 if (err < 0) {
101 ALOGD("get() caught exception %d\n", err);
102 return -1;
103 }
104 return 0;
105 }
106
Kenny Root0c540aa2013-04-03 09:22:15 -0700107 virtual int32_t insert(const String16& name, const uint8_t* item, size_t itemLength, int uid,
108 int32_t flags)
Kenny Root07438c82012-11-02 15:41:02 -0700109 {
110 Parcel data, reply;
111 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
112 data.writeString16(name);
113 data.writeInt32(itemLength);
114 void* buf = data.writeInplace(itemLength);
115 memcpy(buf, item, itemLength);
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800116 data.writeInt32(uid);
Kenny Root0c540aa2013-04-03 09:22:15 -0700117 data.writeInt32(flags);
Kenny Root07438c82012-11-02 15:41:02 -0700118 status_t status = remote()->transact(BnKeystoreService::INSERT, data, &reply);
119 if (status != NO_ERROR) {
120 ALOGD("import() could not contact remote: %d\n", status);
121 return -1;
122 }
123 int32_t err = reply.readExceptionCode();
124 int32_t ret = reply.readInt32();
125 if (err < 0) {
126 ALOGD("import() caught exception %d\n", err);
127 return -1;
128 }
129 return ret;
130 }
131
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800132 virtual int32_t del(const String16& name, int uid)
Kenny Root07438c82012-11-02 15:41:02 -0700133 {
134 Parcel data, reply;
135 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
136 data.writeString16(name);
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800137 data.writeInt32(uid);
Kenny Root07438c82012-11-02 15:41:02 -0700138 status_t status = remote()->transact(BnKeystoreService::DEL, data, &reply);
139 if (status != NO_ERROR) {
140 ALOGD("del() could not contact remote: %d\n", status);
141 return -1;
142 }
143 int32_t err = reply.readExceptionCode();
144 int32_t ret = reply.readInt32();
145 if (err < 0) {
146 ALOGD("del() caught exception %d\n", err);
147 return -1;
148 }
149 return ret;
150 }
151
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800152 virtual int32_t exist(const String16& name, int uid)
Kenny Root07438c82012-11-02 15:41:02 -0700153 {
154 Parcel data, reply;
155 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
156 data.writeString16(name);
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800157 data.writeInt32(uid);
Kenny Root07438c82012-11-02 15:41:02 -0700158 status_t status = remote()->transact(BnKeystoreService::EXIST, data, &reply);
159 if (status != NO_ERROR) {
160 ALOGD("exist() could not contact remote: %d\n", status);
161 return -1;
162 }
163 int32_t err = reply.readExceptionCode();
164 int32_t ret = reply.readInt32();
165 if (err < 0) {
166 ALOGD("exist() caught exception %d\n", err);
167 return -1;
168 }
169 return ret;
170 }
171
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800172 virtual int32_t saw(const String16& name, int uid, Vector<String16>* matches)
Kenny Root07438c82012-11-02 15:41:02 -0700173 {
174 Parcel data, reply;
175 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
176 data.writeString16(name);
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800177 data.writeInt32(uid);
Kenny Root07438c82012-11-02 15:41:02 -0700178 status_t status = remote()->transact(BnKeystoreService::SAW, data, &reply);
179 if (status != NO_ERROR) {
180 ALOGD("saw() could not contact remote: %d\n", status);
181 return -1;
182 }
183 int32_t err = reply.readExceptionCode();
184 int32_t numMatches = reply.readInt32();
185 for (int32_t i = 0; i < numMatches; i++) {
186 matches->push(reply.readString16());
187 }
188 int32_t ret = reply.readInt32();
189 if (err < 0) {
190 ALOGD("saw() caught exception %d\n", err);
191 return -1;
192 }
193 return ret;
194 }
195
196 virtual int32_t reset()
197 {
198 Parcel data, reply;
199 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
200 status_t status = remote()->transact(BnKeystoreService::RESET, data, &reply);
201 if (status != NO_ERROR) {
202 ALOGD("reset() could not contact remote: %d\n", status);
203 return -1;
204 }
205 int32_t err = reply.readExceptionCode();
206 int32_t ret = reply.readInt32();
207 if (err < 0) {
208 ALOGD("reset() caught exception %d\n", err);
209 return -1;
210 }
211 return ret;
212 }
213
214 virtual int32_t password(const String16& password)
215 {
216 Parcel data, reply;
217 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
218 data.writeString16(password);
219 status_t status = remote()->transact(BnKeystoreService::PASSWORD, data, &reply);
220 if (status != NO_ERROR) {
221 ALOGD("password() could not contact remote: %d\n", status);
222 return -1;
223 }
224 int32_t err = reply.readExceptionCode();
225 int32_t ret = reply.readInt32();
226 if (err < 0) {
227 ALOGD("password() caught exception %d\n", err);
228 return -1;
229 }
230 return ret;
231 }
232
233 virtual int32_t lock()
234 {
235 Parcel data, reply;
236 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
237 status_t status = remote()->transact(BnKeystoreService::LOCK, data, &reply);
238 if (status != NO_ERROR) {
239 ALOGD("lock() could not contact remote: %d\n", status);
240 return -1;
241 }
242 int32_t err = reply.readExceptionCode();
243 int32_t ret = reply.readInt32();
244 if (err < 0) {
245 ALOGD("lock() caught exception %d\n", err);
246 return -1;
247 }
248 return ret;
249 }
250
251 virtual int32_t unlock(const String16& password)
252 {
253 Parcel data, reply;
254 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
255 data.writeString16(password);
256 status_t status = remote()->transact(BnKeystoreService::UNLOCK, data, &reply);
257 if (status != NO_ERROR) {
258 ALOGD("unlock() could not contact remote: %d\n", status);
259 return -1;
260 }
261 int32_t err = reply.readExceptionCode();
262 int32_t ret = reply.readInt32();
263 if (err < 0) {
264 ALOGD("unlock() caught exception %d\n", err);
265 return -1;
266 }
267 return ret;
268 }
269
270 virtual int32_t zero()
271 {
272 Parcel data, reply;
273 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
274 status_t status = remote()->transact(BnKeystoreService::ZERO, data, &reply);
275 if (status != NO_ERROR) {
276 ALOGD("zero() could not contact remote: %d\n", status);
277 return -1;
278 }
279 int32_t err = reply.readExceptionCode();
280 int32_t ret = reply.readInt32();
281 if (err < 0) {
282 ALOGD("zero() caught exception %d\n", err);
283 return -1;
284 }
285 return ret;
286 }
287
Kenny Root96427ba2013-08-16 14:02:41 -0700288 virtual int32_t generate(const String16& name, int32_t uid, int32_t keyType, int32_t keySize,
289 int32_t flags, Vector<sp<KeystoreArg> >* args)
Kenny Root07438c82012-11-02 15:41:02 -0700290 {
291 Parcel data, reply;
292 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
293 data.writeString16(name);
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800294 data.writeInt32(uid);
Kenny Root96427ba2013-08-16 14:02:41 -0700295 data.writeInt32(keyType);
296 data.writeInt32(keySize);
Kenny Root0c540aa2013-04-03 09:22:15 -0700297 data.writeInt32(flags);
Kenny Root96427ba2013-08-16 14:02:41 -0700298 data.writeInt32(args->size());
299 for (Vector<sp<KeystoreArg> >::iterator it = args->begin(); it != args->end(); ++it) {
300 sp<KeystoreArg> item = *it;
301 size_t keyLength = item->size();
302 data.writeInt32(keyLength);
303 void* buf = data.writeInplace(keyLength);
304 memcpy(buf, item->data(), keyLength);
305 }
Kenny Root07438c82012-11-02 15:41:02 -0700306 status_t status = remote()->transact(BnKeystoreService::GENERATE, data, &reply);
307 if (status != NO_ERROR) {
308 ALOGD("generate() could not contact remote: %d\n", status);
309 return -1;
310 }
311 int32_t err = reply.readExceptionCode();
312 int32_t ret = reply.readInt32();
313 if (err < 0) {
314 ALOGD("generate() caught exception %d\n", err);
315 return -1;
316 }
317 return ret;
318 }
319
Kenny Root0c540aa2013-04-03 09:22:15 -0700320 virtual int32_t import(const String16& name, const uint8_t* key, size_t keyLength, int uid,
321 int flags)
Kenny Root07438c82012-11-02 15:41:02 -0700322 {
323 Parcel data, reply;
324 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
325 data.writeString16(name);
326 data.writeInt32(keyLength);
327 void* buf = data.writeInplace(keyLength);
328 memcpy(buf, key, keyLength);
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800329 data.writeInt32(uid);
Kenny Root0c540aa2013-04-03 09:22:15 -0700330 data.writeInt32(flags);
Kenny Root07438c82012-11-02 15:41:02 -0700331 status_t status = remote()->transact(BnKeystoreService::IMPORT, data, &reply);
332 if (status != NO_ERROR) {
333 ALOGD("import() could not contact remote: %d\n", status);
334 return -1;
335 }
336 int32_t err = reply.readExceptionCode();
337 int32_t ret = reply.readInt32();
338 if (err < 0) {
339 ALOGD("import() caught exception %d\n", err);
340 return -1;
341 }
342 return ret;
343 }
344
345 virtual int32_t sign(const String16& name, const uint8_t* in, size_t inLength, uint8_t** out,
346 size_t* outLength)
347 {
348 Parcel data, reply;
349 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
350 data.writeString16(name);
351 data.writeInt32(inLength);
352 void* buf = data.writeInplace(inLength);
353 memcpy(buf, in, inLength);
354 status_t status = remote()->transact(BnKeystoreService::SIGN, data, &reply);
355 if (status != NO_ERROR) {
356 ALOGD("import() could not contact remote: %d\n", status);
357 return -1;
358 }
359 int32_t err = reply.readExceptionCode();
360 ssize_t len = reply.readInt32();
361 if (len >= 0 && (size_t) len <= reply.dataAvail()) {
362 size_t ulen = (size_t) len;
363 const void* outBuf = reply.readInplace(ulen);
364 *out = (uint8_t*) malloc(ulen);
365 if (*out != NULL) {
366 memcpy((void*) *out, outBuf, ulen);
367 *outLength = ulen;
368 } else {
369 ALOGE("out of memory allocating output array in sign");
370 *outLength = 0;
371 }
372 } else {
373 *outLength = 0;
374 }
375 if (err < 0) {
376 ALOGD("import() caught exception %d\n", err);
377 return -1;
378 }
379 return 0;
380 }
381
382 virtual int32_t verify(const String16& name, const uint8_t* in, size_t inLength,
383 const uint8_t* signature, size_t signatureLength)
384 {
385 Parcel data, reply;
386 void* buf;
387
388 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
389 data.writeString16(name);
390 data.writeInt32(inLength);
391 buf = data.writeInplace(inLength);
392 memcpy(buf, in, inLength);
393 data.writeInt32(signatureLength);
394 buf = data.writeInplace(signatureLength);
395 memcpy(buf, signature, signatureLength);
396 status_t status = remote()->transact(BnKeystoreService::VERIFY, data, &reply);
397 if (status != NO_ERROR) {
398 ALOGD("verify() could not contact remote: %d\n", status);
399 return -1;
400 }
401 int32_t err = reply.readExceptionCode();
402 int32_t ret = reply.readInt32();
403 if (err < 0) {
404 ALOGD("verify() caught exception %d\n", err);
405 return -1;
406 }
407 return ret;
408 }
409
410 virtual int32_t get_pubkey(const String16& name, uint8_t** pubkey, size_t* pubkeyLength)
411 {
412 Parcel data, reply;
413 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
414 data.writeString16(name);
415 status_t status = remote()->transact(BnKeystoreService::GET_PUBKEY, data, &reply);
416 if (status != NO_ERROR) {
417 ALOGD("get_pubkey() could not contact remote: %d\n", status);
418 return -1;
419 }
420 int32_t err = reply.readExceptionCode();
421 ssize_t len = reply.readInt32();
422 if (len >= 0 && (size_t) len <= reply.dataAvail()) {
423 size_t ulen = (size_t) len;
424 const void* buf = reply.readInplace(ulen);
425 *pubkey = (uint8_t*) malloc(ulen);
426 if (*pubkey != NULL) {
427 memcpy(*pubkey, buf, ulen);
428 *pubkeyLength = ulen;
429 } else {
430 ALOGE("out of memory allocating output array in get_pubkey");
431 *pubkeyLength = 0;
432 }
433 } else {
434 *pubkeyLength = 0;
435 }
436 if (err < 0) {
437 ALOGD("get_pubkey() caught exception %d\n", err);
438 return -1;
439 }
440 return 0;
441 }
442
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800443 virtual int32_t del_key(const String16& name, int uid)
Kenny Root07438c82012-11-02 15:41:02 -0700444 {
445 Parcel data, reply;
446 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
447 data.writeString16(name);
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800448 data.writeInt32(uid);
Kenny Root07438c82012-11-02 15:41:02 -0700449 status_t status = remote()->transact(BnKeystoreService::DEL_KEY, data, &reply);
450 if (status != NO_ERROR) {
451 ALOGD("del_key() could not contact remote: %d\n", status);
452 return -1;
453 }
454 int32_t err = reply.readExceptionCode();
455 int32_t ret = reply.readInt32();
456 if (err < 0) {
457 ALOGD("del_key() caught exception %d\n", err);
458 return -1;
459 }
460 return ret;
461 }
462
463 virtual int32_t grant(const String16& name, int32_t granteeUid)
464 {
465 Parcel data, reply;
466 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
467 data.writeString16(name);
468 data.writeInt32(granteeUid);
469 status_t status = remote()->transact(BnKeystoreService::GRANT, data, &reply);
470 if (status != NO_ERROR) {
471 ALOGD("grant() could not contact remote: %d\n", status);
472 return -1;
473 }
474 int32_t err = reply.readExceptionCode();
475 int32_t ret = reply.readInt32();
476 if (err < 0) {
477 ALOGD("grant() caught exception %d\n", err);
478 return -1;
479 }
480 return ret;
481 }
482
483 virtual int32_t ungrant(const String16& name, int32_t granteeUid)
484 {
485 Parcel data, reply;
486 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
487 data.writeString16(name);
488 data.writeInt32(granteeUid);
489 status_t status = remote()->transact(BnKeystoreService::UNGRANT, data, &reply);
490 if (status != NO_ERROR) {
491 ALOGD("ungrant() could not contact remote: %d\n", status);
492 return -1;
493 }
494 int32_t err = reply.readExceptionCode();
495 int32_t ret = reply.readInt32();
496 if (err < 0) {
497 ALOGD("ungrant() caught exception %d\n", err);
498 return -1;
499 }
500 return ret;
501 }
502
503 int64_t getmtime(const String16& name)
504 {
505 Parcel data, reply;
506 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
507 data.writeString16(name);
508 status_t status = remote()->transact(BnKeystoreService::GETMTIME, data, &reply);
509 if (status != NO_ERROR) {
510 ALOGD("getmtime() could not contact remote: %d\n", status);
511 return -1;
512 }
513 int32_t err = reply.readExceptionCode();
514 int64_t ret = reply.readInt64();
515 if (err < 0) {
516 ALOGD("getmtime() caught exception %d\n", err);
517 return -1;
518 }
519 return ret;
520 }
Kenny Root02254072013-03-20 11:48:19 -0700521
Kenny Rootd53bc922013-03-21 14:10:15 -0700522 virtual int32_t duplicate(const String16& srcKey, int32_t srcUid, const String16& destKey,
523 int32_t destUid)
Kenny Root02254072013-03-20 11:48:19 -0700524 {
525 Parcel data, reply;
526 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
Kenny Rootd53bc922013-03-21 14:10:15 -0700527 data.writeString16(srcKey);
528 data.writeInt32(srcUid);
529 data.writeString16(destKey);
530 data.writeInt32(destUid);
531 status_t status = remote()->transact(BnKeystoreService::DUPLICATE, data, &reply);
Kenny Root02254072013-03-20 11:48:19 -0700532 if (status != NO_ERROR) {
Kenny Rootd53bc922013-03-21 14:10:15 -0700533 ALOGD("duplicate() could not contact remote: %d\n", status);
Kenny Root02254072013-03-20 11:48:19 -0700534 return -1;
535 }
536 int32_t err = reply.readExceptionCode();
537 int32_t ret = reply.readInt32();
538 if (err < 0) {
Kenny Rootd53bc922013-03-21 14:10:15 -0700539 ALOGD("duplicate() caught exception %d\n", err);
Kenny Root02254072013-03-20 11:48:19 -0700540 return -1;
541 }
542 return ret;
543 }
Kenny Root43061232013-03-29 11:15:50 -0700544
545 virtual int32_t is_hardware_backed()
546 {
547 Parcel data, reply;
548 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
549 status_t status = remote()->transact(BnKeystoreService::IS_HARDWARE_BACKED, data, &reply);
550 if (status != NO_ERROR) {
551 ALOGD("is_hardware_backed() could not contact remote: %d\n", status);
552 return -1;
553 }
554 int32_t err = reply.readExceptionCode();
555 int32_t ret = reply.readInt32();
556 if (err < 0) {
557 ALOGD("is_hardware_backed() caught exception %d\n", err);
558 return -1;
559 }
560 return ret;
561 }
Kenny Root2ecc7a12013-04-01 16:29:11 -0700562
563 virtual int32_t clear_uid(int64_t uid)
564 {
565 Parcel data, reply;
566 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
567 data.writeInt64(uid);
568 status_t status = remote()->transact(BnKeystoreService::CLEAR_UID, data, &reply);
569 if (status != NO_ERROR) {
570 ALOGD("clear_uid() could not contact remote: %d\n", status);
571 return -1;
572 }
573 int32_t err = reply.readExceptionCode();
574 int32_t ret = reply.readInt32();
575 if (err < 0) {
576 ALOGD("clear_uid() caught exception %d\n", err);
577 return -1;
578 }
579 return ret;
580 }
Kenny Root07438c82012-11-02 15:41:02 -0700581};
582
583IMPLEMENT_META_INTERFACE(KeystoreService, "android.security.keystore");
584
585// ----------------------------------------------------------------------
586
587status_t BnKeystoreService::onTransact(
588 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
589{
590 switch(code) {
591 case TEST: {
592 CHECK_INTERFACE(IKeystoreService, data, reply);
593 int32_t ret = test();
594 reply->writeNoException();
595 reply->writeInt32(ret);
596 return NO_ERROR;
597 } break;
598 case GET: {
599 CHECK_INTERFACE(IKeystoreService, data, reply);
600 String16 name = data.readString16();
601 void* out = NULL;
602 size_t outSize = 0;
603 int32_t ret = get(name, (uint8_t**) &out, &outSize);
604 reply->writeNoException();
605 if (ret == 1) {
606 reply->writeInt32(outSize);
607 void* buf = reply->writeInplace(outSize);
608 memcpy(buf, out, outSize);
609 free(out);
610 } else {
611 reply->writeInt32(-1);
612 }
613 return NO_ERROR;
614 } break;
615 case INSERT: {
616 CHECK_INTERFACE(IKeystoreService, data, reply);
617 String16 name = data.readString16();
618 ssize_t inSize = data.readInt32();
619 const void* in;
620 if (inSize >= 0 && (size_t) inSize <= data.dataAvail()) {
621 in = data.readInplace(inSize);
622 } else {
623 in = NULL;
624 inSize = 0;
625 }
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800626 int uid = data.readInt32();
Kenny Root0c540aa2013-04-03 09:22:15 -0700627 int32_t flags = data.readInt32();
628 int32_t ret = insert(name, (const uint8_t*) in, (size_t) inSize, uid, flags);
Kenny Root07438c82012-11-02 15:41:02 -0700629 reply->writeNoException();
630 reply->writeInt32(ret);
631 return NO_ERROR;
632 } break;
633 case DEL: {
634 CHECK_INTERFACE(IKeystoreService, data, reply);
635 String16 name = data.readString16();
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800636 int uid = data.readInt32();
637 int32_t ret = del(name, uid);
Kenny Root07438c82012-11-02 15:41:02 -0700638 reply->writeNoException();
639 reply->writeInt32(ret);
640 return NO_ERROR;
641 } break;
642 case EXIST: {
643 CHECK_INTERFACE(IKeystoreService, data, reply);
644 String16 name = data.readString16();
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800645 int uid = data.readInt32();
646 int32_t ret = exist(name, uid);
Kenny Root07438c82012-11-02 15:41:02 -0700647 reply->writeNoException();
648 reply->writeInt32(ret);
649 return NO_ERROR;
650 } break;
651 case SAW: {
652 CHECK_INTERFACE(IKeystoreService, data, reply);
653 String16 name = data.readString16();
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800654 int uid = data.readInt32();
Kenny Root07438c82012-11-02 15:41:02 -0700655 Vector<String16> matches;
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800656 int32_t ret = saw(name, uid, &matches);
Kenny Root07438c82012-11-02 15:41:02 -0700657 reply->writeNoException();
658 reply->writeInt32(matches.size());
659 Vector<String16>::const_iterator it = matches.begin();
660 for (; it != matches.end(); ++it) {
661 reply->writeString16(*it);
662 }
663 reply->writeInt32(ret);
664 return NO_ERROR;
665 } break;
666 case RESET: {
667 CHECK_INTERFACE(IKeystoreService, data, reply);
668 int32_t ret = reset();
669 reply->writeNoException();
670 reply->writeInt32(ret);
671 return NO_ERROR;
672 } break;
673 case PASSWORD: {
674 CHECK_INTERFACE(IKeystoreService, data, reply);
675 String16 pass = data.readString16();
676 int32_t ret = password(pass);
677 reply->writeNoException();
678 reply->writeInt32(ret);
679 return NO_ERROR;
680 } break;
681 case LOCK: {
682 CHECK_INTERFACE(IKeystoreService, data, reply);
683 int32_t ret = lock();
684 reply->writeNoException();
685 reply->writeInt32(ret);
686 return NO_ERROR;
687 } break;
688 case UNLOCK: {
689 CHECK_INTERFACE(IKeystoreService, data, reply);
690 String16 pass = data.readString16();
691 int32_t ret = unlock(pass);
692 reply->writeNoException();
693 reply->writeInt32(ret);
694 return NO_ERROR;
695 } break;
696 case ZERO: {
697 CHECK_INTERFACE(IKeystoreService, data, reply);
698 int32_t ret = zero();
699 reply->writeNoException();
700 reply->writeInt32(ret);
701 return NO_ERROR;
702 } break;
703 case GENERATE: {
704 CHECK_INTERFACE(IKeystoreService, data, reply);
705 String16 name = data.readString16();
Kenny Root96427ba2013-08-16 14:02:41 -0700706 int32_t uid = data.readInt32();
707 int32_t keyType = data.readInt32();
708 int32_t keySize = data.readInt32();
Kenny Root0c540aa2013-04-03 09:22:15 -0700709 int32_t flags = data.readInt32();
Kenny Root96427ba2013-08-16 14:02:41 -0700710 Vector<sp<KeystoreArg> > args;
711 ssize_t numArgs = data.readInt32();
712 if (numArgs > 0) {
713 for (size_t i = 0; i < (size_t) numArgs; i++) {
714 ssize_t inSize = data.readInt32();
715 if (inSize >= 0 && (size_t) inSize <= data.dataAvail()) {
716 sp<KeystoreArg> arg = new KeystoreArg(data.readInplace(inSize), inSize);
717 args.push_back(arg);
718 } else {
719 args.push_back(NULL);
720 }
721 }
722 }
723 int32_t ret = generate(name, uid, keyType, keySize, flags, &args);
Kenny Root07438c82012-11-02 15:41:02 -0700724 reply->writeNoException();
725 reply->writeInt32(ret);
726 return NO_ERROR;
727 } break;
728 case IMPORT: {
729 CHECK_INTERFACE(IKeystoreService, data, reply);
730 String16 name = data.readString16();
731 ssize_t inSize = data.readInt32();
732 const void* in;
733 if (inSize >= 0 && (size_t) inSize <= data.dataAvail()) {
734 in = data.readInplace(inSize);
735 } else {
736 in = NULL;
737 inSize = 0;
738 }
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800739 int uid = data.readInt32();
Kenny Root0c540aa2013-04-03 09:22:15 -0700740 int32_t flags = data.readInt32();
741 int32_t ret = import(name, (const uint8_t*) in, (size_t) inSize, uid, flags);
Kenny Root07438c82012-11-02 15:41:02 -0700742 reply->writeNoException();
743 reply->writeInt32(ret);
744 return NO_ERROR;
745 } break;
746 case SIGN: {
747 CHECK_INTERFACE(IKeystoreService, data, reply);
748 String16 name = data.readString16();
749 ssize_t inSize = data.readInt32();
750 const void* in;
751 if (inSize >= 0 && (size_t) inSize <= data.dataAvail()) {
752 in = data.readInplace(inSize);
753 } else {
754 in = NULL;
755 inSize = 0;
756 }
757 void* out = NULL;
758 size_t outSize = 0;
759 int32_t ret = sign(name, (const uint8_t*) in, (size_t) inSize, (uint8_t**) &out, &outSize);
760 reply->writeNoException();
Kenny Rootb03c9fb2013-02-04 16:42:51 -0800761 if (outSize > 0 && out != NULL) {
762 reply->writeInt32(outSize);
763 void* buf = reply->writeInplace(outSize);
764 memcpy(buf, out, outSize);
765 free(out);
766 } else {
Kenny Roote289c402013-02-14 11:31:53 -0800767 reply->writeInt32(-1);
Kenny Rootb03c9fb2013-02-04 16:42:51 -0800768 }
Kenny Root07438c82012-11-02 15:41:02 -0700769 reply->writeInt32(ret);
770 return NO_ERROR;
771 } break;
772 case VERIFY: {
773 CHECK_INTERFACE(IKeystoreService, data, reply);
774 String16 name = data.readString16();
775 ssize_t inSize = data.readInt32();
776 const void* in;
777 if (inSize >= 0 && (size_t) inSize <= data.dataAvail()) {
778 in = data.readInplace(inSize);
779 } else {
780 in = NULL;
781 inSize = 0;
782 }
783 ssize_t sigSize = data.readInt32();
784 const void* sig;
785 if (sigSize >= 0 && (size_t) sigSize <= data.dataAvail()) {
786 sig = data.readInplace(sigSize);
787 } else {
788 sig = NULL;
789 sigSize = 0;
790 }
791 bool ret = verify(name, (const uint8_t*) in, (size_t) inSize, (const uint8_t*) sig,
792 (size_t) sigSize);
793 reply->writeNoException();
794 reply->writeInt32(ret ? 1 : 0);
795 return NO_ERROR;
796 } break;
797 case GET_PUBKEY: {
798 CHECK_INTERFACE(IKeystoreService, data, reply);
799 String16 name = data.readString16();
800 void* out = NULL;
801 size_t outSize = 0;
802 int32_t ret = get_pubkey(name, (unsigned char**) &out, &outSize);
803 reply->writeNoException();
Kenny Rootb03c9fb2013-02-04 16:42:51 -0800804 if (outSize > 0 && out != NULL) {
805 reply->writeInt32(outSize);
806 void* buf = reply->writeInplace(outSize);
807 memcpy(buf, out, outSize);
808 free(out);
809 } else {
Kenny Roote289c402013-02-14 11:31:53 -0800810 reply->writeInt32(-1);
Kenny Rootb03c9fb2013-02-04 16:42:51 -0800811 }
Kenny Root07438c82012-11-02 15:41:02 -0700812 reply->writeInt32(ret);
813 return NO_ERROR;
Kenny Rootb03c9fb2013-02-04 16:42:51 -0800814 } break;
Kenny Root07438c82012-11-02 15:41:02 -0700815 case DEL_KEY: {
816 CHECK_INTERFACE(IKeystoreService, data, reply);
817 String16 name = data.readString16();
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800818 int uid = data.readInt32();
819 int32_t ret = del_key(name, uid);
Kenny Root07438c82012-11-02 15:41:02 -0700820 reply->writeNoException();
821 reply->writeInt32(ret);
822 return NO_ERROR;
823 } break;
824 case GRANT: {
825 CHECK_INTERFACE(IKeystoreService, data, reply);
826 String16 name = data.readString16();
827 int32_t granteeUid = data.readInt32();
828 int32_t ret = grant(name, granteeUid);
829 reply->writeNoException();
830 reply->writeInt32(ret);
831 return NO_ERROR;
832 } break;
833 case UNGRANT: {
834 CHECK_INTERFACE(IKeystoreService, data, reply);
835 String16 name = data.readString16();
836 int32_t granteeUid = data.readInt32();
837 int32_t ret = ungrant(name, granteeUid);
838 reply->writeNoException();
839 reply->writeInt32(ret);
840 return NO_ERROR;
841 } break;
842 case GETMTIME: {
843 CHECK_INTERFACE(IKeystoreService, data, reply);
844 String16 name = data.readString16();
845 int64_t ret = getmtime(name);
846 reply->writeNoException();
847 reply->writeInt64(ret);
848 return NO_ERROR;
849 } break;
Kenny Rootd53bc922013-03-21 14:10:15 -0700850 case DUPLICATE: {
Kenny Root02254072013-03-20 11:48:19 -0700851 CHECK_INTERFACE(IKeystoreService, data, reply);
Kenny Rootd53bc922013-03-21 14:10:15 -0700852 String16 srcKey = data.readString16();
853 int32_t srcUid = data.readInt32();
854 String16 destKey = data.readString16();
855 int32_t destUid = data.readInt32();
856 int32_t ret = duplicate(srcKey, srcUid, destKey, destUid);
Kenny Root02254072013-03-20 11:48:19 -0700857 reply->writeNoException();
858 reply->writeInt32(ret);
859 return NO_ERROR;
860 } break;
Kenny Root43061232013-03-29 11:15:50 -0700861 case IS_HARDWARE_BACKED: {
862 CHECK_INTERFACE(IKeystoreService, data, reply);
863 int32_t ret = is_hardware_backed();
864 reply->writeNoException();
865 reply->writeInt32(ret);
866 return NO_ERROR;
867 }
Kenny Root2ecc7a12013-04-01 16:29:11 -0700868 case CLEAR_UID: {
869 CHECK_INTERFACE(IKeystoreService, data, reply);
870 int64_t uid = data.readInt64();
871 int32_t ret = clear_uid(uid);
872 reply->writeNoException();
873 reply->writeInt32(ret);
874 return NO_ERROR;
875 }
Kenny Root07438c82012-11-02 15:41:02 -0700876 default:
877 return BBinder::onTransact(code, data, reply, flags);
878 }
879}
880
881// ----------------------------------------------------------------------------
882
883}; // namespace android