API参考
载入中...
搜索中...
未找到
hitls_x509_local.h
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#ifndef HITLS_X509_LOCAL_H
17#define HITLS_X509_LOCAL_H
18
19#include "hitls_build.h"
20#ifdef HITLS_PKI_X509
21#include <stdint.h>
22#include "bsl_asn1_internal.h"
23#include "bsl_obj.h"
24#include "crypt_eal_pkey.h"
25#include "sal_atomic.h"
26#include "hitls_pki_types.h"
27
28#ifdef __cplusplus
29extern "C" {
30#endif
31
35#define BSL_TIME_UTC_MAX_YEAR 2049
36
37#define BSL_TIME_BEFORE_SET 0x01
38#define BSL_TIME_AFTER_SET 0x02
39#define BSL_TIME_BEFORE_IS_UTC 0x04
40#define BSL_TIME_AFTER_IS_UTC 0x08
41
42/* Identifies the current ext as a parsed state */
43#define HITLS_X509_EXT_FLAG_PARSE (1 << 0)
44/* Identifies the current ext as a generated state */
45#define HITLS_X509_EXT_FLAG_GEN (1 << 1)
46
47/* Identifies the keyusage extension in the current structure */
48#define HITLS_X509_EXT_FLAG_KUSAGE (1 << 0)
49/* Identifies the basic constraints extension in the current structure */
50#define HITLS_X509_EXT_FLAG_BCONS (1 << 1)
51/* Identifies the extended keyusage extension in the current structure */
52#define HITLS_X509_EXT_FLAG_EXKUSAGE (1 << 2)
53
54#define HITLS_X509_GN_OTHER (HITLS_X509_GN_IP + 1)
55#define HITLS_X509_GN_X400 (HITLS_X509_GN_OTHER + 1)
56#define HITLS_X509_GN_EDI (HITLS_X509_GN_X400 + 1)
57#define HITLS_X509_GN_RID (HITLS_X509_GN_EDI + 1)
58
59typedef struct _HITLS_X509_NameNode {
60 BSL_ASN1_Buffer nameType;
61 BSL_ASN1_Buffer nameValue;
62 /* UTF-8 normalized content, used for certificate chain verification.
63 Allocate memory during the verification process and release it along with the NameNode. */
64 BSL_ASN1_Buffer utf8Value;
65 uint8_t layer;
66} HITLS_X509_NameNode;
67
68typedef struct _HITLS_X509_ExtEntry {
69 BslCid cid;
70 BSL_ASN1_Buffer extnId;
71 bool critical;
72 BSL_ASN1_Buffer extnValue;
73} HITLS_X509_ExtEntry;
74
75typedef struct _HITLS_X509_CertExt {
76 uint32_t extFlags; // Indicates which extensions exist
77 // basic usage ext
78 bool isCa;
79 // -1 no check, 0 no intermediate certificate
80 int32_t maxPathLen;
81 // key usage ext
82 uint32_t keyUsage;
83 // extended key usage ext
84 HITLS_X509_ExtExKeyUsage exKeyUsage;
85} HITLS_X509_CertExt;
86
87typedef enum {
88 HITLS_X509_EXT_TYPE_CERT = 1,
89 HITLS_X509_EXT_TYPE_CRL,
90} HITLS_X509_ExtInnerType;
91
92typedef struct _HITLS_X509_Ext {
93 uint32_t flag; // Identifies the status of the current ext, generate or parse
94 BslList *extList;
95 int32_t type;
96 void *extData;
97} HITLS_X509_Ext;
98
99typedef struct _HITLS_X509_AttrEntry {
100 BslCid cid;
101 BSL_ASN1_Buffer attrId;
102 BSL_ASN1_Buffer attrValue;
103} HITLS_X509_AttrEntry;
104
105typedef int32_t (*HITLS_X509_ParseAttrItemCb)(BslList *attrList, HITLS_X509_AttrEntry *attrEntry);
106
107typedef int32_t (*HITLS_X509_EncodeAttrItemCb)(void *attrNode, HITLS_X509_AttrEntry *attrEntry);
108
109typedef void *(*HITLS_X509_DupAttrItemCb)(const void *item);
110
111typedef void (*HITLS_X509_FreeAttrItemCb)(void *item);
112typedef struct _HITLS_X509_Attrs {
113 uint8_t flag;
114 BslList *list; // The list of HITLS_X509_AttrEntry
115} HITLS_X509_Attrs;
116
117typedef struct _HITLS_X509_ValidTime {
118 uint8_t flag;
119 BSL_TIME start;
120 BSL_TIME end;
121} HITLS_X509_ValidTime;
122
123typedef struct _HITLS_X509_Asn1AlgId {
124 BslCid algId;
125 union {
126 CRYPT_RSA_PssPara rsaPssParam;
127#ifdef HITLS_CRYPTO_SM2
128 BSL_Buffer sm2UserId;
129#endif
130 };
131} HITLS_X509_Asn1AlgId;
132
133typedef int32_t (*HITLS_X509_Asn1Parse)(uint8_t *encode, uint32_t encodeLen, void *out);
134typedef void *(*HITLS_X509_ProviderNew)(CRYPT_EAL_LibCtx *libCtx, const char *attrName);
135typedef void *(*HITLS_X509_New)(void);
136typedef void (*HITLS_X509_Free)(void *elem);
137
138typedef struct {
139 HITLS_X509_Asn1Parse asn1Parse;
140 HITLS_X509_ProviderNew x509ProviderNew;
141 HITLS_X509_New x509New;
142 HITLS_X509_Free x509Free;
143} X509_ParseFuncCbk;
144
145int32_t HITLS_X509_ParseTbsRawData(uint8_t *encode, uint32_t encodeLen, uint8_t **tbsRawData, uint32_t *tbsRawDataLen);
146
147#if defined(HITLS_PKI_X509_CRT_PARSE) || defined(HITLS_PKI_X509_CSR) || defined(HITLS_PKI_X509_CRL_PARSE) ||\
148 defined(HITLS_PKI_INFO_CRT) || defined(HITLS_PKI_INFO_CSR)
149int32_t HITLS_X509_ParseExtendedKeyUsage(HITLS_X509_ExtEntry *extEntry, HITLS_X509_ExtExKeyUsage *exku);
150#endif
151#if defined(HITLS_PKI_X509_CRT_PARSE) || defined(HITLS_PKI_X509_CSR_PARSE) || \
152 defined(HITLS_PKI_INFO_CRT) || defined(HITLS_PKI_INFO_CSR) || defined(HITLS_PKI_INFO_CRL)
153#endif
154
155#if defined(HITLS_PKI_X509_CRT_PARSE) || defined(HITLS_PKI_X509_CRL_PARSE) || defined(HITLS_PKI_X509_CSR_PARSE)
156// The public key parsing is more complex, and the crypto module completes it
157int32_t HITLS_X509_ParseSignAlgInfo(BSL_ASN1_Buffer *algId, BSL_ASN1_Buffer *param, HITLS_X509_Asn1AlgId *x509Alg);
158
159int32_t HITLS_X509_ParseExtItem(BSL_ASN1_Buffer *extItem, HITLS_X509_ExtEntry *extEntry);
160
161int32_t HITLS_X509_ParseTime(BSL_ASN1_Buffer *before, BSL_ASN1_Buffer *after, HITLS_X509_ValidTime *time);
162#endif
163
164#if defined(HITLS_PKI_X509_CSR_GEN) || defined(HITLS_PKI_X509_CRT_GEN) || defined(HITLS_PKI_X509_CRL_GEN) || \
165 defined(HITLS_PKI_X509_VFY_LOCATION) || defined(HITLS_TLS_FEATURE_CERTIFICATE_AUTHORITIES) || \
166 defined(HITLS_PKI_INFO)
167int32_t HITLS_X509_EncodeNameList(BSL_ASN1_List *list, BSL_ASN1_Buffer *name);
168#endif
169
170#if defined(HITLS_PKI_X509_CSR_GEN) || defined(HITLS_PKI_X509_CRT_GEN) || defined(HITLS_PKI_X509_CRL_GEN)
171int32_t HITLS_X509_EncodeSignAlgInfo(HITLS_X509_Asn1AlgId *x509Alg, BSL_ASN1_Buffer *asn);
172
173int32_t HITLS_X509_SetNameList(BslList **dest, void *val, uint32_t valLen);
174
175int32_t HITLS_X509_EncodeExt(uint8_t tag, BSL_ASN1_List *list, BSL_ASN1_Buffer *ext);
176
177int32_t HITLS_X509_SignAsn1Data(CRYPT_EAL_PkeyCtx *priv, CRYPT_MD_AlgId mdId,
178 BSL_ASN1_Buffer *asn1Buff, BSL_Buffer *rawSignBuff, BSL_ASN1_BitString *sign);
179
180typedef int32_t (*EncodeExtCb)(void *, HITLS_X509_ExtEntry *, const void *);
181
182int32_t HITLS_X509_SetExtList(void *param, BslList *extList, BslCid cid, void *val, EncodeExtCb encodeExt);
183
184int32_t HITLS_X509_SetGeneralNames(HITLS_X509_ExtEntry *extEntry, void *val);
185
186int32_t HITLS_X509_EncodeExtEntry(BSL_ASN1_List *list, BSL_ASN1_Buffer *ext);
187
188typedef int32_t (*HITLS_X509_SignCb)(int32_t mdId, CRYPT_EAL_PkeyCtx *prvKey, HITLS_X509_Asn1AlgId *signAlgId,
189 void *obj);
190
191int32_t HITLS_X509_Sign(int32_t mdId, const CRYPT_EAL_PkeyCtx *prvKey, const HITLS_X509_SignAlgParam *algParam,
192 void *obj, HITLS_X509_SignCb signCb);
193#endif
194
195void HITLS_X509_FreeNameNode(HITLS_X509_NameNode *node);
196
197void HITLS_X509_FreeParsedNameNode(HITLS_X509_NameNode *node);
198
199int32_t HITLS_X509_ParseNameList(BSL_ASN1_Buffer *name, BSL_ASN1_List *list);
200
201int32_t HITLS_X509_ParseGeneralNames(uint8_t *encode, uint32_t encLen, BslList *list);
202
203void HITLS_X509_ClearGeneralNames(BslList *names);
204
205int32_t HITLS_X509_ParseAuthorityKeyId(HITLS_X509_ExtEntry *extEntry, HITLS_X509_ExtAki *aki);
206
207int32_t HITLS_X509_ParseSubjectKeyId(HITLS_X509_ExtEntry *extEntry, HITLS_X509_ExtSki *ski);
208
209int32_t HITLS_X509_ParseSubjectAltName(HITLS_X509_ExtEntry *extEntry, HITLS_X509_ExtSan *san);
210
211void HITLS_X509_ClearSubjectAltName(HITLS_X509_ExtSan *san);
212
213void HITLS_X509_ClearExtendedKeyUsage(HITLS_X509_ExtExKeyUsage *exku);
214
215HITLS_X509_Ext *X509_ExtNew(HITLS_X509_Ext *ext, int32_t type);
216
217void X509_ExtFree(HITLS_X509_Ext *ext, bool isFreeOut);
218
219#if defined(HITLS_PKI_X509_CRT_PARSE) || defined(HITLS_PKI_X509_CRL_PARSE) || defined(HITLS_PKI_X509_CSR)
220int32_t HITLS_X509_ParseExt(BSL_ASN1_Buffer *ext, HITLS_X509_Ext *certExt);
221#endif
222
223void HITLS_X509_ExtEntryFree(HITLS_X509_ExtEntry *entry);
224
225int32_t HITLS_X509_AddListItemDefault(void *item, uint32_t len, BSL_ASN1_List *list);
226
227
228int32_t HITLS_X509_ParseX509(CRYPT_EAL_LibCtx *libCtx, const char *attrName, int32_t format, const BSL_Buffer *encode,
229 bool isCert, X509_ParseFuncCbk *parseFun, HITLS_X509_List *list);
230
231int32_t HITLS_X509_CheckAlg(CRYPT_EAL_PkeyCtx *pubkey, const HITLS_X509_Asn1AlgId *subAlg);
232
233#if defined(HITLS_PKI_X509_CSR_PARSE) || defined(HITLS_PKI_PKCS12_PARSE) || defined(HITLS_PKI_CMS_SIGNEDDATA)
234int32_t HITLS_X509_ParseAttrList(BSL_ASN1_Buffer *attrBuff, HITLS_X509_Attrs *attrs, HITLS_X509_ParseAttrItemCb parseCb,
235 HITLS_X509_FreeAttrItemCb freeItem);
236#endif
237
238#ifdef HITLS_PKI_PKCS12_GEN
239HITLS_X509_Attrs *HITLS_X509_AttrsDup(const HITLS_X509_Attrs *src, HITLS_X509_DupAttrItemCb dupCb,
240 HITLS_X509_FreeAttrItemCb freeCb);
241#endif
242
243void HITLS_X509_AttrEntryFree(HITLS_X509_AttrEntry *attr);
244
245HITLS_X509_Attrs *HITLS_X509_AttrsNew(void);
246
247void HITLS_X509_AttrsFree(HITLS_X509_Attrs *attrs, HITLS_X509_FreeAttrItemCb freeItem);
248
249#if (defined(HITLS_PKI_X509_CSR_GEN) && defined(HITLS_PKI_X509_CSR_ATTR)) || defined(HITLS_PKI_PKCS12_GEN) || \
250 defined(HITLS_PKI_CMS_SIGNEDDATA)
251int32_t HITLS_X509_EncodeAttrList(uint8_t tag, HITLS_X509_Attrs *attrs, HITLS_X509_EncodeAttrItemCb encodeCb,
252 BSL_ASN1_Buffer *attrAsn1);
253#endif
254
255int32_t HITLS_X509_CheckSignature(const CRYPT_EAL_PkeyCtx *pubKey, uint8_t *rawData, uint32_t rawDataLen,
256 const HITLS_X509_Asn1AlgId *alg, const BSL_ASN1_BitString *signature);
257
258#ifdef HITLS_CRYPTO_SM2
259int32_t HITLS_X509_SetSm2UserId(BSL_Buffer *sm2UserId, void *val, uint32_t valLen);
260#endif
261
262int32_t HITLS_X509_GetList(BslList *list, void *val, uint32_t valLen);
263
264#if defined(HITLS_PKI_X509_CRT_GEN) || defined(HITLS_PKI_X509_CRL_GEN) || defined(HITLS_PKI_X509_CSR_GEN) || \
265 defined(HITLS_PKI_X509_CRT_AUTH)
266int32_t HITLS_X509_GetEncodeDn(BslList *list, void *val, uint32_t valLen);
267#endif
268
269int32_t HITLS_X509_GetPubKey(void *ealPubKey, void **val);
270
271int32_t HITLS_X509_GetSignAlg(BslCid signAlgId, int32_t *val, uint32_t valLen);
272
273int32_t HITLS_X509_GetSignMdAlg(const HITLS_X509_Asn1AlgId *signAlgId, int32_t *val, uint32_t valLen);
274
275int32_t HITLS_X509_GetEncodeLen(uint32_t encodeLen, uint32_t *val, uint32_t valLen);
276
277int32_t HITLS_X509_GetEncodeData(uint8_t *rawData, uint8_t **val);
278
279int32_t HITLS_X509_SetPkey(void **pkey, void *val);
280
281#ifdef HITLS_PKI_X509_CRT_GEN
282int32_t HITLS_X509_ExtReplace(HITLS_X509_Ext *dest, HITLS_X509_Ext *src);
283#endif
284
285#if defined(HITLS_PKI_X509_CRT) || defined(HITLS_PKI_X509_CRL)
286
287#if defined(HITLS_PKI_X509_CRT_GEN) || defined(HITLS_PKI_X509_CRL_GEN)
288int32_t HITLS_X509_SetSerial(BSL_ASN1_Buffer *serial, const void *val, uint32_t valLen);
289
290HITLS_X509_ExtEntry *X509_DupExtEntry(const HITLS_X509_ExtEntry *src);
291#endif
292
293int32_t HITLS_X509_GetSerial(BSL_ASN1_Buffer *serial, void *val, uint32_t valLen);
294#endif
295
296typedef int32_t (*DecodeExtCb)(HITLS_X509_ExtEntry *, void *);
297
298int32_t HITLS_X509_GetExt(BslList *ext, BslCid cid, BSL_Buffer *val, uint32_t expectLen, DecodeExtCb decodeExt);
299
300#ifdef HITLS_PKI_X509_VFY
301int32_t HITLS_X509_CheckAki(HITLS_X509_Ext *issueExt, HITLS_X509_Ext *subjectExt, BSL_ASN1_List *issueName,
302 BSL_ASN1_Buffer *serialNum);
303
304int32_t HITLS_X509_CmpNameNode(BSL_ASN1_List *nameOri, BSL_ASN1_List *name);
305#endif
306
307bool X509_CheckCmdValid(int32_t *cmdSet, uint32_t cmdSize, int32_t cmd);
308
309int32_t X509_ExtCtrl(HITLS_X509_Ext *ext, int32_t cmd, void *val, uint32_t valLen);
310
311#if defined(HITLS_PKI_INFO_DN_HASH) || defined(HITLS_PKI_X509_VFY_LOCATION)
312int32_t HITLS_X509_EncodeCanonNameList(BSL_ASN1_List *list, BSL_ASN1_Buffer *name);
313#endif
314
315int32_t HITLS_X509_GetDistinguishNameStrFromList(BSL_ASN1_List *nameList, BSL_Buffer *buff);
316
317int32_t HITLS_X509_MatchPattern(uint32_t flags, const char *pattern, const char *hostname);
318
319int32_t X509_GetHashId(const HITLS_X509_Asn1AlgId *alg, int32_t *hashId);
320
321int32_t HITLS_X509_CtrlAlgInfo(CRYPT_EAL_PkeyCtx *pubKey, int32_t hashId, const HITLS_X509_Asn1AlgId *alg);
322
323int32_t HITLS_X509_EncodeObjIdentity(BslCid cid, BSL_ASN1_Buffer *asnBuff);
324
325#ifdef __cplusplus
326}
327#endif
328
329#endif // HITLS_PKI_X509
330
331#endif // HITLS_X509_LOCAL_H
BslCid
定义 bsl_obj.h:36
CRYPT_MD_AlgId
定义 crypt_algid.h:68
struct EAL_PkeyCtx CRYPT_EAL_PkeyCtx
定义 crypt_eal_pkey.h:108
定义 bsl_types.h:40
定义 bsl_list.h:49
定义 hitls_pki_types.h:164
定义 hitls_pki_types.h:190
定义 hitls_pki_types.h:198
定义 hitls_pki_types.h:174
Signature algorithm parameters.
定义 hitls_pki_types.h:215