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(
94 new (std::nothrow) FaceAuthExecutorCallbackHdi(callbackObj, FACE_CALLBACK_ENROLL));
95 IF_FALSE_LOGE_AND_RETURN_VAL(callback != nullptr, IamResultCode::GENERAL_ERROR);
96 int32_t status = executorProxy_->Enroll(scheduleId, param.extraInfo, callback);
97 IamResultCode result = ConvertResultCode(status);
98 if (result != IamResultCode::SUCCESS) {
99 IAM_LOGE("Enroll fail result %{public}d", result);
100 return result;
101 }
102 return IamResultCode::SUCCESS;
103 }
104
Authenticate(uint64_t scheduleId,const UserAuth::AuthenticateParam & param,const std::shared_ptr<UserAuth::IExecuteCallback> & callbackObj)105 IamResultCode FaceAuthExecutorHdi::Authenticate(uint64_t scheduleId, const UserAuth::AuthenticateParam ¶m,
106 const std::shared_ptr<UserAuth::IExecuteCallback> &callbackObj)
107 {
108 IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
109 IF_FALSE_LOGE_AND_RETURN_VAL(callbackObj != nullptr, IamResultCode::GENERAL_ERROR);
110 sptr<IExecutorCallback> callback(new (std::nothrow) FaceAuthExecutorCallbackHdi(callbackObj, FACE_CALLBACK_AUTH));
111 IF_FALSE_LOGE_AND_RETURN_VAL(callback != nullptr, IamResultCode::GENERAL_ERROR);
112 int32_t status = executorProxy_->Authenticate(scheduleId, param.templateIdList, param.extraInfo, callback);
113 IamResultCode result = ConvertResultCode(status);
114 if (result != IamResultCode::SUCCESS) {
115 IAM_LOGE("Authenticate fail result %{public}d", result);
116 return result;
117 }
118 return IamResultCode::SUCCESS;
119 }
120
Identify(uint64_t scheduleId,const UserAuth::IdentifyParam & param,const std::shared_ptr<UserAuth::IExecuteCallback> & callbackObj)121 IamResultCode FaceAuthExecutorHdi::Identify(uint64_t scheduleId, const UserAuth::IdentifyParam ¶m,
122 const std::shared_ptr<UserAuth::IExecuteCallback> &callbackObj)
123 {
124 IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
125 IF_FALSE_LOGE_AND_RETURN_VAL(callbackObj != nullptr, IamResultCode::GENERAL_ERROR);
126 sptr<IExecutorCallback> callback(
127 new (std::nothrow) FaceAuthExecutorCallbackHdi(callbackObj, FACE_CALLBACK_IDENTIFY));
128 IF_FALSE_LOGE_AND_RETURN_VAL(callback != nullptr, IamResultCode::GENERAL_ERROR);
129 int32_t status = executorProxy_->Identify(scheduleId, param.extraInfo, callback);
130 IamResultCode result = ConvertResultCode(status);
131 if (result != IamResultCode::SUCCESS) {
132 IAM_LOGE("Identify fail result %{public}d", result);
133 return result;
134 }
135 return IamResultCode::SUCCESS;
136 }
137
Delete(const std::vector<uint64_t> & templateIdList)138 IamResultCode FaceAuthExecutorHdi::Delete(const std::vector<uint64_t> &templateIdList)
139 {
140 IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
141 int32_t status = executorProxy_->Delete(templateIdList);
142 IamResultCode result = ConvertResultCode(status);
143 if (result != IamResultCode::SUCCESS) {
144 IAM_LOGE("Delete fail result %{public}d", result);
145 return result;
146 }
147 return IamResultCode::SUCCESS;
148 }
149
Cancel(uint64_t scheduleId)150 IamResultCode FaceAuthExecutorHdi::Cancel(uint64_t scheduleId)
151 {
152 IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
153 int32_t status = executorProxy_->Cancel(scheduleId);
154 IamResultCode result = ConvertResultCode(status);
155 if (result != IamResultCode::SUCCESS) {
156 IAM_LOGE("Cancel fail result %{public}d", result);
157 return result;
158 }
159 return IamResultCode::SUCCESS;
160 }
161
SendCommand(UserAuth::PropertyMode commandId,const std::vector<uint8_t> & extraInfo,const std::shared_ptr<UserAuth::IExecuteCallback> & callbackObj)162 IamResultCode FaceAuthExecutorHdi::SendCommand(UserAuth::PropertyMode commandId, const std::vector<uint8_t> &extraInfo,
163 const std::shared_ptr<UserAuth::IExecuteCallback> &callbackObj)
164 {
165 IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
166 IF_FALSE_LOGE_AND_RETURN_VAL(callbackObj != nullptr, IamResultCode::GENERAL_ERROR);
167 CommandId hdiCommandId;
168 IamResultCode result = ConvertCommandId(commandId, hdiCommandId);
169 if (result != IamResultCode::SUCCESS) {
170 IAM_LOGE("ConvertCommandId fail result %{public}d", result);
171 return result;
172 }
173 sptr<IExecutorCallback> callback(
174 new (std::nothrow) FaceAuthExecutorCallbackHdi(callbackObj, FACE_CALLBACK_COMMAND));
175 IF_FALSE_LOGE_AND_RETURN_VAL(callback != nullptr, IamResultCode::GENERAL_ERROR);
176 int32_t status = executorProxy_->SendCommand(hdiCommandId, extraInfo, callback);
177 result = ConvertResultCode(status);
178 if (result != IamResultCode::SUCCESS) {
179 IAM_LOGE("SendCommand fail result %{public}d", result);
180 return result;
181 }
182 return IamResultCode::SUCCESS;
183 }
184
GetProperty(const std::vector<uint64_t> & templateIdList,const std::vector<UserAuth::Attributes::AttributeKey> & keys,UserAuth::Property & property)185 UserAuth::ResultCode FaceAuthExecutorHdi::GetProperty(const std::vector<uint64_t> &templateIdList,
186 const std::vector<UserAuth::Attributes::AttributeKey> &keys, UserAuth::Property &property)
187 {
188 IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
189
190 std::vector<GetPropertyType> propertyTypes;
191 IamResultCode result = ConvertAttributeKeyVectorToPropertyType(keys, propertyTypes);
192 IF_FALSE_LOGE_AND_RETURN_VAL(result == IamResultCode::SUCCESS, IamResultCode::GENERAL_ERROR);
193
194 Property hdiProperty;
195 int32_t status = executorProxy_->GetProperty(templateIdList, propertyTypes, hdiProperty);
196 result = ConvertResultCode(status);
197 if (result != IamResultCode::SUCCESS) {
198 IAM_LOGE("SendCommand fail result %{public}d", result);
199 return result;
200 }
201 MoveHdiProperty(hdiProperty, property);
202 return IamResultCode::SUCCESS;
203 }
204
SetCachedTemplates(const std::vector<uint64_t> & templateIdList)205 UserAuth::ResultCode FaceAuthExecutorHdi::SetCachedTemplates(const std::vector<uint64_t> &templateIdList)
206 {
207 IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
208
209 int32_t status = executorProxy_->SetCachedTemplates(templateIdList);
210 IamResultCode result = ConvertResultCode(status);
211 if (result != IamResultCode::SUCCESS) {
212 IAM_LOGE("SendCommand fail result %{public}d", result);
213 return result;
214 }
215 return IamResultCode::SUCCESS;
216 }
217
SetBufferProducer(sptr<IBufferProducer> & producer)218 int32_t FaceAuthExecutorHdi::SetBufferProducer(sptr<IBufferProducer> &producer)
219 {
220 IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
221 OHOS::sptr<BufferProducerSequenceable> producerSequenceable(nullptr);
222 if (producer != nullptr) {
223 producerSequenceable =
224 sptr<BufferProducerSequenceable>(new (std::nothrow) BufferProducerSequenceable(producer));
225 IF_FALSE_LOGE_AND_RETURN_VAL(producerSequenceable != nullptr, FACE_AUTH_ERROR);
226 }
227
228 int32_t status = executorProxy_->SetBufferProducer(producerSequenceable);
229 IamResultCode result = ConvertResultCode(status);
230 if (result != IamResultCode::SUCCESS) {
231 IAM_LOGE("SetBufferProducer fail result %{public}d", result);
232 return FACE_AUTH_ERROR;
233 }
234 return FACE_AUTH_SUCCESS;
235 }
236
OnHdiDisconnect()237 void FaceAuthExecutorHdi::OnHdiDisconnect()
238 {
239 IAM_LOGE("start");
240 SaCommandManager::GetInstance().OnHdiDisconnect(shared_from_this());
241 }
242
MoveHdiExecutorInfo(ExecutorInfo & in,IamExecutorInfo & out)243 IamResultCode FaceAuthExecutorHdi::MoveHdiExecutorInfo(ExecutorInfo &in, IamExecutorInfo &out)
244 {
245 out.executorSensorHint = static_cast<uint32_t>(in.sensorId);
246 out.executorMatcher = in.executorType;
247 IamResultCode result = ConvertExecutorRole(in.executorRole, out.executorRole);
248 if (result != IamResultCode::SUCCESS) {
249 IAM_LOGE("ConvertExecutorRole fail result %{public}d", result);
250 return result;
251 }
252 result = ConvertAuthType(in.authType, out.authType);
253 if (result != IamResultCode::SUCCESS) {
254 IAM_LOGE("ConvertAuthType fail result %{public}d", result);
255 return result;
256 }
257 result = ConvertExecutorSecureLevel(in.esl, out.esl);
258 if (result != IamResultCode::SUCCESS) {
259 IAM_LOGE("ConvertExecutorSecureLevel fail result %{public}d", result);
260 return result;
261 }
262 in.publicKey.swap(out.publicKey);
263 return IamResultCode::SUCCESS;
264 }
265
MoveHdiProperty(Property & in,UserAuth::Property & out)266 void FaceAuthExecutorHdi::MoveHdiProperty(Property &in, UserAuth::Property &out)
267 {
268 out.authSubType = in.authSubType;
269 out.lockoutDuration = in.lockoutDuration;
270 out.remainAttempts = in.remainAttempts;
271 out.enrollmentProgress.swap(in.enrollmentProgress);
272 out.sensorInfo.swap(in.sensorInfo);
273 }
274
MoveHdiTemplateInfo(TemplateInfo & in,UserAuth::TemplateInfo & out)275 void FaceAuthExecutorHdi::MoveHdiTemplateInfo(TemplateInfo &in, UserAuth::TemplateInfo &out)
276 {
277 out.executorType = in.executorType;
278 out.freezingTime = in.lockoutDuration;
279 out.remainTimes = in.remainAttempts;
280 in.extraInfo.swap(out.extraInfo);
281 }
282
ConvertCommandId(const UserAuth::PropertyMode in,CommandId & out)283 IamResultCode FaceAuthExecutorHdi::ConvertCommandId(const UserAuth::PropertyMode in, CommandId &out)
284 {
285 if (static_cast<CommandId>(in) > CommandId::VENDOR_COMMAND_BEGIN) {
286 out = static_cast<CommandId>(in);
287 IAM_LOGI("vendor command id %{public}d, no covert", out);
288 return IamResultCode::SUCCESS;
289 }
290
291 static const std::map<UserAuth::PropertyMode, CommandId> data = {
292 { UserAuth::PropertyMode::PROPERTY_INIT_ALGORITHM, CommandId::INIT_ALGORITHM },
293 { UserAuth::PropertyMode::PROPERTY_MODE_FREEZE, CommandId::LOCK_TEMPLATE },
294 { UserAuth::PropertyMode::PROPERTY_MODE_UNFREEZE, CommandId::UNLOCK_TEMPLATE } };
295 auto iter = data.find(in);
296 if (iter == data.end()) {
297 IAM_LOGE("command id %{public}d is invalid", in);
298 return IamResultCode::INVALID_PARAMETERS;
299 }
300 out = iter->second;
301 IAM_LOGI("covert command id %{public}d to idl command is %{public}d", in, out);
302 return IamResultCode::SUCCESS;
303 }
304
ConvertAuthType(const AuthType in,UserAuth::AuthType & out)305 IamResultCode FaceAuthExecutorHdi::ConvertAuthType(const AuthType in, UserAuth::AuthType &out)
306 {
307 static const std::map<AuthType, UserAuth::AuthType> data = {
308 { AuthType::FACE, UserAuth::AuthType::FACE },
309 };
310 auto iter = data.find(in);
311 if (iter == data.end()) {
312 IAM_LOGE("authType %{public}d is invalid", in);
313 return IamResultCode::GENERAL_ERROR;
314 }
315 out = iter->second;
316 return IamResultCode::SUCCESS;
317 }
318
ConvertExecutorRole(const ExecutorRole in,IamExecutorRole & out)319 IamResultCode FaceAuthExecutorHdi::ConvertExecutorRole(const ExecutorRole in, IamExecutorRole &out)
320 {
321 static const std::map<ExecutorRole, IamExecutorRole> data = {
322 { ExecutorRole::COLLECTOR, IamExecutorRole::COLLECTOR },
323 { ExecutorRole::VERIFIER, IamExecutorRole::VERIFIER },
324 { ExecutorRole::ALL_IN_ONE, IamExecutorRole::ALL_IN_ONE },
325 };
326 auto iter = data.find(in);
327 if (iter == data.end()) {
328 IAM_LOGE("executorRole %{public}d is invalid", in);
329 return IamResultCode::GENERAL_ERROR;
330 }
331 out = iter->second;
332 return IamResultCode::SUCCESS;
333 }
334
ConvertExecutorSecureLevel(const ExecutorSecureLevel in,UserAuth::ExecutorSecureLevel & out)335 IamResultCode FaceAuthExecutorHdi::ConvertExecutorSecureLevel(const ExecutorSecureLevel in,
336 UserAuth::ExecutorSecureLevel &out)
337 {
338 static const std::map<ExecutorSecureLevel, UserAuth::ExecutorSecureLevel> data = {
339 { ExecutorSecureLevel::ESL0, UserAuth::ExecutorSecureLevel::ESL0 },
340 { ExecutorSecureLevel::ESL1, UserAuth::ExecutorSecureLevel::ESL1 },
341 { ExecutorSecureLevel::ESL2, UserAuth::ExecutorSecureLevel::ESL2 },
342 { ExecutorSecureLevel::ESL3, UserAuth::ExecutorSecureLevel::ESL3 },
343 };
344 auto iter = data.find(in);
345 if (iter == data.end()) {
346 IAM_LOGE("executorSecureLevel %{public}d is invalid", in);
347 return IamResultCode::GENERAL_ERROR;
348 }
349 out = iter->second;
350 return IamResultCode::SUCCESS;
351 }
352
ConvertResultCode(const int32_t in)353 IamResultCode FaceAuthExecutorHdi::ConvertResultCode(const int32_t in)
354 {
355 HDF_STATUS hdfIn = static_cast<HDF_STATUS>(in);
356 static const std::map<HDF_STATUS, IamResultCode> data = {
357 { HDF_SUCCESS, IamResultCode::SUCCESS },
358 { HDF_FAILURE, IamResultCode::GENERAL_ERROR },
359 { HDF_ERR_TIMEOUT, IamResultCode::TIMEOUT },
360 { HDF_ERR_QUEUE_FULL, IamResultCode::BUSY },
361 { HDF_ERR_DEVICE_BUSY, IamResultCode::BUSY },
362 };
363
364 IamResultCode out;
365 auto iter = data.find(hdfIn);
366 if (iter == data.end()) {
367 out = IamResultCode::GENERAL_ERROR;
368 } else {
369 out = iter->second;
370 }
371 IAM_LOGI("covert hdi result code %{public}d to framework result code %{public}d", in, out);
372 return out;
373 }
374
ConvertAttributeKeyVectorToPropertyType(const std::vector<UserAuth::Attributes::AttributeKey> inItems,std::vector<GetPropertyType> & outItems)375 IamResultCode FaceAuthExecutorHdi::ConvertAttributeKeyVectorToPropertyType(
376 const std::vector<UserAuth::Attributes::AttributeKey> inItems, std::vector<GetPropertyType> &outItems)
377 {
378 outItems.clear();
379 for (auto &inItem : inItems) {
380 GetPropertyType outItem;
381 IamResultCode result = ConvertAttributeKeyToPropertyType(inItem, outItem);
382 IF_FALSE_LOGE_AND_RETURN_VAL(result == IamResultCode::SUCCESS, IamResultCode::GENERAL_ERROR);
383 outItems.push_back(outItem);
384 }
385
386 return IamResultCode::SUCCESS;
387 }
388
ConvertAttributeKeyToPropertyType(const UserAuth::Attributes::AttributeKey in,GetPropertyType & out)389 IamResultCode FaceAuthExecutorHdi::ConvertAttributeKeyToPropertyType(const UserAuth::Attributes::AttributeKey in,
390 GetPropertyType &out)
391 {
392 static const std::map<UserAuth::Attributes::AttributeKey, GetPropertyType> data = {
393 { UserAuth::Attributes::ATTR_PIN_SUB_TYPE, GetPropertyType::AUTH_SUB_TYPE },
394 { UserAuth::Attributes::ATTR_FREEZING_TIME, GetPropertyType::LOCKOUT_DURATION },
395 { UserAuth::Attributes::ATTR_REMAIN_TIMES, GetPropertyType::REMAIN_ATTEMPTS },
396 { UserAuth::Attributes::ATTR_ENROLL_PROGRESS, GetPropertyType::ENROLL_PROGRESS },
397 { UserAuth::Attributes::ATTR_SENSOR_INFO, GetPropertyType::SENSOR_INFO },
398 };
399
400 auto iter = data.find(in);
401 if (iter == data.end()) {
402 IAM_LOGE("attribute %{public}d is invalid", in);
403 return IamResultCode::GENERAL_ERROR;
404 } else {
405 out = iter->second;
406 }
407 IAM_LOGI("covert hdi result code %{public}d to framework result code %{public}d", in, out);
408 return IamResultCode::SUCCESS;
409 }
410
RegisterSaCommandCallback()411 UserAuth::ResultCode FaceAuthExecutorHdi::RegisterSaCommandCallback()
412 {
413 IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
414
415 sptr<SaCommandCallback> callback(new (std::nothrow) SaCommandCallback(shared_from_this()));
416 IF_FALSE_LOGE_AND_RETURN_VAL(callback != nullptr, IamResultCode::GENERAL_ERROR);
417
418 int32_t status = executorProxy_->RegisterSaCommandCallback(callback);
419 IamResultCode result = ConvertResultCode(status);
420 if (result != IamResultCode::SUCCESS) {
421 IAM_LOGE("RegisterSaCommandCallback fail result %{public}d", result);
422 return result;
423 }
424
425 return IamResultCode::SUCCESS;
426 }
427
OnSaCommands(const std::vector<SaCommand> & commands)428 int32_t FaceAuthExecutorHdi::SaCommandCallback::OnSaCommands(const std::vector<SaCommand> &commands)
429 {
430 IAM_LOGI("start");
431 IamResultCode result = SaCommandManager::GetInstance().ProcessSaCommands(executorHdi_, commands);
432 if (result != IamResultCode::SUCCESS) {
433 IAM_LOGE("ProcessSaCommands fail");
434 return HDF_FAILURE;
435 }
436 IAM_LOGI("success");
437 return HDF_SUCCESS;
438 };
439 } // namespace FaceAuth
440 } // namespace UserIam
441 } // namespace OHOS
442