1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "face_auth_executor_hdi.h"
17
18 #include <cstdint>
19 #include <functional>
20 #include <map>
21 #include <memory>
22 #include <new>
23 #include <utility>
24 #include <vector>
25
26 #include "hdf_base.h"
27 #include "refbase.h"
28
29 #include "iam_check.h"
30 #include "iam_executor_framework_types.h"
31 #include "iam_logger.h"
32
33 #include "buffer_producer_sequenceable.h"
34 #include "face_auth_defines.h"
35 #include "face_auth_executor_callback_hdi.h"
36 #include "face_auth_hdi.h"
37 #include "sa_command_manager.h"
38
39 #define LOG_LABEL UserIam::Common::LABEL_FACE_AUTH_SA
40
41 namespace OHOS {
42 namespace UserIam {
43 namespace FaceAuth {
44 using IamResultCode = UserAuth::ResultCode;
45 using IamExecutorRole = UserAuth::ExecutorRole;
46 using IamExecutorInfo = UserAuth::ExecutorInfo;
47 using BufferProducerSequenceable = OHOS::HDI::Camera::V1_0::BufferProducerSequenceable;
48 namespace UserAuth = OHOS::UserIam::UserAuth;
FaceAuthExecutorHdi(sptr<IExecutor> executorProxy)49 FaceAuthExecutorHdi::FaceAuthExecutorHdi(sptr<IExecutor> executorProxy) : executorProxy_(executorProxy) {};
50
GetExecutorInfo(IamExecutorInfo & info)51 IamResultCode FaceAuthExecutorHdi::GetExecutorInfo(IamExecutorInfo &info)
52 {
53 IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
54 ExecutorInfo localInfo = {};
55 int32_t status = executorProxy_->GetExecutorInfo(localInfo);
56 IamResultCode result = ConvertResultCode(status);
57 if (result != IamResultCode::SUCCESS) {
58 IAM_LOGE("GetExecutorInfo fail result %{public}d", result);
59 return result;
60 }
61 result = MoveHdiExecutorInfo(localInfo, info);
62 if (result != IamResultCode::SUCCESS) {
63 IAM_LOGE("MoveHdiExecutorInfo fail result %{public}d", result);
64 return result;
65 }
66 return IamResultCode::SUCCESS;
67 }
68
OnRegisterFinish(const std::vector<uint64_t> & templateIdList,const std::vector<uint8_t> & frameworkPublicKey,const std::vector<uint8_t> & extraInfo)69 IamResultCode FaceAuthExecutorHdi::OnRegisterFinish(const std::vector<uint64_t> &templateIdList,
70 const std::vector<uint8_t> &frameworkPublicKey, const std::vector<uint8_t> &extraInfo)
71 {
72 IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
73 int32_t status = executorProxy_->OnRegisterFinish(templateIdList, frameworkPublicKey, extraInfo);
74 IamResultCode result = ConvertResultCode(status);
75 if (result != IamResultCode::SUCCESS) {
76 IAM_LOGE("OnRegisterFinish fail result %{public}d", result);
77 return result;
78 }
79
80 result = RegisterSaCommandCallback();
81 if (result != IamResultCode::SUCCESS) {
82 IAM_LOGE("RegisterSaCommandCallback fail");
83 return result;
84 }
85 return IamResultCode::SUCCESS;
86 }
87
Enroll(uint64_t scheduleId,const UserAuth::EnrollParam & param,const std::shared_ptr<UserAuth::IExecuteCallback> & callbackObj)88 IamResultCode FaceAuthExecutorHdi::Enroll(uint64_t scheduleId, const UserAuth::EnrollParam ¶m,
89 const std::shared_ptr<UserAuth::IExecuteCallback> &callbackObj)
90 {
91 IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
92 IF_FALSE_LOGE_AND_RETURN_VAL(callbackObj != nullptr, IamResultCode::GENERAL_ERROR);
93 sptr<IExecutorCallback> callback(new (std::nothrow) FaceAuthExecutorCallbackHdi(callbackObj));
94 IF_FALSE_LOGE_AND_RETURN_VAL(callback != nullptr, IamResultCode::GENERAL_ERROR);
95 int32_t status = executorProxy_->Enroll(scheduleId, param.extraInfo, callback);
96 IamResultCode result = ConvertResultCode(status);
97 if (result != IamResultCode::SUCCESS) {
98 IAM_LOGE("Enroll fail result %{public}d", result);
99 return result;
100 }
101 return IamResultCode::SUCCESS;
102 }
103
Authenticate(uint64_t scheduleId,const UserAuth::AuthenticateParam & param,const std::shared_ptr<UserAuth::IExecuteCallback> & callbackObj)104 IamResultCode FaceAuthExecutorHdi::Authenticate(uint64_t scheduleId, const UserAuth::AuthenticateParam ¶m,
105 const std::shared_ptr<UserAuth::IExecuteCallback> &callbackObj)
106 {
107 IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
108 IF_FALSE_LOGE_AND_RETURN_VAL(callbackObj != nullptr, IamResultCode::GENERAL_ERROR);
109 sptr<IExecutorCallback> callback(new (std::nothrow) FaceAuthExecutorCallbackHdi(callbackObj));
110 IF_FALSE_LOGE_AND_RETURN_VAL(callback != nullptr, IamResultCode::GENERAL_ERROR);
111 int32_t status = executorProxy_->Authenticate(scheduleId, param.templateIdList, param.extraInfo, callback);
112 IamResultCode result = ConvertResultCode(status);
113 if (result != IamResultCode::SUCCESS) {
114 IAM_LOGE("Authenticate fail result %{public}d", result);
115 return result;
116 }
117 return IamResultCode::SUCCESS;
118 }
119
Identify(uint64_t scheduleId,const UserAuth::IdentifyParam & param,const std::shared_ptr<UserAuth::IExecuteCallback> & callbackObj)120 IamResultCode FaceAuthExecutorHdi::Identify(uint64_t scheduleId, const UserAuth::IdentifyParam ¶m,
121 const std::shared_ptr<UserAuth::IExecuteCallback> &callbackObj)
122 {
123 IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
124 IF_FALSE_LOGE_AND_RETURN_VAL(callbackObj != nullptr, IamResultCode::GENERAL_ERROR);
125 sptr<IExecutorCallback> callback(new (std::nothrow) FaceAuthExecutorCallbackHdi(callbackObj));
126 IF_FALSE_LOGE_AND_RETURN_VAL(callback != nullptr, IamResultCode::GENERAL_ERROR);
127 int32_t status = executorProxy_->Identify(scheduleId, param.extraInfo, callback);
128 IamResultCode result = ConvertResultCode(status);
129 if (result != IamResultCode::SUCCESS) {
130 IAM_LOGE("Identify fail result %{public}d", result);
131 return result;
132 }
133 return IamResultCode::SUCCESS;
134 }
135
Delete(const std::vector<uint64_t> & templateIdList)136 IamResultCode FaceAuthExecutorHdi::Delete(const std::vector<uint64_t> &templateIdList)
137 {
138 IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
139 int32_t status = executorProxy_->Delete(templateIdList);
140 IamResultCode result = ConvertResultCode(status);
141 if (result != IamResultCode::SUCCESS) {
142 IAM_LOGE("Delete fail result %{public}d", result);
143 return result;
144 }
145 return IamResultCode::SUCCESS;
146 }
147
Cancel(uint64_t scheduleId)148 IamResultCode FaceAuthExecutorHdi::Cancel(uint64_t scheduleId)
149 {
150 IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
151 int32_t status = executorProxy_->Cancel(scheduleId);
152 IamResultCode result = ConvertResultCode(status);
153 if (result != IamResultCode::SUCCESS) {
154 IAM_LOGE("Cancel fail result %{public}d", result);
155 return result;
156 }
157 return IamResultCode::SUCCESS;
158 }
159
SendCommand(UserAuth::PropertyMode commandId,const std::vector<uint8_t> & extraInfo,const std::shared_ptr<UserAuth::IExecuteCallback> & callbackObj)160 IamResultCode FaceAuthExecutorHdi::SendCommand(UserAuth::PropertyMode commandId, const std::vector<uint8_t> &extraInfo,
161 const std::shared_ptr<UserAuth::IExecuteCallback> &callbackObj)
162 {
163 IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
164 IF_FALSE_LOGE_AND_RETURN_VAL(callbackObj != nullptr, IamResultCode::GENERAL_ERROR);
165 CommandId hdiCommandId;
166 IamResultCode result = ConvertCommandId(commandId, hdiCommandId);
167 if (result != IamResultCode::SUCCESS) {
168 IAM_LOGE("ConvertCommandId fail result %{public}d", result);
169 return result;
170 }
171 sptr<IExecutorCallback> callback(new (std::nothrow) FaceAuthExecutorCallbackHdi(callbackObj));
172 IF_FALSE_LOGE_AND_RETURN_VAL(callback != nullptr, IamResultCode::GENERAL_ERROR);
173 int32_t status = executorProxy_->SendCommand(hdiCommandId, extraInfo, callback);
174 result = ConvertResultCode(status);
175 if (result != IamResultCode::SUCCESS) {
176 IAM_LOGE("SendCommand fail result %{public}d", result);
177 return result;
178 }
179 return IamResultCode::SUCCESS;
180 }
181
GetProperty(const std::vector<uint64_t> & templateIdList,const std::vector<UserAuth::Attributes::AttributeKey> & keys,UserAuth::Property & property)182 UserAuth::ResultCode FaceAuthExecutorHdi::GetProperty(const std::vector<uint64_t> &templateIdList,
183 const std::vector<UserAuth::Attributes::AttributeKey> &keys, UserAuth::Property &property)
184 {
185 IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
186
187 std::vector<GetPropertyType> propertyTypes;
188 IamResultCode result = ConvertAttributeKeyVectorToPropertyType(keys, propertyTypes);
189 IF_FALSE_LOGE_AND_RETURN_VAL(result == IamResultCode::SUCCESS, IamResultCode::GENERAL_ERROR);
190
191 Property hdiProperty;
192 int32_t status = executorProxy_->GetProperty(templateIdList, propertyTypes, hdiProperty);
193 result = ConvertResultCode(status);
194 if (result != IamResultCode::SUCCESS) {
195 IAM_LOGE("SendCommand fail result %{public}d", result);
196 return result;
197 }
198 MoveHdiProperty(hdiProperty, property);
199 return IamResultCode::SUCCESS;
200 }
201
SetCachedTemplates(const std::vector<uint64_t> & templateIdList)202 UserAuth::ResultCode FaceAuthExecutorHdi::SetCachedTemplates(const std::vector<uint64_t> &templateIdList)
203 {
204 IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
205
206 int32_t status = executorProxy_->SetCachedTemplates(templateIdList);
207 IamResultCode result = ConvertResultCode(status);
208 if (result != IamResultCode::SUCCESS) {
209 IAM_LOGE("SendCommand fail result %{public}d", result);
210 return result;
211 }
212 return IamResultCode::SUCCESS;
213 }
214
SetBufferProducer(sptr<IBufferProducer> & producer)215 int32_t FaceAuthExecutorHdi::SetBufferProducer(sptr<IBufferProducer> &producer)
216 {
217 IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
218 OHOS::sptr<BufferProducerSequenceable> producerSequenceable(nullptr);
219 if (producer != nullptr) {
220 producerSequenceable =
221 sptr<BufferProducerSequenceable>(new (std::nothrow) BufferProducerSequenceable(producer));
222 IF_FALSE_LOGE_AND_RETURN_VAL(producerSequenceable != nullptr, FACE_AUTH_ERROR);
223 }
224
225 int32_t status = executorProxy_->SetBufferProducer(producerSequenceable);
226 IamResultCode result = ConvertResultCode(status);
227 if (result != IamResultCode::SUCCESS) {
228 IAM_LOGE("SetBufferProducer fail result %{public}d", result);
229 return FACE_AUTH_ERROR;
230 }
231 return FACE_AUTH_SUCCESS;
232 }
233
OnHdiDisconnect()234 void FaceAuthExecutorHdi::OnHdiDisconnect()
235 {
236 IAM_LOGE("start");
237 SaCommandManager::GetInstance().OnHdiDisconnect(shared_from_this());
238 }
239
MoveHdiExecutorInfo(ExecutorInfo & in,IamExecutorInfo & out)240 IamResultCode FaceAuthExecutorHdi::MoveHdiExecutorInfo(ExecutorInfo &in, IamExecutorInfo &out)
241 {
242 out.executorSensorHint = static_cast<uint32_t>(in.sensorId);
243 out.executorMatcher = in.executorType;
244 IamResultCode result = ConvertExecutorRole(in.executorRole, out.executorRole);
245 if (result != IamResultCode::SUCCESS) {
246 IAM_LOGE("ConvertExecutorRole fail result %{public}d", result);
247 return result;
248 }
249 result = ConvertAuthType(in.authType, out.authType);
250 if (result != IamResultCode::SUCCESS) {
251 IAM_LOGE("ConvertAuthType fail result %{public}d", result);
252 return result;
253 }
254 result = ConvertExecutorSecureLevel(in.esl, out.esl);
255 if (result != IamResultCode::SUCCESS) {
256 IAM_LOGE("ConvertExecutorSecureLevel fail result %{public}d", result);
257 return result;
258 }
259 in.publicKey.swap(out.publicKey);
260 return IamResultCode::SUCCESS;
261 }
262
MoveHdiProperty(Property & in,UserAuth::Property & out)263 void FaceAuthExecutorHdi::MoveHdiProperty(Property &in, UserAuth::Property &out)
264 {
265 out.authSubType = in.authSubType;
266 out.lockoutDuration = in.lockoutDuration;
267 out.remainAttempts = in.remainAttempts;
268 out.enrollmentProgress.swap(in.enrollmentProgress);
269 out.sensorInfo.swap(in.sensorInfo);
270 }
271
MoveHdiTemplateInfo(TemplateInfo & in,UserAuth::TemplateInfo & out)272 void FaceAuthExecutorHdi::MoveHdiTemplateInfo(TemplateInfo &in, UserAuth::TemplateInfo &out)
273 {
274 out.executorType = in.executorType;
275 out.freezingTime = in.lockoutDuration;
276 out.remainTimes = in.remainAttempts;
277 in.extraInfo.swap(out.extraInfo);
278 }
279
ConvertCommandId(const UserAuth::PropertyMode in,CommandId & out)280 IamResultCode FaceAuthExecutorHdi::ConvertCommandId(const UserAuth::PropertyMode in, CommandId &out)
281 {
282 if (static_cast<CommandId>(in) > CommandId::VENDOR_COMMAND_BEGIN) {
283 out = static_cast<CommandId>(in);
284 IAM_LOGI("vendor command id %{public}d, no covert", out);
285 return IamResultCode::SUCCESS;
286 }
287
288 static const std::map<UserAuth::PropertyMode, CommandId> data = {
289 { UserAuth::PropertyMode::PROPERTY_INIT_ALGORITHM, CommandId::INIT_ALGORITHM },
290 { UserAuth::PropertyMode::PROPERTY_MODE_FREEZE, CommandId::LOCK_TEMPLATE },
291 { UserAuth::PropertyMode::PROPERTY_MODE_UNFREEZE, CommandId::UNLOCK_TEMPLATE } };
292 auto iter = data.find(in);
293 if (iter == data.end()) {
294 IAM_LOGE("command id %{public}d is invalid", in);
295 return IamResultCode::INVALID_PARAMETERS;
296 }
297 out = iter->second;
298 IAM_LOGI("covert command id %{public}d to idl command is %{public}d", in, out);
299 return IamResultCode::SUCCESS;
300 }
301
ConvertAuthType(const AuthType in,UserAuth::AuthType & out)302 IamResultCode FaceAuthExecutorHdi::ConvertAuthType(const AuthType in, UserAuth::AuthType &out)
303 {
304 static const std::map<AuthType, UserAuth::AuthType> data = {
305 { AuthType::FACE, UserAuth::AuthType::FACE },
306 };
307 auto iter = data.find(in);
308 if (iter == data.end()) {
309 IAM_LOGE("authType %{public}d is invalid", in);
310 return IamResultCode::GENERAL_ERROR;
311 }
312 out = iter->second;
313 return IamResultCode::SUCCESS;
314 }
315
ConvertExecutorRole(const ExecutorRole in,IamExecutorRole & out)316 IamResultCode FaceAuthExecutorHdi::ConvertExecutorRole(const ExecutorRole in, IamExecutorRole &out)
317 {
318 static const std::map<ExecutorRole, IamExecutorRole> data = {
319 { ExecutorRole::COLLECTOR, IamExecutorRole::COLLECTOR },
320 { ExecutorRole::VERIFIER, IamExecutorRole::VERIFIER },
321 { ExecutorRole::ALL_IN_ONE, IamExecutorRole::ALL_IN_ONE },
322 };
323 auto iter = data.find(in);
324 if (iter == data.end()) {
325 IAM_LOGE("executorRole %{public}d is invalid", in);
326 return IamResultCode::GENERAL_ERROR;
327 }
328 out = iter->second;
329 return IamResultCode::SUCCESS;
330 }
331
ConvertExecutorSecureLevel(const ExecutorSecureLevel in,UserAuth::ExecutorSecureLevel & out)332 IamResultCode FaceAuthExecutorHdi::ConvertExecutorSecureLevel(const ExecutorSecureLevel in,
333 UserAuth::ExecutorSecureLevel &out)
334 {
335 static const std::map<ExecutorSecureLevel, UserAuth::ExecutorSecureLevel> data = {
336 { ExecutorSecureLevel::ESL0, UserAuth::ExecutorSecureLevel::ESL0 },
337 { ExecutorSecureLevel::ESL1, UserAuth::ExecutorSecureLevel::ESL1 },
338 { ExecutorSecureLevel::ESL2, UserAuth::ExecutorSecureLevel::ESL2 },
339 { ExecutorSecureLevel::ESL3, UserAuth::ExecutorSecureLevel::ESL3 },
340 };
341 auto iter = data.find(in);
342 if (iter == data.end()) {
343 IAM_LOGE("executorSecureLevel %{public}d is invalid", in);
344 return IamResultCode::GENERAL_ERROR;
345 }
346 out = iter->second;
347 return IamResultCode::SUCCESS;
348 }
349
ConvertResultCode(const int32_t in)350 IamResultCode FaceAuthExecutorHdi::ConvertResultCode(const int32_t in)
351 {
352 HDF_STATUS hdfIn = static_cast<HDF_STATUS>(in);
353 static const std::map<HDF_STATUS, IamResultCode> data = {
354 { HDF_SUCCESS, IamResultCode::SUCCESS },
355 { HDF_FAILURE, IamResultCode::GENERAL_ERROR },
356 { HDF_ERR_TIMEOUT, IamResultCode::TIMEOUT },
357 { HDF_ERR_QUEUE_FULL, IamResultCode::BUSY },
358 { HDF_ERR_DEVICE_BUSY, IamResultCode::BUSY },
359 };
360
361 IamResultCode out;
362 auto iter = data.find(hdfIn);
363 if (iter == data.end()) {
364 out = IamResultCode::GENERAL_ERROR;
365 } else {
366 out = iter->second;
367 }
368 IAM_LOGI("covert hdi result code %{public}d to framework result code %{public}d", in, out);
369 return out;
370 }
371
ConvertAttributeKeyVectorToPropertyType(const std::vector<UserAuth::Attributes::AttributeKey> inItems,std::vector<GetPropertyType> & outItems)372 IamResultCode FaceAuthExecutorHdi::ConvertAttributeKeyVectorToPropertyType(
373 const std::vector<UserAuth::Attributes::AttributeKey> inItems, std::vector<GetPropertyType> &outItems)
374 {
375 outItems.clear();
376 for (auto &inItem : inItems) {
377 GetPropertyType outItem;
378 IamResultCode result = ConvertAttributeKeyToPropertyType(inItem, outItem);
379 IF_FALSE_LOGE_AND_RETURN_VAL(result == IamResultCode::SUCCESS, IamResultCode::GENERAL_ERROR);
380 outItems.push_back(outItem);
381 }
382
383 return IamResultCode::SUCCESS;
384 }
385
ConvertAttributeKeyToPropertyType(const UserAuth::Attributes::AttributeKey in,GetPropertyType & out)386 IamResultCode FaceAuthExecutorHdi::ConvertAttributeKeyToPropertyType(const UserAuth::Attributes::AttributeKey in,
387 GetPropertyType &out)
388 {
389 static const std::map<UserAuth::Attributes::AttributeKey, GetPropertyType> data = {
390 { UserAuth::Attributes::ATTR_PIN_SUB_TYPE, GetPropertyType::AUTH_SUB_TYPE },
391 { UserAuth::Attributes::ATTR_FREEZING_TIME, GetPropertyType::LOCKOUT_DURATION },
392 { UserAuth::Attributes::ATTR_REMAIN_TIMES, GetPropertyType::REMAIN_ATTEMPTS },
393 { UserAuth::Attributes::ATTR_ENROLL_PROGRESS, GetPropertyType::ENROLL_PROGRESS },
394 { UserAuth::Attributes::ATTR_SENSOR_INFO, GetPropertyType::SENSOR_INFO },
395 };
396
397 auto iter = data.find(in);
398 if (iter == data.end()) {
399 IAM_LOGE("attribute %{public}d is invalid", in);
400 return IamResultCode::GENERAL_ERROR;
401 } else {
402 out = iter->second;
403 }
404 IAM_LOGI("covert hdi result code %{public}d to framework result code %{public}d", in, out);
405 return IamResultCode::SUCCESS;
406 }
407
RegisterSaCommandCallback()408 UserAuth::ResultCode FaceAuthExecutorHdi::RegisterSaCommandCallback()
409 {
410 IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
411
412 sptr<SaCommandCallback> callback(new (std::nothrow) SaCommandCallback(shared_from_this()));
413 IF_FALSE_LOGE_AND_RETURN_VAL(callback != nullptr, IamResultCode::GENERAL_ERROR);
414
415 int32_t status = executorProxy_->RegisterSaCommandCallback(callback);
416 IamResultCode result = ConvertResultCode(status);
417 if (result != IamResultCode::SUCCESS) {
418 IAM_LOGE("RegisterSaCommandCallback fail result %{public}d", result);
419 return result;
420 }
421
422 return IamResultCode::SUCCESS;
423 }
424
OnSaCommands(const std::vector<SaCommand> & commands)425 int32_t FaceAuthExecutorHdi::SaCommandCallback::OnSaCommands(const std::vector<SaCommand> &commands)
426 {
427 IAM_LOGI("start");
428 IamResultCode result = SaCommandManager::GetInstance().ProcessSaCommands(executorHdi_, commands);
429 if (result != IamResultCode::SUCCESS) {
430 IAM_LOGE("ProcessSaCommands fail");
431 return HDF_FAILURE;
432 }
433 IAM_LOGI("success");
434 return HDF_SUCCESS;
435 };
436 } // namespace FaceAuth
437 } // namespace UserIam
438 } // namespace OHOS
439