1 /*
2 * Copyright (c) 2023-2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #ifndef CF_TYPE_H
17 #define CF_TYPE_H
18
19 #include <stdbool.h>
20 #include <stdint.h>
21 #include <stdlib.h>
22
23 #include "cf_blob.h"
24
25 #define CF_API_EXPORT __attribute__ ((visibility("default")))
26
27 typedef enum {
28 CF_OBJ_TYPE_CERT,
29 CF_OBJ_TYPE_EXTENSION,
30 CF_OBJ_TYPE_CRL,
31 CF_OBJ_TYPE_LIST,
32 } CfObjectType;
33
34 typedef struct {
35 unsigned long type;
36 } CfBase;
37
38 typedef enum {
39 CF_ITEM_TBS = 0, /* TBS Certificate */
40 CF_ITEM_PUBLIC_KEY, /* Subject Public Key */
41 CF_ITEM_ISSUER_UNIQUE_ID, /* Issuer Unique Identifier */
42 CF_ITEM_SUBJECT_UNIQUE_ID, /* Subject Unique Identifier */
43 CF_ITEM_EXTENSIONS, /* Extensions */
44
45 CF_ITEM_ENCODED,
46 CF_ITEM_VERSION,
47 CF_ITEM_SERIAL_NUMBER,
48 CF_ITEM_ISSUE_NAME,
49 CF_ITEM_SUBJECT_NAME,
50 CF_ITEM_NOT_BEFORE,
51 CF_ITEM_NOT_AFTER,
52 CF_ITEM_SIGNATURE,
53 CF_ITEM_SIGNATURE_ALG_NAME,
54
55 CF_ITEM_INVALID,
56 } CfItemId;
57
58 typedef enum {
59 CF_EXT_TYPE_ALL_OIDS,
60 CF_EXT_TYPE_CRITICAL_OIDS,
61 CF_EXT_TYPE_UNCRITICAL_OIDS,
62 } CfExtensionOidType;
63
64 typedef enum {
65 CF_EXT_ENTRY_TYPE_ENTRY,
66 CF_EXT_ENTRY_TYPE_ENTRY_CRITICAL,
67 CF_EXT_ENTRY_TYPE_ENTRY_VALUE,
68 } CfExtensionEntryType;
69
70 typedef enum {
71 CF_GENERAL_NAME_TYPE_OTHER_NAME,
72 CF_GENERAL_NAME_TYPE_RFC822_NAME,
73 CF_GENERAL_NAME_TYPE_DNS_NAME,
74 CF_GENERAL_NAME_TYPE_X400_ADDRESS,
75 CF_GENERAL_NAME_TYPE_DIRECTORY_NAME,
76 CF_GENERAL_NAME_TYPE_EDI_PARTY_NAME,
77 CF_GENERAL_NAME_TYPE_UNIFORM_RESOURCE_ID,
78 CF_GENERAL_NAME_TYPE_IP_ADDRESS,
79 CF_GENERAL_NAME_TYPE_REGISTERED_ID
80 } CfGeneralNameType;
81
82 typedef enum {
83 CF_REVOCATION_CHECK_OPTION_PREFER_OCSP,
84 CF_REVOCATION_CHECK_OPTION_ACCESS_NETWORK,
85 CF_REVOCATION_CHECK_OPTION_FALLBACK_NO_PREFER,
86 CF_REVOCATION_CHECK_OPTION_FALLBACK_LOCAL,
87 } CfRevocationCheckOptionsType;
88
89 typedef enum {
90 CF_VALIDATION_POLICY_TYPE_X509,
91 CF_VALIDATION_POLICY_TYPE_SSL,
92 } CfValidationPolicyType;
93
94 typedef enum {
95 CF_KEYUSAGE_DIGITAL_SIGNATURE,
96 CF_KEYUSAGE_NON_REPUDIATION,
97 CF_KEYUSAGE_KEY_ENCIPHERMENT,
98 CF_KEYUSAGE_DATA_ENCIPHERMENT,
99 CF_KEYUSAGE_KEY_AGREEMENT,
100 CF_KEYUSAGE_KEY_CERT_SIGN,
101 CF_KEYUSAGE_CRL_SIGN,
102 CF_KEYUSAGE_ENCIPHER_ONLY,
103 CF_KEYUSAGE_DECIPHER_ONLY,
104 } CfValidationKeyUsageType;
105
106 typedef enum {
107 CF_GET_TYPE_CERT_ITEM,
108 CF_GET_TYPE_EXT_ITEM,
109 CF_GET_TYPE_EXT_OIDS,
110 CF_GET_TYPE_EXT_ENTRY,
111 } CfGetType;
112
113 typedef enum {
114 CF_CHECK_TYPE_EXT_CA,
115 CF_CHECK_TYPE_EXT_HAS_UN_SUPPORT,
116 } CfCheckType;
117
118 typedef enum {
119 CF_TAG_TYPE_INVALID = 0 << 28,
120 CF_TAG_TYPE_INT = 1 << 28,
121 CF_TAG_TYPE_UINT = 2 << 28,
122 CF_TAG_TYPE_ULONG = 3 << 28,
123 CF_TAG_TYPE_BOOL = 4 << 28,
124 CF_TAG_TYPE_BYTES = 5 << 28,
125 } CfTagType;
126
127 typedef enum {
128 CF_TAG_INVALID = CF_TAG_TYPE_INVALID | 0,
129
130 CF_TAG_RESULT_TYPE = CF_TAG_TYPE_INT | 1, /* choose from CfTagType */
131 CF_TAG_RESULT_INT = CF_TAG_TYPE_INT | 2,
132 CF_TAG_RESULT_UINT = CF_TAG_TYPE_UINT | 3,
133 CF_TAG_RESULT_ULONG = CF_TAG_TYPE_ULONG | 4,
134 CF_TAG_RESULT_BOOL = CF_TAG_TYPE_BOOL | 5,
135 CF_TAG_RESULT_BYTES = CF_TAG_TYPE_BYTES | 6,
136
137 CF_TAG_GET_TYPE = CF_TAG_TYPE_INT | 1001, /* choose from CfGetType */
138 CF_TAG_CHECK_TYPE = CF_TAG_TYPE_INT | 1002, /* choose from CfCheckType */
139
140 CF_TAG_PARAM0_BUFFER = CF_TAG_TYPE_BYTES | 30001,
141 CF_TAG_PARAM1_BUFFER = CF_TAG_TYPE_BYTES | 30002,
142 CF_TAG_PARAM2_BUFFER = CF_TAG_TYPE_BYTES | 30003,
143 CF_TAG_PARAM3_BUFFER = CF_TAG_TYPE_BYTES | 30004,
144 CF_TAG_PARAM4_BUFFER = CF_TAG_TYPE_BYTES | 30005,
145 CF_TAG_PARAM0_INT32 = CF_TAG_TYPE_INT | 30006,
146 CF_TAG_PARAM1_INT32 = CF_TAG_TYPE_INT | 30007,
147 CF_TAG_PARAM2_INT32 = CF_TAG_TYPE_INT | 30008,
148 CF_TAG_PARAM3_INT32 = CF_TAG_TYPE_INT | 30009,
149 CF_TAG_PARAM4_INT32 = CF_TAG_TYPE_INT | 30010,
150 } CfTag;
151
152 typedef enum {
153 CF_ENCODING_UTF8 = 0,
154 } CfEncodinigType;
155
156 typedef struct {
157 uint32_t tag;
158 union {
159 bool boolParam;
160 int32_t int32Param;
161 uint32_t uint32Param;
162 uint64_t uint64Param;
163 CfBlob blob;
164 };
165 } CfParam;
166
167 typedef struct {
168 uint32_t paramSetSize;
169 uint32_t paramsCnt;
170 CfParam params[];
171 } CfParamSet;
172
CfIsAdditionOverflow(uint32_t a,uint32_t b)173 static inline bool CfIsAdditionOverflow(uint32_t a, uint32_t b)
174 {
175 return (UINT32_MAX - a) < b;
176 }
177
178 #define MAX_COUNT_OID 100
179 #define MAX_LEN_OID 128
180 #define MAX_COUNT_NID 1195
181
182 #define MAX_LEN_CERTIFICATE 65536
183 #define MAX_LEN_EXTENSIONS 65536
184
185 #define BASIC_CONSTRAINTS_NO_CA (-1)
186 #define BASIC_CONSTRAINTS_PATHLEN_NO_LIMIT (-2)
187 #endif /* CF_TYPE_H */
188