diff options
| author | Jocelyn Bohr <bohr@google.com> | 2017-02-09 17:16:51 -0800 |
|---|---|---|
| committer | Jocelyn Bohr <bohr@google.com> | 2017-04-10 17:21:10 -0700 |
| commit | e514dd8ad4468411c38806092c87612e0911e155 (patch) | |
| tree | a25dd01608dde55804ef013ecf9489eb35334a6e /trusty | |
| parent | 126402aae76f54fcf53f21d1f16a1ed158683544 (diff) | |
| download | system_core-e514dd8ad4468411c38806092c87612e0911e155.tar.gz system_core-e514dd8ad4468411c38806092c87612e0911e155.tar.bz2 system_core-e514dd8ad4468411c38806092c87612e0911e155.zip | |
trusty: keymaster: Implement generate_key
Test: builds
Change-Id: Ib77e29709eed2e5f0cd16ed214db61f4257fcebd
Diffstat (limited to 'trusty')
| -rw-r--r-- | trusty/keymaster/trusty_keymaster_device.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/trusty/keymaster/trusty_keymaster_device.cpp b/trusty/keymaster/trusty_keymaster_device.cpp index c1c43f544..f66804604 100644 --- a/trusty/keymaster/trusty_keymaster_device.cpp +++ b/trusty/keymaster/trusty_keymaster_device.cpp @@ -136,6 +136,20 @@ TrustyKeymasterDevice::~TrustyKeymasterDevice() { trusty_keymaster_disconnect(); } +namespace { + +// Allocates a new buffer with malloc and copies the contents of |buffer| to it. Caller takes +// ownership of the returned buffer. +uint8_t* DuplicateBuffer(const uint8_t* buffer, size_t size) { + uint8_t* tmp = reinterpret_cast<uint8_t*>(malloc(size)); + if (tmp) { + memcpy(tmp, buffer, size); + } + return tmp; +} + +} // unnamed namespace + keymaster_error_t TrustyKeymasterDevice::configure(const keymaster_key_param_set_t* params) { ALOGD("Device received configure\n"); @@ -180,6 +194,39 @@ keymaster_error_t TrustyKeymasterDevice::generate_key( const keymaster_key_param_set_t* params, keymaster_key_blob_t* key_blob, keymaster_key_characteristics_t* characteristics) { ALOGD("Device received generate_key"); + + if (error_ != KM_ERROR_OK) { + return error_; + } + if (!params) { + return KM_ERROR_UNEXPECTED_NULL_POINTER; + } + if (!key_blob) { + return KM_ERROR_OUTPUT_PARAMETER_NULL; + } + + GenerateKeyRequest request(message_version_); + request.key_description.Reinitialize(*params); + request.key_description.push_back(TAG_CREATION_DATETIME, java_time(time(NULL))); + + GenerateKeyResponse response(message_version_); + keymaster_error_t err = Send(KM_GENERATE_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; } |
