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