1*789431f2SAndroid Build Coastguard Worker /*
2*789431f2SAndroid Build Coastguard Worker * Copyright 2020, The Android Open Source Project
3*789431f2SAndroid Build Coastguard Worker *
4*789431f2SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*789431f2SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*789431f2SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*789431f2SAndroid Build Coastguard Worker *
8*789431f2SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*789431f2SAndroid Build Coastguard Worker *
10*789431f2SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*789431f2SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*789431f2SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*789431f2SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*789431f2SAndroid Build Coastguard Worker * limitations under the License.
15*789431f2SAndroid Build Coastguard Worker */
16*789431f2SAndroid Build Coastguard Worker
17*789431f2SAndroid Build Coastguard Worker #define LOG_TAG "android.hardware.security.keymint-impl"
18*789431f2SAndroid Build Coastguard Worker #include <log/log.h>
19*789431f2SAndroid Build Coastguard Worker
20*789431f2SAndroid Build Coastguard Worker #include "AndroidKeyMintOperation.h"
21*789431f2SAndroid Build Coastguard Worker
22*789431f2SAndroid Build Coastguard Worker #include <aidl/android/hardware/security/keymint/ErrorCode.h>
23*789431f2SAndroid Build Coastguard Worker #include <aidl/android/hardware/security/secureclock/ISecureClock.h>
24*789431f2SAndroid Build Coastguard Worker
25*789431f2SAndroid Build Coastguard Worker #include <keymaster/android_keymaster.h>
26*789431f2SAndroid Build Coastguard Worker
27*789431f2SAndroid Build Coastguard Worker #include "KeyMintUtils.h"
28*789431f2SAndroid Build Coastguard Worker
29*789431f2SAndroid Build Coastguard Worker namespace aidl::android::hardware::security::keymint {
30*789431f2SAndroid Build Coastguard Worker
31*789431f2SAndroid Build Coastguard Worker using ::keymaster::AbortOperationRequest;
32*789431f2SAndroid Build Coastguard Worker using ::keymaster::AbortOperationResponse;
33*789431f2SAndroid Build Coastguard Worker using ::keymaster::FinishOperationRequest;
34*789431f2SAndroid Build Coastguard Worker using ::keymaster::FinishOperationResponse;
35*789431f2SAndroid Build Coastguard Worker using ::keymaster::TAG_ASSOCIATED_DATA;
36*789431f2SAndroid Build Coastguard Worker using ::keymaster::UpdateOperationRequest;
37*789431f2SAndroid Build Coastguard Worker using ::keymaster::UpdateOperationResponse;
38*789431f2SAndroid Build Coastguard Worker using secureclock::TimeStampToken;
39*789431f2SAndroid Build Coastguard Worker using namespace km_utils; // NOLINT(google-build-using-namespace)
40*789431f2SAndroid Build Coastguard Worker
AndroidKeyMintOperation(shared_ptr<::keymaster::AndroidKeymaster> implementation,keymaster_operation_handle_t opHandle)41*789431f2SAndroid Build Coastguard Worker AndroidKeyMintOperation::AndroidKeyMintOperation(
42*789431f2SAndroid Build Coastguard Worker shared_ptr<::keymaster::AndroidKeymaster> implementation, keymaster_operation_handle_t opHandle)
43*789431f2SAndroid Build Coastguard Worker : impl_(std::move(implementation)), opHandle_(opHandle) {}
44*789431f2SAndroid Build Coastguard Worker
~AndroidKeyMintOperation()45*789431f2SAndroid Build Coastguard Worker AndroidKeyMintOperation::~AndroidKeyMintOperation() {
46*789431f2SAndroid Build Coastguard Worker if (opHandle_ != 0) {
47*789431f2SAndroid Build Coastguard Worker abort();
48*789431f2SAndroid Build Coastguard Worker }
49*789431f2SAndroid Build Coastguard Worker }
50*789431f2SAndroid Build Coastguard Worker
51*789431f2SAndroid Build Coastguard Worker ScopedAStatus
updateAad(const vector<uint8_t> & input,const optional<HardwareAuthToken> & authToken,const optional<TimeStampToken> &)52*789431f2SAndroid Build Coastguard Worker AndroidKeyMintOperation::updateAad(const vector<uint8_t>& input,
53*789431f2SAndroid Build Coastguard Worker const optional<HardwareAuthToken>& authToken,
54*789431f2SAndroid Build Coastguard Worker const optional<TimeStampToken>& /* timestampToken */) {
55*789431f2SAndroid Build Coastguard Worker UpdateOperationRequest request(impl_->message_version());
56*789431f2SAndroid Build Coastguard Worker request.op_handle = opHandle_;
57*789431f2SAndroid Build Coastguard Worker request.additional_params.push_back(TAG_ASSOCIATED_DATA, input.data(), input.size());
58*789431f2SAndroid Build Coastguard Worker if (authToken) {
59*789431f2SAndroid Build Coastguard Worker auto tokenAsVec(authToken2AidlVec(*authToken));
60*789431f2SAndroid Build Coastguard Worker request.additional_params.push_back(keymaster::TAG_AUTH_TOKEN, tokenAsVec.data(),
61*789431f2SAndroid Build Coastguard Worker tokenAsVec.size());
62*789431f2SAndroid Build Coastguard Worker }
63*789431f2SAndroid Build Coastguard Worker
64*789431f2SAndroid Build Coastguard Worker UpdateOperationResponse response(impl_->message_version());
65*789431f2SAndroid Build Coastguard Worker impl_->UpdateOperation(request, &response);
66*789431f2SAndroid Build Coastguard Worker
67*789431f2SAndroid Build Coastguard Worker return kmError2ScopedAStatus(response.error);
68*789431f2SAndroid Build Coastguard Worker }
69*789431f2SAndroid Build Coastguard Worker
update(const vector<uint8_t> & input,const optional<HardwareAuthToken> & authToken,const optional<TimeStampToken> &,vector<uint8_t> * output)70*789431f2SAndroid Build Coastguard Worker ScopedAStatus AndroidKeyMintOperation::update(const vector<uint8_t>& input,
71*789431f2SAndroid Build Coastguard Worker const optional<HardwareAuthToken>& authToken,
72*789431f2SAndroid Build Coastguard Worker const optional<TimeStampToken>&
73*789431f2SAndroid Build Coastguard Worker /* timestampToken */,
74*789431f2SAndroid Build Coastguard Worker vector<uint8_t>* output) {
75*789431f2SAndroid Build Coastguard Worker if (!output) return kmError2ScopedAStatus(KM_ERROR_OUTPUT_PARAMETER_NULL);
76*789431f2SAndroid Build Coastguard Worker
77*789431f2SAndroid Build Coastguard Worker UpdateOperationRequest request(impl_->message_version());
78*789431f2SAndroid Build Coastguard Worker request.op_handle = opHandle_;
79*789431f2SAndroid Build Coastguard Worker request.input.Reinitialize(input.data(), input.size());
80*789431f2SAndroid Build Coastguard Worker if (authToken) {
81*789431f2SAndroid Build Coastguard Worker auto tokenAsVec(authToken2AidlVec(*authToken));
82*789431f2SAndroid Build Coastguard Worker request.additional_params.push_back(keymaster::TAG_AUTH_TOKEN, tokenAsVec.data(),
83*789431f2SAndroid Build Coastguard Worker tokenAsVec.size());
84*789431f2SAndroid Build Coastguard Worker }
85*789431f2SAndroid Build Coastguard Worker
86*789431f2SAndroid Build Coastguard Worker UpdateOperationResponse response(impl_->message_version());
87*789431f2SAndroid Build Coastguard Worker impl_->UpdateOperation(request, &response);
88*789431f2SAndroid Build Coastguard Worker
89*789431f2SAndroid Build Coastguard Worker if (response.error != KM_ERROR_OK) return kmError2ScopedAStatus(response.error);
90*789431f2SAndroid Build Coastguard Worker if (response.input_consumed != request.input.buffer_size()) {
91*789431f2SAndroid Build Coastguard Worker return kmError2ScopedAStatus(KM_ERROR_UNKNOWN_ERROR);
92*789431f2SAndroid Build Coastguard Worker }
93*789431f2SAndroid Build Coastguard Worker
94*789431f2SAndroid Build Coastguard Worker *output = kmBuffer2vector(response.output);
95*789431f2SAndroid Build Coastguard Worker return ScopedAStatus::ok();
96*789431f2SAndroid Build Coastguard Worker }
97*789431f2SAndroid Build Coastguard Worker
98*789431f2SAndroid Build Coastguard Worker ScopedAStatus
finish(const optional<vector<uint8_t>> & input,const optional<vector<uint8_t>> & signature,const optional<HardwareAuthToken> & authToken,const optional<TimeStampToken> &,const optional<vector<uint8_t>> &,vector<uint8_t> * output)99*789431f2SAndroid Build Coastguard Worker AndroidKeyMintOperation::finish(const optional<vector<uint8_t>>& input, //
100*789431f2SAndroid Build Coastguard Worker const optional<vector<uint8_t>>& signature, //
101*789431f2SAndroid Build Coastguard Worker const optional<HardwareAuthToken>& authToken,
102*789431f2SAndroid Build Coastguard Worker const optional<TimeStampToken>& /* timestampToken */,
103*789431f2SAndroid Build Coastguard Worker const optional<vector<uint8_t>>& /* confirmationToken */,
104*789431f2SAndroid Build Coastguard Worker vector<uint8_t>* output) {
105*789431f2SAndroid Build Coastguard Worker
106*789431f2SAndroid Build Coastguard Worker if (!output) {
107*789431f2SAndroid Build Coastguard Worker return ScopedAStatus(AStatus_fromServiceSpecificError(
108*789431f2SAndroid Build Coastguard Worker static_cast<int32_t>(ErrorCode::OUTPUT_PARAMETER_NULL)));
109*789431f2SAndroid Build Coastguard Worker }
110*789431f2SAndroid Build Coastguard Worker
111*789431f2SAndroid Build Coastguard Worker FinishOperationRequest request(impl_->message_version());
112*789431f2SAndroid Build Coastguard Worker request.op_handle = opHandle_;
113*789431f2SAndroid Build Coastguard Worker if (input) request.input.Reinitialize(input->data(), input->size());
114*789431f2SAndroid Build Coastguard Worker if (signature) request.signature.Reinitialize(signature->data(), signature->size());
115*789431f2SAndroid Build Coastguard Worker if (authToken) {
116*789431f2SAndroid Build Coastguard Worker auto tokenAsVec(authToken2AidlVec(*authToken));
117*789431f2SAndroid Build Coastguard Worker request.additional_params.push_back(keymaster::TAG_AUTH_TOKEN, tokenAsVec.data(),
118*789431f2SAndroid Build Coastguard Worker tokenAsVec.size());
119*789431f2SAndroid Build Coastguard Worker }
120*789431f2SAndroid Build Coastguard Worker
121*789431f2SAndroid Build Coastguard Worker FinishOperationResponse response(impl_->message_version());
122*789431f2SAndroid Build Coastguard Worker impl_->FinishOperation(request, &response);
123*789431f2SAndroid Build Coastguard Worker opHandle_ = 0;
124*789431f2SAndroid Build Coastguard Worker
125*789431f2SAndroid Build Coastguard Worker if (response.error != KM_ERROR_OK) return kmError2ScopedAStatus(response.error);
126*789431f2SAndroid Build Coastguard Worker
127*789431f2SAndroid Build Coastguard Worker *output = kmBuffer2vector(response.output);
128*789431f2SAndroid Build Coastguard Worker return ScopedAStatus::ok();
129*789431f2SAndroid Build Coastguard Worker }
130*789431f2SAndroid Build Coastguard Worker
abort()131*789431f2SAndroid Build Coastguard Worker ScopedAStatus AndroidKeyMintOperation::abort() {
132*789431f2SAndroid Build Coastguard Worker AbortOperationRequest request(impl_->message_version());
133*789431f2SAndroid Build Coastguard Worker request.op_handle = opHandle_;
134*789431f2SAndroid Build Coastguard Worker
135*789431f2SAndroid Build Coastguard Worker AbortOperationResponse response(impl_->message_version());
136*789431f2SAndroid Build Coastguard Worker impl_->AbortOperation(request, &response);
137*789431f2SAndroid Build Coastguard Worker opHandle_ = 0;
138*789431f2SAndroid Build Coastguard Worker
139*789431f2SAndroid Build Coastguard Worker return kmError2ScopedAStatus(response.error);
140*789431f2SAndroid Build Coastguard Worker }
141*789431f2SAndroid Build Coastguard Worker
142*789431f2SAndroid Build Coastguard Worker } // namespace aidl::android::hardware::security::keymint
143