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*/,