1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker **
3*4d7e907cSAndroid Build Coastguard Worker ** Copyright 2017, The Android Open Source Project
4*4d7e907cSAndroid Build Coastguard Worker **
5*4d7e907cSAndroid Build Coastguard Worker ** Licensed under the Apache License, Version 2.0 (the "License");
6*4d7e907cSAndroid Build Coastguard Worker ** you may not use this file except in compliance with the License.
7*4d7e907cSAndroid Build Coastguard Worker ** You may obtain a copy of the License at
8*4d7e907cSAndroid Build Coastguard Worker **
9*4d7e907cSAndroid Build Coastguard Worker ** http://www.apache.org/licenses/LICENSE-2.0
10*4d7e907cSAndroid Build Coastguard Worker **
11*4d7e907cSAndroid Build Coastguard Worker ** Unless required by applicable law or agreed to in writing, software
12*4d7e907cSAndroid Build Coastguard Worker ** distributed under the License is distributed on an "AS IS" BASIS,
13*4d7e907cSAndroid Build Coastguard Worker ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*4d7e907cSAndroid Build Coastguard Worker ** See the License for the specific language governing permissions and
15*4d7e907cSAndroid Build Coastguard Worker ** limitations under the License.
16*4d7e907cSAndroid Build Coastguard Worker */
17*4d7e907cSAndroid Build Coastguard Worker
18*4d7e907cSAndroid Build Coastguard Worker #include <keymasterV4_1/Keymaster3.h>
19*4d7e907cSAndroid Build Coastguard Worker
20*4d7e907cSAndroid Build Coastguard Worker #include <android-base/logging.h>
21*4d7e907cSAndroid Build Coastguard Worker #include <keymasterV4_0/keymaster_utils.h>
22*4d7e907cSAndroid Build Coastguard Worker
23*4d7e907cSAndroid Build Coastguard Worker namespace android::hardware::keymaster::V4_1::support {
24*4d7e907cSAndroid Build Coastguard Worker
25*4d7e907cSAndroid Build Coastguard Worker using android::hardware::details::StatusOf;
26*4d7e907cSAndroid Build Coastguard Worker
27*4d7e907cSAndroid Build Coastguard Worker namespace {
28*4d7e907cSAndroid Build Coastguard Worker
convert(V3_0::ErrorCode error)29*4d7e907cSAndroid Build Coastguard Worker V4_0::ErrorCode convert(V3_0::ErrorCode error) {
30*4d7e907cSAndroid Build Coastguard Worker return static_cast<V4_0::ErrorCode>(error);
31*4d7e907cSAndroid Build Coastguard Worker }
32*4d7e907cSAndroid Build Coastguard Worker
convert(KeyPurpose purpose)33*4d7e907cSAndroid Build Coastguard Worker V3_0::KeyPurpose convert(KeyPurpose purpose) {
34*4d7e907cSAndroid Build Coastguard Worker return static_cast<V3_0::KeyPurpose>(purpose);
35*4d7e907cSAndroid Build Coastguard Worker }
36*4d7e907cSAndroid Build Coastguard Worker
convert(KeyFormat purpose)37*4d7e907cSAndroid Build Coastguard Worker V3_0::KeyFormat convert(KeyFormat purpose) {
38*4d7e907cSAndroid Build Coastguard Worker return static_cast<V3_0::KeyFormat>(purpose);
39*4d7e907cSAndroid Build Coastguard Worker }
40*4d7e907cSAndroid Build Coastguard Worker
convert(const KeyParameter & param)41*4d7e907cSAndroid Build Coastguard Worker V3_0::KeyParameter convert(const KeyParameter& param) {
42*4d7e907cSAndroid Build Coastguard Worker V3_0::KeyParameter converted;
43*4d7e907cSAndroid Build Coastguard Worker converted.tag = static_cast<V3_0::Tag>(param.tag);
44*4d7e907cSAndroid Build Coastguard Worker static_assert(sizeof(converted.f) == sizeof(param.f), "This function assumes sizes match");
45*4d7e907cSAndroid Build Coastguard Worker memcpy(&converted.f, ¶m.f, sizeof(param.f));
46*4d7e907cSAndroid Build Coastguard Worker converted.blob = param.blob;
47*4d7e907cSAndroid Build Coastguard Worker return converted;
48*4d7e907cSAndroid Build Coastguard Worker }
49*4d7e907cSAndroid Build Coastguard Worker
convert(const V3_0::KeyParameter & param)50*4d7e907cSAndroid Build Coastguard Worker KeyParameter convert(const V3_0::KeyParameter& param) {
51*4d7e907cSAndroid Build Coastguard Worker KeyParameter converted;
52*4d7e907cSAndroid Build Coastguard Worker converted.tag = static_cast<V4_0::Tag>(param.tag);
53*4d7e907cSAndroid Build Coastguard Worker static_assert(sizeof(converted.f) == sizeof(param.f), "This function assumes sizes match");
54*4d7e907cSAndroid Build Coastguard Worker memcpy(&converted.f, ¶m.f, sizeof(param.f));
55*4d7e907cSAndroid Build Coastguard Worker converted.blob = param.blob;
56*4d7e907cSAndroid Build Coastguard Worker return converted;
57*4d7e907cSAndroid Build Coastguard Worker }
58*4d7e907cSAndroid Build Coastguard Worker
convert(const hidl_vec<KeyParameter> & params)59*4d7e907cSAndroid Build Coastguard Worker hidl_vec<V3_0::KeyParameter> convert(const hidl_vec<KeyParameter>& params) {
60*4d7e907cSAndroid Build Coastguard Worker hidl_vec<V3_0::KeyParameter> converted(params.size());
61*4d7e907cSAndroid Build Coastguard Worker for (size_t i = 0; i < params.size(); ++i) {
62*4d7e907cSAndroid Build Coastguard Worker converted[i] = convert(params[i]);
63*4d7e907cSAndroid Build Coastguard Worker }
64*4d7e907cSAndroid Build Coastguard Worker return converted;
65*4d7e907cSAndroid Build Coastguard Worker }
66*4d7e907cSAndroid Build Coastguard Worker
convert(const hidl_vec<V3_0::KeyParameter> & params)67*4d7e907cSAndroid Build Coastguard Worker hidl_vec<KeyParameter> convert(const hidl_vec<V3_0::KeyParameter>& params) {
68*4d7e907cSAndroid Build Coastguard Worker hidl_vec<KeyParameter> converted(params.size());
69*4d7e907cSAndroid Build Coastguard Worker for (size_t i = 0; i < params.size(); ++i) {
70*4d7e907cSAndroid Build Coastguard Worker converted[i] = convert(params[i]);
71*4d7e907cSAndroid Build Coastguard Worker }
72*4d7e907cSAndroid Build Coastguard Worker return converted;
73*4d7e907cSAndroid Build Coastguard Worker }
74*4d7e907cSAndroid Build Coastguard Worker
75*4d7e907cSAndroid Build Coastguard Worker template <typename T, typename OutIter>
copy_bytes_to_iterator(const T & value,OutIter dest)76*4d7e907cSAndroid Build Coastguard Worker inline static OutIter copy_bytes_to_iterator(const T& value, OutIter dest) {
77*4d7e907cSAndroid Build Coastguard Worker const uint8_t* value_ptr = reinterpret_cast<const uint8_t*>(&value);
78*4d7e907cSAndroid Build Coastguard Worker return std::copy(value_ptr, value_ptr + sizeof(value), dest);
79*4d7e907cSAndroid Build Coastguard Worker }
80*4d7e907cSAndroid Build Coastguard Worker
convertAndAddAuthToken(const hidl_vec<KeyParameter> & params,const HardwareAuthToken & authToken)81*4d7e907cSAndroid Build Coastguard Worker hidl_vec<V3_0::KeyParameter> convertAndAddAuthToken(const hidl_vec<KeyParameter>& params,
82*4d7e907cSAndroid Build Coastguard Worker const HardwareAuthToken& authToken) {
83*4d7e907cSAndroid Build Coastguard Worker hidl_vec<V3_0::KeyParameter> converted(params.size() + 1);
84*4d7e907cSAndroid Build Coastguard Worker for (size_t i = 0; i < params.size(); ++i) {
85*4d7e907cSAndroid Build Coastguard Worker converted[i] = convert(params[i]);
86*4d7e907cSAndroid Build Coastguard Worker }
87*4d7e907cSAndroid Build Coastguard Worker converted[params.size()].tag = V3_0::Tag::AUTH_TOKEN;
88*4d7e907cSAndroid Build Coastguard Worker converted[params.size()].blob = V4_0::support::authToken2HidlVec(authToken);
89*4d7e907cSAndroid Build Coastguard Worker
90*4d7e907cSAndroid Build Coastguard Worker return converted;
91*4d7e907cSAndroid Build Coastguard Worker }
92*4d7e907cSAndroid Build Coastguard Worker
convert(const V3_0::KeyCharacteristics & chars)93*4d7e907cSAndroid Build Coastguard Worker KeyCharacteristics convert(const V3_0::KeyCharacteristics& chars) {
94*4d7e907cSAndroid Build Coastguard Worker KeyCharacteristics converted;
95*4d7e907cSAndroid Build Coastguard Worker converted.hardwareEnforced = convert(chars.teeEnforced);
96*4d7e907cSAndroid Build Coastguard Worker converted.softwareEnforced = convert(chars.softwareEnforced);
97*4d7e907cSAndroid Build Coastguard Worker return converted;
98*4d7e907cSAndroid Build Coastguard Worker }
99*4d7e907cSAndroid Build Coastguard Worker
100*4d7e907cSAndroid Build Coastguard Worker } // namespace
101*4d7e907cSAndroid Build Coastguard Worker
getVersionIfNeeded()102*4d7e907cSAndroid Build Coastguard Worker void Keymaster3::getVersionIfNeeded() {
103*4d7e907cSAndroid Build Coastguard Worker if (haveVersion_) return;
104*4d7e907cSAndroid Build Coastguard Worker
105*4d7e907cSAndroid Build Coastguard Worker auto rc = km3_dev_->getHardwareFeatures(
106*4d7e907cSAndroid Build Coastguard Worker [&](bool isSecure, bool supportsEllipticCurve, bool supportsSymmetricCryptography,
107*4d7e907cSAndroid Build Coastguard Worker bool supportsAttestation, bool supportsAllDigests, const hidl_string& keymasterName,
108*4d7e907cSAndroid Build Coastguard Worker const hidl_string& keymasterAuthorName) {
109*4d7e907cSAndroid Build Coastguard Worker version_ = {keymasterName,
110*4d7e907cSAndroid Build Coastguard Worker keymasterAuthorName,
111*4d7e907cSAndroid Build Coastguard Worker 0 /* major version, filled below */,
112*4d7e907cSAndroid Build Coastguard Worker 0 /* minor version */,
113*4d7e907cSAndroid Build Coastguard Worker isSecure ? SecurityLevel::TRUSTED_ENVIRONMENT : SecurityLevel::SOFTWARE,
114*4d7e907cSAndroid Build Coastguard Worker supportsEllipticCurve};
115*4d7e907cSAndroid Build Coastguard Worker supportsSymmetricCryptography_ = supportsSymmetricCryptography;
116*4d7e907cSAndroid Build Coastguard Worker supportsAttestation_ = supportsAttestation;
117*4d7e907cSAndroid Build Coastguard Worker supportsAllDigests_ = supportsAllDigests;
118*4d7e907cSAndroid Build Coastguard Worker });
119*4d7e907cSAndroid Build Coastguard Worker
120*4d7e907cSAndroid Build Coastguard Worker CHECK(rc.isOk()) << "Got error " << rc.description() << " trying to get hardware features";
121*4d7e907cSAndroid Build Coastguard Worker
122*4d7e907cSAndroid Build Coastguard Worker if (version_.securityLevel == SecurityLevel::SOFTWARE) {
123*4d7e907cSAndroid Build Coastguard Worker version_.majorVersion = 3;
124*4d7e907cSAndroid Build Coastguard Worker } else if (supportsAttestation_) {
125*4d7e907cSAndroid Build Coastguard Worker version_.majorVersion = 3; // Could be 2, doesn't matter.
126*4d7e907cSAndroid Build Coastguard Worker } else if (supportsSymmetricCryptography_) {
127*4d7e907cSAndroid Build Coastguard Worker version_.majorVersion = 1;
128*4d7e907cSAndroid Build Coastguard Worker } else {
129*4d7e907cSAndroid Build Coastguard Worker version_.majorVersion = 0;
130*4d7e907cSAndroid Build Coastguard Worker }
131*4d7e907cSAndroid Build Coastguard Worker }
132*4d7e907cSAndroid Build Coastguard Worker
getHardwareInfo(Keymaster3::getHardwareInfo_cb _hidl_cb)133*4d7e907cSAndroid Build Coastguard Worker Return<void> Keymaster3::getHardwareInfo(Keymaster3::getHardwareInfo_cb _hidl_cb) {
134*4d7e907cSAndroid Build Coastguard Worker getVersionIfNeeded();
135*4d7e907cSAndroid Build Coastguard Worker _hidl_cb(version_.securityLevel,
136*4d7e907cSAndroid Build Coastguard Worker std::string(version_.keymasterName) + " (wrapped by keystore::Keymaster3)",
137*4d7e907cSAndroid Build Coastguard Worker version_.authorName);
138*4d7e907cSAndroid Build Coastguard Worker return Void();
139*4d7e907cSAndroid Build Coastguard Worker }
140*4d7e907cSAndroid Build Coastguard Worker
addRngEntropy(const hidl_vec<uint8_t> & data)141*4d7e907cSAndroid Build Coastguard Worker Return<V4_0::ErrorCode> Keymaster3::addRngEntropy(const hidl_vec<uint8_t>& data) {
142*4d7e907cSAndroid Build Coastguard Worker auto rc = km3_dev_->addRngEntropy(data);
143*4d7e907cSAndroid Build Coastguard Worker if (!rc.isOk()) {
144*4d7e907cSAndroid Build Coastguard Worker return StatusOf<V3_0::ErrorCode, V4_0::ErrorCode>(rc);
145*4d7e907cSAndroid Build Coastguard Worker }
146*4d7e907cSAndroid Build Coastguard Worker return convert(rc);
147*4d7e907cSAndroid Build Coastguard Worker }
148*4d7e907cSAndroid Build Coastguard Worker
generateKey(const hidl_vec<KeyParameter> & keyParams,generateKey_cb _hidl_cb)149*4d7e907cSAndroid Build Coastguard Worker Return<void> Keymaster3::generateKey(const hidl_vec<KeyParameter>& keyParams,
150*4d7e907cSAndroid Build Coastguard Worker generateKey_cb _hidl_cb) {
151*4d7e907cSAndroid Build Coastguard Worker auto cb = [&](V3_0::ErrorCode error, const hidl_vec<uint8_t>& keyBlob,
152*4d7e907cSAndroid Build Coastguard Worker const V3_0::KeyCharacteristics& characteristics) {
153*4d7e907cSAndroid Build Coastguard Worker _hidl_cb(convert(error), keyBlob, convert(characteristics));
154*4d7e907cSAndroid Build Coastguard Worker };
155*4d7e907cSAndroid Build Coastguard Worker auto rc = km3_dev_->generateKey(convert(keyParams), cb);
156*4d7e907cSAndroid Build Coastguard Worker rc.isOk(); // move ctor prereq
157*4d7e907cSAndroid Build Coastguard Worker return rc;
158*4d7e907cSAndroid Build Coastguard Worker }
159*4d7e907cSAndroid 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)160*4d7e907cSAndroid Build Coastguard Worker Return<void> Keymaster3::getKeyCharacteristics(const hidl_vec<uint8_t>& keyBlob,
161*4d7e907cSAndroid Build Coastguard Worker const hidl_vec<uint8_t>& clientId,
162*4d7e907cSAndroid Build Coastguard Worker const hidl_vec<uint8_t>& appData,
163*4d7e907cSAndroid Build Coastguard Worker getKeyCharacteristics_cb _hidl_cb) {
164*4d7e907cSAndroid Build Coastguard Worker auto cb = [&](V3_0::ErrorCode error, const V3_0::KeyCharacteristics& chars) {
165*4d7e907cSAndroid Build Coastguard Worker _hidl_cb(convert(error), convert(chars));
166*4d7e907cSAndroid Build Coastguard Worker };
167*4d7e907cSAndroid Build Coastguard Worker
168*4d7e907cSAndroid Build Coastguard Worker auto rc = km3_dev_->getKeyCharacteristics(keyBlob, clientId, appData, cb);
169*4d7e907cSAndroid Build Coastguard Worker rc.isOk(); // move ctor prereq
170*4d7e907cSAndroid Build Coastguard Worker return rc;
171*4d7e907cSAndroid Build Coastguard Worker }
172*4d7e907cSAndroid Build Coastguard Worker
importKey(const hidl_vec<KeyParameter> & params,KeyFormat keyFormat,const hidl_vec<uint8_t> & keyData,importKey_cb _hidl_cb)173*4d7e907cSAndroid Build Coastguard Worker Return<void> Keymaster3::importKey(const hidl_vec<KeyParameter>& params, KeyFormat keyFormat,
174*4d7e907cSAndroid Build Coastguard Worker const hidl_vec<uint8_t>& keyData, importKey_cb _hidl_cb) {
175*4d7e907cSAndroid Build Coastguard Worker auto cb = [&](V3_0::ErrorCode error, const hidl_vec<uint8_t>& keyBlob,
176*4d7e907cSAndroid Build Coastguard Worker const V3_0::KeyCharacteristics& chars) {
177*4d7e907cSAndroid Build Coastguard Worker _hidl_cb(convert(error), keyBlob, convert(chars));
178*4d7e907cSAndroid Build Coastguard Worker };
179*4d7e907cSAndroid Build Coastguard Worker auto rc = km3_dev_->importKey(convert(params), convert(keyFormat), keyData, cb);
180*4d7e907cSAndroid Build Coastguard Worker rc.isOk(); // move ctor prereq
181*4d7e907cSAndroid Build Coastguard Worker return rc;
182*4d7e907cSAndroid Build Coastguard Worker }
183*4d7e907cSAndroid 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)184*4d7e907cSAndroid Build Coastguard Worker Return<void> Keymaster3::exportKey(KeyFormat exportFormat, const hidl_vec<uint8_t>& keyBlob,
185*4d7e907cSAndroid Build Coastguard Worker const hidl_vec<uint8_t>& clientId,
186*4d7e907cSAndroid Build Coastguard Worker const hidl_vec<uint8_t>& appData, exportKey_cb _hidl_cb) {
187*4d7e907cSAndroid Build Coastguard Worker auto cb = [&](V3_0::ErrorCode error, const hidl_vec<uint8_t>& keyMaterial) {
188*4d7e907cSAndroid Build Coastguard Worker _hidl_cb(convert(error), keyMaterial);
189*4d7e907cSAndroid Build Coastguard Worker };
190*4d7e907cSAndroid Build Coastguard Worker auto rc = km3_dev_->exportKey(convert(exportFormat), keyBlob, clientId, appData, cb);
191*4d7e907cSAndroid Build Coastguard Worker rc.isOk(); // move ctor prereq
192*4d7e907cSAndroid Build Coastguard Worker return rc;
193*4d7e907cSAndroid Build Coastguard Worker }
194*4d7e907cSAndroid Build Coastguard Worker
attestKey(const hidl_vec<uint8_t> & keyToAttest,const hidl_vec<KeyParameter> & attestParams,attestKey_cb _hidl_cb)195*4d7e907cSAndroid Build Coastguard Worker Return<void> Keymaster3::attestKey(const hidl_vec<uint8_t>& keyToAttest,
196*4d7e907cSAndroid Build Coastguard Worker const hidl_vec<KeyParameter>& attestParams,
197*4d7e907cSAndroid Build Coastguard Worker attestKey_cb _hidl_cb) {
198*4d7e907cSAndroid Build Coastguard Worker auto cb = [&](V3_0::ErrorCode error, const hidl_vec<hidl_vec<uint8_t>>& certChain) {
199*4d7e907cSAndroid Build Coastguard Worker _hidl_cb(convert(error), certChain);
200*4d7e907cSAndroid Build Coastguard Worker };
201*4d7e907cSAndroid Build Coastguard Worker auto rc = km3_dev_->attestKey(keyToAttest, convert(attestParams), cb);
202*4d7e907cSAndroid Build Coastguard Worker rc.isOk(); // move ctor prereq
203*4d7e907cSAndroid Build Coastguard Worker return rc;
204*4d7e907cSAndroid Build Coastguard Worker }
205*4d7e907cSAndroid Build Coastguard Worker
upgradeKey(const hidl_vec<uint8_t> & keyBlobToUpgrade,const hidl_vec<KeyParameter> & upgradeParams,upgradeKey_cb _hidl_cb)206*4d7e907cSAndroid Build Coastguard Worker Return<void> Keymaster3::upgradeKey(const hidl_vec<uint8_t>& keyBlobToUpgrade,
207*4d7e907cSAndroid Build Coastguard Worker const hidl_vec<KeyParameter>& upgradeParams,
208*4d7e907cSAndroid Build Coastguard Worker upgradeKey_cb _hidl_cb) {
209*4d7e907cSAndroid Build Coastguard Worker auto cb = [&](V3_0::ErrorCode error, const hidl_vec<uint8_t>& upgradedKeyBlob) {
210*4d7e907cSAndroid Build Coastguard Worker _hidl_cb(convert(error), upgradedKeyBlob);
211*4d7e907cSAndroid Build Coastguard Worker };
212*4d7e907cSAndroid Build Coastguard Worker auto rc = km3_dev_->upgradeKey(keyBlobToUpgrade, convert(upgradeParams), cb);
213*4d7e907cSAndroid Build Coastguard Worker rc.isOk(); // move ctor prereq
214*4d7e907cSAndroid Build Coastguard Worker return rc;
215*4d7e907cSAndroid Build Coastguard Worker }
216*4d7e907cSAndroid Build Coastguard Worker
deleteKey(const hidl_vec<uint8_t> & keyBlob)217*4d7e907cSAndroid Build Coastguard Worker Return<V4_0::ErrorCode> Keymaster3::deleteKey(const hidl_vec<uint8_t>& keyBlob) {
218*4d7e907cSAndroid Build Coastguard Worker auto rc = km3_dev_->deleteKey(keyBlob);
219*4d7e907cSAndroid Build Coastguard Worker if (!rc.isOk()) return StatusOf<V3_0::ErrorCode, V4_0::ErrorCode>(rc);
220*4d7e907cSAndroid Build Coastguard Worker return convert(rc);
221*4d7e907cSAndroid Build Coastguard Worker }
222*4d7e907cSAndroid Build Coastguard Worker
deleteAllKeys()223*4d7e907cSAndroid Build Coastguard Worker Return<V4_0::ErrorCode> Keymaster3::deleteAllKeys() {
224*4d7e907cSAndroid Build Coastguard Worker auto rc = km3_dev_->deleteAllKeys();
225*4d7e907cSAndroid Build Coastguard Worker if (!rc.isOk()) return StatusOf<V3_0::ErrorCode, V4_0::ErrorCode>(rc);
226*4d7e907cSAndroid Build Coastguard Worker return convert(rc);
227*4d7e907cSAndroid Build Coastguard Worker }
228*4d7e907cSAndroid Build Coastguard Worker
destroyAttestationIds()229*4d7e907cSAndroid Build Coastguard Worker Return<V4_0::ErrorCode> Keymaster3::destroyAttestationIds() {
230*4d7e907cSAndroid Build Coastguard Worker auto rc = km3_dev_->destroyAttestationIds();
231*4d7e907cSAndroid Build Coastguard Worker if (!rc.isOk()) return StatusOf<V3_0::ErrorCode, V4_0::ErrorCode>(rc);
232*4d7e907cSAndroid Build Coastguard Worker return convert(rc);
233*4d7e907cSAndroid Build Coastguard Worker }
234*4d7e907cSAndroid Build Coastguard Worker
begin(KeyPurpose purpose,const hidl_vec<uint8_t> & key,const hidl_vec<KeyParameter> & inParams,const HardwareAuthToken & authToken,begin_cb _hidl_cb)235*4d7e907cSAndroid Build Coastguard Worker Return<void> Keymaster3::begin(KeyPurpose purpose, const hidl_vec<uint8_t>& key,
236*4d7e907cSAndroid Build Coastguard Worker const hidl_vec<KeyParameter>& inParams,
237*4d7e907cSAndroid Build Coastguard Worker const HardwareAuthToken& authToken, begin_cb _hidl_cb) {
238*4d7e907cSAndroid Build Coastguard Worker auto cb = [&](V3_0::ErrorCode error, const hidl_vec<V3_0::KeyParameter>& outParams,
239*4d7e907cSAndroid Build Coastguard Worker OperationHandle operationHandle) {
240*4d7e907cSAndroid Build Coastguard Worker _hidl_cb(convert(error), convert(outParams), operationHandle);
241*4d7e907cSAndroid Build Coastguard Worker };
242*4d7e907cSAndroid Build Coastguard Worker
243*4d7e907cSAndroid Build Coastguard Worker auto rc =
244*4d7e907cSAndroid Build Coastguard Worker km3_dev_->begin(convert(purpose), key, convertAndAddAuthToken(inParams, authToken), cb);
245*4d7e907cSAndroid Build Coastguard Worker rc.isOk(); // move ctor prereq
246*4d7e907cSAndroid Build Coastguard Worker return rc;
247*4d7e907cSAndroid Build Coastguard Worker }
248*4d7e907cSAndroid 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)249*4d7e907cSAndroid Build Coastguard Worker Return<void> Keymaster3::update(uint64_t operationHandle, const hidl_vec<KeyParameter>& inParams,
250*4d7e907cSAndroid Build Coastguard Worker const hidl_vec<uint8_t>& input, const HardwareAuthToken& authToken,
251*4d7e907cSAndroid Build Coastguard Worker const VerificationToken& /* verificationToken */,
252*4d7e907cSAndroid Build Coastguard Worker update_cb _hidl_cb) {
253*4d7e907cSAndroid Build Coastguard Worker auto cb = [&](V3_0::ErrorCode error, uint32_t inputConsumed,
254*4d7e907cSAndroid Build Coastguard Worker const hidl_vec<V3_0::KeyParameter>& outParams, const hidl_vec<uint8_t>& output) {
255*4d7e907cSAndroid Build Coastguard Worker _hidl_cb(convert(error), inputConsumed, convert(outParams), output);
256*4d7e907cSAndroid Build Coastguard Worker };
257*4d7e907cSAndroid Build Coastguard Worker
258*4d7e907cSAndroid Build Coastguard Worker auto rc = km3_dev_->update(operationHandle, convertAndAddAuthToken(inParams, authToken), input,
259*4d7e907cSAndroid Build Coastguard Worker cb);
260*4d7e907cSAndroid Build Coastguard Worker rc.isOk(); // move ctor prereq
261*4d7e907cSAndroid Build Coastguard Worker return rc;
262*4d7e907cSAndroid Build Coastguard Worker }
263*4d7e907cSAndroid 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)264*4d7e907cSAndroid Build Coastguard Worker Return<void> Keymaster3::finish(uint64_t operationHandle, const hidl_vec<KeyParameter>& inParams,
265*4d7e907cSAndroid Build Coastguard Worker const hidl_vec<uint8_t>& input, const hidl_vec<uint8_t>& signature,
266*4d7e907cSAndroid Build Coastguard Worker const HardwareAuthToken& authToken,
267*4d7e907cSAndroid Build Coastguard Worker const VerificationToken& /* verificationToken */,
268*4d7e907cSAndroid Build Coastguard Worker finish_cb _hidl_cb) {
269*4d7e907cSAndroid Build Coastguard Worker auto cb = [&](V3_0::ErrorCode error, const hidl_vec<V3_0::KeyParameter>& outParams,
270*4d7e907cSAndroid Build Coastguard Worker const hidl_vec<uint8_t>& output) {
271*4d7e907cSAndroid Build Coastguard Worker _hidl_cb(convert(error), convert(outParams), output);
272*4d7e907cSAndroid Build Coastguard Worker };
273*4d7e907cSAndroid Build Coastguard Worker
274*4d7e907cSAndroid Build Coastguard Worker auto rc = km3_dev_->finish(operationHandle, convertAndAddAuthToken(inParams, authToken), input,
275*4d7e907cSAndroid Build Coastguard Worker signature, cb);
276*4d7e907cSAndroid Build Coastguard Worker rc.isOk(); // move ctor prereq
277*4d7e907cSAndroid Build Coastguard Worker return rc;
278*4d7e907cSAndroid Build Coastguard Worker }
279*4d7e907cSAndroid Build Coastguard Worker
abort(uint64_t operationHandle)280*4d7e907cSAndroid Build Coastguard Worker Return<V4_0::ErrorCode> Keymaster3::abort(uint64_t operationHandle) {
281*4d7e907cSAndroid Build Coastguard Worker auto rc = km3_dev_->abort(operationHandle);
282*4d7e907cSAndroid Build Coastguard Worker if (!rc.isOk()) return StatusOf<V3_0::ErrorCode, V4_0::ErrorCode>(rc);
283*4d7e907cSAndroid Build Coastguard Worker return convert(rc);
284*4d7e907cSAndroid Build Coastguard Worker }
285*4d7e907cSAndroid Build Coastguard Worker
286*4d7e907cSAndroid Build Coastguard Worker } // namespace android::hardware::keymaster::V4_1::support
287