blob: 3a23059e4725d9463c82d3c464ad941519d4536f [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>
Chad Brubaker9899d6b2015-02-03 13:03:00 -080019#include <sys/limits.h>
Kenny Root07438c82012-11-02 15:41:02 -070020#include <sys/types.h>
21
22#define LOG_TAG "KeystoreService"
23#include <utils/Log.h>
24
25#include <binder/Parcel.h>
26#include <binder/IPCThreadState.h>
27#include <binder/IServiceManager.h>
28
29#include <keystore/IKeystoreService.h>
30
31namespace android {
32
Chad Brubaker9899d6b2015-02-03 13:03:00 -080033static keymaster_key_param_t* readParamList(const Parcel& in, size_t* length);
34
Kenny Root96427ba2013-08-16 14:02:41 -070035KeystoreArg::KeystoreArg(const void* data, size_t len)
36 : mData(data), mSize(len) {
37}
38
39KeystoreArg::~KeystoreArg() {
40}
41
42const void *KeystoreArg::data() const {
43 return mData;
44}
45
46size_t KeystoreArg::size() const {
47 return mSize;
48}
49
Chad Brubaker9899d6b2015-02-03 13:03:00 -080050OperationResult::OperationResult() : resultCode(0), token(), inputConsumed(0),
51 data(NULL), dataLength(0) {
52}
53
54OperationResult::~OperationResult() {
55}
56
57void OperationResult::readFromParcel(const Parcel& in) {
58 resultCode = in.readInt32();
59 token = in.readStrongBinder();
60 inputConsumed = in.readInt32();
61 ssize_t length = in.readInt32();
62 dataLength = 0;
63 if (length > 0) {
64 const void* buf = in.readInplace(length);
65 if (buf) {
66 data.reset(reinterpret_cast<uint8_t*>(malloc(length)));
67 if (data.get()) {
68 memcpy(data.get(), buf, length);
69 dataLength = (size_t) length;
70 } else {
71 ALOGE("Failed to allocate OperationResult buffer");
72 }
73 } else {
74 ALOGE("Failed to readInplace OperationResult data");
75 }
76 }
77}
78
79void OperationResult::writeToParcel(Parcel* out) const {
80 out->writeInt32(resultCode);
81 out->writeStrongBinder(token);
82 out->writeInt32(inputConsumed);
83 out->writeInt32(dataLength);
84 if (dataLength && data) {
85 void* buf = out->writeInplace(dataLength);
86 if (buf) {
87 memcpy(buf, data.get(), dataLength);
88 } else {
89 ALOGE("Failed to writeInplace OperationResult data.");
90 }
91 }
92}
93
94ExportResult::ExportResult() : resultCode(0), exportData(NULL), dataLength(0) {
95}
96
97ExportResult::~ExportResult() {
98}
99
100void ExportResult::readFromParcel(const Parcel& in) {
101 resultCode = in.readInt32();
102 ssize_t length = in.readInt32();
103 dataLength = 0;
104 if (length > 0) {
105 const void* buf = in.readInplace(length);
106 if (buf) {
107 exportData.reset(reinterpret_cast<uint8_t*>(malloc(length)));
108 if (exportData.get()) {
109 memcpy(exportData.get(), buf, length);
110 dataLength = (size_t) length;
111 } else {
112 ALOGE("Failed to allocate ExportData buffer");
113 }
114 } else {
115 ALOGE("Failed to readInplace ExportData data");
116 }
117 }
118}
119
120void ExportResult::writeToParcel(Parcel* out) const {
121 out->writeInt32(resultCode);
122 out->writeInt32(dataLength);
123 if (exportData && dataLength) {
124 void* buf = out->writeInplace(dataLength);
125 if (buf) {
126 memcpy(buf, exportData.get(), dataLength);
127 } else {
128 ALOGE("Failed to writeInplace ExportResult data.");
129 }
130 }
131}
132
133KeymasterArguments::KeymasterArguments() {
134}
135
136KeymasterArguments::~KeymasterArguments() {
137 keymaster_free_param_values(params.data(), params.size());
138}
139
140void KeymasterArguments::readFromParcel(const Parcel& in) {
141 ssize_t length = in.readInt32();
142 size_t ulength = (size_t) length;
143 if (length < 0) {
144 ulength = 0;
145 }
146 keymaster_free_param_values(params.data(), params.size());
147 params.clear();
148 for(size_t i = 0; i < ulength; i++) {
149 keymaster_key_param_t param;
150 if (!readKeymasterArgumentFromParcel(in, &param)) {
151 ALOGE("Error reading keymaster argument from parcel");
152 break;
153 }
154 params.push_back(param);
155 }
156}
157
158void KeymasterArguments::writeToParcel(Parcel* out) const {
159 out->writeInt32(params.size());
160 for (auto param : params) {
161 out->writeInt32(1);
162 writeKeymasterArgumentToParcel(param, out);
163 }
164}
165
166KeyCharacteristics::KeyCharacteristics() {
167 memset((void*) &characteristics, 0, sizeof(characteristics));
168}
169
170KeyCharacteristics::~KeyCharacteristics() {
171 keymaster_free_characteristics(&characteristics);
172}
173
174void KeyCharacteristics::readFromParcel(const Parcel& in) {
175 size_t length = 0;
176 keymaster_key_param_t* params = readParamList(in, &length);
177 characteristics.sw_enforced.params = params;
178 characteristics.sw_enforced.length = length;
179
180 params = readParamList(in, &length);
181 characteristics.hw_enforced.params = params;
182 characteristics.hw_enforced.length = length;
183}
184
185void KeyCharacteristics::writeToParcel(Parcel* out) const {
186 if (characteristics.sw_enforced.params) {
187 out->writeInt32(characteristics.sw_enforced.length);
188 for (size_t i = 0; i < characteristics.sw_enforced.length; i++) {
189 out->writeInt32(1);
190 writeKeymasterArgumentToParcel(characteristics.sw_enforced.params[i], out);
191 }
192 } else {
193 out->writeInt32(0);
194 }
195 if (characteristics.hw_enforced.params) {
196 out->writeInt32(characteristics.hw_enforced.length);
197 for (size_t i = 0; i < characteristics.hw_enforced.length; i++) {
198 out->writeInt32(1);
199 writeKeymasterArgumentToParcel(characteristics.hw_enforced.params[i], out);
200 }
201 } else {
202 out->writeInt32(0);
203 }
204}
205
206void writeKeymasterArgumentToParcel(const keymaster_key_param_t& param, Parcel* out) {
207 switch (keymaster_tag_get_type(param.tag)) {
208 case KM_ENUM:
209 case KM_ENUM_REP: {
210 out->writeInt32(param.tag);
211 out->writeInt32(param.enumerated);
212 break;
213 }
214 case KM_INT:
215 case KM_INT_REP: {
216 out->writeInt32(param.tag);
217 out->writeInt32(param.integer);
218 break;
219 }
220 case KM_LONG: {
221 out->writeInt32(param.tag);
222 out->writeInt64(param.long_integer);
223 break;
224 }
225 case KM_DATE: {
226 out->writeInt32(param.tag);
227 out->writeInt64(param.date_time);
228 break;
229 }
230 case KM_BOOL: {
231 out->writeInt32(param.tag);
232 break;
233 }
234 case KM_BIGNUM:
235 case KM_BYTES: {
236 out->writeInt32(param.tag);
237 out->writeInt32(param.blob.data_length);
238 void* buf = out->writeInplace(param.blob.data_length);
239 if (buf) {
240 memcpy(buf, param.blob.data, param.blob.data_length);
241 } else {
242 ALOGE("Failed to writeInplace keymaster blob param");
243 }
244 break;
245 }
246 default: {
247 ALOGE("Failed to write argument: Unsupported keymaster_tag_t %d", param.tag);
248 }
249 }
250}
251
252
253bool readKeymasterArgumentFromParcel(const Parcel& in, keymaster_key_param_t* out) {
254 if (in.readInt32() == 0) {
255 return false;
256 }
257 keymaster_tag_t tag = static_cast<keymaster_tag_t>(in.readInt32());
258 switch (keymaster_tag_get_type(tag)) {
259 case KM_ENUM:
260 case KM_ENUM_REP: {
261 uint32_t value = in.readInt32();
262 *out = keymaster_param_enum(tag, value);
263 break;
264 }
265 case KM_INT:
266 case KM_INT_REP: {
267 uint32_t value = in.readInt32();
268 *out = keymaster_param_int(tag, value);
269 break;
270 }
271 case KM_LONG: {
272 uint64_t value = in.readInt64();
273 *out = keymaster_param_long(tag, value);
274 break;
275 }
276 case KM_DATE: {
277 uint64_t value = in.readInt64();
278 *out = keymaster_param_date(tag, value);
279 break;
280 }
281 case KM_BOOL: {
282 *out = keymaster_param_bool(tag);
283 break;
284 }
285 case KM_BIGNUM:
286 case KM_BYTES: {
287 ssize_t length = in.readInt32();
288 uint8_t* data = NULL;
289 size_t ulength = 0;
290 if (length >= 0) {
291 ulength = (size_t) length;
292 // use malloc here so we can use keymaster_free_param_values
293 // consistently.
294 data = reinterpret_cast<uint8_t*>(malloc(ulength));
295 const void* buf = in.readInplace(ulength);
296 if (!buf || !data) {
297 ALOGE("Failed to allocate buffer for keymaster blob param");
298 return false;
299 }
300 memcpy(data, buf, ulength);
301 }
302 *out = keymaster_param_blob(tag, data, ulength);
303 break;
304 }
305 default: {
306 ALOGE("Unsupported keymaster_tag_t %d", tag);
307 return false;
308 }
309 }
310 return true;
311}
312
Chad Brubaker6432df72015-03-20 16:23:04 -0700313/**
314 * Read a byte array from in. The data at *data is still owned by the parcel
315 */
316static void readByteArray(const Parcel& in, const uint8_t** data, size_t* length) {
317 ssize_t slength = in.readInt32();
318 if (slength > 0) {
319 *data = reinterpret_cast<const uint8_t*>(in.readInplace(slength));
320 if (*data) {
321 *length = static_cast<size_t>(slength);
322 } else {
323 *length = 0;
324 }
325 } else {
326 *data = NULL;
327 *length = 0;
328 }
329}
330
Chad Brubaker9899d6b2015-02-03 13:03:00 -0800331// Read a keymaster_key_param_t* from a Parcel for use in a
332// keymaster_key_characteristics_t. This will be free'd by calling
333// keymaster_free_key_characteristics.
334static keymaster_key_param_t* readParamList(const Parcel& in, size_t* length) {
335 ssize_t slength = in.readInt32();
336 *length = 0;
337 if (slength < 0) {
338 return NULL;
339 }
340 *length = (size_t) slength;
341 if (*length >= UINT_MAX / sizeof(keymaster_key_param_t)) {
342 return NULL;
343 }
344 keymaster_key_param_t* list =
345 reinterpret_cast<keymaster_key_param_t*>(malloc(*length *
346 sizeof(keymaster_key_param_t)));
347 if (!list) {
348 ALOGD("Failed to allocate buffer for generateKey outCharacteristics");
349 goto err;
350 }
351 for (size_t i = 0; i < *length ; i++) {
352 if (!readKeymasterArgumentFromParcel(in, &list[i])) {
353 ALOGE("Failed to read keymaster argument");
354 keymaster_free_param_values(list, i);
355 goto err;
356 }
357 }
358 return list;
359err:
360 free(list);
361 return NULL;
362}
363
Chad Brubakerd6634422015-03-21 22:36:07 -0700364static std::unique_ptr<keymaster_blob_t> readKeymasterBlob(const Parcel& in) {
365 std::unique_ptr<keymaster_blob_t> blob;
366 if (in.readInt32() != 1) {
367 blob.reset(NULL);
368 return blob;
369 }
Chad Brubaker9899d6b2015-02-03 13:03:00 -0800370 ssize_t length = in.readInt32();
Chad Brubakerd6634422015-03-21 22:36:07 -0700371 blob.reset(new keymaster_blob_t);
Chad Brubaker9899d6b2015-02-03 13:03:00 -0800372 if (length > 0) {
Chad Brubakerd6634422015-03-21 22:36:07 -0700373 blob->data = reinterpret_cast<const uint8_t*>(in.readInplace(length));
Chad Brubaker9899d6b2015-02-03 13:03:00 -0800374 if (blob->data) {
Chad Brubakerd6634422015-03-21 22:36:07 -0700375 blob->data_length = static_cast<size_t>(length);
Chad Brubaker9899d6b2015-02-03 13:03:00 -0800376 } else {
377 blob->data_length = 0;
378 }
379 } else {
380 blob->data = NULL;
381 blob->data_length = 0;
382 }
Chad Brubakerd6634422015-03-21 22:36:07 -0700383 return blob;
Chad Brubaker9899d6b2015-02-03 13:03:00 -0800384}
385
Kenny Root07438c82012-11-02 15:41:02 -0700386class BpKeystoreService: public BpInterface<IKeystoreService>
387{
388public:
389 BpKeystoreService(const sp<IBinder>& impl)
390 : BpInterface<IKeystoreService>(impl)
391 {
392 }
393
394 // test ping
395 virtual int32_t test()
396 {
397 Parcel data, reply;
398 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
399 status_t status = remote()->transact(BnKeystoreService::TEST, data, &reply);
400 if (status != NO_ERROR) {
401 ALOGD("test() could not contact remote: %d\n", status);
402 return -1;
403 }
404 int32_t err = reply.readExceptionCode();
405 int32_t ret = reply.readInt32();
406 if (err < 0) {
407 ALOGD("test() caught exception %d\n", err);
408 return -1;
409 }
410 return ret;
411 }
412
413 virtual int32_t get(const String16& name, uint8_t** item, size_t* itemLength)
414 {
415 Parcel data, reply;
416 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
417 data.writeString16(name);
418 status_t status = remote()->transact(BnKeystoreService::GET, data, &reply);
419 if (status != NO_ERROR) {
420 ALOGD("get() could not contact remote: %d\n", status);
421 return -1;
422 }
423 int32_t err = reply.readExceptionCode();
424 ssize_t len = reply.readInt32();
425 if (len >= 0 && (size_t) len <= reply.dataAvail()) {
426 size_t ulen = (size_t) len;
427 const void* buf = reply.readInplace(ulen);
428 *item = (uint8_t*) malloc(ulen);
429 if (*item != NULL) {
430 memcpy(*item, buf, ulen);
431 *itemLength = ulen;
432 } else {
433 ALOGE("out of memory allocating output array in get");
434 *itemLength = 0;
435 }
436 } else {
437 *itemLength = 0;
438 }
439 if (err < 0) {
440 ALOGD("get() caught exception %d\n", err);
441 return -1;
442 }
443 return 0;
444 }
445
Kenny Root0c540aa2013-04-03 09:22:15 -0700446 virtual int32_t insert(const String16& name, const uint8_t* item, size_t itemLength, int uid,
447 int32_t flags)
Kenny Root07438c82012-11-02 15:41:02 -0700448 {
449 Parcel data, reply;
450 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
451 data.writeString16(name);
452 data.writeInt32(itemLength);
453 void* buf = data.writeInplace(itemLength);
454 memcpy(buf, item, itemLength);
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800455 data.writeInt32(uid);
Kenny Root0c540aa2013-04-03 09:22:15 -0700456 data.writeInt32(flags);
Kenny Root07438c82012-11-02 15:41:02 -0700457 status_t status = remote()->transact(BnKeystoreService::INSERT, data, &reply);
458 if (status != NO_ERROR) {
459 ALOGD("import() could not contact remote: %d\n", status);
460 return -1;
461 }
462 int32_t err = reply.readExceptionCode();
463 int32_t ret = reply.readInt32();
464 if (err < 0) {
465 ALOGD("import() caught exception %d\n", err);
466 return -1;
467 }
468 return ret;
469 }
470
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800471 virtual int32_t del(const String16& name, int uid)
Kenny Root07438c82012-11-02 15:41:02 -0700472 {
473 Parcel data, reply;
474 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
475 data.writeString16(name);
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800476 data.writeInt32(uid);
Kenny Root07438c82012-11-02 15:41:02 -0700477 status_t status = remote()->transact(BnKeystoreService::DEL, data, &reply);
478 if (status != NO_ERROR) {
479 ALOGD("del() could not contact remote: %d\n", status);
480 return -1;
481 }
482 int32_t err = reply.readExceptionCode();
483 int32_t ret = reply.readInt32();
484 if (err < 0) {
485 ALOGD("del() caught exception %d\n", err);
486 return -1;
487 }
488 return ret;
489 }
490
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800491 virtual int32_t exist(const String16& name, int uid)
Kenny Root07438c82012-11-02 15:41:02 -0700492 {
493 Parcel data, reply;
494 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
495 data.writeString16(name);
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800496 data.writeInt32(uid);
Kenny Root07438c82012-11-02 15:41:02 -0700497 status_t status = remote()->transact(BnKeystoreService::EXIST, data, &reply);
498 if (status != NO_ERROR) {
499 ALOGD("exist() could not contact remote: %d\n", status);
500 return -1;
501 }
502 int32_t err = reply.readExceptionCode();
503 int32_t ret = reply.readInt32();
504 if (err < 0) {
505 ALOGD("exist() caught exception %d\n", err);
506 return -1;
507 }
508 return ret;
509 }
510
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800511 virtual int32_t saw(const String16& name, int uid, Vector<String16>* matches)
Kenny Root07438c82012-11-02 15:41:02 -0700512 {
513 Parcel data, reply;
514 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
515 data.writeString16(name);
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800516 data.writeInt32(uid);
Kenny Root07438c82012-11-02 15:41:02 -0700517 status_t status = remote()->transact(BnKeystoreService::SAW, data, &reply);
518 if (status != NO_ERROR) {
519 ALOGD("saw() could not contact remote: %d\n", status);
520 return -1;
521 }
522 int32_t err = reply.readExceptionCode();
523 int32_t numMatches = reply.readInt32();
524 for (int32_t i = 0; i < numMatches; i++) {
525 matches->push(reply.readString16());
526 }
527 int32_t ret = reply.readInt32();
528 if (err < 0) {
529 ALOGD("saw() caught exception %d\n", err);
530 return -1;
531 }
532 return ret;
533 }
534
535 virtual int32_t reset()
536 {
537 Parcel data, reply;
538 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
539 status_t status = remote()->transact(BnKeystoreService::RESET, data, &reply);
540 if (status != NO_ERROR) {
541 ALOGD("reset() could not contact remote: %d\n", status);
542 return -1;
543 }
544 int32_t err = reply.readExceptionCode();
545 int32_t ret = reply.readInt32();
546 if (err < 0) {
547 ALOGD("reset() caught exception %d\n", err);
548 return -1;
549 }
550 return ret;
551 }
552
553 virtual int32_t password(const String16& password)
554 {
555 Parcel data, reply;
556 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
557 data.writeString16(password);
558 status_t status = remote()->transact(BnKeystoreService::PASSWORD, data, &reply);
559 if (status != NO_ERROR) {
560 ALOGD("password() could not contact remote: %d\n", status);
561 return -1;
562 }
563 int32_t err = reply.readExceptionCode();
564 int32_t ret = reply.readInt32();
565 if (err < 0) {
566 ALOGD("password() caught exception %d\n", err);
567 return -1;
568 }
569 return ret;
570 }
571
572 virtual int32_t lock()
573 {
574 Parcel data, reply;
575 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
576 status_t status = remote()->transact(BnKeystoreService::LOCK, data, &reply);
577 if (status != NO_ERROR) {
578 ALOGD("lock() could not contact remote: %d\n", status);
579 return -1;
580 }
581 int32_t err = reply.readExceptionCode();
582 int32_t ret = reply.readInt32();
583 if (err < 0) {
584 ALOGD("lock() caught exception %d\n", err);
585 return -1;
586 }
587 return ret;
588 }
589
590 virtual int32_t unlock(const String16& password)
591 {
592 Parcel data, reply;
593 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
594 data.writeString16(password);
595 status_t status = remote()->transact(BnKeystoreService::UNLOCK, data, &reply);
596 if (status != NO_ERROR) {
597 ALOGD("unlock() could not contact remote: %d\n", status);
598 return -1;
599 }
600 int32_t err = reply.readExceptionCode();
601 int32_t ret = reply.readInt32();
602 if (err < 0) {
603 ALOGD("unlock() caught exception %d\n", err);
604 return -1;
605 }
606 return ret;
607 }
608
609 virtual int32_t zero()
610 {
611 Parcel data, reply;
612 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
613 status_t status = remote()->transact(BnKeystoreService::ZERO, data, &reply);
614 if (status != NO_ERROR) {
615 ALOGD("zero() could not contact remote: %d\n", status);
616 return -1;
617 }
618 int32_t err = reply.readExceptionCode();
619 int32_t ret = reply.readInt32();
620 if (err < 0) {
621 ALOGD("zero() caught exception %d\n", err);
622 return -1;
623 }
624 return ret;
625 }
626
Kenny Root96427ba2013-08-16 14:02:41 -0700627 virtual int32_t generate(const String16& name, int32_t uid, int32_t keyType, int32_t keySize,
628 int32_t flags, Vector<sp<KeystoreArg> >* args)
Kenny Root07438c82012-11-02 15:41:02 -0700629 {
630 Parcel data, reply;
631 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
632 data.writeString16(name);
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800633 data.writeInt32(uid);
Kenny Root96427ba2013-08-16 14:02:41 -0700634 data.writeInt32(keyType);
635 data.writeInt32(keySize);
Kenny Root0c540aa2013-04-03 09:22:15 -0700636 data.writeInt32(flags);
Chad Brubaker468fc692015-01-13 17:33:14 -0800637 data.writeInt32(1);
Kenny Root96427ba2013-08-16 14:02:41 -0700638 data.writeInt32(args->size());
639 for (Vector<sp<KeystoreArg> >::iterator it = args->begin(); it != args->end(); ++it) {
640 sp<KeystoreArg> item = *it;
641 size_t keyLength = item->size();
642 data.writeInt32(keyLength);
643 void* buf = data.writeInplace(keyLength);
644 memcpy(buf, item->data(), keyLength);
645 }
Kenny Root07438c82012-11-02 15:41:02 -0700646 status_t status = remote()->transact(BnKeystoreService::GENERATE, data, &reply);
647 if (status != NO_ERROR) {
648 ALOGD("generate() could not contact remote: %d\n", status);
649 return -1;
650 }
651 int32_t err = reply.readExceptionCode();
652 int32_t ret = reply.readInt32();
653 if (err < 0) {
654 ALOGD("generate() caught exception %d\n", err);
655 return -1;
656 }
657 return ret;
658 }
659
Kenny Root0c540aa2013-04-03 09:22:15 -0700660 virtual int32_t import(const String16& name, const uint8_t* key, size_t keyLength, int uid,
661 int flags)
Kenny Root07438c82012-11-02 15:41:02 -0700662 {
663 Parcel data, reply;
664 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
665 data.writeString16(name);
666 data.writeInt32(keyLength);
667 void* buf = data.writeInplace(keyLength);
668 memcpy(buf, key, keyLength);
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800669 data.writeInt32(uid);
Kenny Root0c540aa2013-04-03 09:22:15 -0700670 data.writeInt32(flags);
Kenny Root07438c82012-11-02 15:41:02 -0700671 status_t status = remote()->transact(BnKeystoreService::IMPORT, data, &reply);
672 if (status != NO_ERROR) {
673 ALOGD("import() could not contact remote: %d\n", status);
674 return -1;
675 }
676 int32_t err = reply.readExceptionCode();
677 int32_t ret = reply.readInt32();
678 if (err < 0) {
679 ALOGD("import() caught exception %d\n", err);
680 return -1;
681 }
682 return ret;
683 }
684
685 virtual int32_t sign(const String16& name, const uint8_t* in, size_t inLength, uint8_t** out,
686 size_t* outLength)
687 {
688 Parcel data, reply;
689 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
690 data.writeString16(name);
691 data.writeInt32(inLength);
692 void* buf = data.writeInplace(inLength);
693 memcpy(buf, in, inLength);
694 status_t status = remote()->transact(BnKeystoreService::SIGN, data, &reply);
695 if (status != NO_ERROR) {
696 ALOGD("import() could not contact remote: %d\n", status);
697 return -1;
698 }
699 int32_t err = reply.readExceptionCode();
700 ssize_t len = reply.readInt32();
701 if (len >= 0 && (size_t) len <= reply.dataAvail()) {
702 size_t ulen = (size_t) len;
703 const void* outBuf = reply.readInplace(ulen);
704 *out = (uint8_t*) malloc(ulen);
705 if (*out != NULL) {
706 memcpy((void*) *out, outBuf, ulen);
707 *outLength = ulen;
708 } else {
709 ALOGE("out of memory allocating output array in sign");
710 *outLength = 0;
711 }
712 } else {
713 *outLength = 0;
714 }
715 if (err < 0) {
716 ALOGD("import() caught exception %d\n", err);
717 return -1;
718 }
719 return 0;
720 }
721
722 virtual int32_t verify(const String16& name, const uint8_t* in, size_t inLength,
723 const uint8_t* signature, size_t signatureLength)
724 {
725 Parcel data, reply;
726 void* buf;
727
728 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
729 data.writeString16(name);
730 data.writeInt32(inLength);
731 buf = data.writeInplace(inLength);
732 memcpy(buf, in, inLength);
733 data.writeInt32(signatureLength);
734 buf = data.writeInplace(signatureLength);
735 memcpy(buf, signature, signatureLength);
736 status_t status = remote()->transact(BnKeystoreService::VERIFY, data, &reply);
737 if (status != NO_ERROR) {
738 ALOGD("verify() could not contact remote: %d\n", status);
739 return -1;
740 }
741 int32_t err = reply.readExceptionCode();
742 int32_t ret = reply.readInt32();
743 if (err < 0) {
744 ALOGD("verify() caught exception %d\n", err);
745 return -1;
746 }
747 return ret;
748 }
749
750 virtual int32_t get_pubkey(const String16& name, uint8_t** pubkey, size_t* pubkeyLength)
751 {
752 Parcel data, reply;
753 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
754 data.writeString16(name);
755 status_t status = remote()->transact(BnKeystoreService::GET_PUBKEY, data, &reply);
756 if (status != NO_ERROR) {
757 ALOGD("get_pubkey() could not contact remote: %d\n", status);
758 return -1;
759 }
760 int32_t err = reply.readExceptionCode();
761 ssize_t len = reply.readInt32();
762 if (len >= 0 && (size_t) len <= reply.dataAvail()) {
763 size_t ulen = (size_t) len;
764 const void* buf = reply.readInplace(ulen);
765 *pubkey = (uint8_t*) malloc(ulen);
766 if (*pubkey != NULL) {
767 memcpy(*pubkey, buf, ulen);
768 *pubkeyLength = ulen;
769 } else {
770 ALOGE("out of memory allocating output array in get_pubkey");
771 *pubkeyLength = 0;
772 }
773 } else {
774 *pubkeyLength = 0;
775 }
776 if (err < 0) {
777 ALOGD("get_pubkey() caught exception %d\n", err);
778 return -1;
779 }
780 return 0;
781 }
782
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800783 virtual int32_t del_key(const String16& name, int uid)
Kenny Root07438c82012-11-02 15:41:02 -0700784 {
785 Parcel data, reply;
786 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
787 data.writeString16(name);
Kenny Rootb88c3eb2013-02-13 14:43:43 -0800788 data.writeInt32(uid);
Kenny Root07438c82012-11-02 15:41:02 -0700789 status_t status = remote()->transact(BnKeystoreService::DEL_KEY, data, &reply);
790 if (status != NO_ERROR) {
791 ALOGD("del_key() could not contact remote: %d\n", status);
792 return -1;
793 }
794 int32_t err = reply.readExceptionCode();
795 int32_t ret = reply.readInt32();
796 if (err < 0) {
797 ALOGD("del_key() caught exception %d\n", err);
798 return -1;
799 }
800 return ret;
801 }
802
803 virtual int32_t grant(const String16& name, int32_t granteeUid)
804 {
805 Parcel data, reply;
806 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
807 data.writeString16(name);
808 data.writeInt32(granteeUid);
809 status_t status = remote()->transact(BnKeystoreService::GRANT, data, &reply);
810 if (status != NO_ERROR) {
811 ALOGD("grant() could not contact remote: %d\n", status);
812 return -1;
813 }
814 int32_t err = reply.readExceptionCode();
815 int32_t ret = reply.readInt32();
816 if (err < 0) {
817 ALOGD("grant() caught exception %d\n", err);
818 return -1;
819 }
820 return ret;
821 }
822
823 virtual int32_t ungrant(const String16& name, int32_t granteeUid)
824 {
825 Parcel data, reply;
826 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
827 data.writeString16(name);
828 data.writeInt32(granteeUid);
829 status_t status = remote()->transact(BnKeystoreService::UNGRANT, data, &reply);
830 if (status != NO_ERROR) {
831 ALOGD("ungrant() could not contact remote: %d\n", status);
832 return -1;
833 }
834 int32_t err = reply.readExceptionCode();
835 int32_t ret = reply.readInt32();
836 if (err < 0) {
837 ALOGD("ungrant() caught exception %d\n", err);
838 return -1;
839 }
840 return ret;
841 }
842
843 int64_t getmtime(const String16& name)
844 {
845 Parcel data, reply;
846 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
847 data.writeString16(name);
848 status_t status = remote()->transact(BnKeystoreService::GETMTIME, data, &reply);
849 if (status != NO_ERROR) {
850 ALOGD("getmtime() could not contact remote: %d\n", status);
851 return -1;
852 }
853 int32_t err = reply.readExceptionCode();
854 int64_t ret = reply.readInt64();
855 if (err < 0) {
856 ALOGD("getmtime() caught exception %d\n", err);
857 return -1;
858 }
859 return ret;
860 }
Kenny Root02254072013-03-20 11:48:19 -0700861
Kenny Rootd53bc922013-03-21 14:10:15 -0700862 virtual int32_t duplicate(const String16& srcKey, int32_t srcUid, const String16& destKey,
863 int32_t destUid)
Kenny Root02254072013-03-20 11:48:19 -0700864 {
865 Parcel data, reply;
866 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
Kenny Rootd53bc922013-03-21 14:10:15 -0700867 data.writeString16(srcKey);
868 data.writeInt32(srcUid);
869 data.writeString16(destKey);
870 data.writeInt32(destUid);
871 status_t status = remote()->transact(BnKeystoreService::DUPLICATE, data, &reply);
Kenny Root02254072013-03-20 11:48:19 -0700872 if (status != NO_ERROR) {
Kenny Rootd53bc922013-03-21 14:10:15 -0700873 ALOGD("duplicate() could not contact remote: %d\n", status);
Kenny Root02254072013-03-20 11:48:19 -0700874 return -1;
875 }
876 int32_t err = reply.readExceptionCode();
877 int32_t ret = reply.readInt32();
878 if (err < 0) {
Kenny Rootd53bc922013-03-21 14:10:15 -0700879 ALOGD("duplicate() caught exception %d\n", err);
Kenny Root02254072013-03-20 11:48:19 -0700880 return -1;
881 }
882 return ret;
883 }
Kenny Root43061232013-03-29 11:15:50 -0700884
Kenny Root1b0e3932013-09-05 13:06:32 -0700885 virtual int32_t is_hardware_backed(const String16& keyType)
Kenny Root43061232013-03-29 11:15:50 -0700886 {
887 Parcel data, reply;
888 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
Kenny Root1b0e3932013-09-05 13:06:32 -0700889 data.writeString16(keyType);
Kenny Root43061232013-03-29 11:15:50 -0700890 status_t status = remote()->transact(BnKeystoreService::IS_HARDWARE_BACKED, data, &reply);
891 if (status != NO_ERROR) {
892 ALOGD("is_hardware_backed() could not contact remote: %d\n", status);
893 return -1;
894 }
895 int32_t err = reply.readExceptionCode();
896 int32_t ret = reply.readInt32();
897 if (err < 0) {
898 ALOGD("is_hardware_backed() caught exception %d\n", err);
899 return -1;
900 }
901 return ret;
902 }
Kenny Root2ecc7a12013-04-01 16:29:11 -0700903
904 virtual int32_t clear_uid(int64_t uid)
905 {
906 Parcel data, reply;
907 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
908 data.writeInt64(uid);
909 status_t status = remote()->transact(BnKeystoreService::CLEAR_UID, data, &reply);
910 if (status != NO_ERROR) {
911 ALOGD("clear_uid() could not contact remote: %d\n", status);
912 return -1;
913 }
914 int32_t err = reply.readExceptionCode();
915 int32_t ret = reply.readInt32();
916 if (err < 0) {
917 ALOGD("clear_uid() caught exception %d\n", err);
918 return -1;
919 }
920 return ret;
921 }
Robin Lee4e865752014-08-19 17:37:55 +0100922
923 virtual int32_t reset_uid(int32_t uid) {
924 Parcel data, reply;
925 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
926 data.writeInt32(uid);
927 status_t status = remote()->transact(BnKeystoreService::RESET_UID, data, &reply);
928 if (status != NO_ERROR) {
929 ALOGD("reset_uid() could not contact remote: %d\n", status);
930 return -1;
931 }
932 int32_t err = reply.readExceptionCode();
933 int32_t ret = reply.readInt32();
934 if (err < 0) {
935 ALOGD("reset_uid() caught exception %d\n", err);
936 return -1;
937 }
938 return ret;
939
940 }
941
942 virtual int32_t sync_uid(int32_t sourceUid, int32_t targetUid)
943 {
944 Parcel data, reply;
945 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
946 data.writeInt32(sourceUid);
947 data.writeInt32(targetUid);
948 status_t status = remote()->transact(BnKeystoreService::SYNC_UID, data, &reply);
949 if (status != NO_ERROR) {
950 ALOGD("sync_uid() could not contact remote: %d\n", status);
951 return -1;
952 }
953 int32_t err = reply.readExceptionCode();
954 int32_t ret = reply.readInt32();
955 if (err < 0) {
956 ALOGD("sync_uid() caught exception %d\n", err);
957 return -1;
958 }
959 return ret;
960 }
961
962 virtual int32_t password_uid(const String16& password, int32_t uid)
963 {
964 Parcel data, reply;
965 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
966 data.writeString16(password);
967 data.writeInt32(uid);
968 status_t status = remote()->transact(BnKeystoreService::PASSWORD_UID, data, &reply);
969 if (status != NO_ERROR) {
970 ALOGD("password_uid() could not contact remote: %d\n", status);
971 return -1;
972 }
973 int32_t err = reply.readExceptionCode();
974 int32_t ret = reply.readInt32();
975 if (err < 0) {
976 ALOGD("password_uid() caught exception %d\n", err);
977 return -1;
978 }
979 return ret;
980 }
Chad Brubaker9899d6b2015-02-03 13:03:00 -0800981 virtual int32_t addRngEntropy(const uint8_t* buf, size_t bufLength)
982 {
983 Parcel data, reply;
984 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
985 data.writeInt32(bufLength);
986 data.writeByteArray(bufLength, buf);
987 status_t status = remote()->transact(BnKeystoreService::ADD_RNG_ENTROPY, data, &reply);
988 if (status != NO_ERROR) {
989 ALOGD("addRngEntropy() could not contact remote: %d\n", status);
990 return -1;
991 }
992 int32_t err = reply.readExceptionCode();
993 int32_t ret = reply.readInt32();
994 if (err < 0) {
995 ALOGD("addRngEntropy() caught exception %d\n", err);
996 return -1;
997 }
998 return ret;
999 };
1000
1001 virtual int32_t generateKey(const String16& name, const KeymasterArguments& params,
1002 int uid, int flags, KeyCharacteristics* outCharacteristics)
1003 {
1004 Parcel data, reply;
1005 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
1006 data.writeString16(name);
1007 data.writeInt32(1);
1008 params.writeToParcel(&data);
1009 data.writeInt32(uid);
1010 data.writeInt32(flags);
1011 status_t status = remote()->transact(BnKeystoreService::GENERATE_KEY, data, &reply);
1012 if (status != NO_ERROR) {
1013 ALOGD("generateKey() could not contact remote: %d\n", status);
1014 return KM_ERROR_UNKNOWN_ERROR;
1015 }
1016 int32_t err = reply.readExceptionCode();
1017 int32_t ret = reply.readInt32();
1018 if (err < 0) {
1019 ALOGD("generateKey() caught exception %d\n", err);
1020 return KM_ERROR_UNKNOWN_ERROR;
1021 }
1022 if (reply.readInt32() != 0 && outCharacteristics) {
1023 outCharacteristics->readFromParcel(reply);
1024 }
1025 return ret;
1026 }
1027 virtual int32_t getKeyCharacteristics(const String16& name,
Chad Brubakerd6634422015-03-21 22:36:07 -07001028 const keymaster_blob_t* clientId,
1029 const keymaster_blob_t* appData,
Chad Brubaker9899d6b2015-02-03 13:03:00 -08001030 KeyCharacteristics* outCharacteristics)
1031 {
1032 Parcel data, reply;
1033 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
1034 data.writeString16(name);
Chad Brubakerd6634422015-03-21 22:36:07 -07001035 if (clientId) {
1036 data.writeByteArray(clientId->data_length, clientId->data);
1037 } else {
1038 data.writeInt32(-1);
1039 }
1040 if (appData) {
1041 data.writeByteArray(appData->data_length, appData->data);
1042 } else {
1043 data.writeInt32(-1);
1044 }
Chad Brubaker9899d6b2015-02-03 13:03:00 -08001045 status_t status = remote()->transact(BnKeystoreService::GET_KEY_CHARACTERISTICS,
1046 data, &reply);
1047 if (status != NO_ERROR) {
1048 ALOGD("getKeyCharacteristics() could not contact remote: %d\n", status);
1049 return KM_ERROR_UNKNOWN_ERROR;
1050 }
1051 int32_t err = reply.readExceptionCode();
1052 int32_t ret = reply.readInt32();
1053 if (err < 0) {
1054 ALOGD("getKeyCharacteristics() caught exception %d\n", err);
1055 return KM_ERROR_UNKNOWN_ERROR;
1056 }
1057 if (reply.readInt32() != 0 && outCharacteristics) {
1058 outCharacteristics->readFromParcel(reply);
1059 }
1060 return ret;
1061 }
1062 virtual int32_t importKey(const String16& name, const KeymasterArguments& params,
1063 keymaster_key_format_t format, const uint8_t *keyData,
1064 size_t keyLength, int uid, int flags,
1065 KeyCharacteristics* outCharacteristics)
1066 {
1067 Parcel data, reply;
1068 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
1069 data.writeString16(name);
1070 data.writeInt32(1);
1071 params.writeToParcel(&data);
1072 data.writeInt32(format);
1073 data.writeByteArray(keyLength, keyData);
1074 data.writeInt32(uid);
1075 data.writeInt32(flags);
1076 status_t status = remote()->transact(BnKeystoreService::IMPORT_KEY, data, &reply);
1077 if (status != NO_ERROR) {
1078 ALOGD("importKey() could not contact remote: %d\n", status);
1079 return KM_ERROR_UNKNOWN_ERROR;
1080 }
1081 int32_t err = reply.readExceptionCode();
1082 int32_t ret = reply.readInt32();
1083 if (err < 0) {
1084 ALOGD("importKey() caught exception %d\n", err);
1085 return KM_ERROR_UNKNOWN_ERROR;
1086 }
1087 if (reply.readInt32() != 0 && outCharacteristics) {
1088 outCharacteristics->readFromParcel(reply);
1089 }
1090 return ret;
1091 }
1092
1093 virtual void exportKey(const String16& name, keymaster_key_format_t format,
Chad Brubakerd6634422015-03-21 22:36:07 -07001094 const keymaster_blob_t* clientId,
1095 const keymaster_blob_t* appData, ExportResult* result)
Chad Brubaker9899d6b2015-02-03 13:03:00 -08001096 {
1097 if (!result) {
1098 return;
1099 }
1100
1101 Parcel data, reply;
1102 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
1103 data.writeString16(name);
1104 data.writeInt32(format);
Chad Brubakerd6634422015-03-21 22:36:07 -07001105 if (clientId) {
1106 data.writeByteArray(clientId->data_length, clientId->data);
1107 } else {
1108 data.writeInt32(-1);
1109 }
1110 if (appData) {
1111 data.writeByteArray(appData->data_length, appData->data);
1112 } else {
1113 data.writeInt32(-1);
1114 }
Chad Brubaker9899d6b2015-02-03 13:03:00 -08001115 status_t status = remote()->transact(BnKeystoreService::EXPORT_KEY, data, &reply);
1116 if (status != NO_ERROR) {
1117 ALOGD("exportKey() could not contact remote: %d\n", status);
1118 result->resultCode = KM_ERROR_UNKNOWN_ERROR;
1119 return;
1120 }
1121 int32_t err = reply.readExceptionCode();
1122 if (err < 0) {
1123 ALOGD("exportKey() caught exception %d\n", err);
1124 result->resultCode = KM_ERROR_UNKNOWN_ERROR;
1125 return;
1126 }
1127 if (reply.readInt32() != 0) {
1128 result->readFromParcel(reply);
1129 }
1130 }
1131
1132 virtual void begin(const sp<IBinder>& appToken, const String16& name,
1133 keymaster_purpose_t purpose, bool pruneable,
1134 const KeymasterArguments& params, KeymasterArguments* outParams,
1135 OperationResult* result)
1136 {
1137 if (!result || !outParams) {
1138 return;
1139 }
1140 Parcel data, reply;
1141 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
1142 data.writeStrongBinder(appToken);
1143 data.writeString16(name);
1144 data.writeInt32(purpose);
1145 data.writeInt32(pruneable ? 1 : 0);
1146 data.writeInt32(1);
1147 params.writeToParcel(&data);
1148 status_t status = remote()->transact(BnKeystoreService::BEGIN, data, &reply);
1149 if (status != NO_ERROR) {
1150 ALOGD("begin() could not contact remote: %d\n", status);
1151 result->resultCode = KM_ERROR_UNKNOWN_ERROR;
1152 return;
1153 }
1154 int32_t err = reply.readExceptionCode();
1155 if (err < 0) {
1156 ALOGD("begin() caught exception %d\n", err);
1157 result->resultCode = KM_ERROR_UNKNOWN_ERROR;
1158 return;
1159 }
1160 if (reply.readInt32() != 0) {
1161 result->readFromParcel(reply);
1162 }
1163 if (reply.readInt32() != 0) {
1164 outParams->readFromParcel(reply);
1165 }
1166 }
1167
1168 virtual void update(const sp<IBinder>& token, const KeymasterArguments& params,
Chad Brubaker40a1a9b2015-02-20 14:08:13 -08001169 const uint8_t* opData, size_t dataLength, OperationResult* result)
Chad Brubaker9899d6b2015-02-03 13:03:00 -08001170 {
1171 if (!result) {
1172 return;
1173 }
1174 Parcel data, reply;
1175 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
1176 data.writeStrongBinder(token);
1177 data.writeInt32(1);
1178 params.writeToParcel(&data);
1179 data.writeByteArray(dataLength, opData);
1180 status_t status = remote()->transact(BnKeystoreService::UPDATE, data, &reply);
1181 if (status != NO_ERROR) {
1182 ALOGD("update() could not contact remote: %d\n", status);
1183 result->resultCode = KM_ERROR_UNKNOWN_ERROR;
1184 return;
1185 }
1186 int32_t err = reply.readExceptionCode();
1187 if (err < 0) {
1188 ALOGD("update() caught exception %d\n", err);
1189 result->resultCode = KM_ERROR_UNKNOWN_ERROR;
1190 return;
1191 }
1192 if (reply.readInt32() != 0) {
1193 result->readFromParcel(reply);
1194 }
1195 }
1196
1197 virtual void finish(const sp<IBinder>& token, const KeymasterArguments& params,
Chad Brubaker40a1a9b2015-02-20 14:08:13 -08001198 const uint8_t* signature, size_t signatureLength, OperationResult* result)
Chad Brubaker9899d6b2015-02-03 13:03:00 -08001199 {
1200 if (!result) {
1201 return;
1202 }
1203 Parcel data, reply;
1204 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
1205 data.writeStrongBinder(token);
1206 data.writeInt32(1);
1207 params.writeToParcel(&data);
1208 data.writeByteArray(signatureLength, signature);
1209 status_t status = remote()->transact(BnKeystoreService::FINISH, data, &reply);
1210 if (status != NO_ERROR) {
1211 ALOGD("finish() could not contact remote: %d\n", status);
1212 result->resultCode = KM_ERROR_UNKNOWN_ERROR;
1213 return;
1214 }
1215 int32_t err = reply.readExceptionCode();
1216 if (err < 0) {
1217 ALOGD("finish() caught exception %d\n", err);
1218 result->resultCode = KM_ERROR_UNKNOWN_ERROR;
1219 return;
1220 }
1221 if (reply.readInt32() != 0) {
1222 result->readFromParcel(reply);
1223 }
1224 }
1225
1226 virtual int32_t abort(const sp<IBinder>& token)
1227 {
1228 Parcel data, reply;
1229 data.writeInterfaceToken(IKeystoreService::getInterfaceDescriptor());
1230 data.writeStrongBinder(token);
1231 status_t status = remote()->transact(BnKeystoreService::FINISH, data, &reply);
1232 if (status != NO_ERROR) {
1233 ALOGD("abort() could not contact remote: %d\n", status);
1234 return KM_ERROR_UNKNOWN_ERROR;
1235 }
1236 int32_t err = reply.readExceptionCode();
1237 int32_t ret = reply.readInt32();
1238 if (err < 0) {
1239 ALOGD("abort() caught exception %d\n", err);
1240 return KM_ERROR_UNKNOWN_ERROR;
1241 }
1242 return ret;
1243 }
Kenny Root07438c82012-11-02 15:41:02 -07001244};
1245
Chad Brubaker468fc692015-01-13 17:33:14 -08001246IMPLEMENT_META_INTERFACE(KeystoreService, "android.security.IKeystoreService");
Kenny Root07438c82012-11-02 15:41:02 -07001247
1248// ----------------------------------------------------------------------
1249
1250status_t BnKeystoreService::onTransact(
1251 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
1252{
1253 switch(code) {
1254 case TEST: {
1255 CHECK_INTERFACE(IKeystoreService, data, reply);
1256 int32_t ret = test();
1257 reply->writeNoException();
1258 reply->writeInt32(ret);
1259 return NO_ERROR;
1260 } break;
1261 case GET: {
1262 CHECK_INTERFACE(IKeystoreService, data, reply);
1263 String16 name = data.readString16();
1264 void* out = NULL;
1265 size_t outSize = 0;
1266 int32_t ret = get(name, (uint8_t**) &out, &outSize);
1267 reply->writeNoException();
1268 if (ret == 1) {
1269 reply->writeInt32(outSize);
1270 void* buf = reply->writeInplace(outSize);
1271 memcpy(buf, out, outSize);
1272 free(out);
1273 } else {
1274 reply->writeInt32(-1);
1275 }
1276 return NO_ERROR;
1277 } break;
1278 case INSERT: {
1279 CHECK_INTERFACE(IKeystoreService, data, reply);
1280 String16 name = data.readString16();
1281 ssize_t inSize = data.readInt32();
1282 const void* in;
1283 if (inSize >= 0 && (size_t) inSize <= data.dataAvail()) {
1284 in = data.readInplace(inSize);
1285 } else {
1286 in = NULL;
1287 inSize = 0;
1288 }
Kenny Rootb88c3eb2013-02-13 14:43:43 -08001289 int uid = data.readInt32();
Kenny Root0c540aa2013-04-03 09:22:15 -07001290 int32_t flags = data.readInt32();
1291 int32_t ret = insert(name, (const uint8_t*) in, (size_t) inSize, uid, flags);
Kenny Root07438c82012-11-02 15:41:02 -07001292 reply->writeNoException();
1293 reply->writeInt32(ret);
1294 return NO_ERROR;
1295 } break;
1296 case DEL: {
1297 CHECK_INTERFACE(IKeystoreService, data, reply);
1298 String16 name = data.readString16();
Kenny Rootb88c3eb2013-02-13 14:43:43 -08001299 int uid = data.readInt32();
1300 int32_t ret = del(name, uid);
Kenny Root07438c82012-11-02 15:41:02 -07001301 reply->writeNoException();
1302 reply->writeInt32(ret);
1303 return NO_ERROR;
1304 } break;
1305 case EXIST: {
1306 CHECK_INTERFACE(IKeystoreService, data, reply);
1307 String16 name = data.readString16();
Kenny Rootb88c3eb2013-02-13 14:43:43 -08001308 int uid = data.readInt32();
1309 int32_t ret = exist(name, uid);
Kenny Root07438c82012-11-02 15:41:02 -07001310 reply->writeNoException();
1311 reply->writeInt32(ret);
1312 return NO_ERROR;
1313 } break;
1314 case SAW: {
1315 CHECK_INTERFACE(IKeystoreService, data, reply);
1316 String16 name = data.readString16();
Kenny Rootb88c3eb2013-02-13 14:43:43 -08001317 int uid = data.readInt32();
Kenny Root07438c82012-11-02 15:41:02 -07001318 Vector<String16> matches;
Kenny Rootb88c3eb2013-02-13 14:43:43 -08001319 int32_t ret = saw(name, uid, &matches);
Kenny Root07438c82012-11-02 15:41:02 -07001320 reply->writeNoException();
1321 reply->writeInt32(matches.size());
1322 Vector<String16>::const_iterator it = matches.begin();
1323 for (; it != matches.end(); ++it) {
1324 reply->writeString16(*it);
1325 }
1326 reply->writeInt32(ret);
1327 return NO_ERROR;
1328 } break;
1329 case RESET: {
1330 CHECK_INTERFACE(IKeystoreService, data, reply);
1331 int32_t ret = reset();
1332 reply->writeNoException();
1333 reply->writeInt32(ret);
1334 return NO_ERROR;
1335 } break;
1336 case PASSWORD: {
1337 CHECK_INTERFACE(IKeystoreService, data, reply);
1338 String16 pass = data.readString16();
1339 int32_t ret = password(pass);
1340 reply->writeNoException();
1341 reply->writeInt32(ret);
1342 return NO_ERROR;
1343 } break;
1344 case LOCK: {
1345 CHECK_INTERFACE(IKeystoreService, data, reply);
1346 int32_t ret = lock();
1347 reply->writeNoException();
1348 reply->writeInt32(ret);
1349 return NO_ERROR;
1350 } break;
1351 case UNLOCK: {
1352 CHECK_INTERFACE(IKeystoreService, data, reply);
1353 String16 pass = data.readString16();
1354 int32_t ret = unlock(pass);
1355 reply->writeNoException();
1356 reply->writeInt32(ret);
1357 return NO_ERROR;
1358 } break;
1359 case ZERO: {
1360 CHECK_INTERFACE(IKeystoreService, data, reply);
1361 int32_t ret = zero();
1362 reply->writeNoException();
1363 reply->writeInt32(ret);
1364 return NO_ERROR;
1365 } break;
1366 case GENERATE: {
1367 CHECK_INTERFACE(IKeystoreService, data, reply);
1368 String16 name = data.readString16();
Kenny Root96427ba2013-08-16 14:02:41 -07001369 int32_t uid = data.readInt32();
1370 int32_t keyType = data.readInt32();
1371 int32_t keySize = data.readInt32();
Kenny Root0c540aa2013-04-03 09:22:15 -07001372 int32_t flags = data.readInt32();
Kenny Root96427ba2013-08-16 14:02:41 -07001373 Vector<sp<KeystoreArg> > args;
Chad Brubaker468fc692015-01-13 17:33:14 -08001374 int32_t argsPresent = data.readInt32();
1375 if (argsPresent == 1) {
1376 ssize_t numArgs = data.readInt32();
1377 if (numArgs > 0) {
1378 for (size_t i = 0; i < (size_t) numArgs; i++) {
1379 ssize_t inSize = data.readInt32();
1380 if (inSize >= 0 && (size_t) inSize <= data.dataAvail()) {
1381 sp<KeystoreArg> arg = new KeystoreArg(data.readInplace(inSize),
1382 inSize);
1383 args.push_back(arg);
1384 } else {
1385 args.push_back(NULL);
1386 }
Kenny Root96427ba2013-08-16 14:02:41 -07001387 }
1388 }
1389 }
1390 int32_t ret = generate(name, uid, keyType, keySize, flags, &args);
Kenny Root07438c82012-11-02 15:41:02 -07001391 reply->writeNoException();
1392 reply->writeInt32(ret);
1393 return NO_ERROR;
1394 } break;
1395 case IMPORT: {
1396 CHECK_INTERFACE(IKeystoreService, data, reply);
1397 String16 name = data.readString16();
1398 ssize_t inSize = data.readInt32();
1399 const void* in;
1400 if (inSize >= 0 && (size_t) inSize <= data.dataAvail()) {
1401 in = data.readInplace(inSize);
1402 } else {
1403 in = NULL;
1404 inSize = 0;
1405 }
Kenny Rootb88c3eb2013-02-13 14:43:43 -08001406 int uid = data.readInt32();
Kenny Root0c540aa2013-04-03 09:22:15 -07001407 int32_t flags = data.readInt32();
1408 int32_t ret = import(name, (const uint8_t*) in, (size_t) inSize, uid, flags);
Kenny Root07438c82012-11-02 15:41:02 -07001409 reply->writeNoException();
1410 reply->writeInt32(ret);
1411 return NO_ERROR;
1412 } break;
1413 case SIGN: {
1414 CHECK_INTERFACE(IKeystoreService, data, reply);
1415 String16 name = data.readString16();
1416 ssize_t inSize = data.readInt32();
1417 const void* in;
1418 if (inSize >= 0 && (size_t) inSize <= data.dataAvail()) {
1419 in = data.readInplace(inSize);
1420 } else {
1421 in = NULL;
1422 inSize = 0;
1423 }
1424 void* out = NULL;
1425 size_t outSize = 0;
1426 int32_t ret = sign(name, (const uint8_t*) in, (size_t) inSize, (uint8_t**) &out, &outSize);
1427 reply->writeNoException();
Kenny Rootb03c9fb2013-02-04 16:42:51 -08001428 if (outSize > 0 && out != NULL) {
1429 reply->writeInt32(outSize);
1430 void* buf = reply->writeInplace(outSize);
1431 memcpy(buf, out, outSize);
1432 free(out);
1433 } else {
Kenny Roote289c402013-02-14 11:31:53 -08001434 reply->writeInt32(-1);
Kenny Rootb03c9fb2013-02-04 16:42:51 -08001435 }
Kenny Root07438c82012-11-02 15:41:02 -07001436 reply->writeInt32(ret);
1437 return NO_ERROR;
1438 } break;
1439 case VERIFY: {
1440 CHECK_INTERFACE(IKeystoreService, data, reply);
1441 String16 name = data.readString16();
1442 ssize_t inSize = data.readInt32();
1443 const void* in;
1444 if (inSize >= 0 && (size_t) inSize <= data.dataAvail()) {
1445 in = data.readInplace(inSize);
1446 } else {
1447 in = NULL;
1448 inSize = 0;
1449 }
1450 ssize_t sigSize = data.readInt32();
1451 const void* sig;
1452 if (sigSize >= 0 && (size_t) sigSize <= data.dataAvail()) {
1453 sig = data.readInplace(sigSize);
1454 } else {
1455 sig = NULL;
1456 sigSize = 0;
1457 }
1458 bool ret = verify(name, (const uint8_t*) in, (size_t) inSize, (const uint8_t*) sig,
1459 (size_t) sigSize);
1460 reply->writeNoException();
1461 reply->writeInt32(ret ? 1 : 0);
1462 return NO_ERROR;
1463 } break;
1464 case GET_PUBKEY: {
1465 CHECK_INTERFACE(IKeystoreService, data, reply);
1466 String16 name = data.readString16();
1467 void* out = NULL;
1468 size_t outSize = 0;
1469 int32_t ret = get_pubkey(name, (unsigned char**) &out, &outSize);
1470 reply->writeNoException();
Kenny Rootb03c9fb2013-02-04 16:42:51 -08001471 if (outSize > 0 && out != NULL) {
1472 reply->writeInt32(outSize);
1473 void* buf = reply->writeInplace(outSize);
1474 memcpy(buf, out, outSize);
1475 free(out);
1476 } else {
Kenny Roote289c402013-02-14 11:31:53 -08001477 reply->writeInt32(-1);
Kenny Rootb03c9fb2013-02-04 16:42:51 -08001478 }
Kenny Root07438c82012-11-02 15:41:02 -07001479 reply->writeInt32(ret);
1480 return NO_ERROR;
Kenny Rootb03c9fb2013-02-04 16:42:51 -08001481 } break;
Kenny Root07438c82012-11-02 15:41:02 -07001482 case DEL_KEY: {
1483 CHECK_INTERFACE(IKeystoreService, data, reply);
1484 String16 name = data.readString16();
Kenny Rootb88c3eb2013-02-13 14:43:43 -08001485 int uid = data.readInt32();
1486 int32_t ret = del_key(name, uid);
Kenny Root07438c82012-11-02 15:41:02 -07001487 reply->writeNoException();
1488 reply->writeInt32(ret);
1489 return NO_ERROR;
1490 } break;
1491 case GRANT: {
1492 CHECK_INTERFACE(IKeystoreService, data, reply);
1493 String16 name = data.readString16();
1494 int32_t granteeUid = data.readInt32();
1495 int32_t ret = grant(name, granteeUid);
1496 reply->writeNoException();
1497 reply->writeInt32(ret);
1498 return NO_ERROR;
1499 } break;
1500 case UNGRANT: {
1501 CHECK_INTERFACE(IKeystoreService, data, reply);
1502 String16 name = data.readString16();
1503 int32_t granteeUid = data.readInt32();
1504 int32_t ret = ungrant(name, granteeUid);
1505 reply->writeNoException();
1506 reply->writeInt32(ret);
1507 return NO_ERROR;
1508 } break;
1509 case GETMTIME: {
1510 CHECK_INTERFACE(IKeystoreService, data, reply);
1511 String16 name = data.readString16();
1512 int64_t ret = getmtime(name);
1513 reply->writeNoException();
1514 reply->writeInt64(ret);
1515 return NO_ERROR;
1516 } break;
Kenny Rootd53bc922013-03-21 14:10:15 -07001517 case DUPLICATE: {
Kenny Root02254072013-03-20 11:48:19 -07001518 CHECK_INTERFACE(IKeystoreService, data, reply);
Kenny Rootd53bc922013-03-21 14:10:15 -07001519 String16 srcKey = data.readString16();
1520 int32_t srcUid = data.readInt32();
1521 String16 destKey = data.readString16();
1522 int32_t destUid = data.readInt32();
1523 int32_t ret = duplicate(srcKey, srcUid, destKey, destUid);
Kenny Root02254072013-03-20 11:48:19 -07001524 reply->writeNoException();
1525 reply->writeInt32(ret);
1526 return NO_ERROR;
1527 } break;
Kenny Root43061232013-03-29 11:15:50 -07001528 case IS_HARDWARE_BACKED: {
1529 CHECK_INTERFACE(IKeystoreService, data, reply);
Kenny Root1b0e3932013-09-05 13:06:32 -07001530 String16 keyType = data.readString16();
1531 int32_t ret = is_hardware_backed(keyType);
Kenny Root43061232013-03-29 11:15:50 -07001532 reply->writeNoException();
1533 reply->writeInt32(ret);
1534 return NO_ERROR;
1535 }
Kenny Root2ecc7a12013-04-01 16:29:11 -07001536 case CLEAR_UID: {
1537 CHECK_INTERFACE(IKeystoreService, data, reply);
1538 int64_t uid = data.readInt64();
1539 int32_t ret = clear_uid(uid);
1540 reply->writeNoException();
1541 reply->writeInt32(ret);
1542 return NO_ERROR;
1543 }
Robin Lee4e865752014-08-19 17:37:55 +01001544 case RESET_UID: {
1545 CHECK_INTERFACE(IKeystoreService, data, reply);
1546 int32_t uid = data.readInt32();
1547 int32_t ret = reset_uid(uid);
1548 reply->writeNoException();
1549 reply->writeInt32(ret);
1550 return NO_ERROR;
1551 }
1552 case SYNC_UID: {
1553 CHECK_INTERFACE(IKeystoreService, data, reply);
1554 int32_t sourceUid = data.readInt32();
1555 int32_t targetUid = data.readInt32();
1556 int32_t ret = sync_uid(sourceUid, targetUid);
1557 reply->writeNoException();
1558 reply->writeInt32(ret);
1559 return NO_ERROR;
1560 }
1561 case PASSWORD_UID: {
1562 CHECK_INTERFACE(IKeystoreService, data, reply);
1563 String16 password = data.readString16();
1564 int32_t uid = data.readInt32();
1565 int32_t ret = password_uid(password, uid);
1566 reply->writeNoException();
1567 reply->writeInt32(ret);
1568 return NO_ERROR;
1569 }
Chad Brubaker9899d6b2015-02-03 13:03:00 -08001570 case ADD_RNG_ENTROPY: {
1571 CHECK_INTERFACE(IKeystoreService, data, reply);
Chad Brubaker6432df72015-03-20 16:23:04 -07001572 const uint8_t* bytes = NULL;
1573 size_t size = 0;
1574 readByteArray(data, &bytes, &size);
Chad Brubaker9899d6b2015-02-03 13:03:00 -08001575 int32_t ret = addRngEntropy(bytes, size);
1576 reply->writeNoException();
1577 reply->writeInt32(ret);
1578 return NO_ERROR;
1579 }
1580 case GENERATE_KEY: {
1581 CHECK_INTERFACE(IKeystoreService, data, reply);
1582 String16 name = data.readString16();
1583 KeymasterArguments args;
1584 if (data.readInt32() != 0) {
1585 args.readFromParcel(data);
1586 }
1587 int32_t uid = data.readInt32();
1588 int32_t flags = data.readInt32();
1589 KeyCharacteristics outCharacteristics;
1590 int32_t ret = generateKey(name, args, uid, flags, &outCharacteristics);
1591 reply->writeNoException();
1592 reply->writeInt32(ret);
1593 reply->writeInt32(1);
1594 outCharacteristics.writeToParcel(reply);
1595 return NO_ERROR;
1596 }
1597 case GET_KEY_CHARACTERISTICS: {
1598 CHECK_INTERFACE(IKeystoreService, data, reply);
1599 String16 name = data.readString16();
Chad Brubakerd6634422015-03-21 22:36:07 -07001600 std::unique_ptr<keymaster_blob_t> clientId = readKeymasterBlob(data);
1601 std::unique_ptr<keymaster_blob_t> appData = readKeymasterBlob(data);
Chad Brubaker9899d6b2015-02-03 13:03:00 -08001602 KeyCharacteristics outCharacteristics;
Chad Brubakerd6634422015-03-21 22:36:07 -07001603 int ret = getKeyCharacteristics(name, clientId.get(), appData.get(),
1604 &outCharacteristics);
Chad Brubaker9899d6b2015-02-03 13:03:00 -08001605 reply->writeNoException();
1606 reply->writeInt32(ret);
1607 reply->writeInt32(1);
1608 outCharacteristics.writeToParcel(reply);
1609 return NO_ERROR;
1610 }
1611 case IMPORT_KEY: {
1612 CHECK_INTERFACE(IKeystoreService, data, reply);
1613 String16 name = data.readString16();
1614 KeymasterArguments args;
1615 if (data.readInt32() != 0) {
1616 args.readFromParcel(data);
1617 }
1618 keymaster_key_format_t format = static_cast<keymaster_key_format_t>(data.readInt32());
Chad Brubaker6432df72015-03-20 16:23:04 -07001619 const uint8_t* keyData = NULL;
1620 size_t keyLength = 0;
1621 readByteArray(data, &keyData, &keyLength);
Chad Brubaker9899d6b2015-02-03 13:03:00 -08001622 int32_t uid = data.readInt32();
1623 int32_t flags = data.readInt32();
1624 KeyCharacteristics outCharacteristics;
Chad Brubaker6432df72015-03-20 16:23:04 -07001625 int32_t ret = importKey(name, args, format, keyData, keyLength, uid, flags,
Chad Brubaker9899d6b2015-02-03 13:03:00 -08001626 &outCharacteristics);
1627 reply->writeNoException();
1628 reply->writeInt32(ret);
1629 reply->writeInt32(1);
1630 outCharacteristics.writeToParcel(reply);
1631
1632 return NO_ERROR;
1633 }
1634 case EXPORT_KEY: {
1635 CHECK_INTERFACE(IKeystoreService, data, reply);
1636 String16 name = data.readString16();
1637 keymaster_key_format_t format = static_cast<keymaster_key_format_t>(data.readInt32());
Chad Brubakerd6634422015-03-21 22:36:07 -07001638 std::unique_ptr<keymaster_blob_t> clientId = readKeymasterBlob(data);
1639 std::unique_ptr<keymaster_blob_t> appData = readKeymasterBlob(data);
Chad Brubaker9899d6b2015-02-03 13:03:00 -08001640 ExportResult result;
Chad Brubakerd6634422015-03-21 22:36:07 -07001641 exportKey(name, format, clientId.get(), appData.get(), &result);
Chad Brubaker9899d6b2015-02-03 13:03:00 -08001642 reply->writeNoException();
1643 reply->writeInt32(1);
1644 result.writeToParcel(reply);
1645
1646 return NO_ERROR;
1647 }
1648 case BEGIN: {
1649 CHECK_INTERFACE(IKeystoreService, data, reply);
1650 sp<IBinder> token = data.readStrongBinder();
1651 String16 name = data.readString16();
1652 keymaster_purpose_t purpose = static_cast<keymaster_purpose_t>(data.readInt32());
1653 bool pruneable = data.readInt32() != 0;
1654 KeymasterArguments args;
1655 if (data.readInt32() != 0) {
1656 args.readFromParcel(data);
1657 }
1658 KeymasterArguments outArgs;
1659 OperationResult result;
1660 begin(token, name, purpose, pruneable, args, &outArgs, &result);
1661 reply->writeNoException();
1662 reply->writeInt32(1);
1663 result.writeToParcel(reply);
1664 reply->writeInt32(1);
1665 outArgs.writeToParcel(reply);
1666
1667 return NO_ERROR;
1668 }
1669 case UPDATE: {
1670 CHECK_INTERFACE(IKeystoreService, data, reply);
1671 sp<IBinder> token = data.readStrongBinder();
1672 KeymasterArguments args;
1673 if (data.readInt32() != 0) {
1674 args.readFromParcel(data);
1675 }
Chad Brubaker6432df72015-03-20 16:23:04 -07001676 const uint8_t* buf = NULL;
1677 size_t bufLength = 0;
1678 readByteArray(data, &buf, &bufLength);
Chad Brubaker9899d6b2015-02-03 13:03:00 -08001679 OperationResult result;
Chad Brubaker6432df72015-03-20 16:23:04 -07001680 update(token, args, buf, bufLength, &result);
Chad Brubaker9899d6b2015-02-03 13:03:00 -08001681 reply->writeNoException();
1682 reply->writeInt32(1);
1683 result.writeToParcel(reply);
1684
1685 return NO_ERROR;
1686 }
1687 case FINISH: {
1688 CHECK_INTERFACE(IKeystoreService, data, reply);
1689 sp<IBinder> token = data.readStrongBinder();
1690 KeymasterArguments args;
1691 if (data.readInt32() != 0) {
1692 args.readFromParcel(data);
1693 }
Chad Brubaker6432df72015-03-20 16:23:04 -07001694 const uint8_t* buf = NULL;
1695 size_t bufLength = 0;
1696 readByteArray(data, &buf, &bufLength);
Chad Brubaker9899d6b2015-02-03 13:03:00 -08001697 OperationResult result;
Chad Brubaker6432df72015-03-20 16:23:04 -07001698 finish(token, args, buf, bufLength, &result);
Chad Brubaker9899d6b2015-02-03 13:03:00 -08001699 reply->writeNoException();
1700 reply->writeInt32(1);
1701 result.writeToParcel(reply);
1702
1703 return NO_ERROR;
1704 }
1705 case ABORT: {
1706 CHECK_INTERFACE(IKeystoreService, data, reply);
1707 sp<IBinder> token = data.readStrongBinder();
1708 int32_t result = abort(token);
1709 reply->writeNoException();
1710 reply->writeInt32(result);
1711
1712 return NO_ERROR;
1713 }
Kenny Root07438c82012-11-02 15:41:02 -07001714 default:
1715 return BBinder::onTransact(code, data, reply, flags);
1716 }
1717}
1718
1719// ----------------------------------------------------------------------------
1720
1721}; // namespace android