summaryrefslogtreecommitdiffstats
path: root/trusty
diff options
context:
space:
mode:
authorJocelyn Bohr <bohr@google.com>2017-02-09 17:29:59 -0800
committerJocelyn Bohr <bohr@google.com>2017-04-10 17:33:49 -0700
commit4cbfa7f2f0dcbea559b46487c1d9f4560eba4f0b (patch)
treea5e80aa1a9481f2693b2cb96a47fb0be77a3148a /trusty
parent2d768669fae9e45fb852e5e862640aad06294ac2 (diff)
downloadsystem_core-4cbfa7f2f0dcbea559b46487c1d9f4560eba4f0b.tar.gz
system_core-4cbfa7f2f0dcbea559b46487c1d9f4560eba4f0b.tar.bz2
system_core-4cbfa7f2f0dcbea559b46487c1d9f4560eba4f0b.zip
trusty: keymaster: Implement export_key
Test: builds Change-Id: I47d1ed4144014fca47fdf67f9f4d2eb0d9b1eb8f
Diffstat (limited to 'trusty')
-rw-r--r--trusty/keymaster/trusty_keymaster_device.cpp31
1 files changed, 31 insertions, 0 deletions
diff --git a/trusty/keymaster/trusty_keymaster_device.cpp b/trusty/keymaster/trusty_keymaster_device.cpp
index 04826dffc..361045624 100644
--- a/trusty/keymaster/trusty_keymaster_device.cpp
+++ b/trusty/keymaster/trusty_keymaster_device.cpp
@@ -323,6 +323,37 @@ keymaster_error_t TrustyKeymasterDevice::export_key(keymaster_key_format_t expor
const keymaster_blob_t* app_data,
keymaster_blob_t* export_data) {
ALOGD("Device received export_key");
+
+ if (error_ != KM_ERROR_OK) {
+ return error_;
+ }
+ if (!key_to_export || !key_to_export->key_material) {
+ return KM_ERROR_UNEXPECTED_NULL_POINTER;
+ }
+ if (!export_data) {
+ return KM_ERROR_OUTPUT_PARAMETER_NULL;
+ }
+
+ export_data->data = nullptr;
+ export_data->data_length = 0;
+
+ ExportKeyRequest request(message_version_);
+ request.key_format = export_format;
+ request.SetKeyMaterial(*key_to_export);
+ AddClientAndAppData(client_id, app_data, &request);
+
+ ExportKeyResponse response(message_version_);
+ keymaster_error_t err = Send(KM_EXPORT_KEY, request, &response);
+ if (err != KM_ERROR_OK) {
+ return err;
+ }
+
+ export_data->data_length = response.key_data_length;
+ export_data->data = DuplicateBuffer(response.key_data, response.key_data_length);
+ if (!export_data->data) {
+ return KM_ERROR_MEMORY_ALLOCATION_FAILED;
+ }
+
return KM_ERROR_OK;
}