• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &param,
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 &param,
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 &param,
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