1 /*
2 * Copyright (c) 2023 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_GET_TYPE_CERT_ITEM,
72 CF_GET_TYPE_EXT_ITEM,
73 CF_GET_TYPE_EXT_OIDS,
74 CF_GET_TYPE_EXT_ENTRY,
75 } CfGetType;
76
77 typedef enum {
78 CF_CHECK_TYPE_EXT_CA,
79 CF_CHECK_TYPE_EXT_HAS_UN_SUPPORT,
80 } CfCheckType;
81
82 typedef enum {
83 CF_TAG_TYPE_INVALID = 0 << 28,
84 CF_TAG_TYPE_INT = 1 << 28,
85 CF_TAG_TYPE_UINT = 2 << 28,
86 CF_TAG_TYPE_ULONG = 3 << 28,
87 CF_TAG_TYPE_BOOL = 4 << 28,
88 CF_TAG_TYPE_BYTES = 5 << 28,
89 } CfTagType;
90
91 typedef enum {
92 CF_TAG_INVALID = CF_TAG_TYPE_INVALID | 0,
93
94 CF_TAG_RESULT_TYPE = CF_TAG_TYPE_INT | 1, /* choose from CfTagType */
95 CF_TAG_RESULT_INT = CF_TAG_TYPE_INT | 2,
96 CF_TAG_RESULT_UINT = CF_TAG_TYPE_UINT | 3,
97 CF_TAG_RESULT_ULONG = CF_TAG_TYPE_ULONG | 4,
98 CF_TAG_RESULT_BOOL = CF_TAG_TYPE_BOOL | 5,
99 CF_TAG_RESULT_BYTES = CF_TAG_TYPE_BYTES | 6,
100
101 CF_TAG_GET_TYPE = CF_TAG_TYPE_INT | 1001, /* choose from CfGetType */
102 CF_TAG_CHECK_TYPE = CF_TAG_TYPE_INT | 1002, /* choose from CfCheckType */
103
104 CF_TAG_PARAM0_BUFFER = CF_TAG_TYPE_BYTES | 30001,
105 CF_TAG_PARAM1_BUFFER = CF_TAG_TYPE_BYTES | 30002,
106 CF_TAG_PARAM2_BUFFER = CF_TAG_TYPE_BYTES | 30003,
107 CF_TAG_PARAM3_BUFFER = CF_TAG_TYPE_BYTES | 30004,
108 CF_TAG_PARAM4_BUFFER = CF_TAG_TYPE_BYTES | 30005,
109 CF_TAG_PARAM0_INT32 = CF_TAG_TYPE_INT | 30006,
110 CF_TAG_PARAM1_INT32 = CF_TAG_TYPE_INT | 30007,
111 CF_TAG_PARAM2_INT32 = CF_TAG_TYPE_INT | 30008,
112 CF_TAG_PARAM3_INT32 = CF_TAG_TYPE_INT | 30009,
113 CF_TAG_PARAM4_INT32 = CF_TAG_TYPE_INT | 30010,
114 } CfTag;
115
116 typedef struct {
117 uint32_t tag;
118 union {
119 bool boolParam;
120 int32_t int32Param;
121 uint32_t uint32Param;
122 uint64_t uint64Param;
123 CfBlob blob;
124 };
125 } CfParam;
126
127 typedef struct {
128 uint32_t paramSetSize;
129 uint32_t paramsCnt;
130 CfParam params[];
131 } CfParamSet;
132
CfIsAdditionOverflow(uint32_t a,uint32_t b)133 static inline bool CfIsAdditionOverflow(uint32_t a, uint32_t b)
134 {
135 return (UINT32_MAX - a) < b;
136 }
137
138 #define MAX_COUNT_OID 100
139 #define MAX_LEN_OID 128
140 #define MAX_COUNT_NID 1195
141
142 #define MAX_LEN_CERTIFICATE 65536
143 #define MAX_LEN_EXTENSIONS 65536
144
145 #define BASIC_CONSTRAINTS_NO_CA (-1)
146 #define BASIC_CONSTRAINTS_PATHLEN_NO_LIMIT (-2)
147 #endif /* CF_TYPE_H */
148