Implement keymaster 1.0 get_key_characteristics method
Change-Id: I02e1ff4ef67f5e3dcd34453ac2a16218961a03bf
diff --git a/keystore/keystore.cpp b/keystore/keystore.cpp
index c17eacc..a2ef175 100644
--- a/keystore/keystore.cpp
+++ b/keystore/keystore.cpp
@@ -2536,11 +2536,41 @@
return mKeyStore->put(filename.string(), &keyBlob, uid);
}
- int32_t getKeyCharacteristics(const String16& /*name*/,
- const keymaster_blob_t& /*clientId*/,
- const keymaster_blob_t& /*appData*/,
- KeyCharacteristics* /*outCharacteristics*/) {
- return KM_ERROR_UNIMPLEMENTED;
+ int32_t getKeyCharacteristics(const String16& name,
+ const keymaster_blob_t& clientId,
+ const keymaster_blob_t& appData,
+ KeyCharacteristics* outCharacteristics) {
+
+ if (!outCharacteristics) {
+ return KM_ERROR_UNEXPECTED_NULL_POINTER;
+ }
+
+ uid_t callingUid = IPCThreadState::self()->getCallingUid();
+
+ Blob keyBlob;
+ String8 name8(name);
+ int rc;
+
+ ResponseCode responseCode = mKeyStore->getKeyForName(&keyBlob, name8, callingUid,
+ TYPE_KEYMASTER_10);
+ if (responseCode != ::NO_ERROR) {
+ return responseCode;
+ }
+ keymaster_key_blob_t key;
+ key.key_material_size = keyBlob.getLength();
+ key.key_material = keyBlob.getValue();
+ keymaster1_device_t* dev = mKeyStore->getDeviceForBlob(keyBlob);
+ keymaster_key_characteristics_t *out = NULL;
+ if (!dev->get_key_characteristics) {
+ ALOGW("device does not implement get_key_characteristics");
+ return KM_ERROR_UNIMPLEMENTED;
+ }
+ rc = dev->get_key_characteristics(dev, &key, &clientId, &appData, &out);
+ if (out) {
+ outCharacteristics->characteristics = *out;
+ free(out);
+ }
+ return rc ? rc : ::NO_ERROR;
}
int32_t importKey(const String16& /*name*/, const KeymasterArguments& /*params*/,