• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * This file is part of the openHiTLS project.
3  *
4  * openHiTLS is licensed under the Mulan PSL v2.
5  * You can use this software according to the terms and conditions of the Mulan PSL v2.
6  * You may obtain a copy of Mulan PSL v2 at:
7  *
8  *     http://license.coscl.org.cn/MulanPSL2
9  *
10  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11  * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12  * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13  * See the Mulan PSL v2 for more details.
14  */
15 
16 #include "hitls_build.h"
17 #ifdef HITLS_PKI_X509
18 
19 #include "hitls_x509_local.h"
20 #include "securec.h"
21 #include "bsl_sal.h"
22 #include "bsl_log_internal.h"
23 #include "hitls_pki_errno.h"
24 #include "crypt_errno.h"
25 #include "crypt_eal_pkey.h"
26 #include "bsl_obj_internal.h"
27 #include "bsl_err_internal.h"
28 
29 #ifdef HITLS_BSL_PEM
30 #include "bsl_pem_internal.h"
31 #endif // HITLS_BSL_PEM
32 
33 #include "crypt_encode_decode_key.h"
34 #include "bsl_params.h"
35 #include "crypt_params_key.h"
36 #include "hitls_pki_utils.h"
37 
HITLS_X509_AddListItemDefault(void * item,uint32_t len,BSL_ASN1_List * list)38 int32_t HITLS_X509_AddListItemDefault(void *item, uint32_t len, BSL_ASN1_List *list)
39 {
40     void *node = BSL_SAL_Malloc(len);
41     if (node == NULL) {
42         BSL_ERR_PUSH_ERROR(BSL_MALLOC_FAIL);
43         return BSL_MALLOC_FAIL;
44     }
45     (void)memcpy_s(node, len, item, len);
46     int32_t ret = BSL_LIST_AddElement(list, node, BSL_LIST_POS_AFTER);
47     if (ret != BSL_SUCCESS) {
48         BSL_ERR_PUSH_ERROR(ret);
49         BSL_SAL_Free(node);
50     }
51     return ret;
52 }
53 
54 #if defined(HITLS_PKI_X509_CRT_PARSE) || defined(HITLS_PKI_X509_CRL_PARSE) || defined(HITLS_PKI_X509_CSR_PARSE)
HITLS_X509_ParseTbsRawData(uint8_t * encode,uint32_t encodeLen,uint8_t ** tbsRawData,uint32_t * tbsRawDataLen)55 int32_t HITLS_X509_ParseTbsRawData(uint8_t *encode, uint32_t encodeLen, uint8_t **tbsRawData, uint32_t *tbsRawDataLen)
56 {
57     uint8_t *temp = encode;
58     uint32_t tempLen = encodeLen;
59     uint32_t valLen;
60     // x509
61     int32_t ret = BSL_ASN1_DecodeTagLen(BSL_ASN1_TAG_CONSTRUCTED | BSL_ASN1_TAG_SEQUENCE, &temp, &tempLen, &valLen);
62     if (ret != BSL_SUCCESS) {
63         BSL_ERR_PUSH_ERROR(ret);
64         return ret;
65     }
66     uint32_t len = tempLen;
67     *tbsRawData = temp;
68     // tbs
69     ret = BSL_ASN1_DecodeTagLen(BSL_ASN1_TAG_CONSTRUCTED | BSL_ASN1_TAG_SEQUENCE, &temp, &tempLen, &valLen);
70     if (ret != BSL_SUCCESS) {
71         BSL_ERR_PUSH_ERROR(ret);
72         return ret;
73     }
74 
75     *tbsRawDataLen = len - tempLen + valLen;
76     return ret;
77 }
78 
HITLS_X509_ParseSignAlgInfo(BSL_ASN1_Buffer * algId,BSL_ASN1_Buffer * param,HITLS_X509_Asn1AlgId * x509Alg)79 int32_t HITLS_X509_ParseSignAlgInfo(BSL_ASN1_Buffer *algId, BSL_ASN1_Buffer *param, HITLS_X509_Asn1AlgId *x509Alg)
80 {
81     int32_t ret = HITLS_PKI_SUCCESS;
82     BslOidString oidStr = {algId->len, (char *)algId->buff, 0};
83     BslCid cid = BSL_OBJ_GetCID(&oidStr);
84     if (cid == BSL_CID_UNKNOWN) {
85         BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_ALG_OID);
86         return HITLS_X509_ERR_ALG_OID;
87     }
88     if (cid == BSL_CID_RSASSAPSS) {
89 #ifdef HITLS_CRYPTO_RSA
90         ret = CRYPT_EAL_ParseRsaPssAlgParam(param, &x509Alg->rsaPssParam);
91         if (ret != BSL_SUCCESS) {
92             BSL_ERR_PUSH_ERROR(ret);
93             return ret;
94         }
95 #else
96         (void)param;
97         BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_ALG_UNSUPPORT);
98         return HITLS_X509_ERR_ALG_UNSUPPORT;
99 #endif
100     }
101     x509Alg->algId = cid;
102     return ret;
103 }
104 #endif
105 
HITLS_X509_ParseNameNode(BSL_ASN1_Buffer * asn,HITLS_X509_NameNode * node)106 static int32_t HITLS_X509_ParseNameNode(BSL_ASN1_Buffer *asn, HITLS_X509_NameNode *node)
107 {
108     uint8_t *temp = asn->buff;
109     uint32_t tempLen = asn->len;
110     // parse oid
111     if (*temp != BSL_ASN1_TAG_OBJECT_ID) {
112         BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_NAME_OID);
113         return HITLS_X509_ERR_NAME_OID;
114     }
115 
116     int32_t ret = BSL_ASN1_DecodeItem(&temp, &tempLen, &node->nameType);
117     if (ret != BSL_SUCCESS) {
118         BSL_ERR_PUSH_ERROR(ret);
119         return ret;
120     }
121 
122     // parse string
123     if (*temp != BSL_ASN1_TAG_UTF8STRING && *temp != BSL_ASN1_TAG_PRINTABLESTRING &&
124         *temp != BSL_ASN1_TAG_IA5STRING) {
125         BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_PARSE_STR);
126         return HITLS_X509_ERR_PARSE_STR;
127     }
128 
129     ret = BSL_ASN1_DecodeItem(&temp, &tempLen, &node->nameValue);
130     if (ret != BSL_SUCCESS) {
131         BSL_ERR_PUSH_ERROR(ret);
132     }
133     return ret;
134 }
135 
HITLS_X509_ParseListAsnItem(uint32_t layer,BSL_ASN1_Buffer * asn,void * cbParam,BSL_ASN1_List * list)136 int32_t HITLS_X509_ParseListAsnItem(uint32_t layer, BSL_ASN1_Buffer *asn, void *cbParam, BSL_ASN1_List *list)
137 {
138     (void) cbParam;
139     int32_t ret = HITLS_PKI_SUCCESS;
140     HITLS_X509_NameNode *node = BSL_SAL_Calloc(1, sizeof(HITLS_X509_NameNode));
141     if (node == NULL) {
142         BSL_ERR_PUSH_ERROR(BSL_MALLOC_FAIL);
143         return BSL_MALLOC_FAIL;
144     }
145 
146     if (layer == 1) {
147         node->layer = 1;
148     } else { // layer == 2
149         node->layer = 2;
150         ret = HITLS_X509_ParseNameNode(asn, node);
151         if (ret != HITLS_PKI_SUCCESS) {
152             goto ERR;
153         }
154     }
155 
156     ret = BSL_LIST_AddElement(list, node, BSL_LIST_POS_AFTER);
157     if (ret != BSL_SUCCESS) {
158         goto ERR;
159     }
160     return ret;
161 ERR:
162     BSL_SAL_Free(node);
163     return ret;
164 }
165 
HITLS_X509_ParseNameList(BSL_ASN1_Buffer * name,BSL_ASN1_List * list)166 int32_t HITLS_X509_ParseNameList(BSL_ASN1_Buffer *name, BSL_ASN1_List *list)
167 {
168     uint8_t expTag[] = {BSL_ASN1_TAG_CONSTRUCTED | BSL_ASN1_TAG_SET,
169         BSL_ASN1_TAG_CONSTRUCTED | BSL_ASN1_TAG_SEQUENCE};
170     BSL_ASN1_DecodeListParam listParam = {2, expTag};
171     int32_t ret = BSL_ASN1_DecodeListItem(&listParam, name, HITLS_X509_ParseListAsnItem, NULL, list);
172     if (ret != BSL_SUCCESS) {
173         BSL_LIST_DeleteAll(list, NULL);
174     }
175     return ret;
176 }
177 
178 #if defined(HITLS_PKI_X509_CRT_PARSE) || defined(HITLS_PKI_X509_CSR_PARSE) || defined(HITLS_PKI_X509_CRL)
HITLS_X509_ParseTime(BSL_ASN1_Buffer * before,BSL_ASN1_Buffer * after,HITLS_X509_ValidTime * time)179 int32_t HITLS_X509_ParseTime(BSL_ASN1_Buffer *before, BSL_ASN1_Buffer *after, HITLS_X509_ValidTime *time)
180 {
181     int32_t ret = BSL_ASN1_DecodePrimitiveItem(before, &time->start);
182     if (ret != BSL_SUCCESS) {
183         BSL_ERR_PUSH_ERROR(ret);
184         return ret;
185     }
186     time->flag |= BSL_TIME_BEFORE_SET;
187     if (before->tag == BSL_ASN1_TAG_UTCTIME) {
188         time->flag |= BSL_TIME_BEFORE_IS_UTC;
189     }
190     // crl after time is optional
191     if (after->tag != 0) {
192         ret = BSL_ASN1_DecodePrimitiveItem(after, &time->end);
193         if (ret != BSL_SUCCESS) {
194             BSL_ERR_PUSH_ERROR(ret);
195             return ret;
196         }
197         time->flag |= BSL_TIME_AFTER_SET;
198         if (after->tag == BSL_ASN1_TAG_UTCTIME) {
199             time->flag |= BSL_TIME_AFTER_IS_UTC;
200         }
201     }
202     return ret;
203 }
204 #endif
205 
206 #if defined(HITLS_PKI_X509_CSR_GEN) || defined(HITLS_PKI_X509_CRT_GEN) || defined(HITLS_PKI_X509_CRL_GEN)
X509_CheckIsRsa(uint32_t algId)207 static bool X509_CheckIsRsa(uint32_t algId)
208 {
209     switch (algId) {
210         case BSL_CID_RSA:
211         case BSL_CID_MD5WITHRSA:
212         case BSL_CID_SHA1WITHRSA:
213         case BSL_CID_SHA224WITHRSAENCRYPTION:
214         case BSL_CID_SHA256WITHRSAENCRYPTION:
215         case BSL_CID_SHA384WITHRSAENCRYPTION:
216         case BSL_CID_SHA512WITHRSAENCRYPTION:
217         case BSL_CID_SM3WITHRSAENCRYPTION:
218             return true;
219         default:
220             return false;
221     }
222 }
223 
HITLS_X509_EncodeSignAlgInfo(HITLS_X509_Asn1AlgId * x509Alg,BSL_ASN1_Buffer * asn)224 int32_t HITLS_X509_EncodeSignAlgInfo(HITLS_X509_Asn1AlgId *x509Alg, BSL_ASN1_Buffer *asn)
225 {
226     int32_t ret;
227     BslOidString *oidStr = BSL_OBJ_GetOID(x509Alg->algId);
228     if (oidStr == NULL) {
229         BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_ALG_OID);
230         return HITLS_X509_ERR_ALG_OID;
231     }
232     BSL_ASN1_Buffer asnArr[2] = {0};
233     asnArr[0].buff = (uint8_t *)oidStr->octs;
234     asnArr[0].len = oidStr->octetLen;
235     asnArr[0].tag = BSL_ASN1_TAG_OBJECT_ID;
236     if (x509Alg->algId == BSL_CID_RSASSAPSS) {
237 #ifdef HITLS_CRYPTO_RSA
238         ret = CRYPT_EAL_EncodeRsaPssAlgParam(&(x509Alg->rsaPssParam), &asnArr[1].buff, &asnArr[1].len);
239 #else
240         ret = HITLS_X509_ERR_ALG_UNSUPPORT;
241 #endif
242         if (ret != BSL_SUCCESS) {
243             BSL_ERR_PUSH_ERROR(ret);
244             return ret;
245         }
246         asnArr[1].tag = BSL_ASN1_TAG_SEQUENCE | BSL_ASN1_TAG_CONSTRUCTED;
247     } else if (X509_CheckIsRsa(x509Alg->algId)) {
248         asnArr[1].buff = NULL;
249         asnArr[1].len = 0;
250         asnArr[1].tag = BSL_ASN1_TAG_NULL;
251     } else {
252         /**
253          * RFC5758 sec 3.2
254          * When the ecdsa-with-SHA224, ecdsa-with-SHA256, ecdsa-with-SHA384, or
255          * ecdsa-with-SHA512 algorithm identifier appears in the algorithm field
256          * as an AlgorithmIdentifier, the encoding MUST omit the parameters
257          * field.
258          */
259         asnArr[1].buff = NULL;
260         asnArr[1].len = 0;
261         asnArr[1].tag = BSL_ASN1_TAG_ANY;
262     }
263     BSL_ASN1_TemplateItem algTempl[] = {
264         {BSL_ASN1_TAG_OBJECT_ID, 0, 0},
265         {BSL_ASN1_TAG_ANY, BSL_ASN1_FLAG_OPTIONAL | BSL_ASN1_FLAG_HEADERONLY, 0},
266     };
267     BSL_ASN1_Template templ = {algTempl, sizeof(algTempl) / sizeof(algTempl[0])};
268     // 2: alg + param
269     ret = BSL_ASN1_EncodeTemplate(&templ, asnArr, 2, &(asn->buff), &(asn->len));
270     BSL_SAL_FREE(asnArr[1].buff);
271     if (ret != HITLS_PKI_SUCCESS) {
272         BSL_ERR_PUSH_ERROR(ret);
273         return ret;
274     }
275     asn->tag = BSL_ASN1_TAG_SEQUENCE | BSL_ASN1_TAG_CONSTRUCTED;
276     return HITLS_PKI_SUCCESS;
277 }
278 
X509_EncodeRdName(BSL_ASN1_List * list,BSL_ASN1_Buffer * asnBuf)279 static int32_t X509_EncodeRdName(BSL_ASN1_List *list, BSL_ASN1_Buffer *asnBuf)
280 {
281     uint32_t maxCount = (BSL_LIST_COUNT(list) - 1) * 2; // 2: layer 1 and layer 2
282     BSL_ASN1_Buffer *tmpBuf = BSL_SAL_Calloc(maxCount, sizeof(BSL_ASN1_Buffer));
283     if (tmpBuf == NULL) {
284         BSL_ERR_PUSH_ERROR(BSL_MALLOC_FAIL);
285         return BSL_MALLOC_FAIL;
286     }
287     uint32_t iter = 0;
288     HITLS_X509_NameNode *node = BSL_LIST_GET_NEXT(list);
289     while (node != NULL && node->layer != 1) {
290         tmpBuf[iter++] = node->nameType;
291         tmpBuf[iter++] = node->nameValue;
292         node = BSL_LIST_GET_NEXT(list);
293     }
294 
295     BSL_ASN1_TemplateItem x509RdName[] = {
296         {BSL_ASN1_TAG_CONSTRUCTED | BSL_ASN1_TAG_SEQUENCE, 0, 0},
297             {BSL_ASN1_TAG_OBJECT_ID, 0, 1},
298             {BSL_ASN1_TAG_ANY, 0, 1}
299     };
300     BSL_ASN1_Template templ = {x509RdName, sizeof(x509RdName) / sizeof(x509RdName[0])};
301     int32_t ret = BSL_ASN1_EncodeListItem(BSL_ASN1_TAG_SET, iter / 2, &templ, tmpBuf, iter, asnBuf);
302     BSL_SAL_Free(tmpBuf);
303     return ret;
304 }
305 
HITLS_X509_EncodeNameList(BSL_ASN1_List * list,BSL_ASN1_Buffer * name)306 int32_t HITLS_X509_EncodeNameList(BSL_ASN1_List *list, BSL_ASN1_Buffer *name)
307 {
308     int32_t ret;
309     // (count + 1) / 2 : round up, the maximum number of set
310     uint32_t maxCount = ((uint32_t)BSL_LIST_COUNT(list) + 1) / 2;
311     BSL_ASN1_Buffer *asnBuf = BSL_SAL_Calloc(maxCount, sizeof(BSL_ASN1_Buffer));
312     if (asnBuf == NULL) {
313         BSL_ERR_PUSH_ERROR(BSL_MALLOC_FAIL);
314         return BSL_MALLOC_FAIL;
315     }
316     HITLS_X509_NameNode *node = BSL_LIST_GET_FIRST(list);
317     uint32_t iter = 0;
318     while (node != NULL) {
319         ret = X509_EncodeRdName(list, &asnBuf[iter]);
320         if (ret != HITLS_PKI_SUCCESS) {
321             goto EXIT;
322         }
323         iter++;
324         node = BSL_LIST_Curr(list);
325     }
326 
327     BSL_ASN1_TemplateItem x509Name[] = {
328         {BSL_ASN1_TAG_CONSTRUCTED | BSL_ASN1_TAG_SET, 0, 0}
329     };
330     BSL_ASN1_Template templ = {x509Name, 1};
331     ret = BSL_ASN1_EncodeListItem(BSL_ASN1_TAG_SEQUENCE, iter, &templ, asnBuf, iter, name);
332 EXIT:
333     for (uint32_t index = 0; index < iter; index++) {
334         BSL_SAL_Free(asnBuf[index].buff);
335     }
336     BSL_SAL_Free(asnBuf);
337     return ret;
338 }
339 #endif
340 
341 #ifdef HITLS_BSL_PEM
X509_GetPemSymbol(bool isCert,BSL_PEM_Symbol * symbol)342 static void X509_GetPemSymbol(bool isCert, BSL_PEM_Symbol *symbol)
343 {
344     if (isCert) {
345         symbol->head = BSL_PEM_CERT_BEGIN_STR;
346         symbol->tail = BSL_PEM_CERT_END_STR;
347     } else {
348         symbol->head = BSL_PEM_CRL_BEGIN_STR;
349         symbol->tail = BSL_PEM_CRL_END_STR;
350     }
351 }
352 #endif // HITLS_BSL_PEM
353 
X509_ParseAndAddRes(CRYPT_EAL_LibCtx * libCtx,const char * attrName,BSL_Buffer * asn1Buf,X509_ParseFuncCbk * parseFun,HITLS_X509_List * list)354 static int32_t X509_ParseAndAddRes(CRYPT_EAL_LibCtx *libCtx, const char *attrName, BSL_Buffer *asn1Buf,
355     X509_ParseFuncCbk *parseFun, HITLS_X509_List *list)
356 {
357     void *res = NULL;
358     if (parseFun->x509ProviderNew != NULL) {
359         res = parseFun->x509ProviderNew(libCtx, attrName);
360     } else if (parseFun->x509New != NULL) {
361         res = parseFun->x509New();
362     }
363     if (res == NULL) {
364         BSL_SAL_FREE(asn1Buf->data); // must free asn1Buf.data.
365         BSL_ERR_PUSH_ERROR(BSL_MALLOC_FAIL);
366         return BSL_MALLOC_FAIL;
367     }
368     int32_t ret = parseFun->asn1Parse(asn1Buf->data, asn1Buf->dataLen, res);
369     if (ret != HITLS_PKI_SUCCESS) {
370         parseFun->x509Free(res); // The asn1Buf.data is taken over by res->rawData.
371         BSL_ERR_PUSH_ERROR(ret);
372         return ret;
373     }
374     ret = BSL_LIST_AddElement(list, res, BSL_LIST_POS_AFTER);
375     if (ret != BSL_SUCCESS) {
376         parseFun->x509Free(res);
377         BSL_ERR_PUSH_ERROR(ret);
378         return ret;
379     }
380     return HITLS_PKI_SUCCESS;
381 }
382 
HITLS_X509_ParseAsn1(CRYPT_EAL_LibCtx * libCtx,const char * attrName,const BSL_Buffer * encode,X509_ParseFuncCbk * parseFun,HITLS_X509_List * list)383 static int32_t HITLS_X509_ParseAsn1(CRYPT_EAL_LibCtx *libCtx, const char *attrName, const BSL_Buffer *encode,
384     X509_ParseFuncCbk *parseFun, HITLS_X509_List *list)
385 {
386     uint8_t *data = encode->data;
387     uint32_t dataLen = encode->dataLen;
388     while (dataLen > 0) {
389         uint32_t elemLen = dataLen;
390         int32_t ret = BSL_ASN1_GetCompleteLen(data, &elemLen);
391         if (ret != HITLS_PKI_SUCCESS) {
392             return ret;
393         }
394         BSL_Buffer asn1Buf = {data, elemLen};
395         asn1Buf.data = BSL_SAL_Dump(data, elemLen);
396         if (asn1Buf.data == NULL) {
397             return BSL_DUMP_FAIL;
398         }
399         ret = X509_ParseAndAddRes(libCtx, attrName, &asn1Buf, parseFun, list);
400         if (ret != HITLS_PKI_SUCCESS) {
401             return ret; // asn1Buf.data has beed freed in X509_ParseAndAddRes.
402         }
403         data += elemLen;
404         dataLen -= elemLen;
405     }
406     return HITLS_PKI_SUCCESS;
407 }
408 
409 #ifdef HITLS_BSL_PEM
HITLS_X509_ParsePem(CRYPT_EAL_LibCtx * libCtx,const char * attrName,const BSL_Buffer * encode,bool isCert,X509_ParseFuncCbk * parseFun,HITLS_X509_List * list)410 static int32_t HITLS_X509_ParsePem(CRYPT_EAL_LibCtx *libCtx, const char *attrName, const BSL_Buffer *encode,
411     bool isCert, X509_ParseFuncCbk *parseFun, HITLS_X509_List *list)
412 {
413     char *nextEncode = (char *)(encode->data);
414     uint32_t nextEncodeLen = encode->dataLen;
415     BSL_PEM_Symbol symbol = {0};
416     X509_GetPemSymbol(isCert, &symbol);
417     while (nextEncodeLen > 0) {
418         BSL_Buffer asn1Buf = {0};
419         int32_t ret = BSL_PEM_DecodePemToAsn1(&nextEncode, &nextEncodeLen, &symbol, &(asn1Buf.data),
420             &(asn1Buf.dataLen));
421         if (ret != HITLS_PKI_SUCCESS) {
422             break;
423         }
424         ret = X509_ParseAndAddRes(libCtx, attrName, &asn1Buf, parseFun, list);
425         if (ret != HITLS_PKI_SUCCESS) { // asn1Buf.data has beed freed in X509_ParseAndAddRes.
426             return ret;
427         }
428     }
429     if (BSL_LIST_COUNT(list) == 0) {
430         BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_PARSE_NO_ELEMENT);
431         return HITLS_X509_ERR_PARSE_NO_ELEMENT;
432     }
433     return HITLS_PKI_SUCCESS;
434 }
435 #endif // HITLS_BSL_PEM
436 
HITLS_X509_ParseUnknown(CRYPT_EAL_LibCtx * libCtx,const char * attrName,const BSL_Buffer * encode,bool isCert,X509_ParseFuncCbk * parseFun,HITLS_X509_List * list)437 static int32_t HITLS_X509_ParseUnknown(CRYPT_EAL_LibCtx *libCtx, const char *attrName, const BSL_Buffer *encode,
438     bool isCert, X509_ParseFuncCbk *parseFun, HITLS_X509_List *list)
439 {
440 #ifdef HITLS_BSL_PEM
441     bool isPem = BSL_PEM_IsPemFormat((char *)(encode->data), encode->dataLen);
442     if (isPem) {
443         return HITLS_X509_ParsePem(libCtx, attrName, encode, isCert, parseFun, list);
444     }
445 #else
446     (void)isCert;
447 #endif // HITLS_BSL_PEM
448     return HITLS_X509_ParseAsn1(libCtx, attrName, encode, parseFun, list);
449 }
450 
HITLS_X509_ParseX509(CRYPT_EAL_LibCtx * libCtx,const char * attrName,int32_t format,const BSL_Buffer * encode,bool isCert,X509_ParseFuncCbk * parseFun,HITLS_X509_List * list)451 int32_t HITLS_X509_ParseX509(CRYPT_EAL_LibCtx *libCtx, const char *attrName, int32_t format, const BSL_Buffer *encode,
452     bool isCert, X509_ParseFuncCbk *parseFun, HITLS_X509_List *list)
453 {
454     switch (format) {
455         case BSL_FORMAT_ASN1:
456             return HITLS_X509_ParseAsn1(libCtx, attrName, encode, parseFun, list);
457 #ifdef HITLS_BSL_PEM
458         case BSL_FORMAT_PEM:
459             return HITLS_X509_ParsePem(libCtx, attrName, encode, isCert, parseFun, list);
460 #endif // HITLS_BSL_PEM
461         case BSL_FORMAT_UNKNOWN:
462             return HITLS_X509_ParseUnknown(libCtx, attrName, encode, isCert, parseFun, list);
463         default:
464             BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_FORMAT_UNSUPPORT);
465             return HITLS_X509_ERR_FORMAT_UNSUPPORT;
466     }
467 }
468 
469 #ifdef HITLS_PKI_X509_VFY
X509_NodeNameCompare(BSL_ASN1_Buffer * src,BSL_ASN1_Buffer * dest)470 static int32_t X509_NodeNameCompare(BSL_ASN1_Buffer *src, BSL_ASN1_Buffer *dest)
471 {
472     if (src->tag != dest->tag) {
473         return 1;
474     }
475     if (src->len != dest->len) {
476         return 1;
477     }
478     return memcmp(src->buff, dest->buff, dest->len);
479 }
480 
X509_NodeNameCaseCompare(BSL_ASN1_Buffer * src,BSL_ASN1_Buffer * dest)481 static int32_t X509_NodeNameCaseCompare(BSL_ASN1_Buffer *src, BSL_ASN1_Buffer *dest)
482 {
483     if ((src->tag == BSL_ASN1_TAG_UTF8STRING || src->tag == BSL_ASN1_TAG_PRINTABLESTRING) &&
484         (dest->tag == BSL_ASN1_TAG_UTF8STRING || dest->tag == BSL_ASN1_TAG_PRINTABLESTRING)) {
485         if (src->len != dest->len) {
486             return 1;
487         }
488         for (uint32_t i = 0; i < src->len; i++) {
489             if (src->buff[i] == dest->buff[i]) {
490                 continue;
491             }
492             if ('a' <= src->buff[i] && src->buff[i] <= 'z' && src->buff[i] - dest->buff[i] == 32) {
493                 continue;
494             }
495             if ('a' <= dest->buff[i] && dest->buff[i] <= 'z' && dest->buff[i] - src->buff[i] == 32) {
496                 continue;
497             }
498             return 1;
499         }
500         return 0;
501     }
502     return 1;
503 }
504 
X509_NodeNameValueCompare(BSL_ASN1_Buffer * src,BSL_ASN1_Buffer * dest)505 static int32_t X509_NodeNameValueCompare(BSL_ASN1_Buffer *src, BSL_ASN1_Buffer *dest)
506 {
507     // quick comparison
508     if (X509_NodeNameCompare(src, dest) == 0) {
509         return 0;
510     }
511     return X509_NodeNameCaseCompare(src, dest);
512 }
513 
514 
X509_NodeCompare(BSL_ASN1_Buffer * buffOri,BSL_ASN1_Buffer * buff)515 static int32_t X509_NodeCompare(BSL_ASN1_Buffer *buffOri, BSL_ASN1_Buffer *buff)
516 {
517     if (buffOri->tag != buff->tag) {
518         return 1;
519     }
520     if (buffOri->len != buff->len) {
521         return 1;
522     }
523     return memcmp(buffOri->buff, buff->buff, buff->len);
524 }
525 
HITLS_X509_CmpNameNode(BSL_ASN1_List * nameOri,BSL_ASN1_List * name)526 int32_t HITLS_X509_CmpNameNode(BSL_ASN1_List *nameOri, BSL_ASN1_List *name)
527 {
528     HITLS_X509_NameNode *nodeOri = BSL_LIST_GET_FIRST(nameOri);
529     HITLS_X509_NameNode *node = BSL_LIST_GET_FIRST(name);
530     while (nodeOri != NULL || node != NULL) {
531         if (nodeOri == NULL || node == NULL) {
532             return 1;
533         }
534         if (X509_NodeCompare(&nodeOri->nameType, &node->nameType) != 0) {
535             return 1;
536         }
537         if (nodeOri->layer != node->layer) {
538             return 1;
539         }
540         if (X509_NodeNameValueCompare(&nodeOri->nameValue, &node->nameValue) != 0) {
541             return 1;
542         }
543         nodeOri = (HITLS_X509_NameNode *)BSL_LIST_GET_NEXT(nameOri);
544         node = (HITLS_X509_NameNode *)BSL_LIST_GET_NEXT(name);
545     }
546     return 0;
547 }
548 #endif // HITLS_PKI_X509_VFY
549 
550 #ifdef HITLS_CRYPTO_RSA
551 /**
552  * RFC 4055 section 3.3
553  *
554  * The key is identified by the id-RSASSA-PSS signature algorithm identifier, but the parameters field is
555  * absent.  In this case no parameter validation is needed.
556  * The key is identified by the id-RSASSA-PSS signature algorithm identifier and the parameters are present.
557  * In this case all parameters in the signature structure algorithm identifier MUST match the parameters
558  * in the key structure algorithm identifier except the saltLength field.  The saltLength field in the
559  * signature parameters MUST be greater or equal to that in the key parameters field.
560  */
X509_CheckPssParam(CRYPT_EAL_PkeyCtx * key,int32_t algId,const CRYPT_RSA_PssPara * rsaPssParam)561 static int32_t X509_CheckPssParam(CRYPT_EAL_PkeyCtx *key, int32_t algId, const CRYPT_RSA_PssPara *rsaPssParam)
562 {
563     if (algId != BSL_CID_RSASSAPSS) {
564         BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_MD_NOT_MATCH);
565         return HITLS_X509_ERR_MD_NOT_MATCH;
566     }
567     CRYPT_MD_AlgId mdId;
568     int32_t ret = CRYPT_EAL_PkeyCtrl(key, CRYPT_CTRL_GET_RSA_MD, &mdId, sizeof(int32_t));
569     if (ret != CRYPT_SUCCESS) {
570         BSL_ERR_PUSH_ERROR(ret);
571         return ret;
572     }
573     if (mdId == CRYPT_MD_MAX) {
574         /* If the hash algorithm is unknown, no pss parameter is specified in key. */
575         return HITLS_PKI_SUCCESS;
576     }
577     if (mdId != rsaPssParam->mdId) {
578         BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_MD_NOT_MATCH);
579         return HITLS_X509_ERR_MD_NOT_MATCH;
580     }
581     CRYPT_MD_AlgId mgfId;
582     ret = CRYPT_EAL_PkeyCtrl(key, CRYPT_CTRL_GET_RSA_MGF, &mgfId, sizeof(uint32_t));
583     if (ret != CRYPT_SUCCESS) {
584         BSL_ERR_PUSH_ERROR(ret);
585         return ret;
586     }
587     if (mgfId != rsaPssParam->mgfId) {
588         BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_MGF_NOT_MATCH);
589         return HITLS_X509_ERR_MGF_NOT_MATCH;
590     }
591     int32_t saltLen;
592     ret = CRYPT_EAL_PkeyCtrl(key, CRYPT_CTRL_GET_RSA_SALTLEN, &saltLen, sizeof(int32_t));
593     if (ret != CRYPT_SUCCESS) {
594         BSL_ERR_PUSH_ERROR(ret);
595         return ret;
596     }
597     if (rsaPssParam->saltLen < saltLen) {
598         BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_PSS_SALTLEN);
599         return HITLS_X509_ERR_PSS_SALTLEN;
600     }
601     return HITLS_PKI_SUCCESS;
602 }
603 #endif // HITLS_CRYPTO_RSA
604 
HITLS_X509_CheckAlg(CRYPT_EAL_PkeyCtx * pubkey,const HITLS_X509_Asn1AlgId * subAlg)605 int32_t HITLS_X509_CheckAlg(CRYPT_EAL_PkeyCtx *pubkey, const HITLS_X509_Asn1AlgId *subAlg)
606 {
607     uint32_t pubKeyId = CRYPT_EAL_PkeyGetId(pubkey);
608     if (pubKeyId == CRYPT_PKEY_MAX) {
609         BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_VFY_GET_SIGNID);
610         return HITLS_X509_ERR_VFY_GET_SIGNID;
611     }
612     if (pubKeyId == CRYPT_PKEY_RSA) {
613 #ifdef HITLS_CRYPTO_RSA
614         CRYPT_RsaPadType pad;
615         int32_t ret = CRYPT_EAL_PkeyCtrl(pubkey, CRYPT_CTRL_GET_RSA_PADDING, &pad, sizeof(pad));
616         if (ret != CRYPT_SUCCESS) {
617             BSL_ERR_PUSH_ERROR(ret);
618             return ret;
619         }
620         if (pad == CRYPT_EMSA_PSS) {
621             return X509_CheckPssParam(pubkey, subAlg->algId, &subAlg->rsaPssParam);
622         }
623 #else
624         BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_ALG_UNSUPPORT);
625         return HITLS_X509_ERR_ALG_UNSUPPORT;
626 #endif
627     }
628     BslCid subSignAlg = BSL_OBJ_GetAsymAlgIdFromSignId(subAlg->algId);
629     if (subSignAlg == BSL_CID_UNKNOWN) {
630         BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_VFY_GET_SIGNID);
631         return HITLS_X509_ERR_VFY_GET_SIGNID;
632     }
633     if (pubKeyId != subSignAlg) {
634         BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_VFY_SIGNALG_NOT_MATCH);
635         return HITLS_X509_ERR_VFY_SIGNALG_NOT_MATCH;
636     }
637     return HITLS_PKI_SUCCESS;
638 }
639 
640 #if defined(HITLS_PKI_X509_CRT_GEN) || defined(HITLS_PKI_X509_CRL_GEN) || defined(HITLS_PKI_X509_CSR_GEN)
HITLS_X509_SignAsn1Data(CRYPT_EAL_PkeyCtx * priv,CRYPT_MD_AlgId mdId,BSL_ASN1_Buffer * asn1Buff,BSL_Buffer * rawSignBuff,BSL_ASN1_BitString * sign)641 int32_t HITLS_X509_SignAsn1Data(CRYPT_EAL_PkeyCtx *priv, CRYPT_MD_AlgId mdId,
642     BSL_ASN1_Buffer *asn1Buff, BSL_Buffer *rawSignBuff, BSL_ASN1_BitString *sign)
643 {
644     BSL_ASN1_TemplateItem templItem = {BSL_ASN1_TAG_CONSTRUCTED | BSL_ASN1_TAG_SEQUENCE, 0, 0};
645     BSL_ASN1_Template templ = {&templItem, 1};
646 
647     int32_t ret = BSL_ASN1_EncodeTemplate(&templ, asn1Buff, 1, &rawSignBuff->data, &rawSignBuff->dataLen);
648     if (ret != HITLS_PKI_SUCCESS) {
649         BSL_ERR_PUSH_ERROR(ret);
650         return ret;
651     }
652 
653     sign->len = CRYPT_EAL_PkeyGetSignLen(priv);
654     sign->buff = (uint8_t *)BSL_SAL_Malloc(sign->len);
655     if (sign->buff == NULL) {
656         BSL_SAL_FREE(rawSignBuff->data);
657         rawSignBuff->dataLen = 0;
658         BSL_ERR_PUSH_ERROR(BSL_MALLOC_FAIL);
659         return BSL_MALLOC_FAIL;
660     }
661     ret = CRYPT_EAL_PkeySign(priv, mdId, rawSignBuff->data, rawSignBuff->dataLen, sign->buff, &sign->len);
662     if (ret != CRYPT_SUCCESS) {
663         BSL_ERR_PUSH_ERROR(ret);
664         BSL_SAL_FREE(sign->buff);
665         sign->len = 0;
666         BSL_SAL_FREE(rawSignBuff->data);
667         rawSignBuff->dataLen = 0;
668     }
669 
670     return ret;
671 }
672 #endif
673 
X509_GetHashId(const HITLS_X509_Asn1AlgId * alg)674 static uint32_t X509_GetHashId(const HITLS_X509_Asn1AlgId *alg)
675 {
676     uint32_t hashId = BSL_OBJ_GetHashIdFromSignId(alg->algId);
677     if (hashId != BSL_CID_UNKNOWN) {
678         return hashId;
679     }
680     if (alg->algId == BSL_CID_RSASSAPSS) {
681         return alg->rsaPssParam.mdId;
682     }
683     return BSL_CID_UNKNOWN;
684 }
685 
686 #if defined(HITLS_CRYPTO_RSA) || defined(HITLS_CRYPTO_SM2)
X509_CtrlAlgInfo(const CRYPT_EAL_PkeyCtx * pubKey,uint32_t hashId,const HITLS_X509_Asn1AlgId * alg)687 static int32_t X509_CtrlAlgInfo(const CRYPT_EAL_PkeyCtx *pubKey, uint32_t hashId, const HITLS_X509_Asn1AlgId *alg)
688 {
689 #ifndef HITLS_CRYPTO_RSA
690     (void)hashId;
691 #endif
692     switch (alg->algId) {
693 #ifdef HITLS_CRYPTO_RSA
694         case BSL_CID_MD5WITHRSA:
695         case BSL_CID_SHA1WITHRSA:
696         case BSL_CID_SHA224WITHRSAENCRYPTION:
697         case BSL_CID_SHA256WITHRSAENCRYPTION:
698         case BSL_CID_SHA384WITHRSAENCRYPTION:
699         case BSL_CID_SHA512WITHRSAENCRYPTION:
700         case BSL_CID_SM3WITHRSAENCRYPTION:
701             return CRYPT_EAL_PkeyCtrl((CRYPT_EAL_PkeyCtx *)(uintptr_t)pubKey, CRYPT_CTRL_SET_RSA_EMSA_PKCSV15,
702                 &hashId, sizeof(hashId));
703         case BSL_CID_RSASSAPSS: {
704             BSL_Param param[4] = {
705                 {CRYPT_PARAM_RSA_MD_ID, BSL_PARAM_TYPE_INT32, (void *)(uintptr_t)&alg->rsaPssParam.mdId,
706                     sizeof(alg->rsaPssParam.mdId), 0},
707                 {CRYPT_PARAM_RSA_MGF1_ID, BSL_PARAM_TYPE_INT32, (void *)(uintptr_t)&alg->rsaPssParam.mgfId,
708                     sizeof(alg->rsaPssParam.mgfId), 0},
709                 {CRYPT_PARAM_RSA_SALTLEN, BSL_PARAM_TYPE_INT32, (void *)(uintptr_t)&alg->rsaPssParam.saltLen,
710                     sizeof(alg->rsaPssParam.saltLen), 0},
711                 BSL_PARAM_END
712             };
713             return CRYPT_EAL_PkeyCtrl((CRYPT_EAL_PkeyCtx *)(uintptr_t)pubKey, CRYPT_CTRL_SET_RSA_EMSA_PSS, param, 0);
714         }
715 #endif
716 #ifdef HITLS_CRYPTO_SM2
717         case BSL_CID_SM2DSAWITHSM3:
718             if (alg->sm2UserId.data != NULL) {
719                 return CRYPT_EAL_PkeyCtrl((CRYPT_EAL_PkeyCtx *)(uintptr_t)pubKey, CRYPT_CTRL_SET_SM2_USER_ID,
720                     alg->sm2UserId.data, alg->sm2UserId.dataLen);
721             }
722             return HITLS_PKI_SUCCESS;
723 #endif
724         default:
725             return HITLS_PKI_SUCCESS;
726         }
727 }
728 #endif
729 
HITLS_X509_CheckSignature(const CRYPT_EAL_PkeyCtx * pubKey,uint8_t * rawData,uint32_t rawDataLen,const HITLS_X509_Asn1AlgId * alg,const BSL_ASN1_BitString * signature)730 int32_t HITLS_X509_CheckSignature(const CRYPT_EAL_PkeyCtx *pubKey, uint8_t *rawData, uint32_t rawDataLen,
731     const HITLS_X509_Asn1AlgId *alg, const BSL_ASN1_BitString *signature)
732 {
733     int32_t ret;
734     uint32_t hashId = X509_GetHashId(alg);
735     if (hashId == BSL_CID_UNKNOWN) {
736         BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_VFY_GET_HASHID);
737         return HITLS_X509_ERR_VFY_GET_HASHID;
738     }
739     CRYPT_EAL_PkeyCtx *verifyPubKey = CRYPT_EAL_PkeyDupCtx(pubKey);
740     if (verifyPubKey == NULL) {
741         BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_VFY_DUP_PUBKEY);
742         return HITLS_X509_ERR_VFY_DUP_PUBKEY;
743     }
744 #if defined(HITLS_CRYPTO_RSA) || defined(HITLS_CRYPTO_SM2)
745     ret = X509_CtrlAlgInfo(verifyPubKey, hashId, alg);
746     if (ret != HITLS_PKI_SUCCESS) {
747         CRYPT_EAL_PkeyFreeCtx(verifyPubKey);
748         BSL_ERR_PUSH_ERROR(ret);
749         return ret;
750     }
751 #endif
752     ret = CRYPT_EAL_PkeyVerify(verifyPubKey, hashId, rawData, rawDataLen, signature->buff, signature->len);
753     CRYPT_EAL_PkeyFreeCtx(verifyPubKey);
754     if (ret != CRYPT_SUCCESS) {
755         BSL_ERR_PUSH_ERROR(ret);
756     }
757     return ret;
758 }
759 
760 #ifdef HITLS_PKI_X509_VFY
X509_CheckAuthCertIssuer(BslList * authCertIssue,BSL_ASN1_List * issueName)761 static int32_t X509_CheckAuthCertIssuer(BslList *authCertIssue, BSL_ASN1_List *issueName)
762 {
763     HITLS_X509_GeneralName *name = NULL;
764     for (HITLS_X509_GeneralName *tmp = BSL_LIST_GET_FIRST(authCertIssue); tmp != NULL;
765         tmp = BSL_LIST_GET_NEXT(authCertIssue)) {
766         if (tmp->type == HITLS_X509_GN_DNNAME) {
767             name = tmp;
768             break;
769         }
770     }
771     if (name == NULL) {
772         return HITLS_X509_ERR_VFY_AKI_SKI_NOT_MATCH;
773     }
774     return HITLS_X509_CmpNameNode((BslList *)name->value.data, issueName);
775 }
776 
HITLS_X509_CheckAki(HITLS_X509_Ext * issueExt,HITLS_X509_Ext * subjectExt,BSL_ASN1_List * issueName,BSL_ASN1_Buffer * serialNum)777 int32_t HITLS_X509_CheckAki(HITLS_X509_Ext *issueExt, HITLS_X509_Ext *subjectExt, BSL_ASN1_List *issueName,
778     BSL_ASN1_Buffer *serialNum)
779 {
780     HITLS_X509_ExtAki aki = {0};
781     HITLS_X509_ExtSki ski = {0};
782     int32_t ret = X509_ExtCtrl(issueExt, HITLS_X509_EXT_GET_SKI, (void *)&ski, sizeof(HITLS_X509_ExtSki));
783     if (ret != HITLS_PKI_SUCCESS && ret != HITLS_X509_ERR_EXT_NOT_FOUND) {
784         BSL_ERR_PUSH_ERROR(ret);
785         return ret;
786     }
787     if (ret == HITLS_X509_ERR_EXT_NOT_FOUND) {
788         return HITLS_PKI_SUCCESS;
789     }
790     ret = X509_ExtCtrl(subjectExt, HITLS_X509_EXT_GET_AKI, (void *)&aki, sizeof(HITLS_X509_ExtAki));
791     if (ret != HITLS_PKI_SUCCESS && ret != HITLS_X509_ERR_EXT_NOT_FOUND) {
792         BSL_ERR_PUSH_ERROR(ret);
793         return ret;
794     }
795     if (ret == HITLS_X509_ERR_EXT_NOT_FOUND) {
796         return HITLS_PKI_SUCCESS;
797     }
798     if (ski.kid.dataLen != aki.kid.dataLen || memcmp(ski.kid.data, aki.kid.data, ski.kid.dataLen) != 0) {
799         HITLS_X509_ClearAuthorityKeyId(&aki);
800         BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_VFY_AKI_SKI_NOT_MATCH);
801         return HITLS_X509_ERR_VFY_AKI_SKI_NOT_MATCH;
802     }
803     if (aki.issuerName != NULL) {
804         ret = X509_CheckAuthCertIssuer(aki.issuerName, issueName);
805         HITLS_X509_ClearAuthorityKeyId(&aki);
806         if (ret != HITLS_PKI_SUCCESS) {
807             BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_VFY_AKI_SKI_NOT_MATCH);
808             return HITLS_X509_ERR_VFY_AKI_SKI_NOT_MATCH;
809         }
810     }
811     if (aki.serialNum.dataLen != 0 && aki.serialNum.data != NULL) {
812         if (aki.serialNum.dataLen != serialNum->len ||
813             memcmp(aki.serialNum.data, serialNum->buff, aki.serialNum.dataLen) != 0) {
814             BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_VFY_AKI_SKI_NOT_MATCH);
815             return HITLS_X509_ERR_VFY_AKI_SKI_NOT_MATCH;
816         }
817     }
818 
819     return HITLS_PKI_SUCCESS;
820 }
821 #endif // HITLS_PKI_X509_VFY
822 
823 #if defined(HITLS_PKI_X509_CRT_GEN) || defined(HITLS_PKI_X509_CRL_GEN) || defined(HITLS_PKI_X509_CSR_GEN)
824 #ifdef HITLS_CRYPTO_RSA
X509_SetRsaPssDefaultParam(CRYPT_EAL_PkeyCtx * prvKey,int32_t mdId,HITLS_X509_Asn1AlgId * signAlgId)825 static int32_t X509_SetRsaPssDefaultParam(CRYPT_EAL_PkeyCtx *prvKey, int32_t mdId, HITLS_X509_Asn1AlgId *signAlgId)
826 {
827     int32_t currentHash;
828     int32_t ret = CRYPT_EAL_PkeyCtrl(prvKey, CRYPT_CTRL_GET_RSA_MD, &currentHash, sizeof(int32_t));
829     if (ret != CRYPT_SUCCESS) {
830         BSL_ERR_PUSH_ERROR(ret);
831         return ret;
832     }
833     if (currentHash == BSL_CID_UNKNOWN) {
834         signAlgId->algId = BSL_CID_RSASSAPSS;
835         signAlgId->rsaPssParam.mdId = mdId;
836         signAlgId->rsaPssParam.mgfId = mdId;
837         signAlgId->rsaPssParam.saltLen = 20; // 20: default saltLen
838         BSL_Param param[4] = {
839         {CRYPT_PARAM_RSA_MD_ID, BSL_PARAM_TYPE_INT32, &mdId, sizeof(mdId), 0},
840         {CRYPT_PARAM_RSA_MGF1_ID, BSL_PARAM_TYPE_INT32, &mdId, sizeof(mdId), 0},
841         {CRYPT_PARAM_RSA_SALTLEN, BSL_PARAM_TYPE_INT32, &signAlgId->rsaPssParam.saltLen,
842             sizeof(signAlgId->rsaPssParam.saltLen), 0},
843         BSL_PARAM_END};
844         return CRYPT_EAL_PkeyCtrl(prvKey, CRYPT_CTRL_SET_RSA_EMSA_PSS, param, 0);
845     }
846 
847     if (currentHash != mdId) {
848         BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_MD_NOT_MATCH);
849         return HITLS_X509_ERR_MD_NOT_MATCH;
850     }
851     int32_t currentMgfId;
852     ret = CRYPT_EAL_PkeyCtrl(prvKey, CRYPT_CTRL_GET_RSA_MGF, &currentMgfId, sizeof(int32_t));
853     if (ret != CRYPT_SUCCESS) {
854         BSL_ERR_PUSH_ERROR(ret);
855         return ret;
856     }
857     int32_t saltLen;
858     ret = CRYPT_EAL_PkeyCtrl(prvKey, CRYPT_CTRL_GET_RSA_SALTLEN, &saltLen, sizeof(int32_t));
859     if (ret != CRYPT_SUCCESS) {
860         BSL_ERR_PUSH_ERROR(ret);
861         return ret;
862     }
863     signAlgId->algId = BSL_CID_RSASSAPSS;
864     signAlgId->rsaPssParam.mdId = currentHash;
865     signAlgId->rsaPssParam.mgfId = currentMgfId;
866     signAlgId->rsaPssParam.saltLen = saltLen;
867     return ret;
868 }
869 
X509_SetRsaPssParam(CRYPT_EAL_PkeyCtx * prvKey,int32_t mdId,const HITLS_X509_SignAlgParam * algParam,bool checkKeyParam,HITLS_X509_Asn1AlgId * signAlgId)870 static int32_t X509_SetRsaPssParam(CRYPT_EAL_PkeyCtx *prvKey, int32_t mdId, const HITLS_X509_SignAlgParam *algParam,
871     bool checkKeyParam, HITLS_X509_Asn1AlgId *signAlgId)
872 {
873     if (algParam->rsaPss.mdId != (CRYPT_MD_AlgId)mdId) {
874         BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_MD_NOT_MATCH);
875         return HITLS_X509_ERR_MD_NOT_MATCH;
876     }
877 
878     if (checkKeyParam) {
879         int32_t ret = X509_CheckPssParam(prvKey, algParam->algId, &algParam->rsaPss);
880         if (ret != HITLS_PKI_SUCCESS) {
881             return ret;
882         }
883     }
884 
885     signAlgId->algId = BSL_CID_RSASSAPSS;
886     signAlgId->rsaPssParam = algParam->rsaPss;
887     BSL_Param param[4] = {
888         {CRYPT_PARAM_RSA_MD_ID, BSL_PARAM_TYPE_INT32, (void *)&signAlgId->rsaPssParam.mdId,
889             sizeof(algParam->rsaPss.mdId), 0},
890         {CRYPT_PARAM_RSA_MGF1_ID, BSL_PARAM_TYPE_INT32, (void *)&signAlgId->rsaPssParam.mgfId,
891             sizeof(algParam->rsaPss.mgfId), 0},
892         {CRYPT_PARAM_RSA_SALTLEN, BSL_PARAM_TYPE_INT32, (void *)&signAlgId->rsaPssParam.saltLen,
893             sizeof(algParam->rsaPss.saltLen), 0},
894         BSL_PARAM_END};
895     return CRYPT_EAL_PkeyCtrl(prvKey, CRYPT_CTRL_SET_RSA_EMSA_PSS, param, 0);
896 }
897 
X509_SetRsaPkcsParam(CRYPT_EAL_PkeyCtx * prvKey,int32_t mdId,bool setPadding)898 static int32_t X509_SetRsaPkcsParam(CRYPT_EAL_PkeyCtx *prvKey, int32_t mdId, bool setPadding)
899 {
900     if (setPadding) {
901         CRYPT_RsaPadType pad = CRYPT_EMSA_PKCSV15;
902         int32_t ret = CRYPT_EAL_PkeyCtrl(prvKey, CRYPT_CTRL_SET_RSA_PADDING, &pad, sizeof(CRYPT_RsaPadType));
903         if (ret != CRYPT_SUCCESS) {
904             BSL_ERR_PUSH_ERROR(ret);
905             return ret;
906         }
907     }
908     int32_t pkcs15Param = mdId;
909     return CRYPT_EAL_PkeyCtrl(prvKey, CRYPT_CTRL_SET_RSA_EMSA_PKCSV15, &pkcs15Param, sizeof(int32_t));
910 }
911 
X509_SetRsaSignParam(CRYPT_EAL_PkeyCtx * prvKey,int32_t mdId,const HITLS_X509_SignAlgParam * algParam,HITLS_X509_Asn1AlgId * signAlgId)912 static int32_t X509_SetRsaSignParam(CRYPT_EAL_PkeyCtx *prvKey, int32_t mdId, const HITLS_X509_SignAlgParam *algParam,
913     HITLS_X509_Asn1AlgId *signAlgId)
914 {
915     CRYPT_RsaPadType pad;
916     int32_t ret = CRYPT_EAL_PkeyCtrl(prvKey, CRYPT_CTRL_GET_RSA_PADDING, &pad, sizeof(CRYPT_RsaPadType));
917     if (ret != CRYPT_SUCCESS) {
918         BSL_ERR_PUSH_ERROR(ret);
919         return ret;
920     }
921 
922     switch (pad) {
923         case CRYPT_EMSA_PSS:
924             if (algParam != NULL) {
925                 return X509_SetRsaPssParam(prvKey, mdId, algParam, true, signAlgId);
926             } else {
927                 return X509_SetRsaPssDefaultParam(prvKey, mdId, signAlgId);
928             }
929         case CRYPT_EMSA_PKCSV15:
930             if (algParam != NULL) {
931                 BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_SIGN_PARAM);
932                 return HITLS_X509_ERR_SIGN_PARAM;
933             }
934             ret = X509_SetRsaPkcsParam(prvKey, mdId, false);
935             break;
936         default:
937             if (algParam != NULL) {
938                 return X509_SetRsaPssParam(prvKey, mdId, algParam, false, signAlgId);
939             } else {
940                 ret = X509_SetRsaPkcsParam(prvKey, mdId, true);
941             }
942             break;
943     }
944     if (ret != HITLS_PKI_SUCCESS) {
945         BSL_ERR_PUSH_ERROR(ret);
946         return ret;
947     }
948     signAlgId->algId = BSL_OBJ_GetSignIdFromHashAndAsymId(BSL_CID_RSA, mdId);
949     if (signAlgId->algId == BSL_CID_UNKNOWN) {
950         BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_ENCODE_SIGNID);
951         return HITLS_X509_ERR_ENCODE_SIGNID;
952     }
953     return HITLS_PKI_SUCCESS;
954 }
955 #endif // HITLS_CRYPTO_RSA
956 
957 #ifdef HITLS_CRYPTO_SM2
X509_SetSm2SignParam(CRYPT_EAL_PkeyCtx * prvKey,int32_t mdId,const HITLS_X509_SignAlgParam * algParam,HITLS_X509_Asn1AlgId * signAlgId)958 static int32_t X509_SetSm2SignParam(CRYPT_EAL_PkeyCtx *prvKey, int32_t mdId, const HITLS_X509_SignAlgParam *algParam,
959     HITLS_X509_Asn1AlgId *signAlgId)
960 {
961     int32_t ret;
962     if (mdId != BSL_CID_SM3) {
963         BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_ENCODE_SIGNID);
964         return HITLS_X509_ERR_ENCODE_SIGNID;
965     }
966     signAlgId->algId = BSL_CID_SM2DSAWITHSM3;
967     if (algParam != NULL && algParam->sm2UserId.data != NULL && algParam->sm2UserId.dataLen != 0) {
968         ret = CRYPT_EAL_PkeyCtrl(prvKey, CRYPT_CTRL_SET_SM2_USER_ID, algParam->sm2UserId.data,
969             algParam->sm2UserId.dataLen);
970         if (ret != CRYPT_SUCCESS) {
971             BSL_ERR_PUSH_ERROR(ret);
972             return ret;
973         }
974         signAlgId->sm2UserId.data = BSL_SAL_Dump(algParam->sm2UserId.data, algParam->sm2UserId.dataLen);
975         if (signAlgId->sm2UserId.data == NULL) {
976             BSL_ERR_PUSH_ERROR(BSL_DUMP_FAIL);
977             return BSL_DUMP_FAIL;
978         }
979         signAlgId->sm2UserId.dataLen = algParam->sm2UserId.dataLen;
980     }
981 
982     return HITLS_PKI_SUCCESS;
983 }
984 #endif // HITLS_CRYPTO_SM2
985 
HITLS_X509_Sign(int32_t mdId,const CRYPT_EAL_PkeyCtx * prvKey,const HITLS_X509_SignAlgParam * algParam,void * obj,HITLS_X509_SignCb signCb)986 int32_t HITLS_X509_Sign(int32_t mdId, const CRYPT_EAL_PkeyCtx *prvKey, const HITLS_X509_SignAlgParam *algParam,
987     void *obj, HITLS_X509_SignCb signCb)
988 {
989 #if !defined(HITLS_CRYPTO_RSA) && !defined(HITLS_CRYPTO_SM2)
990     (void)algParam;
991 #endif
992     if (!X509_IsValidHashAlg(mdId)) {
993         BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_HASHID);
994         return HITLS_X509_ERR_HASHID;
995     }
996 
997     CRYPT_PKEY_AlgId keyAlgId = CRYPT_EAL_PkeyGetId(prvKey);
998     if (keyAlgId == CRYPT_PKEY_MAX) {
999         BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_CERT_SIGN_ALG);
1000         return HITLS_X509_ERR_CERT_SIGN_ALG;
1001     }
1002     int32_t ret;
1003     CRYPT_EAL_PkeyCtx *signKey = (CRYPT_EAL_PkeyCtx *)(uintptr_t)prvKey;
1004     HITLS_X509_Asn1AlgId signAlgId = {0};
1005     switch (keyAlgId) {
1006 #ifdef HITLS_CRYPTO_RSA
1007         case CRYPT_PKEY_RSA:
1008             signKey = CRYPT_EAL_PkeyDupCtx(prvKey);
1009             if (signKey == NULL) {
1010                 BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_VFY_DUP_PUBKEY);
1011                 return HITLS_X509_ERR_VFY_DUP_PUBKEY;
1012             }
1013             ret = X509_SetRsaSignParam(signKey, mdId, algParam, &signAlgId);
1014             if (ret != HITLS_PKI_SUCCESS) {
1015                 CRYPT_EAL_PkeyFreeCtx(signKey);
1016                 BSL_ERR_PUSH_ERROR(ret);
1017                 return ret;
1018             }
1019             break;
1020 #endif
1021 #if defined(HITLS_CRYPTO_ECDSA) || defined(HITLS_CRYPTO_ED25519)
1022         case CRYPT_PKEY_ECDSA:
1023         case CRYPT_PKEY_ED25519:
1024             signAlgId.algId = BSL_OBJ_GetSignIdFromHashAndAsymId((BslCid)keyAlgId, (BslCid)mdId);
1025             if (signAlgId.algId == BSL_CID_UNKNOWN) {
1026                 BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_ENCODE_SIGNID);
1027                 return HITLS_X509_ERR_ENCODE_SIGNID;
1028             }
1029             break;
1030 #endif
1031 #ifdef HITLS_CRYPTO_SM2
1032         case CRYPT_PKEY_SM2:
1033             signKey = CRYPT_EAL_PkeyDupCtx(prvKey);
1034             if (signKey == NULL) {
1035                 BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_VFY_DUP_PUBKEY);
1036                 return HITLS_X509_ERR_VFY_DUP_PUBKEY;
1037             }
1038             ret = X509_SetSm2SignParam(signKey, mdId, algParam, &signAlgId);
1039             if (ret != HITLS_PKI_SUCCESS) {
1040                 CRYPT_EAL_PkeyFreeCtx(signKey);
1041                 BSL_ERR_PUSH_ERROR(ret);
1042                 return ret;
1043             }
1044             break;
1045 #endif
1046         default:
1047             BSL_ERR_PUSH_ERROR(HITLS_X509_ERR_CERT_SIGN_ALG);
1048             return HITLS_X509_ERR_CERT_SIGN_ALG;
1049     }
1050 
1051     ret = signCb(mdId, signKey, &signAlgId, obj);
1052 #if defined(HITLS_CRYPTO_RSA) || defined(HITLS_CRYPTO_SM2)
1053     if (keyAlgId == CRYPT_PKEY_RSA || keyAlgId == CRYPT_PKEY_SM2) {
1054         CRYPT_EAL_PkeyFreeCtx(signKey);
1055     }
1056 #endif
1057     return ret;
1058 }
1059 #endif // HITLS_PKI_X509_CRT_GEN || HITLS_PKI_X509_CRL_GEN || HITLS_PKI_X509_CSR_GEN
1060 
1061 #endif // HITLS_PKI_X509
1062