• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef HUKS_HDI_TEMPLATE_H
17 #define HUKS_HDI_TEMPLATE_H
18 
19 #include "huks_sa_type.h"
20 
21 typedef struct HksBlob TargetBlob;
22 typedef struct HksParamSet TargetParamSet;
23 
24 #define HDI_ADAPTER_PARAM(oldParamPtr, newParamPtr) ((oldParamPtr) == NULL ?  NULL : (newParamPtr))
25 
26 
27 #define HDI_CONVERTER_PARAM_IN_BLOB(fromHuksBlobPtr, toHksBlobPtr)  \
28     if ((fromHuksBlobPtr) != NULL && (toHksBlobPtr) != NULL) {      \
29         (toHksBlobPtr)->data = (fromHuksBlobPtr)->data;             \
30         (toHksBlobPtr)->size = (fromHuksBlobPtr)->dataLen;          \
31     }
32 
33 #define HDI_CONVERTER_PARAM_IN_PARAMSET(fromHuksParamSetPtr, toHksParamSetPtr)   \
34     if ((fromHuksParamSetPtr) != NULL && (fromHuksParamSetPtr)->data != NULL &&  \
35         (fromHuksParamSetPtr)->dataLen >= sizeof(TargetParamSet)) {              \
36         (toHksParamSetPtr) = (TargetParamSet *)(fromHuksParamSetPtr)->data;      \
37     }
38 
39 #define HDI_CONVERTER_PARAM_OUT_BLOB(fromHksBlobPtr, toHuksBlobPtr) \
40     if ((fromHksBlobPtr) != NULL && (toHuksBlobPtr) != NULL) {      \
41         (toHuksBlobPtr)->data = (fromHksBlobPtr)->data;             \
42         (toHuksBlobPtr)->dataLen = (fromHksBlobPtr)->size;          \
43     }
44 
45 #define HDI_CONVERTER_FUNC_GENERATEKEY(keyAlias, paramSet, keyIn, keyOut, ret, func) \
46     TargetBlob keyAliasCore = {0};  \
47     TargetParamSet *paramSetCore = NULL;  \
48     TargetBlob keyInCore = {0};  \
49     TargetBlob keyOutCore = {0};  \
50     HDI_CONVERTER_PARAM_IN_BLOB(keyAlias, &keyAliasCore)  \
51     HDI_CONVERTER_PARAM_IN_PARAMSET(paramSet, paramSetCore)  \
52     HDI_CONVERTER_PARAM_IN_BLOB(keyIn, &keyInCore)  \
53     HDI_CONVERTER_PARAM_IN_BLOB(keyOut, &keyOutCore)  \
54     ret = (func)(HDI_ADAPTER_PARAM(keyAlias, &keyAliasCore),  \
55                  HDI_ADAPTER_PARAM(paramSet, paramSetCore),  \
56                  HDI_ADAPTER_PARAM(keyIn, &keyInCore),        \
57                  HDI_ADAPTER_PARAM(keyOut, &keyOutCore));  \
58     HDI_CONVERTER_PARAM_OUT_BLOB(&keyOutCore, keyOut)
59 
60 #define HDI_CONVERTER_FUNC_IMPORTKEY(keyAlias, key, paramSet, keyOut, ret, func) \
61     TargetBlob keyAliasCore = {0};   \
62     TargetParamSet *paramSetCore = NULL;   \
63     TargetBlob keyCore = {0};   \
64     TargetBlob keyOutCore = {0};   \
65     HDI_CONVERTER_PARAM_IN_BLOB(keyAlias, &keyAliasCore)   \
66     HDI_CONVERTER_PARAM_IN_PARAMSET(paramSet, paramSetCore)   \
67     HDI_CONVERTER_PARAM_IN_BLOB(key, &keyCore)   \
68     HDI_CONVERTER_PARAM_IN_BLOB(keyOut, &keyOutCore)   \
69     ret = (func)(HDI_ADAPTER_PARAM(keyAlias, &keyAliasCore), \
70                  HDI_ADAPTER_PARAM(key, &keyCore),   \
71                  HDI_ADAPTER_PARAM(paramSet, paramSetCore), \
72                  HDI_ADAPTER_PARAM(keyOut, &keyOutCore));   \
73     HDI_CONVERTER_PARAM_OUT_BLOB(&keyOutCore, keyOut)
74 
75 #define HDI_CONVERTER_FUNC_IMPORTWRAPPEDKEY(wrappedKeyAlias, key, wrappedKeyData, paramSet, keyOut, ret, func)   \
76     TargetBlob wrappingKeyAliasCore = {0};  \
77     TargetBlob keyCore = {0};  \
78     TargetBlob wrappedKeyDataCore = {0};  \
79     TargetParamSet *paramSetCore = NULL;  \
80     TargetBlob keyOutCore = {0};  \
81     HDI_CONVERTER_PARAM_IN_BLOB(wrappingKeyAlias, &wrappingKeyAliasCore)  \
82     HDI_CONVERTER_PARAM_IN_PARAMSET(paramSet, paramSetCore)  \
83     HDI_CONVERTER_PARAM_IN_BLOB(key, &keyCore)  \
84     HDI_CONVERTER_PARAM_IN_BLOB(wrappedKeyData, &wrappedKeyDataCore)  \
85     HDI_CONVERTER_PARAM_IN_BLOB(keyOut, &keyOutCore)  \
86     ret = (func)(HDI_ADAPTER_PARAM(wrappingKeyAlias, &wrappedKeyDataCore),  \
87                  HDI_ADAPTER_PARAM(key, &keyCore),  \
88                  HDI_ADAPTER_PARAM(wrappedKeyData, &wrappedKeyDataCore),  \
89                  HDI_ADAPTER_PARAM(paramSet, paramSetCore),  \
90                  HDI_ADAPTER_PARAM(keyOut, &keyOutCore));  \
91     HDI_CONVERTER_PARAM_OUT_BLOB(&keyOutCore, keyOut)
92 
93 #define HDI_CONVERTER_FUNC_EXPORTPUBLICKEY(key, paramSet, keyOut, ret, func)  \
94     TargetBlob keyCore = {0};  \
95     TargetParamSet *paramSetCore = NULL;  \
96     TargetBlob keyOutCore = {0};  \
97     HDI_CONVERTER_PARAM_IN_BLOB(key, &keyCore)  \
98     HDI_CONVERTER_PARAM_IN_PARAMSET(paramSet, paramSetCore)  \
99     HDI_CONVERTER_PARAM_IN_BLOB(keyOut, &keyOutCore)  \
100     ret = (func)(HDI_ADAPTER_PARAM(key, &keyCore),  \
101                  HDI_ADAPTER_PARAM(paramSet, paramSetCore),  \
102                  HDI_ADAPTER_PARAM(keyOut, &keyOutCore));  \
103     HDI_CONVERTER_PARAM_OUT_BLOB(&keyOutCore, keyOut)
104 
105 #define HDI_CONVERTER_FUNC_INIT(key, paramSet, handle, token, ret, func)  \
106     TargetBlob keyCore = {0};  \
107     TargetParamSet *paramSetCore = NULL;  \
108     TargetBlob handleCore = {0};  \
109     TargetBlob tokenCore = {0};  \
110     HDI_CONVERTER_PARAM_IN_BLOB(key, &keyCore)  \
111     HDI_CONVERTER_PARAM_IN_PARAMSET(paramSet, paramSetCore)  \
112     HDI_CONVERTER_PARAM_IN_BLOB(handle, &handleCore)  \
113     HDI_CONVERTER_PARAM_IN_BLOB(token, &tokenCore)  \
114     ret = (func)(HDI_ADAPTER_PARAM(key, &keyCore),  \
115                  HDI_ADAPTER_PARAM(paramSet, paramSetCore),  \
116                  HDI_ADAPTER_PARAM(handle, &handleCore),  \
117                  HDI_ADAPTER_PARAM(token, &tokenCore));  \
118     HDI_CONVERTER_PARAM_OUT_BLOB(&handleCore, handle)  \
119     HDI_CONVERTER_PARAM_OUT_BLOB(&tokenCore, token)
120 
121 #define HDI_CONVERTER_FUNC_UPDATE(handle, paramSet, inData, outData, ret, func)  \
122     TargetBlob handleCore = {0};  \
123     TargetParamSet *paramSetCore = NULL;  \
124     TargetBlob inDataCore = {0};  \
125     TargetBlob outDataCore = {0};  \
126     HDI_CONVERTER_PARAM_IN_BLOB(handle, &handleCore)  \
127     HDI_CONVERTER_PARAM_IN_PARAMSET(paramSet, paramSetCore)  \
128     HDI_CONVERTER_PARAM_IN_BLOB(inData, &inDataCore)  \
129     HDI_CONVERTER_PARAM_IN_BLOB(outData, &outDataCore)  \
130     ret = (func)(HDI_ADAPTER_PARAM(handle, &handleCore),  \
131                  HDI_ADAPTER_PARAM(paramSet, paramSetCore),  \
132                  HDI_ADAPTER_PARAM(inData, &inDataCore),  \
133                  HDI_ADAPTER_PARAM(outData, &outDataCore));  \
134     HDI_CONVERTER_PARAM_OUT_BLOB(&outDataCore, outData)
135 
136 #define HDI_CONVERTER_FUNC_FINISH(handle, paramSet, inData, outData, ret, func)  \
137     TargetBlob handleCore = {0};  \
138     TargetParamSet *paramSetCore = NULL;  \
139     TargetBlob inDataCore = {0};  \
140     TargetBlob outDataCore = {0};  \
141     HDI_CONVERTER_PARAM_IN_BLOB(handle, &handleCore)  \
142     HDI_CONVERTER_PARAM_IN_PARAMSET(paramSet, paramSetCore)  \
143     HDI_CONVERTER_PARAM_IN_BLOB(inData, &inDataCore)  \
144     HDI_CONVERTER_PARAM_IN_BLOB(outData, &outDataCore)  \
145     ret = (func)(HDI_ADAPTER_PARAM(handle, &handleCore),  \
146                  HDI_ADAPTER_PARAM(paramSet, paramSetCore),  \
147                  HDI_ADAPTER_PARAM(inData, &inDataCore),  \
148                  HDI_ADAPTER_PARAM(outData, &outDataCore));  \
149     HDI_CONVERTER_PARAM_OUT_BLOB(&outDataCore, outData)
150 
151 #define HDI_CONVERTER_FUNC_ABORT(handle, paramSet, ret, func)  \
152     TargetBlob handleCore = {0};  \
153     TargetParamSet *paramSetCore = NULL;  \
154     HDI_CONVERTER_PARAM_IN_BLOB(handle, &handleCore)  \
155     HDI_CONVERTER_PARAM_IN_PARAMSET(paramSet, paramSetCore)  \
156     ret = (func)(HDI_ADAPTER_PARAM(handle, &handleCore),  \
157                  HDI_ADAPTER_PARAM(paramSet, paramSetCore));
158 
159 #define HDI_CONVERTER_FUNC_CHECKKEYVALIDITY(paramSet, key, ret, func)  \
160     TargetBlob keyCore = {0};  \
161     TargetParamSet *paramSetCore = NULL;  \
162     HDI_CONVERTER_PARAM_IN_PARAMSET(paramSet, paramSetCore)  \
163     HDI_CONVERTER_PARAM_IN_BLOB(key, &keyCore)  \
164     ret = (func)(HDI_ADAPTER_PARAM(paramSet, paramSetCore),  \
165                  HDI_ADAPTER_PARAM(key, &keyCore));
166 
167 #define HDI_CONVERTER_FUNC_ATTESTKEY(key, paramSet, certChain, ret, func)  \
168     TargetBlob keyCore = {0};  \
169     TargetParamSet *paramSetCore = NULL;  \
170     TargetBlob certChainCore = {0};  \
171     HDI_CONVERTER_PARAM_IN_PARAMSET(paramSet, paramSetCore)  \
172     HDI_CONVERTER_PARAM_IN_BLOB(key, &keyCore)  \
173     HDI_CONVERTER_PARAM_IN_BLOB(certChain, &certChainCore)  \
174     ret = (func)(HDI_ADAPTER_PARAM(key, &keyCore),  \
175                  HDI_ADAPTER_PARAM(paramSet, paramSetCore),  \
176                  HDI_ADAPTER_PARAM(certChain, &certChainCore));  \
177     HDI_CONVERTER_PARAM_OUT_BLOB(&certChainCore, certChain)
178 
179 #define HDI_CONVERTER_FUNC_GENERATERANDOM(paramSet, random, ret, func)  \
180     TargetParamSet *paramSetCore = NULL;  \
181     TargetBlob randomCore = {0};  \
182     HDI_CONVERTER_PARAM_IN_PARAMSET(paramSet, paramSetCore)  \
183     HDI_CONVERTER_PARAM_IN_BLOB(random, &randomCore)  \
184     ret = (func)(HDI_ADAPTER_PARAM(paramSet, paramSetCore),  \
185                  HDI_ADAPTER_PARAM(random, &randomCore));  \
186     HDI_CONVERTER_PARAM_OUT_BLOB(&randomCore, random)
187 
188 #define HDI_CONVERTER_FUNC_GETERRORINFO(errorInfo, ret, func)  \
189     TargetBlob errorInfoCore = {0};  \
190     HDI_CONVERTER_PARAM_IN_BLOB((errorInfo), &errorInfoCore)  \
191     (ret) = (func)(HDI_ADAPTER_PARAM((errorInfo), &errorInfoCore));  \
192     HDI_CONVERTER_PARAM_OUT_BLOB(&errorInfoCore, errorInfo)
193 
194 #define HDI_CONVERTER_FUNC_GETSTATINFO(statInfo, ret, func)  \
195     TargetBlob statInfoCore = {0};  \
196     HDI_CONVERTER_PARAM_IN_BLOB((statInfo), &statInfoCore)  \
197     (ret) = (func)(HDI_ADAPTER_PARAM((statInfo), &statInfoCore));  \
198     HDI_CONVERTER_PARAM_OUT_BLOB(&statInfoCore, statInfo)
199 
200 #define HDI_CONVERTER_FUNC_SIGN(key, paramSet, srcData, signature, ret, func) \
201     TargetBlob keyCore = {0}; \
202     TargetParamSet *paramSetCore = NULL; \
203     TargetBlob srcDataCore = {0}; \
204     TargetBlob signatureCore = {0}; \
205     HDI_CONVERTER_PARAM_IN_BLOB(key, &keyCore) \
206     HDI_CONVERTER_PARAM_IN_PARAMSET(paramSet, paramSetCore) \
207     HDI_CONVERTER_PARAM_IN_BLOB(srcData, &srcDataCore) \
208     HDI_CONVERTER_PARAM_IN_BLOB(signature, &signatureCore) \
209     ret = (func)(HDI_ADAPTER_PARAM(key, &keyCore), \
210                  HDI_ADAPTER_PARAM(paramSet, paramSetCore), \
211                  HDI_ADAPTER_PARAM(srcData, &srcDataCore), \
212                  HDI_ADAPTER_PARAM(signature, &signatureCore)); \
213     HDI_CONVERTER_PARAM_OUT_BLOB(&signatureCore, signature)
214 
215 #define HDI_CONVERTER_FUNC_VERIFY(key, paramSet, srcData, signature, ret, func)  \
216     TargetBlob keyCore = {0};  \
217     TargetParamSet *paramSetCore = NULL;  \
218     TargetBlob srcDataCore = {0};  \
219     TargetBlob signatureCore = {0};  \
220     HDI_CONVERTER_PARAM_IN_BLOB(key, &keyCore)  \
221     HDI_CONVERTER_PARAM_IN_PARAMSET(paramSet, paramSetCore)  \
222     HDI_CONVERTER_PARAM_IN_BLOB(srcData, &srcDataCore)  \
223     HDI_CONVERTER_PARAM_IN_BLOB(signature, &signatureCore)  \
224     ret = (func)(HDI_ADAPTER_PARAM(key, &keyCore),  \
225                  HDI_ADAPTER_PARAM(paramSet, paramSetCore),  \
226                  HDI_ADAPTER_PARAM(srcData, &srcDataCore),  \
227                  HDI_ADAPTER_PARAM(signature, &signatureCore));
228 
229 #define HDI_CONVERTER_FUNC_ENCRYPT(key, paramSet, plainText, cipherText, ret, func)  \
230     TargetBlob keyCore = {0};  \
231     TargetParamSet *paramSetCore = NULL;  \
232     TargetBlob plainTextCore = {0};  \
233     TargetBlob cipherTextCore = {0};  \
234     HDI_CONVERTER_PARAM_IN_BLOB(key, &keyCore)  \
235     HDI_CONVERTER_PARAM_IN_PARAMSET(paramSet, paramSetCore)  \
236     HDI_CONVERTER_PARAM_IN_BLOB(plainText, &plainTextCore)  \
237     HDI_CONVERTER_PARAM_IN_BLOB(cipherText, &cipherTextCore)  \
238     ret = (func)(HDI_ADAPTER_PARAM(key, &keyCore),  \
239                  HDI_ADAPTER_PARAM(paramSet, paramSetCore),  \
240                  HDI_ADAPTER_PARAM(plainText, &plainTextCore),  \
241                  HDI_ADAPTER_PARAM(cipherText, &cipherTextCore));  \
242     HDI_CONVERTER_PARAM_OUT_BLOB(&cipherTextCore, cipherText)
243 
244 #define HDI_CONVERTER_FUNC_DECRYPT(key, paramSet, cipherText, plainText, ret, func)  \
245     TargetBlob keyCore = {0};  \
246     TargetParamSet *paramSetCore = NULL;  \
247     TargetBlob cipherTextCore = {0};  \
248     TargetBlob plainTextCore = {0};  \
249     HDI_CONVERTER_PARAM_IN_BLOB(key, &keyCore)  \
250     HDI_CONVERTER_PARAM_IN_PARAMSET(paramSet, paramSetCore)  \
251     HDI_CONVERTER_PARAM_IN_BLOB(cipherText, &cipherTextCore)  \
252     HDI_CONVERTER_PARAM_IN_BLOB(plainText, &plainTextCore)  \
253     ret = (func)(HDI_ADAPTER_PARAM(key, &keyCore),  \
254                  HDI_ADAPTER_PARAM(paramSet, paramSetCore),  \
255                  HDI_ADAPTER_PARAM(cipherText, &cipherTextCore),  \
256                  HDI_ADAPTER_PARAM(plainText, &plainTextCore));  \
257     HDI_CONVERTER_PARAM_OUT_BLOB(&plainTextCore, plainText)
258 
259 #define HDI_CONVERTER_FUNC_AGREEKEY(paramSet, privateKey, peerPublicKey, agreedKey, ret, func)  \
260     TargetParamSet *paramSetCore = NULL;  \
261     TargetBlob privateKeyCore = {0};  \
262     TargetBlob peerPublicKeyCore = {0};  \
263     TargetBlob agreedKeyCore = {0};  \
264     HDI_CONVERTER_PARAM_IN_PARAMSET(paramSet, paramSetCore)  \
265     HDI_CONVERTER_PARAM_IN_BLOB(privateKey, &privateKeyCore)  \
266     HDI_CONVERTER_PARAM_IN_BLOB(peerPublicKey, &peerPublicKeyCore)  \
267     HDI_CONVERTER_PARAM_IN_BLOB(agreedKey, &agreedKeyCore)  \
268     ret = (func)(HDI_ADAPTER_PARAM(paramSet, paramSetCore),  \
269                  HDI_ADAPTER_PARAM(privateKey, &privateKeyCore),  \
270                  HDI_ADAPTER_PARAM(peerPublicKey, &peerPublicKeyCore),  \
271                  HDI_ADAPTER_PARAM(agreedKey, &agreedKeyCore));  \
272     HDI_CONVERTER_PARAM_OUT_BLOB(&agreedKeyCore, agreedKey)
273 
274 
275 #define HDI_CONVERTER_FUNC_DERIVEKEY(paramSet, kdfKey, derivedKey, ret, func)  \
276     TargetParamSet *paramSetCore = NULL;  \
277     TargetBlob kdfKeyCore = {0};  \
278     TargetBlob derivedKeyCore = {0};  \
279     HDI_CONVERTER_PARAM_IN_PARAMSET(paramSet, paramSetCore)  \
280     HDI_CONVERTER_PARAM_IN_BLOB(kdfKey, &kdfKeyCore)  \
281     HDI_CONVERTER_PARAM_IN_BLOB(derivedKey, &derivedKeyCore)  \
282     ret = (func)(HDI_ADAPTER_PARAM(paramSet, paramSetCore),  \
283                  HDI_ADAPTER_PARAM(kdfKey, &kdfKeyCore),  \
284                  HDI_ADAPTER_PARAM(derivedKey, &derivedKeyCore));  \
285     HDI_CONVERTER_PARAM_OUT_BLOB(&derivedKeyCore, derivedKey)
286 
287 #define HDI_CONVERTER_FUNC_MAC(key, paramSet, srcData, mac, ret, func)  \
288     TargetParamSet *paramSetCore = NULL;  \
289     TargetBlob keyCore = {0};  \
290     TargetBlob srcDataCore = {0};  \
291     TargetBlob macCore = {0};  \
292     HDI_CONVERTER_PARAM_IN_PARAMSET(paramSet, paramSetCore)  \
293     HDI_CONVERTER_PARAM_IN_BLOB(key, &keyCore)  \
294     HDI_CONVERTER_PARAM_IN_BLOB(srcData, &srcDataCore)  \
295     HDI_CONVERTER_PARAM_IN_BLOB(mac, &macCore)  \
296     ret = (func)(HDI_ADAPTER_PARAM(key, &keyCore),  \
297                  HDI_ADAPTER_PARAM(paramSet, paramSetCore),  \
298                  HDI_ADAPTER_PARAM(srcData, &srcDataCore),  \
299                  HDI_ADAPTER_PARAM(mac, &macCore));  \
300     HDI_CONVERTER_PARAM_OUT_BLOB(&macCore, mac)
301 
302 #define HDI_CONVERTER_FUNC_UPGRADEKEY(oldKey, paramSet, newKey, ret, func)  \
303     TargetParamSet *paramSetCore = NULL;  \
304     TargetBlob oldKeyCore = {0};  \
305     TargetBlob newKeyCore = {0};  \
306     HDI_CONVERTER_PARAM_IN_PARAMSET(paramSet, paramSetCore)  \
307     HDI_CONVERTER_PARAM_IN_BLOB(oldKey, &oldKeyCore)  \
308     HDI_CONVERTER_PARAM_IN_BLOB(newKey, &newKeyCore)  \
309     ret = (func)(HDI_ADAPTER_PARAM(oldKey, &oldKeyCore),  \
310                  HDI_ADAPTER_PARAM(paramSet, paramSetCore),  \
311                  HDI_ADAPTER_PARAM(newKey, &newKeyCore));  \
312     HDI_CONVERTER_PARAM_OUT_BLOB(&newKeyCore, newKey)
313 
314 #undef HUKS_NULL_POINTER
315 
316 #ifdef __cplusplus
317 #define HUKS_NULL_POINTER nullptr
318 #else
319 #define HUKS_NULL_POINTER NULL
320 #endif
321 
322 #define HUKS_HDI_IF_NOT_SUCC_RETURN(RESULT, ERROR_CODE) \
323 if ((RESULT) != HUKS_SUCCESS) { \
324     return (ERROR_CODE); \
325 }
326 
327 #define HUKS_HDI_IF_NULL_LOGE_RETURN(OBJECT, ERROR_CODE, LOG_MESSAGE, ...) \
328 if ((OBJECT) == HUKS_NULL_POINTER) { \
329     HDF_LOGE(LOG_MESSAGE, ##__VA_ARGS__); \
330     return (ERROR_CODE); \
331 }
332 
333 #endif
334