1*789431f2SAndroid Build Coastguard Worker /*
2*789431f2SAndroid Build Coastguard Worker **
3*789431f2SAndroid Build Coastguard Worker ** Copyright 2017, The Android Open Source Project
4*789431f2SAndroid Build Coastguard Worker **
5*789431f2SAndroid Build Coastguard Worker ** Licensed under the Apache License, Version 2.0 (the "License");
6*789431f2SAndroid Build Coastguard Worker ** you may not use this file except in compliance with the License.
7*789431f2SAndroid Build Coastguard Worker ** You may obtain a copy of the License at
8*789431f2SAndroid Build Coastguard Worker **
9*789431f2SAndroid Build Coastguard Worker ** http://www.apache.org/licenses/LICENSE-2.0
10*789431f2SAndroid Build Coastguard Worker **
11*789431f2SAndroid Build Coastguard Worker ** Unless required by applicable law or agreed to in writing, software
12*789431f2SAndroid Build Coastguard Worker ** distributed under the License is distributed on an "AS IS" BASIS,
13*789431f2SAndroid Build Coastguard Worker ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*789431f2SAndroid Build Coastguard Worker ** See the License for the specific language governing permissions and
15*789431f2SAndroid Build Coastguard Worker ** limitations under the License.
16*789431f2SAndroid Build Coastguard Worker */
17*789431f2SAndroid Build Coastguard Worker
18*789431f2SAndroid Build Coastguard Worker #define LOG_TAG "[email protected]"
19*789431f2SAndroid Build Coastguard Worker #include <log/log.h>
20*789431f2SAndroid Build Coastguard Worker
21*789431f2SAndroid Build Coastguard Worker #include "include/AndroidKeymaster4Device.h"
22*789431f2SAndroid Build Coastguard Worker
23*789431f2SAndroid Build Coastguard Worker #include <keymasterV4_0/authorization_set.h>
24*789431f2SAndroid Build Coastguard Worker #include <keymasterV4_0/keymaster_utils.h>
25*789431f2SAndroid Build Coastguard Worker
26*789431f2SAndroid Build Coastguard Worker #include <keymaster/android_keymaster.h>
27*789431f2SAndroid Build Coastguard Worker #include <keymaster/android_keymaster_messages.h>
28*789431f2SAndroid Build Coastguard Worker #include <keymaster/contexts/pure_soft_keymaster_context.h>
29*789431f2SAndroid Build Coastguard Worker #include <keymaster/contexts/soft_keymaster_context.h>
30*789431f2SAndroid Build Coastguard Worker #include <keymaster/keymaster_configuration.h>
31*789431f2SAndroid Build Coastguard Worker #include <keymaster/keymaster_enforcement.h>
32*789431f2SAndroid Build Coastguard Worker #include <keymaster/km_openssl/soft_keymaster_enforcement.h>
33*789431f2SAndroid Build Coastguard Worker
34*789431f2SAndroid Build Coastguard Worker using android::hardware::keymaster::V4_0::support::authToken2HidlVec;
35*789431f2SAndroid Build Coastguard Worker
36*789431f2SAndroid Build Coastguard Worker namespace keymaster {
37*789431f2SAndroid Build Coastguard Worker namespace V4_0 {
38*789431f2SAndroid Build Coastguard Worker namespace ng {
39*789431f2SAndroid Build Coastguard Worker
40*789431f2SAndroid Build Coastguard Worker namespace {
41*789431f2SAndroid Build Coastguard Worker
42*789431f2SAndroid Build Coastguard Worker constexpr size_t kOperationTableSize = 16;
43*789431f2SAndroid Build Coastguard Worker
legacy_enum_conversion(const Tag value)44*789431f2SAndroid Build Coastguard Worker inline keymaster_tag_t legacy_enum_conversion(const Tag value) {
45*789431f2SAndroid Build Coastguard Worker return keymaster_tag_t(value);
46*789431f2SAndroid Build Coastguard Worker }
47*789431f2SAndroid Build Coastguard Worker
legacy_enum_conversion(const keymaster_tag_t value)48*789431f2SAndroid Build Coastguard Worker inline Tag legacy_enum_conversion(const keymaster_tag_t value) {
49*789431f2SAndroid Build Coastguard Worker return Tag(value);
50*789431f2SAndroid Build Coastguard Worker }
51*789431f2SAndroid Build Coastguard Worker
legacy_enum_conversion(const KeyPurpose value)52*789431f2SAndroid Build Coastguard Worker inline keymaster_purpose_t legacy_enum_conversion(const KeyPurpose value) {
53*789431f2SAndroid Build Coastguard Worker return static_cast<keymaster_purpose_t>(value);
54*789431f2SAndroid Build Coastguard Worker }
55*789431f2SAndroid Build Coastguard Worker
legacy_enum_conversion(const KeyFormat value)56*789431f2SAndroid Build Coastguard Worker inline keymaster_key_format_t legacy_enum_conversion(const KeyFormat value) {
57*789431f2SAndroid Build Coastguard Worker return static_cast<keymaster_key_format_t>(value);
58*789431f2SAndroid Build Coastguard Worker }
59*789431f2SAndroid Build Coastguard Worker
legacy_enum_conversion(const keymaster_security_level_t value)60*789431f2SAndroid Build Coastguard Worker inline SecurityLevel legacy_enum_conversion(const keymaster_security_level_t value) {
61*789431f2SAndroid Build Coastguard Worker return static_cast<SecurityLevel>(value);
62*789431f2SAndroid Build Coastguard Worker }
63*789431f2SAndroid Build Coastguard Worker
legacy_enum_conversion(const HardwareAuthenticatorType value)64*789431f2SAndroid Build Coastguard Worker inline hw_authenticator_type_t legacy_enum_conversion(const HardwareAuthenticatorType value) {
65*789431f2SAndroid Build Coastguard Worker return static_cast<hw_authenticator_type_t>(value);
66*789431f2SAndroid Build Coastguard Worker }
67*789431f2SAndroid Build Coastguard Worker
legacy_enum_conversion(const keymaster_error_t value)68*789431f2SAndroid Build Coastguard Worker inline ErrorCode legacy_enum_conversion(const keymaster_error_t value) {
69*789431f2SAndroid Build Coastguard Worker return static_cast<ErrorCode>(value);
70*789431f2SAndroid Build Coastguard Worker }
71*789431f2SAndroid Build Coastguard Worker
typeFromTag(const keymaster_tag_t tag)72*789431f2SAndroid Build Coastguard Worker inline keymaster_tag_type_t typeFromTag(const keymaster_tag_t tag) {
73*789431f2SAndroid Build Coastguard Worker return keymaster_tag_get_type(tag);
74*789431f2SAndroid Build Coastguard Worker }
75*789431f2SAndroid Build Coastguard Worker
76*789431f2SAndroid Build Coastguard Worker class KmParamSet : public keymaster_key_param_set_t {
77*789431f2SAndroid Build Coastguard Worker public:
KmParamSet(const hidl_vec<KeyParameter> & keyParams)78*789431f2SAndroid Build Coastguard Worker explicit KmParamSet(const hidl_vec<KeyParameter>& keyParams)
79*789431f2SAndroid Build Coastguard Worker : keymaster_key_param_set_t(hidlKeyParams2Km(keyParams)) {}
KmParamSet(KmParamSet && other)80*789431f2SAndroid Build Coastguard Worker KmParamSet(KmParamSet&& other) : keymaster_key_param_set_t{other.params, other.length} {
81*789431f2SAndroid Build Coastguard Worker other.length = 0;
82*789431f2SAndroid Build Coastguard Worker other.params = nullptr;
83*789431f2SAndroid Build Coastguard Worker }
84*789431f2SAndroid Build Coastguard Worker KmParamSet(const KmParamSet&) = delete;
~KmParamSet()85*789431f2SAndroid Build Coastguard Worker ~KmParamSet() { delete[] params; }
86*789431f2SAndroid Build Coastguard Worker };
87*789431f2SAndroid Build Coastguard Worker
kmBlob2hidlVec(const keymaster_key_blob_t & blob)88*789431f2SAndroid Build Coastguard Worker inline hidl_vec<uint8_t> kmBlob2hidlVec(const keymaster_key_blob_t& blob) {
89*789431f2SAndroid Build Coastguard Worker hidl_vec<uint8_t> result;
90*789431f2SAndroid Build Coastguard Worker result.setToExternal(const_cast<unsigned char*>(blob.key_material), blob.key_material_size);
91*789431f2SAndroid Build Coastguard Worker return result;
92*789431f2SAndroid Build Coastguard Worker }
93*789431f2SAndroid Build Coastguard Worker
kmBlob2hidlVec(const keymaster_blob_t & blob)94*789431f2SAndroid Build Coastguard Worker inline hidl_vec<uint8_t> kmBlob2hidlVec(const keymaster_blob_t& blob) {
95*789431f2SAndroid Build Coastguard Worker hidl_vec<uint8_t> result;
96*789431f2SAndroid Build Coastguard Worker result.setToExternal(const_cast<unsigned char*>(blob.data), blob.data_length);
97*789431f2SAndroid Build Coastguard Worker return result;
98*789431f2SAndroid Build Coastguard Worker }
99*789431f2SAndroid Build Coastguard Worker
kmBuffer2hidlVec(const::keymaster::Buffer & buf)100*789431f2SAndroid Build Coastguard Worker inline hidl_vec<uint8_t> kmBuffer2hidlVec(const ::keymaster::Buffer& buf) {
101*789431f2SAndroid Build Coastguard Worker hidl_vec<uint8_t> result;
102*789431f2SAndroid Build Coastguard Worker result.setToExternal(const_cast<unsigned char*>(buf.peek_read()), buf.available_read());
103*789431f2SAndroid Build Coastguard Worker return result;
104*789431f2SAndroid Build Coastguard Worker }
105*789431f2SAndroid Build Coastguard Worker
106*789431f2SAndroid Build Coastguard Worker inline static hidl_vec<hidl_vec<uint8_t>>
kmCertChain2Hidl(const keymaster_cert_chain_t & cert_chain)107*789431f2SAndroid Build Coastguard Worker kmCertChain2Hidl(const keymaster_cert_chain_t& cert_chain) {
108*789431f2SAndroid Build Coastguard Worker hidl_vec<hidl_vec<uint8_t>> result;
109*789431f2SAndroid Build Coastguard Worker if (!cert_chain.entry_count || !cert_chain.entries) return result;
110*789431f2SAndroid Build Coastguard Worker
111*789431f2SAndroid Build Coastguard Worker result.resize(cert_chain.entry_count);
112*789431f2SAndroid Build Coastguard Worker for (size_t i = 0; i < cert_chain.entry_count; ++i) {
113*789431f2SAndroid Build Coastguard Worker result[i] = kmBlob2hidlVec(cert_chain.entries[i]);
114*789431f2SAndroid Build Coastguard Worker }
115*789431f2SAndroid Build Coastguard Worker
116*789431f2SAndroid Build Coastguard Worker return result;
117*789431f2SAndroid Build Coastguard Worker }
118*789431f2SAndroid Build Coastguard Worker
kmParamSet2Hidl(const keymaster_key_param_set_t & set)119*789431f2SAndroid Build Coastguard Worker static inline hidl_vec<KeyParameter> kmParamSet2Hidl(const keymaster_key_param_set_t& set) {
120*789431f2SAndroid Build Coastguard Worker hidl_vec<KeyParameter> result;
121*789431f2SAndroid Build Coastguard Worker if (set.length == 0 || set.params == nullptr) return result;
122*789431f2SAndroid Build Coastguard Worker
123*789431f2SAndroid Build Coastguard Worker result.resize(set.length);
124*789431f2SAndroid Build Coastguard Worker keymaster_key_param_t* params = set.params;
125*789431f2SAndroid Build Coastguard Worker for (size_t i = 0; i < set.length; ++i) {
126*789431f2SAndroid Build Coastguard Worker auto tag = params[i].tag;
127*789431f2SAndroid Build Coastguard Worker result[i].tag = legacy_enum_conversion(tag);
128*789431f2SAndroid Build Coastguard Worker switch (typeFromTag(tag)) {
129*789431f2SAndroid Build Coastguard Worker case KM_ENUM:
130*789431f2SAndroid Build Coastguard Worker case KM_ENUM_REP:
131*789431f2SAndroid Build Coastguard Worker result[i].f.integer = params[i].enumerated;
132*789431f2SAndroid Build Coastguard Worker break;
133*789431f2SAndroid Build Coastguard Worker case KM_UINT:
134*789431f2SAndroid Build Coastguard Worker case KM_UINT_REP:
135*789431f2SAndroid Build Coastguard Worker result[i].f.integer = params[i].integer;
136*789431f2SAndroid Build Coastguard Worker break;
137*789431f2SAndroid Build Coastguard Worker case KM_ULONG:
138*789431f2SAndroid Build Coastguard Worker case KM_ULONG_REP:
139*789431f2SAndroid Build Coastguard Worker result[i].f.longInteger = params[i].long_integer;
140*789431f2SAndroid Build Coastguard Worker break;
141*789431f2SAndroid Build Coastguard Worker case KM_DATE:
142*789431f2SAndroid Build Coastguard Worker result[i].f.dateTime = params[i].date_time;
143*789431f2SAndroid Build Coastguard Worker break;
144*789431f2SAndroid Build Coastguard Worker case KM_BOOL:
145*789431f2SAndroid Build Coastguard Worker result[i].f.boolValue = params[i].boolean;
146*789431f2SAndroid Build Coastguard Worker break;
147*789431f2SAndroid Build Coastguard Worker case KM_BIGNUM:
148*789431f2SAndroid Build Coastguard Worker case KM_BYTES:
149*789431f2SAndroid Build Coastguard Worker result[i].blob.setToExternal(const_cast<unsigned char*>(params[i].blob.data),
150*789431f2SAndroid Build Coastguard Worker params[i].blob.data_length);
151*789431f2SAndroid Build Coastguard Worker break;
152*789431f2SAndroid Build Coastguard Worker case KM_INVALID:
153*789431f2SAndroid Build Coastguard Worker default:
154*789431f2SAndroid Build Coastguard Worker params[i].tag = KM_TAG_INVALID;
155*789431f2SAndroid Build Coastguard Worker /* just skip */
156*789431f2SAndroid Build Coastguard Worker break;
157*789431f2SAndroid Build Coastguard Worker }
158*789431f2SAndroid Build Coastguard Worker }
159*789431f2SAndroid Build Coastguard Worker return result;
160*789431f2SAndroid Build Coastguard Worker }
161*789431f2SAndroid Build Coastguard Worker
addClientAndAppData(const hidl_vec<uint8_t> & clientId,const hidl_vec<uint8_t> & appData,::keymaster::AuthorizationSet * params)162*789431f2SAndroid Build Coastguard Worker void addClientAndAppData(const hidl_vec<uint8_t>& clientId, const hidl_vec<uint8_t>& appData,
163*789431f2SAndroid Build Coastguard Worker ::keymaster::AuthorizationSet* params) {
164*789431f2SAndroid Build Coastguard Worker params->Clear();
165*789431f2SAndroid Build Coastguard Worker if (clientId.size()) {
166*789431f2SAndroid Build Coastguard Worker params->push_back(::keymaster::TAG_APPLICATION_ID, clientId.data(), clientId.size());
167*789431f2SAndroid Build Coastguard Worker }
168*789431f2SAndroid Build Coastguard Worker if (appData.size()) {
169*789431f2SAndroid Build Coastguard Worker params->push_back(::keymaster::TAG_APPLICATION_DATA, appData.data(), appData.size());
170*789431f2SAndroid Build Coastguard Worker }
171*789431f2SAndroid Build Coastguard Worker }
172*789431f2SAndroid Build Coastguard Worker
173*789431f2SAndroid Build Coastguard Worker } // anonymous namespace
174*789431f2SAndroid Build Coastguard Worker
hidlKeyParams2Km(const hidl_vec<KeyParameter> & keyParams)175*789431f2SAndroid Build Coastguard Worker keymaster_key_param_set_t hidlKeyParams2Km(const hidl_vec<KeyParameter>& keyParams) {
176*789431f2SAndroid Build Coastguard Worker keymaster_key_param_set_t set;
177*789431f2SAndroid Build Coastguard Worker
178*789431f2SAndroid Build Coastguard Worker set.params = new (std::nothrow) keymaster_key_param_t[keyParams.size()];
179*789431f2SAndroid Build Coastguard Worker set.length = keyParams.size();
180*789431f2SAndroid Build Coastguard Worker
181*789431f2SAndroid Build Coastguard Worker for (size_t i = 0; i < keyParams.size(); ++i) {
182*789431f2SAndroid Build Coastguard Worker auto tag = legacy_enum_conversion(keyParams[i].tag);
183*789431f2SAndroid Build Coastguard Worker switch (typeFromTag(tag)) {
184*789431f2SAndroid Build Coastguard Worker case KM_ENUM:
185*789431f2SAndroid Build Coastguard Worker case KM_ENUM_REP:
186*789431f2SAndroid Build Coastguard Worker set.params[i] = keymaster_param_enum(tag, keyParams[i].f.integer);
187*789431f2SAndroid Build Coastguard Worker break;
188*789431f2SAndroid Build Coastguard Worker case KM_UINT:
189*789431f2SAndroid Build Coastguard Worker case KM_UINT_REP:
190*789431f2SAndroid Build Coastguard Worker set.params[i] = keymaster_param_int(tag, keyParams[i].f.integer);
191*789431f2SAndroid Build Coastguard Worker break;
192*789431f2SAndroid Build Coastguard Worker case KM_ULONG:
193*789431f2SAndroid Build Coastguard Worker case KM_ULONG_REP:
194*789431f2SAndroid Build Coastguard Worker set.params[i] = keymaster_param_long(tag, keyParams[i].f.longInteger);
195*789431f2SAndroid Build Coastguard Worker break;
196*789431f2SAndroid Build Coastguard Worker case KM_DATE:
197*789431f2SAndroid Build Coastguard Worker set.params[i] = keymaster_param_date(tag, keyParams[i].f.dateTime);
198*789431f2SAndroid Build Coastguard Worker break;
199*789431f2SAndroid Build Coastguard Worker case KM_BOOL:
200*789431f2SAndroid Build Coastguard Worker if (keyParams[i].f.boolValue)
201*789431f2SAndroid Build Coastguard Worker set.params[i] = keymaster_param_bool(tag);
202*789431f2SAndroid Build Coastguard Worker else
203*789431f2SAndroid Build Coastguard Worker set.params[i].tag = KM_TAG_INVALID;
204*789431f2SAndroid Build Coastguard Worker break;
205*789431f2SAndroid Build Coastguard Worker case KM_BIGNUM:
206*789431f2SAndroid Build Coastguard Worker case KM_BYTES:
207*789431f2SAndroid Build Coastguard Worker set.params[i] =
208*789431f2SAndroid Build Coastguard Worker keymaster_param_blob(tag, &keyParams[i].blob[0], keyParams[i].blob.size());
209*789431f2SAndroid Build Coastguard Worker break;
210*789431f2SAndroid Build Coastguard Worker case KM_INVALID:
211*789431f2SAndroid Build Coastguard Worker default:
212*789431f2SAndroid Build Coastguard Worker set.params[i].tag = KM_TAG_INVALID;
213*789431f2SAndroid Build Coastguard Worker /* just skip */
214*789431f2SAndroid Build Coastguard Worker break;
215*789431f2SAndroid Build Coastguard Worker }
216*789431f2SAndroid Build Coastguard Worker }
217*789431f2SAndroid Build Coastguard Worker
218*789431f2SAndroid Build Coastguard Worker return set;
219*789431f2SAndroid Build Coastguard Worker }
220*789431f2SAndroid Build Coastguard Worker
AndroidKeymaster4Device(KmVersion version,SecurityLevel securityLevel)221*789431f2SAndroid Build Coastguard Worker AndroidKeymaster4Device::AndroidKeymaster4Device(KmVersion version, SecurityLevel securityLevel)
222*789431f2SAndroid Build Coastguard Worker : impl_(new (std::nothrow)::keymaster::AndroidKeymaster(
223*789431f2SAndroid Build Coastguard Worker [&]() -> auto{
224*789431f2SAndroid Build Coastguard Worker auto context = new (std::nothrow) PureSoftKeymasterContext(
225*789431f2SAndroid Build Coastguard Worker version, static_cast<keymaster_security_level_t>(securityLevel));
226*789431f2SAndroid Build Coastguard Worker context->SetSystemVersion(GetOsVersion(), GetOsPatchlevel());
227*789431f2SAndroid Build Coastguard Worker context->SetVendorPatchlevel(GetVendorPatchlevel());
228*789431f2SAndroid Build Coastguard Worker // Software devices cannot be configured by the boot loader but they have
229*789431f2SAndroid Build Coastguard Worker // to return a boot patch level. So lets just return the OS patch level.
230*789431f2SAndroid Build Coastguard Worker // The OS patch level only has a year and a month so we just add the 1st
231*789431f2SAndroid Build Coastguard Worker // of the month as day field.
232*789431f2SAndroid Build Coastguard Worker context->SetBootPatchlevel(GetOsPatchlevel() * 100 + 1);
233*789431f2SAndroid Build Coastguard Worker return context;
234*789431f2SAndroid Build Coastguard Worker }(),
235*789431f2SAndroid Build Coastguard Worker kOperationTableSize)),
236*789431f2SAndroid Build Coastguard Worker securityLevel_(securityLevel) {}
237*789431f2SAndroid Build Coastguard Worker
~AndroidKeymaster4Device()238*789431f2SAndroid Build Coastguard Worker AndroidKeymaster4Device::~AndroidKeymaster4Device() {}
239*789431f2SAndroid Build Coastguard Worker
getHardwareInfo(getHardwareInfo_cb _hidl_cb)240*789431f2SAndroid Build Coastguard Worker Return<void> AndroidKeymaster4Device::getHardwareInfo(getHardwareInfo_cb _hidl_cb) {
241*789431f2SAndroid Build Coastguard Worker _hidl_cb(securityLevel_, "SoftwareKeymasterDevice", "Google");
242*789431f2SAndroid Build Coastguard Worker return Void();
243*789431f2SAndroid Build Coastguard Worker }
244*789431f2SAndroid Build Coastguard Worker
245*789431f2SAndroid Build Coastguard Worker Return<void>
getHmacSharingParameters(getHmacSharingParameters_cb _hidl_cb)246*789431f2SAndroid Build Coastguard Worker AndroidKeymaster4Device::getHmacSharingParameters(getHmacSharingParameters_cb _hidl_cb) {
247*789431f2SAndroid Build Coastguard Worker auto response = impl_->GetHmacSharingParameters();
248*789431f2SAndroid Build Coastguard Worker
249*789431f2SAndroid Build Coastguard Worker ::android::hardware::keymaster::V4_0::HmacSharingParameters params;
250*789431f2SAndroid Build Coastguard Worker params.seed.setToExternal(const_cast<uint8_t*>(response.params.seed.data),
251*789431f2SAndroid Build Coastguard Worker response.params.seed.data_length);
252*789431f2SAndroid Build Coastguard Worker static_assert(sizeof(response.params.nonce) == params.nonce.size(), "Nonce sizes don't match");
253*789431f2SAndroid Build Coastguard Worker memcpy(params.nonce.data(), response.params.nonce, params.nonce.size());
254*789431f2SAndroid Build Coastguard Worker _hidl_cb(legacy_enum_conversion(response.error), params);
255*789431f2SAndroid Build Coastguard Worker return Void();
256*789431f2SAndroid Build Coastguard Worker }
257*789431f2SAndroid Build Coastguard Worker
computeSharedHmac(const hidl_vec<::android::hardware::keymaster::V4_0::HmacSharingParameters> & params,computeSharedHmac_cb _hidl_cb)258*789431f2SAndroid Build Coastguard Worker Return<void> AndroidKeymaster4Device::computeSharedHmac(
259*789431f2SAndroid Build Coastguard Worker const hidl_vec<::android::hardware::keymaster::V4_0::HmacSharingParameters>& params,
260*789431f2SAndroid Build Coastguard Worker computeSharedHmac_cb _hidl_cb) {
261*789431f2SAndroid Build Coastguard Worker ComputeSharedHmacRequest request(impl_->message_version());
262*789431f2SAndroid Build Coastguard Worker request.params_array.params_array =
263*789431f2SAndroid Build Coastguard Worker new (std::nothrow) keymaster::HmacSharingParameters[params.size()];
264*789431f2SAndroid Build Coastguard Worker request.params_array.num_params = params.size();
265*789431f2SAndroid Build Coastguard Worker for (size_t i = 0; i < params.size(); ++i) {
266*789431f2SAndroid Build Coastguard Worker request.params_array.params_array[i].seed = {params[i].seed.data(), params[i].seed.size()};
267*789431f2SAndroid Build Coastguard Worker static_assert(sizeof(request.params_array.params_array[i].nonce) ==
268*789431f2SAndroid Build Coastguard Worker decltype(params[i].nonce)::size(),
269*789431f2SAndroid Build Coastguard Worker "Nonce sizes don't match");
270*789431f2SAndroid Build Coastguard Worker memcpy(request.params_array.params_array[i].nonce, params[i].nonce.data(),
271*789431f2SAndroid Build Coastguard Worker params[i].nonce.size());
272*789431f2SAndroid Build Coastguard Worker }
273*789431f2SAndroid Build Coastguard Worker
274*789431f2SAndroid Build Coastguard Worker auto response = impl_->ComputeSharedHmac(request);
275*789431f2SAndroid Build Coastguard Worker hidl_vec<uint8_t> sharing_check;
276*789431f2SAndroid Build Coastguard Worker if (response.error == KM_ERROR_OK) sharing_check = kmBlob2hidlVec(response.sharing_check);
277*789431f2SAndroid Build Coastguard Worker
278*789431f2SAndroid Build Coastguard Worker _hidl_cb(legacy_enum_conversion(response.error), sharing_check);
279*789431f2SAndroid Build Coastguard Worker return Void();
280*789431f2SAndroid Build Coastguard Worker }
281*789431f2SAndroid Build Coastguard Worker
verifyAuthorization(uint64_t challenge,const hidl_vec<KeyParameter> & parametersToVerify,const::android::hardware::keymaster::V4_0::HardwareAuthToken & authToken,verifyAuthorization_cb _hidl_cb)282*789431f2SAndroid Build Coastguard Worker Return<void> AndroidKeymaster4Device::verifyAuthorization(
283*789431f2SAndroid Build Coastguard Worker uint64_t challenge, const hidl_vec<KeyParameter>& parametersToVerify,
284*789431f2SAndroid Build Coastguard Worker const ::android::hardware::keymaster::V4_0::HardwareAuthToken& authToken,
285*789431f2SAndroid Build Coastguard Worker verifyAuthorization_cb _hidl_cb) {
286*789431f2SAndroid Build Coastguard Worker
287*789431f2SAndroid Build Coastguard Worker VerifyAuthorizationRequest request(impl_->message_version());
288*789431f2SAndroid Build Coastguard Worker request.challenge = challenge;
289*789431f2SAndroid Build Coastguard Worker request.parameters_to_verify.Reinitialize(KmParamSet(parametersToVerify));
290*789431f2SAndroid Build Coastguard Worker request.auth_token.challenge = authToken.challenge;
291*789431f2SAndroid Build Coastguard Worker request.auth_token.user_id = authToken.userId;
292*789431f2SAndroid Build Coastguard Worker request.auth_token.authenticator_id = authToken.authenticatorId;
293*789431f2SAndroid Build Coastguard Worker request.auth_token.authenticator_type = legacy_enum_conversion(authToken.authenticatorType);
294*789431f2SAndroid Build Coastguard Worker request.auth_token.timestamp = authToken.timestamp;
295*789431f2SAndroid Build Coastguard Worker KeymasterBlob mac(authToken.mac.data(), authToken.mac.size());
296*789431f2SAndroid Build Coastguard Worker request.auth_token.mac = mac;
297*789431f2SAndroid Build Coastguard Worker
298*789431f2SAndroid Build Coastguard Worker auto response = impl_->VerifyAuthorization(request);
299*789431f2SAndroid Build Coastguard Worker
300*789431f2SAndroid Build Coastguard Worker ::android::hardware::keymaster::V4_0::VerificationToken token;
301*789431f2SAndroid Build Coastguard Worker token.challenge = response.token.challenge;
302*789431f2SAndroid Build Coastguard Worker token.timestamp = response.token.timestamp;
303*789431f2SAndroid Build Coastguard Worker token.parametersVerified = kmParamSet2Hidl(response.token.parameters_verified);
304*789431f2SAndroid Build Coastguard Worker token.securityLevel = legacy_enum_conversion(response.token.security_level);
305*789431f2SAndroid Build Coastguard Worker token.mac = kmBlob2hidlVec(response.token.mac);
306*789431f2SAndroid Build Coastguard Worker
307*789431f2SAndroid Build Coastguard Worker _hidl_cb(legacy_enum_conversion(response.error), token);
308*789431f2SAndroid Build Coastguard Worker
309*789431f2SAndroid Build Coastguard Worker return Void();
310*789431f2SAndroid Build Coastguard Worker }
311*789431f2SAndroid Build Coastguard Worker
addRngEntropy(const hidl_vec<uint8_t> & data)312*789431f2SAndroid Build Coastguard Worker Return<ErrorCode> AndroidKeymaster4Device::addRngEntropy(const hidl_vec<uint8_t>& data) {
313*789431f2SAndroid Build Coastguard Worker if (data.size() == 0) return ErrorCode::OK;
314*789431f2SAndroid Build Coastguard Worker AddEntropyRequest request(impl_->message_version());
315*789431f2SAndroid Build Coastguard Worker request.random_data.Reinitialize(data.data(), data.size());
316*789431f2SAndroid Build Coastguard Worker
317*789431f2SAndroid Build Coastguard Worker AddEntropyResponse response(impl_->message_version());
318*789431f2SAndroid Build Coastguard Worker impl_->AddRngEntropy(request, &response);
319*789431f2SAndroid Build Coastguard Worker
320*789431f2SAndroid Build Coastguard Worker return legacy_enum_conversion(response.error);
321*789431f2SAndroid Build Coastguard Worker }
322*789431f2SAndroid Build Coastguard Worker
generateKey(const hidl_vec<KeyParameter> & keyParams,generateKey_cb _hidl_cb)323*789431f2SAndroid Build Coastguard Worker Return<void> AndroidKeymaster4Device::generateKey(const hidl_vec<KeyParameter>& keyParams,
324*789431f2SAndroid Build Coastguard Worker generateKey_cb _hidl_cb) {
325*789431f2SAndroid Build Coastguard Worker GenerateKeyRequest request(impl_->message_version());
326*789431f2SAndroid Build Coastguard Worker request.key_description.Reinitialize(KmParamSet(keyParams));
327*789431f2SAndroid Build Coastguard Worker
328*789431f2SAndroid Build Coastguard Worker GenerateKeyResponse response(impl_->message_version());
329*789431f2SAndroid Build Coastguard Worker impl_->GenerateKey(request, &response);
330*789431f2SAndroid Build Coastguard Worker
331*789431f2SAndroid Build Coastguard Worker KeyCharacteristics resultCharacteristics;
332*789431f2SAndroid Build Coastguard Worker hidl_vec<uint8_t> resultKeyBlob;
333*789431f2SAndroid Build Coastguard Worker if (response.error == KM_ERROR_OK) {
334*789431f2SAndroid Build Coastguard Worker resultKeyBlob = kmBlob2hidlVec(response.key_blob);
335*789431f2SAndroid Build Coastguard Worker resultCharacteristics.hardwareEnforced = kmParamSet2Hidl(response.enforced);
336*789431f2SAndroid Build Coastguard Worker resultCharacteristics.softwareEnforced = kmParamSet2Hidl(response.unenforced);
337*789431f2SAndroid Build Coastguard Worker }
338*789431f2SAndroid Build Coastguard Worker _hidl_cb(legacy_enum_conversion(response.error), resultKeyBlob, resultCharacteristics);
339*789431f2SAndroid Build Coastguard Worker return Void();
340*789431f2SAndroid Build Coastguard Worker }
341*789431f2SAndroid Build Coastguard Worker
getKeyCharacteristics(const hidl_vec<uint8_t> & keyBlob,const hidl_vec<uint8_t> & clientId,const hidl_vec<uint8_t> & appData,getKeyCharacteristics_cb _hidl_cb)342*789431f2SAndroid Build Coastguard Worker Return<void> AndroidKeymaster4Device::getKeyCharacteristics(const hidl_vec<uint8_t>& keyBlob,
343*789431f2SAndroid Build Coastguard Worker const hidl_vec<uint8_t>& clientId,
344*789431f2SAndroid Build Coastguard Worker const hidl_vec<uint8_t>& appData,
345*789431f2SAndroid Build Coastguard Worker getKeyCharacteristics_cb _hidl_cb) {
346*789431f2SAndroid Build Coastguard Worker GetKeyCharacteristicsRequest request(impl_->message_version());
347*789431f2SAndroid Build Coastguard Worker request.SetKeyMaterial(keyBlob.data(), keyBlob.size());
348*789431f2SAndroid Build Coastguard Worker addClientAndAppData(clientId, appData, &request.additional_params);
349*789431f2SAndroid Build Coastguard Worker
350*789431f2SAndroid Build Coastguard Worker GetKeyCharacteristicsResponse response(impl_->message_version());
351*789431f2SAndroid Build Coastguard Worker impl_->GetKeyCharacteristics(request, &response);
352*789431f2SAndroid Build Coastguard Worker
353*789431f2SAndroid Build Coastguard Worker KeyCharacteristics resultCharacteristics;
354*789431f2SAndroid Build Coastguard Worker if (response.error == KM_ERROR_OK) {
355*789431f2SAndroid Build Coastguard Worker resultCharacteristics.hardwareEnforced = kmParamSet2Hidl(response.enforced);
356*789431f2SAndroid Build Coastguard Worker resultCharacteristics.softwareEnforced = kmParamSet2Hidl(response.unenforced);
357*789431f2SAndroid Build Coastguard Worker }
358*789431f2SAndroid Build Coastguard Worker _hidl_cb(legacy_enum_conversion(response.error), resultCharacteristics);
359*789431f2SAndroid Build Coastguard Worker return Void();
360*789431f2SAndroid Build Coastguard Worker }
361*789431f2SAndroid Build Coastguard Worker
importKey(const hidl_vec<KeyParameter> & params,KeyFormat keyFormat,const hidl_vec<uint8_t> & keyData,importKey_cb _hidl_cb)362*789431f2SAndroid Build Coastguard Worker Return<void> AndroidKeymaster4Device::importKey(const hidl_vec<KeyParameter>& params,
363*789431f2SAndroid Build Coastguard Worker KeyFormat keyFormat,
364*789431f2SAndroid Build Coastguard Worker const hidl_vec<uint8_t>& keyData,
365*789431f2SAndroid Build Coastguard Worker importKey_cb _hidl_cb) {
366*789431f2SAndroid Build Coastguard Worker ImportKeyRequest request(impl_->message_version());
367*789431f2SAndroid Build Coastguard Worker request.key_description.Reinitialize(KmParamSet(params));
368*789431f2SAndroid Build Coastguard Worker request.key_format = legacy_enum_conversion(keyFormat);
369*789431f2SAndroid Build Coastguard Worker request.key_data = KeymasterKeyBlob(keyData.data(), keyData.size());
370*789431f2SAndroid Build Coastguard Worker
371*789431f2SAndroid Build Coastguard Worker ImportKeyResponse response(impl_->message_version());
372*789431f2SAndroid Build Coastguard Worker impl_->ImportKey(request, &response);
373*789431f2SAndroid Build Coastguard Worker
374*789431f2SAndroid Build Coastguard Worker KeyCharacteristics resultCharacteristics;
375*789431f2SAndroid Build Coastguard Worker hidl_vec<uint8_t> resultKeyBlob;
376*789431f2SAndroid Build Coastguard Worker if (response.error == KM_ERROR_OK) {
377*789431f2SAndroid Build Coastguard Worker resultKeyBlob = kmBlob2hidlVec(response.key_blob);
378*789431f2SAndroid Build Coastguard Worker resultCharacteristics.hardwareEnforced = kmParamSet2Hidl(response.enforced);
379*789431f2SAndroid Build Coastguard Worker resultCharacteristics.softwareEnforced = kmParamSet2Hidl(response.unenforced);
380*789431f2SAndroid Build Coastguard Worker }
381*789431f2SAndroid Build Coastguard Worker _hidl_cb(legacy_enum_conversion(response.error), resultKeyBlob, resultCharacteristics);
382*789431f2SAndroid Build Coastguard Worker return Void();
383*789431f2SAndroid Build Coastguard Worker }
384*789431f2SAndroid Build Coastguard Worker
importWrappedKey(const hidl_vec<uint8_t> & wrappedKeyData,const hidl_vec<uint8_t> & wrappingKeyBlob,const hidl_vec<uint8_t> & maskingKey,const hidl_vec<KeyParameter> & unwrappingParams,uint64_t passwordSid,uint64_t biometricSid,importWrappedKey_cb _hidl_cb)385*789431f2SAndroid Build Coastguard Worker Return<void> AndroidKeymaster4Device::importWrappedKey(
386*789431f2SAndroid Build Coastguard Worker const hidl_vec<uint8_t>& wrappedKeyData, const hidl_vec<uint8_t>& wrappingKeyBlob,
387*789431f2SAndroid Build Coastguard Worker const hidl_vec<uint8_t>& maskingKey, const hidl_vec<KeyParameter>& unwrappingParams,
388*789431f2SAndroid Build Coastguard Worker uint64_t passwordSid, uint64_t biometricSid, importWrappedKey_cb _hidl_cb) {
389*789431f2SAndroid Build Coastguard Worker
390*789431f2SAndroid Build Coastguard Worker ImportWrappedKeyRequest request(impl_->message_version());
391*789431f2SAndroid Build Coastguard Worker request.SetWrappedMaterial(wrappedKeyData.data(), wrappedKeyData.size());
392*789431f2SAndroid Build Coastguard Worker request.SetWrappingMaterial(wrappingKeyBlob.data(), wrappingKeyBlob.size());
393*789431f2SAndroid Build Coastguard Worker request.SetMaskingKeyMaterial(maskingKey.data(), maskingKey.size());
394*789431f2SAndroid Build Coastguard Worker request.additional_params.Reinitialize(KmParamSet(unwrappingParams));
395*789431f2SAndroid Build Coastguard Worker request.password_sid = passwordSid;
396*789431f2SAndroid Build Coastguard Worker request.biometric_sid = biometricSid;
397*789431f2SAndroid Build Coastguard Worker
398*789431f2SAndroid Build Coastguard Worker ImportWrappedKeyResponse response(impl_->message_version());
399*789431f2SAndroid Build Coastguard Worker impl_->ImportWrappedKey(request, &response);
400*789431f2SAndroid Build Coastguard Worker
401*789431f2SAndroid Build Coastguard Worker KeyCharacteristics resultCharacteristics;
402*789431f2SAndroid Build Coastguard Worker hidl_vec<uint8_t> resultKeyBlob;
403*789431f2SAndroid Build Coastguard Worker if (response.error == KM_ERROR_OK) {
404*789431f2SAndroid Build Coastguard Worker resultKeyBlob = kmBlob2hidlVec(response.key_blob);
405*789431f2SAndroid Build Coastguard Worker resultCharacteristics.hardwareEnforced = kmParamSet2Hidl(response.enforced);
406*789431f2SAndroid Build Coastguard Worker resultCharacteristics.softwareEnforced = kmParamSet2Hidl(response.unenforced);
407*789431f2SAndroid Build Coastguard Worker }
408*789431f2SAndroid Build Coastguard Worker _hidl_cb(legacy_enum_conversion(response.error), resultKeyBlob, resultCharacteristics);
409*789431f2SAndroid Build Coastguard Worker return Void();
410*789431f2SAndroid Build Coastguard Worker }
411*789431f2SAndroid Build Coastguard Worker
exportKey(KeyFormat exportFormat,const hidl_vec<uint8_t> & keyBlob,const hidl_vec<uint8_t> & clientId,const hidl_vec<uint8_t> & appData,exportKey_cb _hidl_cb)412*789431f2SAndroid Build Coastguard Worker Return<void> AndroidKeymaster4Device::exportKey(KeyFormat exportFormat,
413*789431f2SAndroid Build Coastguard Worker const hidl_vec<uint8_t>& keyBlob,
414*789431f2SAndroid Build Coastguard Worker const hidl_vec<uint8_t>& clientId,
415*789431f2SAndroid Build Coastguard Worker const hidl_vec<uint8_t>& appData,
416*789431f2SAndroid Build Coastguard Worker exportKey_cb _hidl_cb) {
417*789431f2SAndroid Build Coastguard Worker ExportKeyRequest request(impl_->message_version());
418*789431f2SAndroid Build Coastguard Worker request.key_format = legacy_enum_conversion(exportFormat);
419*789431f2SAndroid Build Coastguard Worker request.SetKeyMaterial(keyBlob.data(), keyBlob.size());
420*789431f2SAndroid Build Coastguard Worker addClientAndAppData(clientId, appData, &request.additional_params);
421*789431f2SAndroid Build Coastguard Worker
422*789431f2SAndroid Build Coastguard Worker ExportKeyResponse response(impl_->message_version());
423*789431f2SAndroid Build Coastguard Worker impl_->ExportKey(request, &response);
424*789431f2SAndroid Build Coastguard Worker
425*789431f2SAndroid Build Coastguard Worker hidl_vec<uint8_t> resultKeyBlob;
426*789431f2SAndroid Build Coastguard Worker if (response.error == KM_ERROR_OK) {
427*789431f2SAndroid Build Coastguard Worker resultKeyBlob.setToExternal(response.key_data, response.key_data_length);
428*789431f2SAndroid Build Coastguard Worker }
429*789431f2SAndroid Build Coastguard Worker _hidl_cb(legacy_enum_conversion(response.error), resultKeyBlob);
430*789431f2SAndroid Build Coastguard Worker return Void();
431*789431f2SAndroid Build Coastguard Worker }
432*789431f2SAndroid Build Coastguard Worker
attestKey(const hidl_vec<uint8_t> & keyToAttest,const hidl_vec<KeyParameter> & attestParams,attestKey_cb _hidl_cb)433*789431f2SAndroid Build Coastguard Worker Return<void> AndroidKeymaster4Device::attestKey(const hidl_vec<uint8_t>& keyToAttest,
434*789431f2SAndroid Build Coastguard Worker const hidl_vec<KeyParameter>& attestParams,
435*789431f2SAndroid Build Coastguard Worker attestKey_cb _hidl_cb) {
436*789431f2SAndroid Build Coastguard Worker AttestKeyRequest request(impl_->message_version());
437*789431f2SAndroid Build Coastguard Worker request.SetKeyMaterial(keyToAttest.data(), keyToAttest.size());
438*789431f2SAndroid Build Coastguard Worker request.attest_params.Reinitialize(KmParamSet(attestParams));
439*789431f2SAndroid Build Coastguard Worker
440*789431f2SAndroid Build Coastguard Worker AttestKeyResponse response(impl_->message_version());
441*789431f2SAndroid Build Coastguard Worker impl_->AttestKey(request, &response);
442*789431f2SAndroid Build Coastguard Worker
443*789431f2SAndroid Build Coastguard Worker hidl_vec<hidl_vec<uint8_t>> resultCertChain;
444*789431f2SAndroid Build Coastguard Worker if (response.error == KM_ERROR_OK) {
445*789431f2SAndroid Build Coastguard Worker resultCertChain = kmCertChain2Hidl(response.certificate_chain);
446*789431f2SAndroid Build Coastguard Worker }
447*789431f2SAndroid Build Coastguard Worker _hidl_cb(legacy_enum_conversion(response.error), resultCertChain);
448*789431f2SAndroid Build Coastguard Worker return Void();
449*789431f2SAndroid Build Coastguard Worker }
450*789431f2SAndroid Build Coastguard Worker
upgradeKey(const hidl_vec<uint8_t> & keyBlobToUpgrade,const hidl_vec<KeyParameter> & upgradeParams,upgradeKey_cb _hidl_cb)451*789431f2SAndroid Build Coastguard Worker Return<void> AndroidKeymaster4Device::upgradeKey(const hidl_vec<uint8_t>& keyBlobToUpgrade,
452*789431f2SAndroid Build Coastguard Worker const hidl_vec<KeyParameter>& upgradeParams,
453*789431f2SAndroid Build Coastguard Worker upgradeKey_cb _hidl_cb) {
454*789431f2SAndroid Build Coastguard Worker // There's nothing to be done to upgrade software key blobs. Further, the software
455*789431f2SAndroid Build Coastguard Worker // implementation never returns ErrorCode::KEY_REQUIRES_UPGRADE, so this should never be called.
456*789431f2SAndroid Build Coastguard Worker UpgradeKeyRequest request(impl_->message_version());
457*789431f2SAndroid Build Coastguard Worker request.SetKeyMaterial(keyBlobToUpgrade.data(), keyBlobToUpgrade.size());
458*789431f2SAndroid Build Coastguard Worker request.upgrade_params.Reinitialize(KmParamSet(upgradeParams));
459*789431f2SAndroid Build Coastguard Worker
460*789431f2SAndroid Build Coastguard Worker UpgradeKeyResponse response(impl_->message_version());
461*789431f2SAndroid Build Coastguard Worker impl_->UpgradeKey(request, &response);
462*789431f2SAndroid Build Coastguard Worker
463*789431f2SAndroid Build Coastguard Worker if (response.error == KM_ERROR_OK) {
464*789431f2SAndroid Build Coastguard Worker _hidl_cb(ErrorCode::OK, kmBlob2hidlVec(response.upgraded_key));
465*789431f2SAndroid Build Coastguard Worker } else {
466*789431f2SAndroid Build Coastguard Worker _hidl_cb(legacy_enum_conversion(response.error), hidl_vec<uint8_t>());
467*789431f2SAndroid Build Coastguard Worker }
468*789431f2SAndroid Build Coastguard Worker return Void();
469*789431f2SAndroid Build Coastguard Worker }
470*789431f2SAndroid Build Coastguard Worker
deleteKey(const hidl_vec<uint8_t> & keyBlob)471*789431f2SAndroid Build Coastguard Worker Return<ErrorCode> AndroidKeymaster4Device::deleteKey(const hidl_vec<uint8_t>& keyBlob) {
472*789431f2SAndroid Build Coastguard Worker // There's nothing to be done to delete software key blobs.
473*789431f2SAndroid Build Coastguard Worker DeleteKeyRequest request(impl_->message_version());
474*789431f2SAndroid Build Coastguard Worker request.SetKeyMaterial(keyBlob.data(), keyBlob.size());
475*789431f2SAndroid Build Coastguard Worker
476*789431f2SAndroid Build Coastguard Worker DeleteKeyResponse response(impl_->message_version());
477*789431f2SAndroid Build Coastguard Worker impl_->DeleteKey(request, &response);
478*789431f2SAndroid Build Coastguard Worker
479*789431f2SAndroid Build Coastguard Worker return legacy_enum_conversion(response.error);
480*789431f2SAndroid Build Coastguard Worker }
481*789431f2SAndroid Build Coastguard Worker
deleteAllKeys()482*789431f2SAndroid Build Coastguard Worker Return<ErrorCode> AndroidKeymaster4Device::deleteAllKeys() {
483*789431f2SAndroid Build Coastguard Worker // There's nothing to be done to delete software key blobs.
484*789431f2SAndroid Build Coastguard Worker DeleteAllKeysRequest request(impl_->message_version());
485*789431f2SAndroid Build Coastguard Worker DeleteAllKeysResponse response(impl_->message_version());
486*789431f2SAndroid Build Coastguard Worker impl_->DeleteAllKeys(request, &response);
487*789431f2SAndroid Build Coastguard Worker
488*789431f2SAndroid Build Coastguard Worker return legacy_enum_conversion(response.error);
489*789431f2SAndroid Build Coastguard Worker }
490*789431f2SAndroid Build Coastguard Worker
destroyAttestationIds()491*789431f2SAndroid Build Coastguard Worker Return<ErrorCode> AndroidKeymaster4Device::destroyAttestationIds() {
492*789431f2SAndroid Build Coastguard Worker return ErrorCode::UNIMPLEMENTED;
493*789431f2SAndroid Build Coastguard Worker }
494*789431f2SAndroid Build Coastguard Worker
begin(KeyPurpose purpose,const hidl_vec<uint8_t> & key,const hidl_vec<KeyParameter> & inParams,const HardwareAuthToken & authToken,begin_cb _hidl_cb)495*789431f2SAndroid Build Coastguard Worker Return<void> AndroidKeymaster4Device::begin(KeyPurpose purpose, const hidl_vec<uint8_t>& key,
496*789431f2SAndroid Build Coastguard Worker const hidl_vec<KeyParameter>& inParams,
497*789431f2SAndroid Build Coastguard Worker const HardwareAuthToken& authToken, begin_cb _hidl_cb) {
498*789431f2SAndroid Build Coastguard Worker
499*789431f2SAndroid Build Coastguard Worker BeginOperationRequest request(impl_->message_version());
500*789431f2SAndroid Build Coastguard Worker request.purpose = legacy_enum_conversion(purpose);
501*789431f2SAndroid Build Coastguard Worker request.SetKeyMaterial(key.data(), key.size());
502*789431f2SAndroid Build Coastguard Worker request.additional_params.Reinitialize(KmParamSet(inParams));
503*789431f2SAndroid Build Coastguard Worker
504*789431f2SAndroid Build Coastguard Worker hidl_vec<uint8_t> hidl_vec_token = authToken2HidlVec(authToken);
505*789431f2SAndroid Build Coastguard Worker request.additional_params.push_back(
506*789431f2SAndroid Build Coastguard Worker TAG_AUTH_TOKEN, reinterpret_cast<uint8_t*>(hidl_vec_token.data()), hidl_vec_token.size());
507*789431f2SAndroid Build Coastguard Worker
508*789431f2SAndroid Build Coastguard Worker BeginOperationResponse response(impl_->message_version());
509*789431f2SAndroid Build Coastguard Worker impl_->BeginOperation(request, &response);
510*789431f2SAndroid Build Coastguard Worker
511*789431f2SAndroid Build Coastguard Worker hidl_vec<KeyParameter> resultParams;
512*789431f2SAndroid Build Coastguard Worker if (response.error == KM_ERROR_OK) resultParams = kmParamSet2Hidl(response.output_params);
513*789431f2SAndroid Build Coastguard Worker
514*789431f2SAndroid Build Coastguard Worker _hidl_cb(legacy_enum_conversion(response.error), resultParams, response.op_handle);
515*789431f2SAndroid Build Coastguard Worker return Void();
516*789431f2SAndroid Build Coastguard Worker }
517*789431f2SAndroid Build Coastguard Worker
update(uint64_t operationHandle,const hidl_vec<KeyParameter> & inParams,const hidl_vec<uint8_t> & input,const HardwareAuthToken & authToken,const VerificationToken &,update_cb _hidl_cb)518*789431f2SAndroid Build Coastguard Worker Return<void> AndroidKeymaster4Device::update(uint64_t operationHandle,
519*789431f2SAndroid Build Coastguard Worker const hidl_vec<KeyParameter>& inParams,
520*789431f2SAndroid Build Coastguard Worker const hidl_vec<uint8_t>& input,
521*789431f2SAndroid Build Coastguard Worker const HardwareAuthToken& authToken ,
522*789431f2SAndroid Build Coastguard Worker const VerificationToken& /* verificationToken */,
523*789431f2SAndroid Build Coastguard Worker update_cb _hidl_cb) {
524*789431f2SAndroid Build Coastguard Worker UpdateOperationRequest request(impl_->message_version());
525*789431f2SAndroid Build Coastguard Worker request.op_handle = operationHandle;
526*789431f2SAndroid Build Coastguard Worker request.input.Reinitialize(input.data(), input.size());
527*789431f2SAndroid Build Coastguard Worker request.additional_params.Reinitialize(KmParamSet(inParams));
528*789431f2SAndroid Build Coastguard Worker
529*789431f2SAndroid Build Coastguard Worker hidl_vec<uint8_t> hidl_vec_token = authToken2HidlVec(authToken);
530*789431f2SAndroid Build Coastguard Worker request.additional_params.push_back(
531*789431f2SAndroid Build Coastguard Worker TAG_AUTH_TOKEN, reinterpret_cast<uint8_t*>(hidl_vec_token.data()), hidl_vec_token.size());
532*789431f2SAndroid Build Coastguard Worker
533*789431f2SAndroid Build Coastguard Worker UpdateOperationResponse response(impl_->message_version());
534*789431f2SAndroid Build Coastguard Worker impl_->UpdateOperation(request, &response);
535*789431f2SAndroid Build Coastguard Worker
536*789431f2SAndroid Build Coastguard Worker uint32_t resultConsumed = 0;
537*789431f2SAndroid Build Coastguard Worker hidl_vec<KeyParameter> resultParams;
538*789431f2SAndroid Build Coastguard Worker hidl_vec<uint8_t> resultBlob;
539*789431f2SAndroid Build Coastguard Worker if (response.error == KM_ERROR_OK) {
540*789431f2SAndroid Build Coastguard Worker resultConsumed = response.input_consumed;
541*789431f2SAndroid Build Coastguard Worker resultParams = kmParamSet2Hidl(response.output_params);
542*789431f2SAndroid Build Coastguard Worker resultBlob = kmBuffer2hidlVec(response.output);
543*789431f2SAndroid Build Coastguard Worker }
544*789431f2SAndroid Build Coastguard Worker _hidl_cb(legacy_enum_conversion(response.error), resultConsumed, resultParams, resultBlob);
545*789431f2SAndroid Build Coastguard Worker return Void();
546*789431f2SAndroid Build Coastguard Worker }
547*789431f2SAndroid Build Coastguard Worker
finish(uint64_t operationHandle,const hidl_vec<KeyParameter> & inParams,const hidl_vec<uint8_t> & input,const hidl_vec<uint8_t> & signature,const HardwareAuthToken & authToken,const VerificationToken &,finish_cb _hidl_cb)548*789431f2SAndroid Build Coastguard Worker Return<void> AndroidKeymaster4Device::finish(uint64_t operationHandle,
549*789431f2SAndroid Build Coastguard Worker const hidl_vec<KeyParameter>& inParams,
550*789431f2SAndroid Build Coastguard Worker const hidl_vec<uint8_t>& input,
551*789431f2SAndroid Build Coastguard Worker const hidl_vec<uint8_t>& signature,
552*789431f2SAndroid Build Coastguard Worker const HardwareAuthToken& authToken ,
553*789431f2SAndroid Build Coastguard Worker const VerificationToken& /* verificationToken */,
554*789431f2SAndroid Build Coastguard Worker finish_cb _hidl_cb) {
555*789431f2SAndroid Build Coastguard Worker FinishOperationRequest request(impl_->message_version());
556*789431f2SAndroid Build Coastguard Worker request.op_handle = operationHandle;
557*789431f2SAndroid Build Coastguard Worker request.input.Reinitialize(input.data(), input.size());
558*789431f2SAndroid Build Coastguard Worker request.signature.Reinitialize(signature.data(), signature.size());
559*789431f2SAndroid Build Coastguard Worker request.additional_params.Reinitialize(KmParamSet(inParams));
560*789431f2SAndroid Build Coastguard Worker
561*789431f2SAndroid Build Coastguard Worker hidl_vec<uint8_t> hidl_vec_token = authToken2HidlVec(authToken);
562*789431f2SAndroid Build Coastguard Worker request.additional_params.push_back(
563*789431f2SAndroid Build Coastguard Worker TAG_AUTH_TOKEN, reinterpret_cast<uint8_t*>(hidl_vec_token.data()), hidl_vec_token.size());
564*789431f2SAndroid Build Coastguard Worker
565*789431f2SAndroid Build Coastguard Worker
566*789431f2SAndroid Build Coastguard Worker FinishOperationResponse response(impl_->message_version());
567*789431f2SAndroid Build Coastguard Worker impl_->FinishOperation(request, &response);
568*789431f2SAndroid Build Coastguard Worker
569*789431f2SAndroid Build Coastguard Worker hidl_vec<KeyParameter> resultParams;
570*789431f2SAndroid Build Coastguard Worker hidl_vec<uint8_t> resultBlob;
571*789431f2SAndroid Build Coastguard Worker if (response.error == KM_ERROR_OK) {
572*789431f2SAndroid Build Coastguard Worker resultParams = kmParamSet2Hidl(response.output_params);
573*789431f2SAndroid Build Coastguard Worker resultBlob = kmBuffer2hidlVec(response.output);
574*789431f2SAndroid Build Coastguard Worker }
575*789431f2SAndroid Build Coastguard Worker _hidl_cb(legacy_enum_conversion(response.error), resultParams, resultBlob);
576*789431f2SAndroid Build Coastguard Worker return Void();
577*789431f2SAndroid Build Coastguard Worker }
578*789431f2SAndroid Build Coastguard Worker
abort(uint64_t operationHandle)579*789431f2SAndroid Build Coastguard Worker Return<ErrorCode> AndroidKeymaster4Device::abort(uint64_t operationHandle) {
580*789431f2SAndroid Build Coastguard Worker AbortOperationRequest request(impl_->message_version());
581*789431f2SAndroid Build Coastguard Worker request.op_handle = operationHandle;
582*789431f2SAndroid Build Coastguard Worker
583*789431f2SAndroid Build Coastguard Worker AbortOperationResponse response(impl_->message_version());
584*789431f2SAndroid Build Coastguard Worker impl_->AbortOperation(request, &response);
585*789431f2SAndroid Build Coastguard Worker
586*789431f2SAndroid Build Coastguard Worker return legacy_enum_conversion(response.error);
587*789431f2SAndroid Build Coastguard Worker }
588*789431f2SAndroid Build Coastguard Worker
CreateKeymasterDevice(SecurityLevel securityLevel)589*789431f2SAndroid Build Coastguard Worker IKeymasterDevice* CreateKeymasterDevice(SecurityLevel securityLevel) {
590*789431f2SAndroid Build Coastguard Worker return new (std::nothrow) AndroidKeymaster4Device(securityLevel);
591*789431f2SAndroid Build Coastguard Worker }
592*789431f2SAndroid Build Coastguard Worker
593*789431f2SAndroid Build Coastguard Worker } // namespace ng
594*789431f2SAndroid Build Coastguard Worker } // namespace V4_0
595*789431f2SAndroid Build Coastguard Worker } // namespace keymaster
596