summaryrefslogtreecommitdiffstats
path: root/trusty
diff options
context:
space:
mode:
authorJocelyn Bohr <bohr@google.com>2017-02-09 17:28:14 -0800
committerJocelyn Bohr <bohr@google.com>2017-04-10 17:33:49 -0700
commit2d768669fae9e45fb852e5e862640aad06294ac2 (patch)
tree30ba7a24d73c2ec698077ed85d24090530a4d8cf /trusty
parenta02270fdd9a249717d788ba20419a4c80426bb87 (diff)
downloadsystem_core-2d768669fae9e45fb852e5e862640aad06294ac2.tar.gz
system_core-2d768669fae9e45fb852e5e862640aad06294ac2.tar.bz2
system_core-2d768669fae9e45fb852e5e862640aad06294ac2.zip
trusty: keymaster: Implement import_key
Test: builds Change-Id: Ie130df9958d0a75fdedb463a38ea2625e88940db
Diffstat (limited to 'trusty')
-rw-r--r--trusty/keymaster/trusty_keymaster_device.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/trusty/keymaster/trusty_keymaster_device.cpp b/trusty/keymaster/trusty_keymaster_device.cpp
index 7ada00246..04826dffc 100644
--- a/trusty/keymaster/trusty_keymaster_device.cpp
+++ b/trusty/keymaster/trusty_keymaster_device.cpp
@@ -278,6 +278,42 @@ keymaster_error_t TrustyKeymasterDevice::import_key(
const keymaster_blob_t* key_data, keymaster_key_blob_t* key_blob,
keymaster_key_characteristics_t* characteristics) {
ALOGD("Device received import_key");
+
+ if (error_ != KM_ERROR_OK) {
+ return error_;
+ }
+ if (!params || !key_data) {
+ return KM_ERROR_UNEXPECTED_NULL_POINTER;
+ }
+ if (!key_blob) {
+ return KM_ERROR_OUTPUT_PARAMETER_NULL;
+ }
+
+ ImportKeyRequest request(message_version_);
+ request.key_description.Reinitialize(*params);
+ request.key_description.push_back(TAG_CREATION_DATETIME, java_time(time(NULL)));
+
+ request.key_format = key_format;
+ request.SetKeyMaterial(key_data->data, key_data->data_length);
+
+ ImportKeyResponse response(message_version_);
+ keymaster_error_t err = Send(KM_IMPORT_KEY, request, &response);
+ if (err != KM_ERROR_OK) {
+ return err;
+ }
+
+ key_blob->key_material_size = response.key_blob.key_material_size;
+ key_blob->key_material =
+ DuplicateBuffer(response.key_blob.key_material, response.key_blob.key_material_size);
+ if (!key_blob->key_material) {
+ return KM_ERROR_MEMORY_ALLOCATION_FAILED;
+ }
+
+ if (characteristics) {
+ response.enforced.CopyToParamSet(&characteristics->hw_enforced);
+ response.unenforced.CopyToParamSet(&characteristics->sw_enforced);
+ }
+
return KM_ERROR_OK;
}