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