• 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 "framework_types.h"
30 #include "iam_check.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 "v1_0/face_auth_types.h"
37 #include "v1_0/iexecutor.h"
38 #include "v1_0/iexecutor_callback.h"
39 
40 #define LOG_LABEL UserIam::Common::LABEL_FACE_AUTH_SA
41 
42 namespace OHOS {
43 namespace UserIam {
44 namespace FaceAuth {
45 using IamResultCode = OHOS::UserIam::UserAuth::ResultCode;
46 using IamExecutorRole = UserIam::UserAuth::ExecutorRole;
47 using IamExecutorInfo = UserIam::UserAuth::ExecutorInfo;
48 using BufferProducerSequenceable = OHOS::HDI::Camera::V1_0::BufferProducerSequenceable;
49 namespace UserAuth = OHOS::UserIam::UserAuth;
FaceAuthExecutorHdi(sptr<FaceHdi::IExecutor> executorProxy)50 FaceAuthExecutorHdi::FaceAuthExecutorHdi(sptr<FaceHdi::IExecutor> executorProxy) : executorProxy_(executorProxy) {};
51 
GetExecutorInfo(IamExecutorInfo & info)52 IamResultCode FaceAuthExecutorHdi::GetExecutorInfo(IamExecutorInfo &info)
53 {
54     IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
55     FaceHdi::ExecutorInfo localInfo = {};
56     int32_t status = executorProxy_->GetExecutorInfo(localInfo);
57     IamResultCode result = ConvertResultCode(status);
58     if (result != IamResultCode::SUCCESS) {
59         IAM_LOGE("GetExecutorInfo fail result %{public}d", result);
60         return result;
61     }
62     result = MoveHdiExecutorInfo(localInfo, info);
63     if (result != IamResultCode::SUCCESS) {
64         IAM_LOGE("MoveHdiExecutorInfo fail result %{public}d", result);
65         return result;
66     }
67     return IamResultCode::SUCCESS;
68 }
69 
GetTemplateInfo(uint64_t templateId,UserAuth::TemplateInfo & info)70 IamResultCode FaceAuthExecutorHdi::GetTemplateInfo(uint64_t templateId, UserAuth::TemplateInfo &info)
71 {
72     IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
73     FaceHdi::TemplateInfo localInfo = {};
74     int32_t status = executorProxy_->GetTemplateInfo(templateId, localInfo);
75     IamResultCode result = ConvertResultCode(status);
76     if (result != IamResultCode::SUCCESS) {
77         IAM_LOGE("GetTemplateInfo fail result %{public}d", result);
78         return result;
79     }
80     MoveHdiTemplateInfo(localInfo, info);
81 
82     return IamResultCode::SUCCESS;
83 }
84 
OnRegisterFinish(const std::vector<uint64_t> & templateIdList,const std::vector<uint8_t> & frameworkPublicKey,const std::vector<uint8_t> & extraInfo)85 IamResultCode FaceAuthExecutorHdi::OnRegisterFinish(const std::vector<uint64_t> &templateIdList,
86     const std::vector<uint8_t> &frameworkPublicKey, const std::vector<uint8_t> &extraInfo)
87 {
88     IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
89     int32_t status = executorProxy_->OnRegisterFinish(templateIdList, frameworkPublicKey, extraInfo);
90     IamResultCode result = ConvertResultCode(status);
91     if (result != IamResultCode::SUCCESS) {
92         IAM_LOGE("OnRegisterFinish fail result %{public}d", status);
93         return result;
94     }
95     return IamResultCode::SUCCESS;
96 }
97 
Enroll(uint64_t scheduleId,uint32_t tokenId,const std::vector<uint8_t> & extraInfo,const std::shared_ptr<UserAuth::IExecuteCallback> & callbackObj)98 IamResultCode FaceAuthExecutorHdi::Enroll(uint64_t scheduleId, uint32_t tokenId, const std::vector<uint8_t> &extraInfo,
99     const std::shared_ptr<UserAuth::IExecuteCallback> &callbackObj)
100 {
101     IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
102     IF_FALSE_LOGE_AND_RETURN_VAL(callbackObj != nullptr, IamResultCode::GENERAL_ERROR);
103     auto callback = sptr<FaceHdi::IExecutorCallback>(new (std::nothrow) FaceAuthExecutorCallbackHdi(callbackObj));
104     IF_FALSE_LOGE_AND_RETURN_VAL(callback != nullptr, IamResultCode::GENERAL_ERROR);
105     int32_t status = executorProxy_->Enroll(scheduleId, extraInfo, callback);
106     IamResultCode result = ConvertResultCode(status);
107     if (result != IamResultCode::SUCCESS) {
108         IAM_LOGE("Enroll fail result %{public}d", result);
109         return result;
110     }
111     return IamResultCode::SUCCESS;
112 }
113 
Authenticate(uint64_t scheduleId,uint32_t tokenId,const std::vector<uint64_t> & templateIdList,const std::vector<uint8_t> & extraInfo,const std::shared_ptr<UserAuth::IExecuteCallback> & callbackObj)114 IamResultCode FaceAuthExecutorHdi::Authenticate(uint64_t scheduleId, uint32_t tokenId,
115     const std::vector<uint64_t> &templateIdList, const std::vector<uint8_t> &extraInfo,
116     const std::shared_ptr<UserAuth::IExecuteCallback> &callbackObj)
117 {
118     IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
119     IF_FALSE_LOGE_AND_RETURN_VAL(callbackObj != nullptr, IamResultCode::GENERAL_ERROR);
120     auto callback = sptr<FaceHdi::IExecutorCallback>(new (std::nothrow) FaceAuthExecutorCallbackHdi(callbackObj));
121     IF_FALSE_LOGE_AND_RETURN_VAL(callback != nullptr, IamResultCode::GENERAL_ERROR);
122     int32_t status = executorProxy_->Authenticate(scheduleId, templateIdList, extraInfo, callback);
123     IamResultCode result = ConvertResultCode(status);
124     if (result != IamResultCode::SUCCESS) {
125         IAM_LOGE("Authenticate fail result %{public}d", result);
126         return result;
127     }
128     return IamResultCode::SUCCESS;
129 }
130 
Identify(uint64_t scheduleId,uint32_t tokenId,const std::vector<uint8_t> & extraInfo,const std::shared_ptr<UserAuth::IExecuteCallback> & callbackObj)131 IamResultCode FaceAuthExecutorHdi::Identify(uint64_t scheduleId, uint32_t tokenId,
132     const std::vector<uint8_t> &extraInfo, const std::shared_ptr<UserAuth::IExecuteCallback> &callbackObj)
133 {
134     IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
135     IF_FALSE_LOGE_AND_RETURN_VAL(callbackObj != nullptr, IamResultCode::GENERAL_ERROR);
136     auto callback = sptr<FaceHdi::IExecutorCallback>(new (std::nothrow) FaceAuthExecutorCallbackHdi(callbackObj));
137     IF_FALSE_LOGE_AND_RETURN_VAL(callback != nullptr, IamResultCode::GENERAL_ERROR);
138     int32_t status = executorProxy_->Identify(scheduleId, extraInfo, callback);
139     IamResultCode result = ConvertResultCode(status);
140     if (result != IamResultCode::SUCCESS) {
141         IAM_LOGE("Identify fail result %{public}d", result);
142         return result;
143     }
144     return IamResultCode::SUCCESS;
145 }
146 
Delete(const std::vector<uint64_t> & templateIdList)147 IamResultCode FaceAuthExecutorHdi::Delete(const std::vector<uint64_t> &templateIdList)
148 {
149     IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
150     int32_t status = executorProxy_->Delete(templateIdList);
151     IamResultCode result = ConvertResultCode(status);
152     if (result != IamResultCode::SUCCESS) {
153         IAM_LOGE("Delete fail result %{public}d", result);
154         return result;
155     }
156     return IamResultCode::SUCCESS;
157 }
158 
Cancel(uint64_t scheduleId)159 IamResultCode FaceAuthExecutorHdi::Cancel(uint64_t scheduleId)
160 {
161     IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
162     int32_t status = executorProxy_->Cancel(scheduleId);
163     IamResultCode result = ConvertResultCode(status);
164     if (result != IamResultCode::SUCCESS) {
165         IAM_LOGE("Cancel fail result %{public}d", result);
166         return result;
167     }
168     return IamResultCode::SUCCESS;
169 }
170 
SendCommand(UserIam::UserAuth::PropertyMode commandId,const std::vector<uint8_t> & extraInfo,const std::shared_ptr<UserAuth::IExecuteCallback> & callbackObj)171 IamResultCode FaceAuthExecutorHdi::SendCommand(UserIam::UserAuth::PropertyMode commandId,
172     const std::vector<uint8_t> &extraInfo, const std::shared_ptr<UserAuth::IExecuteCallback> &callbackObj)
173 {
174     IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
175     IF_FALSE_LOGE_AND_RETURN_VAL(callbackObj != nullptr, IamResultCode::GENERAL_ERROR);
176     FaceHdi::CommandId hdiCommandId;
177     IamResultCode result = ConvertCommandId(commandId, hdiCommandId);
178     if (result != IamResultCode::SUCCESS) {
179         IAM_LOGE("ConvertCommandId fail result %{public}d", result);
180         return result;
181     }
182     auto callback = sptr<FaceHdi::IExecutorCallback>(new (std::nothrow) FaceAuthExecutorCallbackHdi(callbackObj));
183     IF_FALSE_LOGE_AND_RETURN_VAL(callback != nullptr, IamResultCode::GENERAL_ERROR);
184     int32_t status = executorProxy_->SendCommand(hdiCommandId, extraInfo, callback);
185     result = ConvertResultCode(status);
186     if (status != IamResultCode::SUCCESS) {
187         IAM_LOGE("SendCommand fail result %{public}d", result);
188         return result;
189     }
190     return IamResultCode::SUCCESS;
191 }
192 
SetBufferProducer(sptr<IBufferProducer> & producer)193 int32_t FaceAuthExecutorHdi::SetBufferProducer(sptr<IBufferProducer> &producer)
194 {
195     IF_FALSE_LOGE_AND_RETURN_VAL(executorProxy_ != nullptr, IamResultCode::GENERAL_ERROR);
196     OHOS::sptr<BufferProducerSequenceable> producerSequenceable = nullptr;
197     if (producer != nullptr) {
198         producerSequenceable = new (std::nothrow) BufferProducerSequenceable(producer);
199         IF_FALSE_LOGE_AND_RETURN_VAL(producerSequenceable != nullptr, FACE_AUTH_ERROR);
200     }
201 
202     int32_t status = executorProxy_->SetBufferProducer(producerSequenceable);
203     IamResultCode result = ConvertResultCode(status);
204     if (status != IamResultCode::SUCCESS) {
205         IAM_LOGE("SetBufferProducer fail result %{public}d", result);
206         return FACE_AUTH_ERROR;
207     }
208     return FACE_AUTH_SUCCESS;
209 }
210 
MoveHdiExecutorInfo(FaceHdi::ExecutorInfo & in,IamExecutorInfo & out)211 IamResultCode FaceAuthExecutorHdi::MoveHdiExecutorInfo(FaceHdi::ExecutorInfo &in, IamExecutorInfo &out)
212 {
213     out.executorSensorHint = static_cast<uint32_t>(in.sensorId);
214     out.executorMatcher = in.executorType;
215     IamResultCode result = ConvertExecutorRole(in.executorRole, out.executorRole);
216     if (result != IamResultCode::SUCCESS) {
217         IAM_LOGE("ConvertExecutorRole fail result %{public}d", result);
218         return result;
219     }
220     result = ConvertAuthType(in.authType, out.authType);
221     if (result != IamResultCode::SUCCESS) {
222         IAM_LOGE("ConvertAuthType fail result %{public}d", result);
223         return result;
224     }
225     result = ConvertExecutorSecureLevel(in.esl, out.esl);
226     if (result != IamResultCode::SUCCESS) {
227         IAM_LOGE("ConvertExecutorSecureLevel fail result %{public}d", result);
228         return result;
229     }
230     in.publicKey.swap(out.publicKey);
231     return IamResultCode::SUCCESS;
232 }
233 
MoveHdiTemplateInfo(FaceHdi::TemplateInfo & in,UserAuth::TemplateInfo & out)234 void FaceAuthExecutorHdi::MoveHdiTemplateInfo(FaceHdi::TemplateInfo &in, UserAuth::TemplateInfo &out)
235 {
236     out.executorType = in.executorType;
237     out.freezingTime = in.lockoutDuration;
238     out.remainTimes = in.remainAttempts;
239     in.extraInfo.swap(out.extraInfo);
240 }
241 
ConvertCommandId(const UserIam::UserAuth::PropertyMode in,FaceHdi::CommandId & out)242 IamResultCode FaceAuthExecutorHdi::ConvertCommandId(const UserIam::UserAuth::PropertyMode in, FaceHdi::CommandId &out)
243 {
244     if (static_cast<FaceHdi::CommandId>(in) > FaceHdi::CommandId::VENDOR_COMMAND_BEGIN) {
245         out = static_cast<FaceHdi::CommandId>(in);
246         IAM_LOGI("vendor command id %{public}d, no covert", out);
247         return IamResultCode::SUCCESS;
248     }
249 
250     static const std::map<UserIam::UserAuth::PropertyMode, FaceHdi::CommandId> data = {
251         {UserIam::UserAuth::PropertyMode::PROPERTY_MODE_FREEZE, FaceHdi::CommandId::LOCK_TEMPLATE},
252         {UserIam::UserAuth::PropertyMode::PROPERTY_MODE_UNFREEZE, FaceHdi::CommandId::UNLOCK_TEMPLATE}};
253     auto iter = data.find(in);
254     if (iter == data.end()) {
255         IAM_LOGE("command id %{public}d is invalid", in);
256         return IamResultCode::INVALID_PARAMETERS;
257     }
258     out = iter->second;
259     IAM_LOGI("covert command id %{public}d to idl command is %{public}d", in, out);
260     return IamResultCode::SUCCESS;
261 }
262 
ConvertAuthType(const FaceHdi::AuthType in,UserIam::UserAuth::AuthType & out)263 IamResultCode FaceAuthExecutorHdi::ConvertAuthType(const FaceHdi::AuthType in, UserIam::UserAuth::AuthType &out)
264 {
265     static const std::map<FaceHdi::AuthType, UserIam::UserAuth::AuthType> data = {
266         {FaceHdi::FACE, UserIam::UserAuth::AuthType::FACE},
267     };
268     auto iter = data.find(in);
269     if (iter == data.end()) {
270         IAM_LOGE("authType %{public}d is invalid", in);
271         return IamResultCode::GENERAL_ERROR;
272     }
273     out = iter->second;
274     return IamResultCode::SUCCESS;
275 }
276 
ConvertExecutorRole(const FaceHdi::ExecutorRole in,IamExecutorRole & out)277 IamResultCode FaceAuthExecutorHdi::ConvertExecutorRole(const FaceHdi::ExecutorRole in, IamExecutorRole &out)
278 {
279     static const std::map<FaceHdi::ExecutorRole, IamExecutorRole> data = {
280         {FaceHdi::ExecutorRole::COLLECTOR, IamExecutorRole::COLLECTOR},
281         {FaceHdi::ExecutorRole::VERIFIER, IamExecutorRole::VERIFIER},
282         {FaceHdi::ExecutorRole::ALL_IN_ONE, IamExecutorRole::ALL_IN_ONE},
283     };
284     auto iter = data.find(in);
285     if (iter == data.end()) {
286         IAM_LOGE("executorRole %{public}d is invalid", in);
287         return IamResultCode::GENERAL_ERROR;
288     }
289     out = iter->second;
290     return IamResultCode::SUCCESS;
291 }
292 
ConvertExecutorSecureLevel(const FaceHdi::ExecutorSecureLevel in,UserIam::UserAuth::ExecutorSecureLevel & out)293 IamResultCode FaceAuthExecutorHdi::ConvertExecutorSecureLevel(
294     const FaceHdi::ExecutorSecureLevel in, UserIam::UserAuth::ExecutorSecureLevel &out)
295 {
296     static const std::map<FaceHdi::ExecutorSecureLevel, UserIam::UserAuth::ExecutorSecureLevel> data = {
297         {FaceHdi::ExecutorSecureLevel::ESL0, UserIam::UserAuth::ExecutorSecureLevel::ESL0},
298         {FaceHdi::ExecutorSecureLevel::ESL1, UserIam::UserAuth::ExecutorSecureLevel::ESL1},
299         {FaceHdi::ExecutorSecureLevel::ESL2, UserIam::UserAuth::ExecutorSecureLevel::ESL2},
300         {FaceHdi::ExecutorSecureLevel::ESL3, UserIam::UserAuth::ExecutorSecureLevel::ESL3},
301     };
302     auto iter = data.find(in);
303     if (iter == data.end()) {
304         IAM_LOGE("executorSecureLevel %{public}d is invalid", in);
305         return IamResultCode::GENERAL_ERROR;
306     }
307     out = iter->second;
308     return IamResultCode::SUCCESS;
309 }
310 
ConvertResultCode(const int32_t in)311 IamResultCode FaceAuthExecutorHdi::ConvertResultCode(const int32_t in)
312 {
313     HDF_STATUS hdfIn = static_cast<HDF_STATUS>(in);
314     static const std::map<HDF_STATUS, IamResultCode> data = {
315         {HDF_SUCCESS, IamResultCode::SUCCESS},
316         {HDF_FAILURE, IamResultCode::GENERAL_ERROR},
317         {HDF_ERR_TIMEOUT, IamResultCode::TIMEOUT},
318         {HDF_ERR_QUEUE_FULL, IamResultCode::BUSY},
319         {HDF_ERR_DEVICE_BUSY, IamResultCode::BUSY},
320     };
321 
322     IamResultCode out;
323     auto iter = data.find(hdfIn);
324     if (iter == data.end()) {
325         out = IamResultCode::GENERAL_ERROR;
326     } else {
327         out = iter->second;
328     }
329     IAM_LOGI("covert hdi result code %{public}d to framework result code %{public}d", in, out);
330     return out;
331 }
332 } // namespace FaceAuth
333 } // namespace UserIam
334 } // namespace OHOS
335