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