Refactor AndroidKeyMintDevice::update.
Test: VtsAidlKeyMintTargetTest
Change-Id: I3709830a78bc6ff479b1236c52aef1ac3e516e83
diff --git a/ng/AndroidKeyMintOperation.cpp b/ng/AndroidKeyMintOperation.cpp
index d1770a0..ffd4f24 100644
--- a/ng/AndroidKeyMintOperation.cpp
+++ b/ng/AndroidKeyMintOperation.cpp
@@ -30,8 +30,10 @@
using ::keymaster::AbortOperationRequest;
using ::keymaster::AbortOperationResponse;
+using ::keymaster::Buffer;
using ::keymaster::FinishOperationRequest;
using ::keymaster::FinishOperationResponse;
+using ::keymaster::TAG_ASSOCIATED_DATA;
using ::keymaster::UpdateOperationRequest;
using ::keymaster::UpdateOperationResponse;
using secureclock::TimeStampToken;
@@ -48,89 +50,69 @@
}
}
-ScopedAStatus AndroidKeyMintOperation::update(const optional<KeyParameterArray>& params,
- const optional<vector<uint8_t>>& input,
- const optional<HardwareAuthToken>& /* authToken */,
- const optional<TimeStampToken>&
- /* verificationToken */,
- optional<KeyParameterArray>* updatedParams,
- optional<ByteArray>* output, int32_t* inputConsumed) {
- if (!updatedParams || !output || !inputConsumed) {
- return kmError2ScopedAStatus(KM_ERROR_OUTPUT_PARAMETER_NULL);
- }
-
+ScopedAStatus
+AndroidKeyMintOperation::updateAad(const vector<uint8_t>& input,
+ const optional<HardwareAuthToken>& /* authToken */,
+ const optional<TimeStampToken>& /* timestampToken */) {
UpdateOperationRequest request(impl_->message_version());
request.op_handle = opHandle_;
- if (input) {
- request.input.Reinitialize(input->data(), input->size());
- }
-
- if (params) {
- request.additional_params.Reinitialize(KmParamSet(params->params));
- }
+ request.additional_params.push_back(TAG_ASSOCIATED_DATA, input.data(), input.size());
UpdateOperationResponse response(impl_->message_version());
impl_->UpdateOperation(request, &response);
- *inputConsumed = 0;
- if (response.error == KM_ERROR_OK) {
- *inputConsumed = response.input_consumed;
-
- updatedParams->emplace();
- (*updatedParams)->params = kmParamSet2Aidl(response.output_params);
-
- output->emplace();
- (*output)->data = kmBuffer2vector(response.output);
-
- return ScopedAStatus::ok();
- }
-
- opHandle_ = 0;
return kmError2ScopedAStatus(response.error);
}
-ScopedAStatus AndroidKeyMintOperation::finish(const optional<KeyParameterArray>& params,
- const optional<vector<uint8_t>>& input,
- const optional<vector<uint8_t>>& signature,
+ScopedAStatus AndroidKeyMintOperation::update(const vector<uint8_t>& input,
const optional<HardwareAuthToken>& /* authToken */,
const optional<TimeStampToken>&
- /* verificationToken */,
- optional<KeyParameterArray>* updatedParams,
+ /* timestampToken */,
vector<uint8_t>* output) {
+ if (!output) return kmError2ScopedAStatus(KM_ERROR_OUTPUT_PARAMETER_NULL);
- if (!updatedParams || !output) {
+ UpdateOperationRequest request(impl_->message_version());
+ request.op_handle = opHandle_;
+ request.input.Reinitialize(input.data(), input.size());
+
+ UpdateOperationResponse response(impl_->message_version());
+ impl_->UpdateOperation(request, &response);
+
+ if (response.error != KM_ERROR_OK) return kmError2ScopedAStatus(response.error);
+ if (response.input_consumed != request.input.buffer_size()) {
+ return kmError2ScopedAStatus(KM_ERROR_UNKNOWN_ERROR);
+ }
+
+ *output = kmBuffer2vector(response.output);
+ return ScopedAStatus::ok();
+}
+
+ScopedAStatus
+AndroidKeyMintOperation::finish(const optional<vector<uint8_t>>& input, //
+ const optional<vector<uint8_t>>& signature, //
+ const optional<HardwareAuthToken>& /* authToken */,
+ const optional<TimeStampToken>& /* timestampToken */,
+ const optional<vector<uint8_t>>& /* confirmationToken */,
+ vector<uint8_t>* output) {
+
+ if (!output) {
return ScopedAStatus(AStatus_fromServiceSpecificError(
static_cast<int32_t>(ErrorCode::OUTPUT_PARAMETER_NULL)));
}
FinishOperationRequest request(impl_->message_version());
request.op_handle = opHandle_;
-
- if (input) {
- request.input.Reinitialize(input->data(), input->size());
- }
-
- if (signature) {
- request.signature.Reinitialize(signature->data(), signature->size());
- }
-
- if (params) {
- request.additional_params.Reinitialize(KmParamSet(params->params));
- }
+ if (input) request.input.Reinitialize(input->data(), input->size());
+ if (signature) request.signature.Reinitialize(signature->data(), signature->size());
FinishOperationResponse response(impl_->message_version());
impl_->FinishOperation(request, &response);
opHandle_ = 0;
- if (response.error == KM_ERROR_OK) {
- updatedParams->emplace();
- (*updatedParams)->params = kmParamSet2Aidl(response.output_params);
+ if (response.error != KM_ERROR_OK) return kmError2ScopedAStatus(response.error);
- *output = kmBuffer2vector(response.output);
- return ScopedAStatus::ok();
- }
-
- return kmError2ScopedAStatus(response.error);
+ *output = kmBuffer2vector(response.output);
+ return ScopedAStatus::ok();
}
ScopedAStatus AndroidKeyMintOperation::abort() {