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, ¤tHash, 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, ¤tMgfId, 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