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