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 #ifdef HKS_CONFIG_FILE
17 #include HKS_CONFIG_FILE
18 #else
19 #include "hks_config.h"
20 #endif
21 
22 #include "huks_access.h"
23 
24 #include "hks_cfi.h"
25 #include "huks_core_hal.h"
26 
27 #include "hks_log.h"
28 #include "hks_mem.h"
29 #include "hks_template.h"
30 
31 static struct HuksHdi *g_hksHalDevicePtr = NULL;
32 
33 #ifndef _CUT_AUTHENTICATE_
ENABLE_CFI(int32_t HuksAccessModuleInit (void))34 ENABLE_CFI(int32_t HuksAccessModuleInit(void))
35 {
36     HKS_IF_NOT_SUCC_RETURN(HksCreateHuksHdiDevice(&g_hksHalDevicePtr), HKS_ERROR_NULL_POINTER)
37 
38     HKS_IF_NULL_LOGE_RETURN(g_hksHalDevicePtr->HuksHdiModuleInit, HKS_ERROR_NULL_POINTER,
39         "Module Init function is null pointer")
40 
41     return g_hksHalDevicePtr->HuksHdiModuleInit();
42 }
43 
ENABLE_CFI(int32_t HuksAccessModuleDestroy (void))44 ENABLE_CFI(int32_t HuksAccessModuleDestroy(void))
45 {
46     HKS_IF_NOT_SUCC_RETURN(HksCreateHuksHdiDevice(&g_hksHalDevicePtr), HKS_ERROR_NULL_POINTER)
47 
48     HKS_IF_NULL_LOGE_RETURN(g_hksHalDevicePtr->HuksHdiModuleDestroy, HKS_ERROR_NULL_POINTER,
49         "Module Destroy function is null pointer")
50 
51     return g_hksHalDevicePtr->HuksHdiModuleDestroy();
52 }
53 
ENABLE_CFI(int32_t HuksAccessRefresh (void))54 ENABLE_CFI(int32_t HuksAccessRefresh(void))
55 {
56     HKS_IF_NOT_SUCC_RETURN(HksCreateHuksHdiDevice(&g_hksHalDevicePtr), HKS_ERROR_NULL_POINTER)
57 
58     HKS_IF_NULL_LOGE_RETURN(g_hksHalDevicePtr->HuksHdiRefresh, HKS_ERROR_NULL_POINTER,
59         "Refresh function is null pointer")
60 
61     return g_hksHalDevicePtr->HuksHdiRefresh();
62 }
63 
ENABLE_CFI(int32_t HuksAccessGenerateKey (const struct HksBlob * keyAlias,const struct HksParamSet * paramSetIn,const struct HksBlob * keyIn,struct HksBlob * keyOut))64 ENABLE_CFI(int32_t HuksAccessGenerateKey(const struct HksBlob *keyAlias, const struct HksParamSet *paramSetIn,
65     const struct HksBlob *keyIn, struct HksBlob *keyOut))
66 {
67     HKS_IF_NOT_SUCC_RETURN(HksCreateHuksHdiDevice(&g_hksHalDevicePtr), HKS_ERROR_NULL_POINTER)
68 
69     HKS_IF_NULL_LOGE_RETURN(g_hksHalDevicePtr->HuksHdiGenerateKey, HKS_ERROR_NULL_POINTER,
70         "GenerateKey function is null pointer")
71 
72     return g_hksHalDevicePtr->HuksHdiGenerateKey(keyAlias, paramSetIn, keyIn, keyOut);
73 }
74 
ENABLE_CFI(int32_t HuksAccessImportKey (const struct HksBlob * keyAlias,const struct HksBlob * key,const struct HksParamSet * paramSet,struct HksBlob * keyOut))75 ENABLE_CFI(int32_t HuksAccessImportKey(const struct HksBlob *keyAlias, const struct HksBlob *key,
76     const struct HksParamSet *paramSet, struct HksBlob *keyOut))
77 {
78     HKS_IF_NOT_SUCC_RETURN(HksCreateHuksHdiDevice(&g_hksHalDevicePtr), HKS_ERROR_NULL_POINTER)
79 
80     HKS_IF_NULL_LOGE_RETURN(g_hksHalDevicePtr->HuksHdiImportKey, HKS_ERROR_NULL_POINTER,
81         "ImportKey function is null pointer")
82 
83     return g_hksHalDevicePtr->HuksHdiImportKey(keyAlias, key, paramSet, keyOut);
84 }
85 
ENABLE_CFI(int32_t HuksAccessImportWrappedKey (const struct HksBlob * wrappingKeyAlias,const struct HksBlob * key,const struct HksBlob * wrappedKeyData,const struct HksParamSet * paramSet,struct HksBlob * keyOut))86 ENABLE_CFI(int32_t HuksAccessImportWrappedKey(const struct HksBlob *wrappingKeyAlias, const struct HksBlob *key,
87     const struct HksBlob *wrappedKeyData, const struct HksParamSet *paramSet, struct HksBlob *keyOut))
88 {
89     HKS_IF_NOT_SUCC_RETURN(HksCreateHuksHdiDevice(&g_hksHalDevicePtr), HKS_ERROR_NULL_POINTER)
90 
91     HKS_IF_NULL_LOGE_RETURN(g_hksHalDevicePtr->HuksHdiImportWrappedKey, HKS_ERROR_NULL_POINTER,
92         "ImportWrappedKey function is null pointer")
93 
94     return g_hksHalDevicePtr->HuksHdiImportWrappedKey(wrappingKeyAlias, key, wrappedKeyData, paramSet, keyOut);
95 }
96 
ENABLE_CFI(int32_t HuksAccessExportPublicKey (const struct HksBlob * key,const struct HksParamSet * paramSet,struct HksBlob * keyOut))97 ENABLE_CFI(int32_t HuksAccessExportPublicKey(const struct HksBlob *key, const struct HksParamSet *paramSet,
98     struct HksBlob *keyOut))
99 {
100     HKS_IF_NOT_SUCC_RETURN(HksCreateHuksHdiDevice(&g_hksHalDevicePtr), HKS_ERROR_NULL_POINTER)
101 
102     HKS_IF_NULL_LOGE_RETURN(g_hksHalDevicePtr->HuksHdiExportPublicKey, HKS_ERROR_NULL_POINTER,
103         "ExportPublicKey function is null pointer")
104 
105     return g_hksHalDevicePtr->HuksHdiExportPublicKey(key, paramSet, keyOut);
106 }
107 
ENABLE_CFI(int32_t HuksAccessInit (const struct HksBlob * key,const struct HksParamSet * paramSet,struct HksBlob * handle,struct HksBlob * token))108 ENABLE_CFI(int32_t HuksAccessInit(const struct  HksBlob *key, const struct HksParamSet *paramSet,
109     struct HksBlob *handle, struct HksBlob *token))
110 {
111     HKS_IF_NOT_SUCC_RETURN(HksCreateHuksHdiDevice(&g_hksHalDevicePtr), HKS_ERROR_NULL_POINTER)
112 
113     HKS_IF_NULL_LOGE_RETURN(g_hksHalDevicePtr->HuksHdiInit, HKS_ERROR_NULL_POINTER,
114         "Init function is null pointer")
115 
116     return g_hksHalDevicePtr->HuksHdiInit(key, paramSet, handle, token);
117 }
118 
ENABLE_CFI(int32_t HuksAccessUpdate (const struct HksBlob * handle,const struct HksParamSet * paramSet,const struct HksBlob * inData,struct HksBlob * outData))119 ENABLE_CFI(int32_t HuksAccessUpdate(const struct HksBlob *handle, const struct HksParamSet *paramSet,
120     const struct HksBlob *inData, struct HksBlob *outData))
121 {
122     HKS_IF_NOT_SUCC_RETURN(HksCreateHuksHdiDevice(&g_hksHalDevicePtr), HKS_ERROR_NULL_POINTER)
123 
124     HKS_IF_NULL_LOGE_RETURN(g_hksHalDevicePtr->HuksHdiUpdate, HKS_ERROR_NULL_POINTER,
125         "Update function is null pointer")
126 
127     return g_hksHalDevicePtr->HuksHdiUpdate(handle, paramSet, inData, outData);
128 }
129 
ENABLE_CFI(int32_t HuksAccessFinish (const struct HksBlob * handle,const struct HksParamSet * paramSet,const struct HksBlob * inData,struct HksBlob * outData))130 ENABLE_CFI(int32_t HuksAccessFinish(const struct HksBlob *handle, const struct HksParamSet *paramSet,
131     const struct HksBlob *inData, struct HksBlob *outData))
132 {
133     HKS_IF_NOT_SUCC_RETURN(HksCreateHuksHdiDevice(&g_hksHalDevicePtr), HKS_ERROR_NULL_POINTER)
134 
135     HKS_IF_NULL_LOGE_RETURN(g_hksHalDevicePtr->HuksHdiFinish, HKS_ERROR_NULL_POINTER,
136         "Finish function is null pointer")
137 
138     return g_hksHalDevicePtr->HuksHdiFinish(handle, paramSet, inData, outData);
139 }
140 
ENABLE_CFI(int32_t HuksAccessAbort (const struct HksBlob * handle,const struct HksParamSet * paramSet))141 ENABLE_CFI(int32_t HuksAccessAbort(const struct HksBlob *handle, const struct HksParamSet *paramSet))
142 {
143     HKS_IF_NOT_SUCC_RETURN(HksCreateHuksHdiDevice(&g_hksHalDevicePtr), HKS_ERROR_NULL_POINTER)
144 
145     HKS_IF_NULL_LOGE_RETURN(g_hksHalDevicePtr->HuksHdiAbort, HKS_ERROR_NULL_POINTER,
146         "Abort function is null pointer")
147 
148     return g_hksHalDevicePtr->HuksHdiAbort(handle, paramSet);
149 }
150 
ENABLE_CFI(int32_t HuksAccessGetKeyProperties (const struct HksParamSet * paramSet,const struct HksBlob * key))151 ENABLE_CFI(int32_t HuksAccessGetKeyProperties(const struct HksParamSet *paramSet, const struct HksBlob *key))
152 {
153     HKS_IF_NOT_SUCC_RETURN(HksCreateHuksHdiDevice(&g_hksHalDevicePtr), HKS_ERROR_NULL_POINTER)
154 
155     HKS_IF_NULL_LOGE_RETURN(g_hksHalDevicePtr->HuksHdiGetKeyProperties, HKS_ERROR_NULL_POINTER,
156         "GetKeyProperties function is null pointer")
157 
158     return g_hksHalDevicePtr->HuksHdiGetKeyProperties(paramSet, key);
159 }
160 
ENABLE_CFI(int32_t HuksAccessGetAbility (int funcType))161 ENABLE_CFI(int32_t HuksAccessGetAbility(int funcType))
162 {
163     HKS_IF_NOT_SUCC_RETURN(HksCreateHuksHdiDevice(&g_hksHalDevicePtr), HKS_ERROR_NULL_POINTER)
164 
165     HKS_IF_NULL_LOGE_RETURN(g_hksHalDevicePtr->HuksHdiGetAbility, HKS_ERROR_NULL_POINTER,
166         "GetAbility function is null pointer")
167 
168     return g_hksHalDevicePtr->HuksHdiGetAbility(funcType);
169 }
170 
ENABLE_CFI(int32_t HuksAccessGetHardwareInfo (void))171 ENABLE_CFI(int32_t HuksAccessGetHardwareInfo(void))
172 {
173     HKS_IF_NOT_SUCC_RETURN(HksCreateHuksHdiDevice(&g_hksHalDevicePtr), HKS_ERROR_NULL_POINTER)
174 
175     HKS_IF_NULL_LOGE_RETURN(g_hksHalDevicePtr->HuksHdiGetHardwareInfo, HKS_ERROR_NULL_POINTER,
176         "GetHardwareInfo function is null pointer")
177 
178     return g_hksHalDevicePtr->HuksHdiGetHardwareInfo();
179 }
180 
ENABLE_CFI(int32_t HuksAccessSign (const struct HksBlob * key,const struct HksParamSet * paramSet,const struct HksBlob * srcData,struct HksBlob * signature))181 ENABLE_CFI(int32_t HuksAccessSign(const struct HksBlob *key, const struct HksParamSet *paramSet,
182     const struct HksBlob *srcData, struct HksBlob *signature))
183 {
184     HKS_IF_NOT_SUCC_RETURN(HksCreateHuksHdiDevice(&g_hksHalDevicePtr), HKS_ERROR_NULL_POINTER)
185 
186     HKS_IF_NULL_LOGE_RETURN(g_hksHalDevicePtr->HuksHdiSign, HKS_ERROR_NULL_POINTER,
187         "Sign function is null pointer")
188 
189     return g_hksHalDevicePtr->HuksHdiSign(key, paramSet, srcData, signature);
190 }
191 
ENABLE_CFI(int32_t HuksAccessVerify (const struct HksBlob * key,const struct HksParamSet * paramSet,const struct HksBlob * srcData,const struct HksBlob * signature))192 ENABLE_CFI(int32_t HuksAccessVerify(const struct HksBlob *key, const struct HksParamSet *paramSet,
193     const struct HksBlob *srcData, const struct HksBlob *signature))
194 {
195     HKS_IF_NOT_SUCC_RETURN(HksCreateHuksHdiDevice(&g_hksHalDevicePtr), HKS_ERROR_NULL_POINTER)
196 
197     HKS_IF_NULL_LOGE_RETURN(g_hksHalDevicePtr->HuksHdiVerify, HKS_ERROR_NULL_POINTER,
198         "Verify function is null pointer")
199 
200     return g_hksHalDevicePtr->HuksHdiVerify(key, paramSet, srcData, signature);
201 }
202 
ENABLE_CFI(int32_t HuksAccessEncrypt (const struct HksBlob * key,const struct HksParamSet * paramSet,const struct HksBlob * plainText,struct HksBlob * cipherText))203 ENABLE_CFI(int32_t HuksAccessEncrypt(const struct HksBlob *key, const struct HksParamSet *paramSet,
204     const struct HksBlob *plainText, struct HksBlob *cipherText))
205 {
206     HKS_IF_NOT_SUCC_RETURN(HksCreateHuksHdiDevice(&g_hksHalDevicePtr), HKS_ERROR_NULL_POINTER)
207 
208     HKS_IF_NULL_LOGE_RETURN(g_hksHalDevicePtr->HuksHdiEncrypt, HKS_ERROR_NULL_POINTER,
209         "Encrypt function is null pointer")
210 
211     return g_hksHalDevicePtr->HuksHdiEncrypt(key, paramSet, plainText, cipherText);
212 }
213 
ENABLE_CFI(int32_t HuksAccessDecrypt (const struct HksBlob * key,const struct HksParamSet * paramSet,const struct HksBlob * cipherText,struct HksBlob * plainText))214 ENABLE_CFI(int32_t HuksAccessDecrypt(const struct HksBlob *key, const struct HksParamSet *paramSet,
215     const struct HksBlob *cipherText, struct HksBlob *plainText))
216 {
217     HKS_IF_NOT_SUCC_RETURN(HksCreateHuksHdiDevice(&g_hksHalDevicePtr), HKS_ERROR_NULL_POINTER)
218 
219     HKS_IF_NULL_LOGE_RETURN(g_hksHalDevicePtr->HuksHdiDecrypt, HKS_ERROR_NULL_POINTER,
220         "Decrypt function is null pointer")
221 
222     return g_hksHalDevicePtr->HuksHdiDecrypt(key, paramSet, cipherText, plainText);
223 }
224 
ENABLE_CFI(int32_t HuksAccessAgreeKey (const struct HksParamSet * paramSet,const struct HksBlob * privateKey,const struct HksBlob * peerPublicKey,struct HksBlob * agreedKey))225 ENABLE_CFI(int32_t HuksAccessAgreeKey(const struct HksParamSet *paramSet, const struct HksBlob *privateKey,
226     const struct HksBlob *peerPublicKey, struct HksBlob *agreedKey))
227 {
228     HKS_IF_NOT_SUCC_RETURN(HksCreateHuksHdiDevice(&g_hksHalDevicePtr), HKS_ERROR_NULL_POINTER)
229 
230     HKS_IF_NULL_LOGE_RETURN(g_hksHalDevicePtr->HuksHdiAgreeKey, HKS_ERROR_NULL_POINTER,
231         "AgreeKey function is null pointer")
232 
233     return g_hksHalDevicePtr->HuksHdiAgreeKey(paramSet, privateKey, peerPublicKey, agreedKey);
234 }
235 
ENABLE_CFI(int32_t HuksAccessDeriveKey (const struct HksParamSet * paramSet,const struct HksBlob * kdfKey,struct HksBlob * derivedKey))236 ENABLE_CFI(int32_t HuksAccessDeriveKey(const struct HksParamSet *paramSet, const struct HksBlob *kdfKey,
237     struct HksBlob *derivedKey))
238 {
239     HKS_IF_NOT_SUCC_RETURN(HksCreateHuksHdiDevice(&g_hksHalDevicePtr), HKS_ERROR_NULL_POINTER)
240 
241     HKS_IF_NULL_LOGE_RETURN(g_hksHalDevicePtr->HuksHdiDeriveKey, HKS_ERROR_NULL_POINTER,
242         "DeriveKey function is null pointer")
243 
244     return g_hksHalDevicePtr->HuksHdiDeriveKey(paramSet, kdfKey, derivedKey);
245 }
246 
ENABLE_CFI(int32_t HuksAccessMac (const struct HksBlob * key,const struct HksParamSet * paramSet,const struct HksBlob * srcData,struct HksBlob * mac))247 ENABLE_CFI(int32_t HuksAccessMac(const struct HksBlob *key, const struct HksParamSet *paramSet,
248     const struct HksBlob *srcData, struct HksBlob *mac))
249 {
250     HKS_IF_NOT_SUCC_RETURN(HksCreateHuksHdiDevice(&g_hksHalDevicePtr), HKS_ERROR_NULL_POINTER)
251 
252     HKS_IF_NULL_LOGE_RETURN(g_hksHalDevicePtr->HuksHdiMac, HKS_ERROR_NULL_POINTER,
253         "Mac function is null pointer")
254 
255     return g_hksHalDevicePtr->HuksHdiMac(key, paramSet, srcData, mac);
256 }
257 
258 #ifdef HKS_ENABLE_UPGRADE_KEY
ENABLE_CFI(int32_t HuksAccessUpgradeKey (const struct HksBlob * oldKey,const struct HksParamSet * paramSet,struct HksBlob * newKey))259 ENABLE_CFI(int32_t HuksAccessUpgradeKey(const struct HksBlob *oldKey, const struct HksParamSet *paramSet,
260     struct HksBlob *newKey))
261 {
262     HKS_IF_NOT_SUCC_RETURN(HksCreateHuksHdiDevice(&g_hksHalDevicePtr), HKS_ERROR_NULL_POINTER)
263 
264     HKS_IF_NULL_LOGE_RETURN(g_hksHalDevicePtr->HuksHdiUpgradeKey, HKS_ERROR_NULL_POINTER,
265         "Change key owner function is null pointer")
266 
267     return g_hksHalDevicePtr->HuksHdiUpgradeKey(oldKey, paramSet, newKey);
268 }
269 #endif
270 
271 #ifdef _STORAGE_LITE_
ENABLE_CFI(int32_t HuksAccessCalcHeaderMac (const struct HksParamSet * paramSet,const struct HksBlob * salt,const struct HksBlob * srcData,struct HksBlob * mac))272 ENABLE_CFI(int32_t HuksAccessCalcHeaderMac(const struct HksParamSet *paramSet, const struct HksBlob *salt,
273     const struct HksBlob *srcData, struct HksBlob *mac))
274 {
275     HKS_IF_NOT_SUCC_RETURN(HksCreateHuksHdiDevice(&g_hksHalDevicePtr), HKS_ERROR_NULL_POINTER)
276 
277     HKS_IF_NULL_LOGE_RETURN(g_hksHalDevicePtr->HuksHdiCalcMacHeader, HKS_ERROR_NULL_POINTER,
278         "CalcMacHeader function is null pointer")
279 
280     return g_hksHalDevicePtr->HuksHdiCalcMacHeader(paramSet, salt, srcData, mac);
281 }
282 #endif
283 
284 #ifdef HKS_SUPPORT_API_ATTEST_KEY
ENABLE_CFI(int32_t HuksAccessAttestKey (const struct HksBlob * key,const struct HksParamSet * paramSet,struct HksBlob * certChain))285 ENABLE_CFI(int32_t HuksAccessAttestKey(const struct HksBlob *key, const struct HksParamSet *paramSet,
286     struct HksBlob *certChain))
287 {
288     HKS_IF_NOT_SUCC_RETURN(HksCreateHuksHdiDevice(&g_hksHalDevicePtr), HKS_ERROR_NULL_POINTER)
289 
290     HKS_IF_NULL_LOGE_RETURN(g_hksHalDevicePtr->HuksHdiAttestKey, HKS_ERROR_NULL_POINTER,
291         "AttestKey function is null pointer")
292 
293     return g_hksHalDevicePtr->HuksHdiAttestKey(key, paramSet, certChain);
294 }
295 #endif
296 
297 #endif /* _CUT_AUTHENTICATE_ */
298 
ENABLE_CFI(int32_t HuksAccessGenerateRandom (const struct HksParamSet * paramSet,struct HksBlob * random))299 ENABLE_CFI(int32_t HuksAccessGenerateRandom(const struct HksParamSet *paramSet, struct HksBlob *random))
300 {
301     HKS_IF_NOT_SUCC_RETURN(HksCreateHuksHdiDevice(&g_hksHalDevicePtr), HKS_ERROR_NULL_POINTER)
302 
303     HKS_IF_NULL_LOGE_RETURN(g_hksHalDevicePtr->HuksHdiGenerateRandom, HKS_ERROR_NULL_POINTER,
304         "GenerateRandom function is null pointer")
305 
306     return g_hksHalDevicePtr->HuksHdiGenerateRandom(paramSet, random);
307 }
308 
309 #ifdef HKS_SUPPORT_CHIPSET_PLATFORM_DECRYPT
ENABLE_CFI(int32_t HuksAccessExportChipsetPlatformPublicKey (const struct HksBlob * salt,enum HksChipsetPlatformDecryptScene scene,struct HksBlob * publicKey))310 ENABLE_CFI(int32_t HuksAccessExportChipsetPlatformPublicKey(const struct HksBlob *salt,
311     enum HksChipsetPlatformDecryptScene scene, struct HksBlob *publicKey))
312 {
313     return g_hksHalDevicePtr->HuksHdiExportChipsetPlatformPublicKey(salt, scene, publicKey);
314 }
315 #endif
316