Implement keymaster 1.0 export_key method
Change-Id: I2a87cb61c340a099cc98d1a2db9e7390fb001b5d
diff --git a/keystore/keystore.cpp b/keystore/keystore.cpp
index 456ebdd..ea9556a 100644
--- a/keystore/keystore.cpp
+++ b/keystore/keystore.cpp
@@ -2639,10 +2639,35 @@
return mKeyStore->put(filename.string(), &keyBlob, uid);
}
- void exportKey(const String16& /*name*/, keymaster_key_format_t /*format*/,
- const keymaster_blob_t& /*clientId*/,
- const keymaster_blob_t& /*appData*/, ExportResult* result) {
- result->resultCode = KM_ERROR_UNIMPLEMENTED;
+ void exportKey(const String16& name, keymaster_key_format_t format,
+ const keymaster_blob_t& clientId,
+ const keymaster_blob_t& appData, ExportResult* result) {
+
+ 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) {
+ result->resultCode = responseCode;
+ return;
+ }
+ keymaster_key_blob_t key;
+ key.key_material_size = keyBlob.getLength();
+ key.key_material = keyBlob.getValue();
+ keymaster1_device_t* dev = mKeyStore->getDeviceForBlob(keyBlob);
+ if (!dev->export_key) {
+ result->resultCode = KM_ERROR_UNIMPLEMENTED;
+ return;
+ }
+ uint8_t* ptr = NULL;
+ rc = dev->export_key(dev, format, &key, &clientId, &appData,
+ &ptr, &result->dataLength);
+ result->exportData.reset(ptr);
+ result->resultCode = rc ? rc : ::NO_ERROR;
}
void begin(const sp<IBinder>& /*appToken*/, const String16& /*name*/,