1 /*
2 * Copyright (c) 2023 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 <dlfcn.h>
17 #include <hdf_log.h>
18
19 #include "huks_hdi_passthrough_adapter.h"
20 #include "huks_sa_type.h"
21 #include "huks_sa_hdi_struct.h"
22 #include "huks_hdi_template.h"
23
24
25 typedef struct HuksHdi *(*HalCreateHandle)(void);
26 typedef void (*HalDestroyHandle)(struct HuksHdi *);
27
28 static struct HuksHdi *g_coreEngine = NULL;
29 static void *g_coreEngineHandle = NULL;
30
HuksHdiAdapterModuleInit(void)31 int32_t HuksHdiAdapterModuleInit(void)
32 {
33 HUKS_HDI_IF_NOT_SUCC_RETURN(HuksInitHuksCoreEngine(), HUKS_ERROR_NULL_POINTER)
34
35 HUKS_HDI_IF_NULL_LOGE_RETURN(g_coreEngine->HuksHdiModuleInit, HUKS_ERROR_NULL_POINTER,
36 "Module Init function is null pointer")
37
38 return g_coreEngine->HuksHdiModuleInit();
39 }
40
HuksHdiAdapterModuleDestroy(void)41 int32_t HuksHdiAdapterModuleDestroy(void)
42 {
43 HUKS_HDI_IF_NOT_SUCC_RETURN(HuksInitHuksCoreEngine(), HUKS_ERROR_NULL_POINTER)
44
45 HUKS_HDI_IF_NULL_LOGE_RETURN(g_coreEngine->HuksHdiModuleDestroy, HUKS_ERROR_NULL_POINTER,
46 "Module Destroy function is null pointer")
47
48 return g_coreEngine->HuksHdiModuleDestroy();
49 }
50
HuksHdiAdapterRefresh(void)51 int32_t HuksHdiAdapterRefresh(void)
52 {
53 HUKS_HDI_IF_NOT_SUCC_RETURN(HuksInitHuksCoreEngine(), HUKS_ERROR_NULL_POINTER)
54
55 HUKS_HDI_IF_NULL_LOGE_RETURN(g_coreEngine->HuksHdiRefresh, HUKS_ERROR_NULL_POINTER,
56 "Refresh function is null pointer")
57
58 return g_coreEngine->HuksHdiRefresh();
59 }
60
HuksHdiAdapterGenerateKey(const struct HksBlob * keyAlias,const struct HksParamSet * paramSetIn,const struct HksBlob * keyIn,struct HksBlob * keyOut)61 int32_t HuksHdiAdapterGenerateKey(const struct HksBlob *keyAlias, const struct HksParamSet *paramSetIn,
62 const struct HksBlob *keyIn, struct HksBlob *keyOut)
63 {
64 HUKS_HDI_IF_NOT_SUCC_RETURN(HuksInitHuksCoreEngine(), HUKS_ERROR_NULL_POINTER)
65
66 HUKS_HDI_IF_NULL_LOGE_RETURN(g_coreEngine->HuksHdiGenerateKey, HUKS_ERROR_NULL_POINTER,
67 "GenerateKey function is null pointer")
68
69 return g_coreEngine->HuksHdiGenerateKey(keyAlias, paramSetIn, keyIn, keyOut);
70 }
71
HuksHdiAdapterImportKey(const struct HksBlob * keyAlias,const struct HksBlob * key,const struct HksParamSet * paramSet,struct HksBlob * keyOut)72 int32_t HuksHdiAdapterImportKey(const struct HksBlob *keyAlias, const struct HksBlob *key,
73 const struct HksParamSet *paramSet, struct HksBlob *keyOut)
74 {
75 HUKS_HDI_IF_NOT_SUCC_RETURN(HuksInitHuksCoreEngine(), HUKS_ERROR_NULL_POINTER)
76
77 HUKS_HDI_IF_NULL_LOGE_RETURN(g_coreEngine->HuksHdiImportKey, HUKS_ERROR_NULL_POINTER,
78 "ImportKey function is null pointer")
79
80 return g_coreEngine->HuksHdiImportKey(keyAlias, key, paramSet, keyOut);
81 }
82
HuksHdiAdapterImportWrappedKey(const struct HksBlob * wrappingKeyAlias,const struct HksBlob * wrappingKey,const struct HksBlob * wrappedKeyData,const struct HksParamSet * paramSet,struct HksBlob * keyOut)83 int32_t HuksHdiAdapterImportWrappedKey(const struct HksBlob *wrappingKeyAlias, const struct HksBlob *wrappingKey,
84 const struct HksBlob *wrappedKeyData, const struct HksParamSet *paramSet, struct HksBlob *keyOut)
85 {
86 HUKS_HDI_IF_NOT_SUCC_RETURN(HuksInitHuksCoreEngine(), HUKS_ERROR_NULL_POINTER)
87
88 HUKS_HDI_IF_NULL_LOGE_RETURN(g_coreEngine->HuksHdiImportWrappedKey, HUKS_ERROR_NULL_POINTER,
89 "ImportWrappedKey function is null pointer")
90
91 return g_coreEngine->HuksHdiImportWrappedKey(wrappingKeyAlias, wrappingKey, wrappedKeyData, paramSet, keyOut);
92 }
93
HuksHdiAdapterExportPublicKey(const struct HksBlob * key,const struct HksParamSet * paramSet,struct HksBlob * keyOut)94 int32_t HuksHdiAdapterExportPublicKey(const struct HksBlob *key, const struct HksParamSet *paramSet,
95 struct HksBlob *keyOut)
96 {
97 HUKS_HDI_IF_NOT_SUCC_RETURN(HuksInitHuksCoreEngine(), HUKS_ERROR_NULL_POINTER)
98
99 HUKS_HDI_IF_NULL_LOGE_RETURN(g_coreEngine->HuksHdiExportPublicKey, HUKS_ERROR_NULL_POINTER,
100 "ExportPublicKey function is null pointer")
101
102 return g_coreEngine->HuksHdiExportPublicKey(key, paramSet, keyOut);
103 }
104
HuksHdiAdapterInit(const struct HksBlob * key,const struct HksParamSet * paramSet,struct HksBlob * handle,struct HksBlob * token)105 int32_t HuksHdiAdapterInit(const struct HksBlob *key, const struct HksParamSet *paramSet,
106 struct HksBlob *handle, struct HksBlob *token)
107 {
108 HUKS_HDI_IF_NOT_SUCC_RETURN(HuksInitHuksCoreEngine(), HUKS_ERROR_NULL_POINTER)
109
110 HUKS_HDI_IF_NULL_LOGE_RETURN(g_coreEngine->HuksHdiInit, HUKS_ERROR_NULL_POINTER,
111 "Init function is null pointer")
112
113 return g_coreEngine->HuksHdiInit(key, paramSet, handle, token);
114 }
115
HuksHdiAdapterUpdate(const struct HksBlob * handle,const struct HksParamSet * paramSet,const struct HksBlob * inData,struct HksBlob * outData)116 int32_t HuksHdiAdapterUpdate(const struct HksBlob *handle, const struct HksParamSet *paramSet,
117 const struct HksBlob *inData, struct HksBlob *outData)
118 {
119 HUKS_HDI_IF_NOT_SUCC_RETURN(HuksInitHuksCoreEngine(), HUKS_ERROR_NULL_POINTER)
120
121 HUKS_HDI_IF_NULL_LOGE_RETURN(g_coreEngine->HuksHdiUpdate, HUKS_ERROR_NULL_POINTER,
122 "Update function is null pointer")
123
124 return g_coreEngine->HuksHdiUpdate(handle, paramSet, inData, outData);
125 }
126
HuksHdiAdapterFinish(const struct HksBlob * handle,const struct HksParamSet * paramSet,const struct HksBlob * inData,struct HksBlob * outData)127 int32_t HuksHdiAdapterFinish(const struct HksBlob *handle, const struct HksParamSet *paramSet,
128 const struct HksBlob *inData, struct HksBlob *outData)
129 {
130 HUKS_HDI_IF_NOT_SUCC_RETURN(HuksInitHuksCoreEngine(), HUKS_ERROR_NULL_POINTER)
131
132 HUKS_HDI_IF_NULL_LOGE_RETURN(g_coreEngine->HuksHdiFinish, HUKS_ERROR_NULL_POINTER,
133 "Finish function is null pointer")
134
135 return g_coreEngine->HuksHdiFinish(handle, paramSet, inData, outData);
136 }
137
HuksHdiAdapterAbort(const struct HksBlob * handle,const struct HksParamSet * paramSet)138 int32_t HuksHdiAdapterAbort(const struct HksBlob *handle, const struct HksParamSet *paramSet)
139 {
140 HUKS_HDI_IF_NOT_SUCC_RETURN(HuksInitHuksCoreEngine(), HUKS_ERROR_NULL_POINTER)
141
142 HUKS_HDI_IF_NULL_LOGE_RETURN(g_coreEngine->HuksHdiAbort, HUKS_ERROR_NULL_POINTER,
143 "Abort function is null pointer")
144
145 return g_coreEngine->HuksHdiAbort(handle, paramSet);
146 }
147
HuksHdiAdapterGetKeyProperties(const struct HksParamSet * paramSet,const struct HksBlob * key)148 int32_t HuksHdiAdapterGetKeyProperties(const struct HksParamSet *paramSet, const struct HksBlob *key)
149 {
150 HUKS_HDI_IF_NOT_SUCC_RETURN(HuksInitHuksCoreEngine(), HUKS_ERROR_NULL_POINTER)
151
152 HUKS_HDI_IF_NULL_LOGE_RETURN(g_coreEngine->HuksHdiGetKeyProperties, HUKS_ERROR_NULL_POINTER,
153 "GetKeyProperties function is null pointer")
154
155 return g_coreEngine->HuksHdiGetKeyProperties(paramSet, key);
156 }
157
HuksHdiAdapterSign(const struct HksBlob * key,const struct HksParamSet * paramSet,const struct HksBlob * srcData,struct HksBlob * signature)158 int32_t HuksHdiAdapterSign(const struct HksBlob *key, const struct HksParamSet *paramSet,
159 const struct HksBlob *srcData, struct HksBlob *signature)
160 {
161 HUKS_HDI_IF_NOT_SUCC_RETURN(HuksInitHuksCoreEngine(), HUKS_ERROR_NULL_POINTER)
162
163 HUKS_HDI_IF_NULL_LOGE_RETURN(g_coreEngine->HuksHdiSign, HUKS_ERROR_NULL_POINTER,
164 "Sign function is null pointer")
165
166 return g_coreEngine->HuksHdiSign(key, paramSet, srcData, signature);
167 }
168
HuksHdiAdapterVerify(const struct HksBlob * key,const struct HksParamSet * paramSet,const struct HksBlob * srcData,const struct HksBlob * signature)169 int32_t HuksHdiAdapterVerify(const struct HksBlob *key, const struct HksParamSet *paramSet,
170 const struct HksBlob *srcData, const struct HksBlob *signature)
171 {
172 HUKS_HDI_IF_NOT_SUCC_RETURN(HuksInitHuksCoreEngine(), HUKS_ERROR_NULL_POINTER)
173
174 HUKS_HDI_IF_NULL_LOGE_RETURN(g_coreEngine->HuksHdiVerify, HUKS_ERROR_NULL_POINTER,
175 "Verify function is null pointer")
176
177 return g_coreEngine->HuksHdiVerify(key, paramSet, srcData, signature);
178 }
179
HuksHdiAdapterEncrypt(const struct HksBlob * key,const struct HksParamSet * paramSet,const struct HksBlob * plainText,struct HksBlob * cipherText)180 int32_t HuksHdiAdapterEncrypt(const struct HksBlob *key, const struct HksParamSet *paramSet,
181 const struct HksBlob *plainText, struct HksBlob *cipherText)
182 {
183 HUKS_HDI_IF_NOT_SUCC_RETURN(HuksInitHuksCoreEngine(), HUKS_ERROR_NULL_POINTER)
184
185 HUKS_HDI_IF_NULL_LOGE_RETURN(g_coreEngine->HuksHdiEncrypt, HUKS_ERROR_NULL_POINTER,
186 "Encrypt function is null pointer")
187
188 return g_coreEngine->HuksHdiEncrypt(key, paramSet, plainText, cipherText);
189 }
190
HuksHdiAdapterDecrypt(const struct HksBlob * key,const struct HksParamSet * paramSet,const struct HksBlob * cipherText,struct HksBlob * plainText)191 int32_t HuksHdiAdapterDecrypt(const struct HksBlob *key, const struct HksParamSet *paramSet,
192 const struct HksBlob *cipherText, struct HksBlob *plainText)
193 {
194 HUKS_HDI_IF_NOT_SUCC_RETURN(HuksInitHuksCoreEngine(), HUKS_ERROR_NULL_POINTER)
195
196 HUKS_HDI_IF_NULL_LOGE_RETURN(g_coreEngine->HuksHdiDecrypt, HUKS_ERROR_NULL_POINTER,
197 "Decrypt function is null pointer")
198
199 return g_coreEngine->HuksHdiDecrypt(key, paramSet, cipherText, plainText);
200 }
201
HuksHdiAdapterAgreeKey(const struct HksParamSet * paramSet,const struct HksBlob * privateKey,const struct HksBlob * peerPublicKey,struct HksBlob * agreedKey)202 int32_t HuksHdiAdapterAgreeKey(const struct HksParamSet *paramSet, const struct HksBlob *privateKey,
203 const struct HksBlob *peerPublicKey, struct HksBlob *agreedKey)
204 {
205 HUKS_HDI_IF_NOT_SUCC_RETURN(HuksInitHuksCoreEngine(), HUKS_ERROR_NULL_POINTER)
206
207 HUKS_HDI_IF_NULL_LOGE_RETURN(g_coreEngine->HuksHdiAgreeKey, HUKS_ERROR_NULL_POINTER,
208 "AgreeKey function is null pointer")
209
210 return g_coreEngine->HuksHdiAgreeKey(paramSet, privateKey, peerPublicKey, agreedKey);
211 }
212
HuksHdiAdapterDeriveKey(const struct HksParamSet * paramSet,const struct HksBlob * kdfKey,struct HksBlob * derivedKey)213 int32_t HuksHdiAdapterDeriveKey(const struct HksParamSet *paramSet, const struct HksBlob *kdfKey,
214 struct HksBlob *derivedKey)
215 {
216 HUKS_HDI_IF_NOT_SUCC_RETURN(HuksInitHuksCoreEngine(), HUKS_ERROR_NULL_POINTER)
217
218 HUKS_HDI_IF_NULL_LOGE_RETURN(g_coreEngine->HuksHdiDeriveKey, HUKS_ERROR_NULL_POINTER,
219 "DeriveKey function is null pointer")
220
221 return g_coreEngine->HuksHdiDeriveKey(paramSet, kdfKey, derivedKey);
222 }
223
HuksHdiAdapterMac(const struct HksBlob * key,const struct HksParamSet * paramSet,const struct HksBlob * srcData,struct HksBlob * mac)224 int32_t HuksHdiAdapterMac(const struct HksBlob *key, const struct HksParamSet *paramSet,
225 const struct HksBlob *srcData, struct HksBlob *mac)
226 {
227 HUKS_HDI_IF_NOT_SUCC_RETURN(HuksInitHuksCoreEngine(), HUKS_ERROR_NULL_POINTER)
228
229 HUKS_HDI_IF_NULL_LOGE_RETURN(g_coreEngine->HuksHdiMac, HUKS_ERROR_NULL_POINTER,
230 "Mac function is null pointer")
231
232 return g_coreEngine->HuksHdiMac(key, paramSet, srcData, mac);
233 }
234
HuksHdiAdapterUpgradeKey(const struct HksBlob * oldKey,const struct HksParamSet * paramSet,struct HksBlob * newKey)235 int32_t HuksHdiAdapterUpgradeKey(const struct HksBlob *oldKey, const struct HksParamSet *paramSet,
236 struct HksBlob *newKey)
237 {
238 HUKS_HDI_IF_NOT_SUCC_RETURN(HuksInitHuksCoreEngine(), HUKS_ERROR_NULL_POINTER)
239
240 HUKS_HDI_IF_NULL_LOGE_RETURN(g_coreEngine->HuksHdiUpgradeKey, HUKS_ERROR_NULL_POINTER,
241 "Change key owner function is null pointer")
242
243 return g_coreEngine->HuksHdiUpgradeKey(oldKey, paramSet, newKey);
244 }
245
HuksHdiAdapterAttestKey(const struct HksBlob * key,const struct HksParamSet * paramSet,struct HksBlob * certChain)246 int32_t HuksHdiAdapterAttestKey(const struct HksBlob *key, const struct HksParamSet *paramSet,
247 struct HksBlob *certChain)
248 {
249 HUKS_HDI_IF_NOT_SUCC_RETURN(HuksInitHuksCoreEngine(), HUKS_ERROR_NULL_POINTER)
250
251 HUKS_HDI_IF_NULL_LOGE_RETURN(g_coreEngine->HuksHdiAttestKey, HUKS_ERROR_NULL_POINTER,
252 "AttestKey function is null pointer")
253
254 return g_coreEngine->HuksHdiAttestKey(key, paramSet, certChain);
255 }
256
HuksHdiAdapterGenerateRandom(const struct HksParamSet * paramSet,struct HksBlob * random)257 int32_t HuksHdiAdapterGenerateRandom(const struct HksParamSet *paramSet, struct HksBlob *random)
258 {
259 HUKS_HDI_IF_NOT_SUCC_RETURN(HuksInitHuksCoreEngine(), HUKS_ERROR_NULL_POINTER)
260
261 HUKS_HDI_IF_NULL_LOGE_RETURN(g_coreEngine->HuksHdiGenerateRandom, HUKS_ERROR_NULL_POINTER,
262 "GenerateRandom function is null pointer")
263
264 return g_coreEngine->HuksHdiGenerateRandom(paramSet, random);
265 }
266
HuksHdiAdapterExportChipsetPlatformPublicKey(const struct HksBlob * salt,enum HksChipsetPlatformDecryptScene scene,struct HksBlob * publicKey)267 int32_t HuksHdiAdapterExportChipsetPlatformPublicKey(const struct HksBlob *salt,
268 enum HksChipsetPlatformDecryptScene scene, struct HksBlob *publicKey)
269 {
270 HUKS_HDI_IF_NOT_SUCC_RETURN(HuksInitHuksCoreEngine(), HUKS_ERROR_NULL_POINTER)
271
272 HUKS_HDI_IF_NULL_LOGE_RETURN(g_coreEngine->HuksHdiExportChipsetPlatformPublicKey, HUKS_ERROR_NULL_POINTER,
273 "ExportChipsetPlatformPublicKey function is null pointer")
274 return g_coreEngine->HuksHdiExportChipsetPlatformPublicKey(salt, scene, publicKey);
275 }
276
HuksInitHuksCoreEngine(void)277 int32_t HuksInitHuksCoreEngine(void)
278 {
279 if (g_coreEngine != NULL) {
280 return HUKS_SUCCESS;
281 }
282
283 // libhuks_engine_core_standard is a software implementation version of huks driver, built-in system image
284 // by the source code at security_huks/services/huks_standard/huks_engine/main
285 g_coreEngineHandle = dlopen("libhuks_engine_core_standard.z.so", RTLD_NOW);
286 if (g_coreEngineHandle == NULL) {
287 HDF_LOGE("HUKS dlopen failed, %{public}s!", dlerror());
288 return HUKS_ERROR_NULL_POINTER;
289 }
290
291 HalCreateHandle devicePtr = (HalCreateHandle)dlsym(g_coreEngineHandle, "HuksCreateHdiDevicePtr");
292 if (devicePtr == NULL) {
293 HDF_LOGE("HUKS dlsym failed, %{public}s!", dlerror());
294 dlclose(g_coreEngineHandle);
295 g_coreEngineHandle = NULL;
296 return HUKS_ERROR_NULL_POINTER;
297 }
298
299 g_coreEngine = (*devicePtr)();
300 if (g_coreEngine == NULL) {
301 HDF_LOGE("HUKS coreEngine is NULL!");
302 dlclose(g_coreEngineHandle);
303 g_coreEngineHandle = NULL;
304 return HUKS_ERROR_NULL_POINTER;
305 }
306 HDF_LOGI("HUKS HuksInitHuksCoreEngine init success!");
307 return HUKS_SUCCESS;
308 }
309
HuksReleaseCoreEngine(void)310 int32_t HuksReleaseCoreEngine(void)
311 {
312 if (g_coreEngine == NULL) {
313 return HUKS_SUCCESS;
314 }
315
316 if (g_coreEngineHandle == NULL) {
317 HDF_LOGE("HUKS g_coreEngineHandle is NULL!");
318 return HUKS_ERROR_NULL_POINTER;
319 }
320
321 HalDestroyHandle halDestroyHandle = (HalDestroyHandle)dlsym(g_coreEngineHandle, "HuksDestoryHdiDevicePtr");
322 (*halDestroyHandle)(g_coreEngine);
323 g_coreEngine = NULL;
324
325 dlclose(g_coreEngineHandle);
326 g_coreEngineHandle = NULL;
327 return HUKS_SUCCESS;
328 }
329
HuksGetCoreEngine(void)330 struct HuksHdi *HuksGetCoreEngine(void)
331 {
332 return g_coreEngine;
333 }
334