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