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