diff options
| author | Jocelyn Bohr <bohr@google.com> | 2017-02-09 17:44:48 -0800 |
|---|---|---|
| committer | Jocelyn Bohr <bohr@google.com> | 2017-04-10 17:33:49 -0700 |
| commit | e57f3ce2bf1536b80339b73bf664134d811a4bc9 (patch) | |
| tree | e9bca6040bfaed90208b7e2da6e8ecb10f0a2138 /trusty | |
| parent | 86eb9661068204221f56881ceb5e7afba3199010 (diff) | |
| download | system_core-e57f3ce2bf1536b80339b73bf664134d811a4bc9.tar.gz system_core-e57f3ce2bf1536b80339b73bf664134d811a4bc9.tar.bz2 system_core-e57f3ce2bf1536b80339b73bf664134d811a4bc9.zip | |
trusty: keymaster: Implement finish
Test: builds
Change-Id: I8505f428613176eea5373a459bbce0de17406c55
Diffstat (limited to 'trusty')
| -rw-r--r-- | trusty/keymaster/trusty_keymaster_device.cpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/trusty/keymaster/trusty_keymaster_device.cpp b/trusty/keymaster/trusty_keymaster_device.cpp index bc390d7bc..3f326400e 100644 --- a/trusty/keymaster/trusty_keymaster_device.cpp +++ b/trusty/keymaster/trusty_keymaster_device.cpp @@ -40,6 +40,7 @@ const uint32_t RECV_BUF_SIZE = PAGE_SIZE; const uint32_t SEND_BUF_SIZE = (PAGE_SIZE - sizeof(struct keymaster_message) - 16 /* tipc header */); const size_t kMaximumAttestationChallengeLength = 128; +const size_t kMaximumFinishInputLength = 2048; namespace keymaster { @@ -570,6 +571,56 @@ keymaster_error_t TrustyKeymasterDevice::finish(keymaster_operation_handle_t ope keymaster_key_param_set_t* out_params, keymaster_blob_t* output) { ALOGD("Device received finish"); + + if (error_ != KM_ERROR_OK) { + return error_; + } + if (input && input->data_length > kMaximumFinishInputLength) { + return KM_ERROR_INVALID_ARGUMENT; + } + + if (out_params) { + *out_params = {}; + } + if (output) { + *output = {}; + } + + FinishOperationRequest request; + request.op_handle = operation_handle; + if (signature && signature->data && signature->data_length > 0) { + request.signature.Reinitialize(signature->data, signature->data_length); + } + if (input && input->data && input->data_length) { + request.input.Reinitialize(input->data, input->data_length); + } + if (in_params) { + request.additional_params.Reinitialize(*in_params); + } + + FinishOperationResponse response; + keymaster_error_t err = Send(KM_FINISH_OPERATION, request, &response); + if (err != KM_ERROR_OK) { + return err; + } + + if (response.output_params.size() > 0) { + if (out_params) { + response.output_params.CopyToParamSet(out_params); + } else { + return KM_ERROR_OUTPUT_PARAMETER_NULL; + } + } + if (output) { + output->data_length = response.output.available_read(); + output->data = DuplicateBuffer(response.output.peek_read(), output->data_length); + if (!output->data) { + return KM_ERROR_MEMORY_ALLOCATION_FAILED; + } + } else if (response.output.available_read() > 0) { + return KM_ERROR_OUTPUT_PARAMETER_NULL; + } + return KM_ERROR_OK; } |
