blob: 64d953f295de10b7c9a94d41c2c111cce6dd833e [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
32class BpKeystoreService: public BpInterface<IKeystoreService>
33{
34public:
35 BpKeystoreService(const sp<IBinder>& impl)
36 : BpInterface<IKeystoreService>(impl)
37 {
38 }
39
40 // test ping
41 virtual int32_t test()
42 {
43 Parcel data, reply;
44 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
45 status_t status = remote()->transact(BnKeystoreService::TEST, data, &reply);
46 if (status != NO_ERROR) {
47 ALOGD("test() could not contact remote: %d\n", status);
48 return -1;
49 }
50 int32_t err = reply.readExceptionCode();
51 int32_t ret = reply.readInt32();
52 if (err < 0) {
53 ALOGD("test() caught exception %d\n", err);
54 return -1;
55 }
56 return ret;
57 }
58
59 virtual int32_t get(const String16& name, uint8_t** item, size_t* itemLength)
60 {
61 Parcel data, reply;
62 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
63 data.writeString16(name);
64 status_t status = remote()->transact(BnKeystoreService::GET, data, &reply);
65 if (status != NO_ERROR) {
66 ALOGD("get() could not contact remote: %d\n", status);
67 return -1;
68 }
69 int32_t err = reply.readExceptionCode();
70 ssize_t len = reply.readInt32();
71 if (len >= 0 && (size_t) len <= reply.dataAvail()) {
72 size_t ulen = (size_t) len;
73 const void* buf = reply.readInplace(ulen);
74 *item = (uint8_t*) malloc(ulen);
75 if (*item != NULL) {
76 memcpy(*item, buf, ulen);
77 *itemLength = ulen;
78 } else {
79 ALOGE("out of memory allocating output array in get");
80 *itemLength = 0;
81 }
82 } else {
83 *itemLength = 0;
84 }
85 if (err < 0) {
86 ALOGD("get() caught exception %d\n", err);
87 return -1;
88 }
89 return 0;
90 }
91
Kenny Rootb88c3eb2013-02-13 14:43:43 -080092 virtual int32_t insert(const String16& name, const uint8_t* item, size_t itemLength, int uid)
Kenny Root07438c82012-11-02 15:41:02 -070093 {
94 Parcel data, reply;
95 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
96 data.writeString16(name);
97 data.writeInt32(itemLength);
98 void* buf = data.writeInplace(itemLength);
99 memcpy(buf, item, itemLength);
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800100 data.writeInt32(uid);
Kenny Root07438c82012-11-02 15:41:02 -0700101 status_t status = remote()->transact(BnKeystoreService::INSERT, data, &reply);
102 if (status != NO_ERROR) {
103 ALOGD("import() could not contact remote: %d\n", status);
104 return -1;
105 }
106 int32_t err = reply.readExceptionCode();
107 int32_t ret = reply.readInt32();
108 if (err < 0) {
109 ALOGD("import() caught exception %d\n", err);
110 return -1;
111 }
112 return ret;
113 }
114
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800115 virtual int32_t del(const String16& name, int uid)
Kenny Root07438c82012-11-02 15:41:02 -0700116 {
117 Parcel data, reply;
118 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
119 data.writeString16(name);
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800120 data.writeInt32(uid);
Kenny Root07438c82012-11-02 15:41:02 -0700121 status_t status = remote()->transact(BnKeystoreService::DEL, data, &reply);
122 if (status != NO_ERROR) {
123 ALOGD("del() could not contact remote: %d\n", status);
124 return -1;
125 }
126 int32_t err = reply.readExceptionCode();
127 int32_t ret = reply.readInt32();
128 if (err < 0) {
129 ALOGD("del() caught exception %d\n", err);
130 return -1;
131 }
132 return ret;
133 }
134
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800135 virtual int32_t exist(const String16& name, int uid)
Kenny Root07438c82012-11-02 15:41:02 -0700136 {
137 Parcel data, reply;
138 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
139 data.writeString16(name);
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800140 data.writeInt32(uid);
Kenny Root07438c82012-11-02 15:41:02 -0700141 status_t status = remote()->transact(BnKeystoreService::EXIST, data, &reply);
142 if (status != NO_ERROR) {
143 ALOGD("exist() could not contact remote: %d\n", status);
144 return -1;
145 }
146 int32_t err = reply.readExceptionCode();
147 int32_t ret = reply.readInt32();
148 if (err < 0) {
149 ALOGD("exist() caught exception %d\n", err);
150 return -1;
151 }
152 return ret;
153 }
154
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800155 virtual int32_t saw(const String16& name, int uid, Vector<String16>* matches)
Kenny Root07438c82012-11-02 15:41:02 -0700156 {
157 Parcel data, reply;
158 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
159 data.writeString16(name);
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800160 data.writeInt32(uid);
Kenny Root07438c82012-11-02 15:41:02 -0700161 status_t status = remote()->transact(BnKeystoreService::SAW, data, &reply);
162 if (status != NO_ERROR) {
163 ALOGD("saw() could not contact remote: %d\n", status);
164 return -1;
165 }
166 int32_t err = reply.readExceptionCode();
167 int32_t numMatches = reply.readInt32();
168 for (int32_t i = 0; i < numMatches; i++) {
169 matches->push(reply.readString16());
170 }
171 int32_t ret = reply.readInt32();
172 if (err < 0) {
173 ALOGD("saw() caught exception %d\n", err);
174 return -1;
175 }
176 return ret;
177 }
178
179 virtual int32_t reset()
180 {
181 Parcel data, reply;
182 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
183 status_t status = remote()->transact(BnKeystoreService::RESET, data, &reply);
184 if (status != NO_ERROR) {
185 ALOGD("reset() could not contact remote: %d\n", status);
186 return -1;
187 }
188 int32_t err = reply.readExceptionCode();
189 int32_t ret = reply.readInt32();
190 if (err < 0) {
191 ALOGD("reset() caught exception %d\n", err);
192 return -1;
193 }
194 return ret;
195 }
196
197 virtual int32_t password(const String16& password)
198 {
199 Parcel data, reply;
200 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
201 data.writeString16(password);
202 status_t status = remote()->transact(BnKeystoreService::PASSWORD, data, &reply);
203 if (status != NO_ERROR) {
204 ALOGD("password() could not contact remote: %d\n", status);
205 return -1;
206 }
207 int32_t err = reply.readExceptionCode();
208 int32_t ret = reply.readInt32();
209 if (err < 0) {
210 ALOGD("password() caught exception %d\n", err);
211 return -1;
212 }
213 return ret;
214 }
215
216 virtual int32_t lock()
217 {
218 Parcel data, reply;
219 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
220 status_t status = remote()->transact(BnKeystoreService::LOCK, data, &reply);
221 if (status != NO_ERROR) {
222 ALOGD("lock() could not contact remote: %d\n", status);
223 return -1;
224 }
225 int32_t err = reply.readExceptionCode();
226 int32_t ret = reply.readInt32();
227 if (err < 0) {
228 ALOGD("lock() caught exception %d\n", err);
229 return -1;
230 }
231 return ret;
232 }
233
234 virtual int32_t unlock(const String16& password)
235 {
236 Parcel data, reply;
237 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
238 data.writeString16(password);
239 status_t status = remote()->transact(BnKeystoreService::UNLOCK, data, &reply);
240 if (status != NO_ERROR) {
241 ALOGD("unlock() could not contact remote: %d\n", status);
242 return -1;
243 }
244 int32_t err = reply.readExceptionCode();
245 int32_t ret = reply.readInt32();
246 if (err < 0) {
247 ALOGD("unlock() caught exception %d\n", err);
248 return -1;
249 }
250 return ret;
251 }
252
253 virtual int32_t zero()
254 {
255 Parcel data, reply;
256 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
257 status_t status = remote()->transact(BnKeystoreService::ZERO, data, &reply);
258 if (status != NO_ERROR) {
259 ALOGD("zero() could not contact remote: %d\n", status);
260 return -1;
261 }
262 int32_t err = reply.readExceptionCode();
263 int32_t ret = reply.readInt32();
264 if (err < 0) {
265 ALOGD("zero() caught exception %d\n", err);
266 return -1;
267 }
268 return ret;
269 }
270
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800271 virtual int32_t generate(const String16& name, int uid)
Kenny Root07438c82012-11-02 15:41:02 -0700272 {
273 Parcel data, reply;
274 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
275 data.writeString16(name);
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800276 data.writeInt32(uid);
Kenny Root07438c82012-11-02 15:41:02 -0700277 status_t status = remote()->transact(BnKeystoreService::GENERATE, data, &reply);
278 if (status != NO_ERROR) {
279 ALOGD("generate() could not contact remote: %d\n", status);
280 return -1;
281 }
282 int32_t err = reply.readExceptionCode();
283 int32_t ret = reply.readInt32();
284 if (err < 0) {
285 ALOGD("generate() caught exception %d\n", err);
286 return -1;
287 }
288 return ret;
289 }
290
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800291 virtual int32_t import(const String16& name, const uint8_t* key, size_t keyLength, int uid)
Kenny Root07438c82012-11-02 15:41:02 -0700292 {
293 Parcel data, reply;
294 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
295 data.writeString16(name);
296 data.writeInt32(keyLength);
297 void* buf = data.writeInplace(keyLength);
298 memcpy(buf, key, keyLength);
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800299 data.writeInt32(uid);
Kenny Root07438c82012-11-02 15:41:02 -0700300 status_t status = remote()->transact(BnKeystoreService::IMPORT, data, &reply);
301 if (status != NO_ERROR) {
302 ALOGD("import() could not contact remote: %d\n", status);
303 return -1;
304 }
305 int32_t err = reply.readExceptionCode();
306 int32_t ret = reply.readInt32();
307 if (err < 0) {
308 ALOGD("import() caught exception %d\n", err);
309 return -1;
310 }
311 return ret;
312 }
313
314 virtual int32_t sign(const String16& name, const uint8_t* in, size_t inLength, uint8_t** out,
315 size_t* outLength)
316 {
317 Parcel data, reply;
318 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
319 data.writeString16(name);
320 data.writeInt32(inLength);
321 void* buf = data.writeInplace(inLength);
322 memcpy(buf, in, inLength);
323 status_t status = remote()->transact(BnKeystoreService::SIGN, data, &reply);
324 if (status != NO_ERROR) {
325 ALOGD("import() could not contact remote: %d\n", status);
326 return -1;
327 }
328 int32_t err = reply.readExceptionCode();
329 ssize_t len = reply.readInt32();
330 if (len >= 0 && (size_t) len <= reply.dataAvail()) {
331 size_t ulen = (size_t) len;
332 const void* outBuf = reply.readInplace(ulen);
333 *out = (uint8_t*) malloc(ulen);
334 if (*out != NULL) {
335 memcpy((void*) *out, outBuf, ulen);
336 *outLength = ulen;
337 } else {
338 ALOGE("out of memory allocating output array in sign");
339 *outLength = 0;
340 }
341 } else {
342 *outLength = 0;
343 }
344 if (err < 0) {
345 ALOGD("import() caught exception %d\n", err);
346 return -1;
347 }
348 return 0;
349 }
350
351 virtual int32_t verify(const String16& name, const uint8_t* in, size_t inLength,
352 const uint8_t* signature, size_t signatureLength)
353 {
354 Parcel data, reply;
355 void* buf;
356
357 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
358 data.writeString16(name);
359 data.writeInt32(inLength);
360 buf = data.writeInplace(inLength);
361 memcpy(buf, in, inLength);
362 data.writeInt32(signatureLength);
363 buf = data.writeInplace(signatureLength);
364 memcpy(buf, signature, signatureLength);
365 status_t status = remote()->transact(BnKeystoreService::VERIFY, data, &reply);
366 if (status != NO_ERROR) {
367 ALOGD("verify() could not contact remote: %d\n", status);
368 return -1;
369 }
370 int32_t err = reply.readExceptionCode();
371 int32_t ret = reply.readInt32();
372 if (err < 0) {
373 ALOGD("verify() caught exception %d\n", err);
374 return -1;
375 }
376 return ret;
377 }
378
379 virtual int32_t get_pubkey(const String16& name, uint8_t** pubkey, size_t* pubkeyLength)
380 {
381 Parcel data, reply;
382 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
383 data.writeString16(name);
384 status_t status = remote()->transact(BnKeystoreService::GET_PUBKEY, data, &reply);
385 if (status != NO_ERROR) {
386 ALOGD("get_pubkey() could not contact remote: %d\n", status);
387 return -1;
388 }
389 int32_t err = reply.readExceptionCode();
390 ssize_t len = reply.readInt32();
391 if (len >= 0 && (size_t) len <= reply.dataAvail()) {
392 size_t ulen = (size_t) len;
393 const void* buf = reply.readInplace(ulen);
394 *pubkey = (uint8_t*) malloc(ulen);
395 if (*pubkey != NULL) {
396 memcpy(*pubkey, buf, ulen);
397 *pubkeyLength = ulen;
398 } else {
399 ALOGE("out of memory allocating output array in get_pubkey");
400 *pubkeyLength = 0;
401 }
402 } else {
403 *pubkeyLength = 0;
404 }
405 if (err < 0) {
406 ALOGD("get_pubkey() caught exception %d\n", err);
407 return -1;
408 }
409 return 0;
410 }
411
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800412 virtual int32_t del_key(const String16& name, int uid)
Kenny Root07438c82012-11-02 15:41:02 -0700413 {
414 Parcel data, reply;
415 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
416 data.writeString16(name);
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800417 data.writeInt32(uid);
Kenny Root07438c82012-11-02 15:41:02 -0700418 status_t status = remote()->transact(BnKeystoreService::DEL_KEY, data, &reply);
419 if (status != NO_ERROR) {
420 ALOGD("del_key() could not contact remote: %d\n", status);
421 return -1;
422 }
423 int32_t err = reply.readExceptionCode();
424 int32_t ret = reply.readInt32();
425 if (err < 0) {
426 ALOGD("del_key() caught exception %d\n", err);
427 return -1;
428 }
429 return ret;
430 }
431
432 virtual int32_t grant(const String16& name, int32_t granteeUid)
433 {
434 Parcel data, reply;
435 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
436 data.writeString16(name);
437 data.writeInt32(granteeUid);
438 status_t status = remote()->transact(BnKeystoreService::GRANT, data, &reply);
439 if (status != NO_ERROR) {
440 ALOGD("grant() could not contact remote: %d\n", status);
441 return -1;
442 }
443 int32_t err = reply.readExceptionCode();
444 int32_t ret = reply.readInt32();
445 if (err < 0) {
446 ALOGD("grant() caught exception %d\n", err);
447 return -1;
448 }
449 return ret;
450 }
451
452 virtual int32_t ungrant(const String16& name, int32_t granteeUid)
453 {
454 Parcel data, reply;
455 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
456 data.writeString16(name);
457 data.writeInt32(granteeUid);
458 status_t status = remote()->transact(BnKeystoreService::UNGRANT, data, &reply);
459 if (status != NO_ERROR) {
460 ALOGD("ungrant() could not contact remote: %d\n", status);
461 return -1;
462 }
463 int32_t err = reply.readExceptionCode();
464 int32_t ret = reply.readInt32();
465 if (err < 0) {
466 ALOGD("ungrant() caught exception %d\n", err);
467 return -1;
468 }
469 return ret;
470 }
471
472 int64_t getmtime(const String16& name)
473 {
474 Parcel data, reply;
475 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
476 data.writeString16(name);
477 status_t status = remote()->transact(BnKeystoreService::GETMTIME, data, &reply);
478 if (status != NO_ERROR) {
479 ALOGD("getmtime() could not contact remote: %d\n", status);
480 return -1;
481 }
482 int32_t err = reply.readExceptionCode();
483 int64_t ret = reply.readInt64();
484 if (err < 0) {
485 ALOGD("getmtime() caught exception %d\n", err);
486 return -1;
487 }
488 return ret;
489 }
490};
491
492IMPLEMENT_META_INTERFACE(KeystoreService, "android.security.keystore");
493
494// ----------------------------------------------------------------------
495
496status_t BnKeystoreService::onTransact(
497 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
498{
499 switch(code) {
500 case TEST: {
501 CHECK_INTERFACE(IKeystoreService, data, reply);
502 int32_t ret = test();
503 reply->writeNoException();
504 reply->writeInt32(ret);
505 return NO_ERROR;
506 } break;
507 case GET: {
508 CHECK_INTERFACE(IKeystoreService, data, reply);
509 String16 name = data.readString16();
510 void* out = NULL;
511 size_t outSize = 0;
512 int32_t ret = get(name, (uint8_t**) &out, &outSize);
513 reply->writeNoException();
514 if (ret == 1) {
515 reply->writeInt32(outSize);
516 void* buf = reply->writeInplace(outSize);
517 memcpy(buf, out, outSize);
518 free(out);
519 } else {
520 reply->writeInt32(-1);
521 }
522 return NO_ERROR;
523 } break;
524 case INSERT: {
525 CHECK_INTERFACE(IKeystoreService, data, reply);
526 String16 name = data.readString16();
527 ssize_t inSize = data.readInt32();
528 const void* in;
529 if (inSize >= 0 && (size_t) inSize <= data.dataAvail()) {
530 in = data.readInplace(inSize);
531 } else {
532 in = NULL;
533 inSize = 0;
534 }
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800535 int uid = data.readInt32();
536 int32_t ret = insert(name, (const uint8_t*) in, (size_t) inSize, uid);
Kenny Root07438c82012-11-02 15:41:02 -0700537 reply->writeNoException();
538 reply->writeInt32(ret);
539 return NO_ERROR;
540 } break;
541 case DEL: {
542 CHECK_INTERFACE(IKeystoreService, data, reply);
543 String16 name = data.readString16();
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800544 int uid = data.readInt32();
545 int32_t ret = del(name, uid);
Kenny Root07438c82012-11-02 15:41:02 -0700546 reply->writeNoException();
547 reply->writeInt32(ret);
548 return NO_ERROR;
549 } break;
550 case EXIST: {
551 CHECK_INTERFACE(IKeystoreService, data, reply);
552 String16 name = data.readString16();
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800553 int uid = data.readInt32();
554 int32_t ret = exist(name, uid);
Kenny Root07438c82012-11-02 15:41:02 -0700555 reply->writeNoException();
556 reply->writeInt32(ret);
557 return NO_ERROR;
558 } break;
559 case SAW: {
560 CHECK_INTERFACE(IKeystoreService, data, reply);
561 String16 name = data.readString16();
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800562 int uid = data.readInt32();
Kenny Root07438c82012-11-02 15:41:02 -0700563 Vector<String16> matches;
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800564 int32_t ret = saw(name, uid, &matches);
Kenny Root07438c82012-11-02 15:41:02 -0700565 reply->writeNoException();
566 reply->writeInt32(matches.size());
567 Vector<String16>::const_iterator it = matches.begin();
568 for (; it != matches.end(); ++it) {
569 reply->writeString16(*it);
570 }
571 reply->writeInt32(ret);
572 return NO_ERROR;
573 } break;
574 case RESET: {
575 CHECK_INTERFACE(IKeystoreService, data, reply);
576 int32_t ret = reset();
577 reply->writeNoException();
578 reply->writeInt32(ret);
579 return NO_ERROR;
580 } break;
581 case PASSWORD: {
582 CHECK_INTERFACE(IKeystoreService, data, reply);
583 String16 pass = data.readString16();
584 int32_t ret = password(pass);
585 reply->writeNoException();
586 reply->writeInt32(ret);
587 return NO_ERROR;
588 } break;
589 case LOCK: {
590 CHECK_INTERFACE(IKeystoreService, data, reply);
591 int32_t ret = lock();
592 reply->writeNoException();
593 reply->writeInt32(ret);
594 return NO_ERROR;
595 } break;
596 case UNLOCK: {
597 CHECK_INTERFACE(IKeystoreService, data, reply);
598 String16 pass = data.readString16();
599 int32_t ret = unlock(pass);
600 reply->writeNoException();
601 reply->writeInt32(ret);
602 return NO_ERROR;
603 } break;
604 case ZERO: {
605 CHECK_INTERFACE(IKeystoreService, data, reply);
606 int32_t ret = zero();
607 reply->writeNoException();
608 reply->writeInt32(ret);
609 return NO_ERROR;
610 } break;
611 case GENERATE: {
612 CHECK_INTERFACE(IKeystoreService, data, reply);
613 String16 name = data.readString16();
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800614 int uid = data.readInt32();
615 int32_t ret = generate(name, uid);
Kenny Root07438c82012-11-02 15:41:02 -0700616 reply->writeNoException();
617 reply->writeInt32(ret);
618 return NO_ERROR;
619 } break;
620 case IMPORT: {
621 CHECK_INTERFACE(IKeystoreService, data, reply);
622 String16 name = data.readString16();
623 ssize_t inSize = data.readInt32();
624 const void* in;
625 if (inSize >= 0 && (size_t) inSize <= data.dataAvail()) {
626 in = data.readInplace(inSize);
627 } else {
628 in = NULL;
629 inSize = 0;
630 }
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800631 int uid = data.readInt32();
632 int32_t ret = import(name, (const uint8_t*) in, (size_t) inSize, uid);
Kenny Root07438c82012-11-02 15:41:02 -0700633 reply->writeNoException();
634 reply->writeInt32(ret);
635 return NO_ERROR;
636 } break;
637 case SIGN: {
638 CHECK_INTERFACE(IKeystoreService, data, reply);
639 String16 name = data.readString16();
640 ssize_t inSize = data.readInt32();
641 const void* in;
642 if (inSize >= 0 && (size_t) inSize <= data.dataAvail()) {
643 in = data.readInplace(inSize);
644 } else {
645 in = NULL;
646 inSize = 0;
647 }
648 void* out = NULL;
649 size_t outSize = 0;
650 int32_t ret = sign(name, (const uint8_t*) in, (size_t) inSize, (uint8_t**) &out, &outSize);
651 reply->writeNoException();
Kenny Rootb03c9fb2013-02-04 16:42:51 -0800652 if (outSize > 0 && out != NULL) {
653 reply->writeInt32(outSize);
654 void* buf = reply->writeInplace(outSize);
655 memcpy(buf, out, outSize);
656 free(out);
657 } else {
658 reply->writeInt32(0);
659 }
Kenny Root07438c82012-11-02 15:41:02 -0700660 reply->writeInt32(ret);
661 return NO_ERROR;
662 } break;
663 case VERIFY: {
664 CHECK_INTERFACE(IKeystoreService, data, reply);
665 String16 name = data.readString16();
666 ssize_t inSize = data.readInt32();
667 const void* in;
668 if (inSize >= 0 && (size_t) inSize <= data.dataAvail()) {
669 in = data.readInplace(inSize);
670 } else {
671 in = NULL;
672 inSize = 0;
673 }
674 ssize_t sigSize = data.readInt32();
675 const void* sig;
676 if (sigSize >= 0 && (size_t) sigSize <= data.dataAvail()) {
677 sig = data.readInplace(sigSize);
678 } else {
679 sig = NULL;
680 sigSize = 0;
681 }
682 bool ret = verify(name, (const uint8_t*) in, (size_t) inSize, (const uint8_t*) sig,
683 (size_t) sigSize);
684 reply->writeNoException();
685 reply->writeInt32(ret ? 1 : 0);
686 return NO_ERROR;
687 } break;
688 case GET_PUBKEY: {
689 CHECK_INTERFACE(IKeystoreService, data, reply);
690 String16 name = data.readString16();
691 void* out = NULL;
692 size_t outSize = 0;
693 int32_t ret = get_pubkey(name, (unsigned char**) &out, &outSize);
694 reply->writeNoException();
Kenny Rootb03c9fb2013-02-04 16:42:51 -0800695 if (outSize > 0 && out != NULL) {
696 reply->writeInt32(outSize);
697 void* buf = reply->writeInplace(outSize);
698 memcpy(buf, out, outSize);
699 free(out);
700 } else {
701 reply->writeInt32(0);
702 }
Kenny Root07438c82012-11-02 15:41:02 -0700703 reply->writeInt32(ret);
704 return NO_ERROR;
Kenny Rootb03c9fb2013-02-04 16:42:51 -0800705 } break;
Kenny Root07438c82012-11-02 15:41:02 -0700706 case DEL_KEY: {
707 CHECK_INTERFACE(IKeystoreService, data, reply);
708 String16 name = data.readString16();
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800709 int uid = data.readInt32();
710 int32_t ret = del_key(name, uid);
Kenny Root07438c82012-11-02 15:41:02 -0700711 reply->writeNoException();
712 reply->writeInt32(ret);
713 return NO_ERROR;
714 } break;
715 case GRANT: {
716 CHECK_INTERFACE(IKeystoreService, data, reply);
717 String16 name = data.readString16();
718 int32_t granteeUid = data.readInt32();
719 int32_t ret = grant(name, granteeUid);
720 reply->writeNoException();
721 reply->writeInt32(ret);
722 return NO_ERROR;
723 } break;
724 case UNGRANT: {
725 CHECK_INTERFACE(IKeystoreService, data, reply);
726 String16 name = data.readString16();
727 int32_t granteeUid = data.readInt32();
728 int32_t ret = ungrant(name, granteeUid);
729 reply->writeNoException();
730 reply->writeInt32(ret);
731 return NO_ERROR;
732 } break;
733 case GETMTIME: {
734 CHECK_INTERFACE(IKeystoreService, data, reply);
735 String16 name = data.readString16();
736 int64_t ret = getmtime(name);
737 reply->writeNoException();
738 reply->writeInt64(ret);
739 return NO_ERROR;
740 } break;
741 default:
742 return BBinder::onTransact(code, data, reply, flags);
743 }
744}
745
746// ----------------------------------------------------------------------------
747
748}; // namespace android