asn1.h (13125B)
1 /* asn1.h 2 * 3 * Copyright (C) 2006-2025 wolfSSL Inc. 4 * 5 * This file is part of wolfSSL. 6 * 7 * wolfSSL is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 3 of the License, or 10 * (at your option) any later version. 11 * 12 * wolfSSL is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA 20 */ 21 22 /* asn1.h for openssl */ 23 24 #ifndef WOLFSSL_ASN1_H_ 25 #define WOLFSSL_ASN1_H_ 26 27 #include <wolfssl/openssl/ssl.h> 28 29 #ifndef OPENSSL_COEXIST 30 31 #define ASN1_STRING_new wolfSSL_ASN1_STRING_new 32 #define ASN1_STRING_type_new wolfSSL_ASN1_STRING_type_new 33 #define ASN1_STRING_type wolfSSL_ASN1_STRING_type 34 #define ASN1_STRING_set wolfSSL_ASN1_STRING_set 35 #define ASN1_OCTET_STRING_set wolfSSL_ASN1_STRING_set 36 #define ASN1_STRING_free wolfSSL_ASN1_STRING_free 37 38 #define ASN1_get_object wolfSSL_ASN1_get_object 39 #define d2i_ASN1_OBJECT wolfSSL_d2i_ASN1_OBJECT 40 #define c2i_ASN1_OBJECT wolfSSL_c2i_ASN1_OBJECT 41 42 #define V_ASN1_BIT_STRING WOLFSSL_V_ASN1_BIT_STRING 43 #define V_ASN1_INTEGER WOLFSSL_V_ASN1_INTEGER 44 #define V_ASN1_NEG WOLFSSL_V_ASN1_NEG 45 #define V_ASN1_NEG_INTEGER WOLFSSL_V_ASN1_NEG_INTEGER 46 #define V_ASN1_NEG_ENUMERATED WOLFSSL_V_ASN1_NEG_ENUMERATED 47 48 /* Type for ASN1_print_ex */ 49 #define ASN1_STRFLGS_ESC_2253 WOLFSSL_ASN1_STRFLGS_ESC_2253 50 #define ASN1_STRFLGS_ESC_CTRL WOLFSSL_ASN1_STRFLGS_ESC_CTRL 51 #define ASN1_STRFLGS_ESC_MSB WOLFSSL_ASN1_STRFLGS_ESC_MSB 52 #define ASN1_STRFLGS_ESC_QUOTE WOLFSSL_ASN1_STRFLGS_ESC_QUOTE 53 #define ASN1_STRFLGS_UTF8_CONVERT WOLFSSL_ASN1_STRFLGS_UTF8_CONVERT 54 #define ASN1_STRFLGS_IGNORE_TYPE WOLFSSL_ASN1_STRFLGS_IGNORE_TYPE 55 #define ASN1_STRFLGS_SHOW_TYPE WOLFSSL_ASN1_STRFLGS_SHOW_TYPE 56 #define ASN1_STRFLGS_DUMP_ALL WOLFSSL_ASN1_STRFLGS_DUMP_ALL 57 #define ASN1_STRFLGS_DUMP_UNKNOWN WOLFSSL_ASN1_STRFLGS_DUMP_UNKNOWN 58 #define ASN1_STRFLGS_DUMP_DER WOLFSSL_ASN1_STRFLGS_DUMP_DER 59 #define ASN1_STRFLGS_RFC2253 WOLFSSL_ASN1_STRFLGS_RFC2253 60 61 #define MBSTRING_UTF8 WOLFSSL_MBSTRING_UTF8 62 #define MBSTRING_ASC WOLFSSL_MBSTRING_ASC 63 #define MBSTRING_BMP WOLFSSL_MBSTRING_BMP 64 #define MBSTRING_UNIV WOLFSSL_MBSTRING_UNIV 65 66 #define ASN1_UTCTIME_print wolfSSL_ASN1_UTCTIME_print 67 #define ASN1_TIME_check wolfSSL_ASN1_TIME_check 68 #define ASN1_TIME_diff wolfSSL_ASN1_TIME_diff 69 #define ASN1_TIME_compare wolfSSL_ASN1_TIME_compare 70 #define ASN1_TIME_set wolfSSL_ASN1_TIME_set 71 72 #define V_ASN1_EOC WOLFSSL_V_ASN1_EOC 73 #define V_ASN1_BOOLEAN WOLFSSL_V_ASN1_BOOLEAN 74 #define V_ASN1_OCTET_STRING WOLFSSL_V_ASN1_OCTET_STRING 75 #define V_ASN1_NULL WOLFSSL_V_ASN1_NULL 76 #define V_ASN1_OBJECT WOLFSSL_V_ASN1_OBJECT 77 #define V_ASN1_UTF8STRING WOLFSSL_V_ASN1_UTF8STRING 78 #define V_ASN1_SEQUENCE WOLFSSL_V_ASN1_SEQUENCE 79 #define V_ASN1_SET WOLFSSL_V_ASN1_SET 80 #define V_ASN1_PRINTABLESTRING WOLFSSL_V_ASN1_PRINTABLESTRING 81 #define V_ASN1_T61STRING WOLFSSL_V_ASN1_T61STRING 82 #define V_ASN1_IA5STRING WOLFSSL_V_ASN1_IA5STRING 83 #define V_ASN1_UTCTIME WOLFSSL_V_ASN1_UTCTIME 84 #define V_ASN1_GENERALIZEDTIME WOLFSSL_V_ASN1_GENERALIZEDTIME 85 #define V_ASN1_UNIVERSALSTRING WOLFSSL_V_ASN1_UNIVERSALSTRING 86 #define V_ASN1_BMPSTRING WOLFSSL_V_ASN1_BMPSTRING 87 88 #define V_ASN1_CONSTRUCTED WOLFSSL_V_ASN1_CONSTRUCTED 89 90 #define ASN1_STRING_FLAG_BITS_LEFT WOLFSSL_ASN1_STRING_FLAG_BITS_LEFT 91 #define ASN1_STRING_FLAG_NDEF WOLFSSL_ASN1_STRING_FLAG_NDEF 92 #define ASN1_STRING_FLAG_CONT WOLFSSL_ASN1_STRING_FLAG_CONT 93 #define ASN1_STRING_FLAG_MSTRING WOLFSSL_ASN1_STRING_FLAG_MSTRING 94 #define ASN1_STRING_FLAG_EMBED WOLFSSL_ASN1_STRING_FLAG_EMBED 95 96 /* X.509 PKI size limits from RFC2459 (appendix A) */ 97 /* internally our limit is CTC_NAME_SIZE (64) - overridden with WC_CTC_NAME_SIZE */ 98 #define ub_name WOLFSSL_ub_name 99 #define ub_common_name WOLFSSL_ub_common_name 100 #define ub_locality_name WOLFSSL_ub_locality_name 101 #define ub_state_name WOLFSSL_ub_state_name 102 #define ub_organization_name WOLFSSL_ub_organization_name 103 #define ub_organization_unit_name WOLFSSL_ub_organization_unit_name 104 #define ub_title WOLFSSL_ub_title 105 #define ub_email_address WOLFSSL_ub_email_address 106 107 #endif /* !OPENSSL_COEXIST */ 108 109 WOLFSSL_API WOLFSSL_ASN1_INTEGER *wolfSSL_BN_to_ASN1_INTEGER( 110 const WOLFSSL_BIGNUM *bn, WOLFSSL_ASN1_INTEGER *ai); 111 112 WOLFSSL_API void wolfSSL_ASN1_TYPE_set(WOLFSSL_ASN1_TYPE *a, int type, void *value); 113 WOLFSSL_API int wolfSSL_ASN1_TYPE_get(const WOLFSSL_ASN1_TYPE *a); 114 115 WOLFSSL_API int wolfSSL_ASN1_get_object(const unsigned char **in, long *len, int *tag, 116 int *cls, long inLen); 117 118 WOLFSSL_API WOLFSSL_ASN1_OBJECT *wolfSSL_c2i_ASN1_OBJECT(WOLFSSL_ASN1_OBJECT **a, 119 const unsigned char **pp, long len); 120 121 #ifdef OPENSSL_ALL 122 /* IMPLEMENT_ASN1_FUNCTIONS is strictly for external use only. Internally 123 * we don't use this. Some projects use OpenSSL to implement ASN1 types and 124 * this section is only to provide those projects with ASN1 functionality. */ 125 126 typedef void* (*WolfsslAsn1NewCb)(void); 127 typedef void (*WolfsslAsn1FreeCb)(void*); 128 typedef int (*WolfsslAsn1i2dCb)(const void*, unsigned char**); 129 typedef void* (*WolfsslAsn1d2iCb)(void**, const byte **, long); 130 131 struct WOLFSSL_ASN1_TEMPLATE { 132 /* Type functions */ 133 WolfsslAsn1NewCb new_func; 134 WolfsslAsn1FreeCb free_func; 135 WolfsslAsn1i2dCb i2d_func; 136 WolfsslAsn1d2iCb d2i_func; 137 /* Member info */ 138 size_t offset; /* Offset of this field in structure */ 139 /* DER info */ 140 int tag; 141 byte first_byte; /* First expected byte. Required for 142 * IMPLICIT types. */ 143 byte ex:1; /* explicit, name conflicts with C++ keyword */ 144 byte sequence:1; 145 }; 146 147 enum WOLFSSL_ASN1_TYPES { 148 WOLFSSL_ASN1_SEQUENCE = 0, 149 WOLFSSL_ASN1_CHOICE, 150 WOLFSSL_ASN1_OBJECT_TYPE, 151 }; 152 153 struct WOLFSSL_ASN1_ITEM { 154 enum WOLFSSL_ASN1_TYPES type; 155 const struct WOLFSSL_ASN1_TEMPLATE* members; /* If SEQUENCE or CHOICE this 156 * contains the contents */ 157 size_t mcount; /* Number of members if SEQUENCE 158 * or CHOICE */ 159 size_t size; /* Structure size */ 160 size_t toffset; /* Type offset */ 161 }; 162 163 typedef struct WOLFSSL_ASN1_TEMPLATE WOLFSSL_ASN1_TEMPLATE; 164 typedef struct WOLFSSL_ASN1_ITEM WOLFSSL_ASN1_ITEM; 165 166 #define ASN1_BIT_STRING_FIRST_BYTE ASN_BIT_STRING 167 #define ASN1_TFLG_EXPLICIT (0x1 << 0) 168 #define ASN1_TFLG_SEQUENCE_OF (0x1 << 1) 169 #define ASN1_TFLG_IMPTAG (0x1 << 2) 170 #define ASN1_TFLG_EXPTAG (0x1 << 3) 171 172 #define ASN1_TFLG_TAG_MASK (ASN1_TFLG_IMPTAG|ASN1_TFLG_EXPTAG) 173 174 #define ASN1_ITEM_TEMPLATE(mtype) \ 175 static const WOLFSSL_ASN1_TEMPLATE mtype##_member_data 176 177 #define ASN1_ITEM_TEMPLATE_END(mtype) \ 178 ; \ 179 const WOLFSSL_ASN1_ITEM mtype##_template_data = { \ 180 WOLFSSL_ASN1_OBJECT_TYPE, \ 181 &mtype##_member_data, \ 182 1, \ 183 0, \ 184 0 \ 185 }; 186 187 #define ASN1_SEQUENCE(mtype) \ 188 static const WOLFSSL_ASN1_TEMPLATE mtype##_member_data[] 189 190 #define ASN1_SEQUENCE_END(mtype) \ 191 ; \ 192 const WOLFSSL_ASN1_ITEM mtype##_template_data = { \ 193 WOLFSSL_ASN1_SEQUENCE, \ 194 mtype##_member_data, \ 195 sizeof(mtype##_member_data) / sizeof(WOLFSSL_ASN1_TEMPLATE), \ 196 sizeof(mtype), \ 197 0 \ 198 }; \ 199 static WC_MAYBE_UNUSED const byte mtype##_FIRST_BYTE = \ 200 ASN_CONSTRUCTED | ASN_SEQUENCE; 201 202 /* This is what a ASN1_CHOICE type should look like 203 * typedef struct { 204 * int type; 205 * union { 206 * ASN1_SOMETHING *opt1; 207 * ASN1_SOMEOTHER *opt2; 208 * } value; 209 * } chname; 210 */ 211 212 #define ASN1_CHOICE(mtype) \ 213 static const WOLFSSL_ASN1_TEMPLATE mtype##_member_data[] 214 215 #define ASN1_CHOICE_END(mtype) \ 216 ; \ 217 const WOLFSSL_ASN1_ITEM mtype##_template_data = { \ 218 WOLFSSL_ASN1_CHOICE, \ 219 mtype##_member_data, \ 220 sizeof(mtype##_member_data) / sizeof(WOLFSSL_ASN1_TEMPLATE), \ 221 sizeof(mtype) ,\ 222 WC_OFFSETOF(mtype, type) \ 223 }; 224 225 #define ASN1_TYPE(type, member, tag, first_byte, exp, seq) \ 226 WC_OFFSETOF(type, member), tag, first_byte, exp, seq 227 228 /* Function callbacks need to be defined immediately otherwise we will 229 * incorrectly expand the type. Ex: ASN1_INTEGER -> WOLFSSL_ASN1_INTEGER */ 230 231 #define ASN1_SIMPLE(type, member, member_type) \ 232 { (WolfsslAsn1NewCb)member_type##_new, \ 233 (WolfsslAsn1FreeCb)member_type##_free, \ 234 (WolfsslAsn1i2dCb)i2d_##member_type, \ 235 (WolfsslAsn1d2iCb)d2i_##member_type, \ 236 ASN1_TYPE(type, member, -1, 0, 0, 0) } 237 238 #define ASN1_IMP(type, member, member_type, tag) \ 239 { (WolfsslAsn1NewCb)member_type##_new, \ 240 (WolfsslAsn1FreeCb)member_type##_free, \ 241 (WolfsslAsn1i2dCb)i2d_##member_type, \ 242 (WolfsslAsn1d2iCb)d2i_##member_type, \ 243 ASN1_TYPE(type, member, tag, member_type##_FIRST_BYTE, 0, 0) } 244 245 #define ASN1_EXP(type, member, member_type, tag) \ 246 { (WolfsslAsn1NewCb)member_type##_new, \ 247 (WolfsslAsn1FreeCb)member_type##_free, \ 248 (WolfsslAsn1i2dCb)i2d_##member_type, \ 249 (WolfsslAsn1d2iCb)d2i_##member_type, \ 250 ASN1_TYPE(type, member, tag, 0, 1, 0) } 251 252 #define ASN1_SEQUENCE_OF(type, member, member_type) \ 253 { (WolfsslAsn1NewCb)member_type##_new, \ 254 (WolfsslAsn1FreeCb)member_type##_free, \ 255 (WolfsslAsn1i2dCb)i2d_##member_type, \ 256 (WolfsslAsn1d2iCb)d2i_##member_type, \ 257 ASN1_TYPE(type, member, -1, 0, 0, 1) } 258 259 #define ASN1_EXP_SEQUENCE_OF(type, member, member_type, tag) \ 260 { (WolfsslAsn1NewCb)member_type##_new, \ 261 (WolfsslAsn1FreeCb)member_type##_free, \ 262 (WolfsslAsn1i2dCb)i2d_##member_type, \ 263 (WolfsslAsn1d2iCb)d2i_##member_type, \ 264 ASN1_TYPE(type, member, tag, 0, 1, 1) } 265 266 #define ASN1_EX_TEMPLATE_TYPE(flags, tag, name, member_type) \ 267 { (WolfsslAsn1NewCb)member_type##_new, \ 268 (WolfsslAsn1FreeCb)member_type##_free, \ 269 (WolfsslAsn1i2dCb)i2d_##member_type, \ 270 (WolfsslAsn1d2iCb)d2i_##member_type, \ 271 0, (flags) & ASN1_TFLG_TAG_MASK ? (tag) : -1, 0, \ 272 !!((flags) & ASN1_TFLG_EXPLICIT), TRUE } 273 274 WOLFSSL_API void *wolfSSL_ASN1_item_new(const WOLFSSL_ASN1_ITEM *tpl); 275 WOLFSSL_API void wolfSSL_ASN1_item_free(void *obj, 276 const WOLFSSL_ASN1_ITEM *item); 277 WOLFSSL_API int wolfSSL_ASN1_item_i2d(const void *src, byte **dest, 278 const WOLFSSL_ASN1_ITEM *tpl); 279 WOLFSSL_API void* wolfSSL_ASN1_item_d2i(void** dst, const byte **src, long len, 280 const WOLFSSL_ASN1_ITEM* item); 281 282 /* Need function declaration otherwise compiler complains */ 283 /* // NOLINTBEGIN(readability-named-parameter,bugprone-macro-parentheses) */ 284 #define IMPLEMENT_ASN1_FUNCTIONS(type) \ 285 type *type##_new(void); \ 286 type *type##_new(void){ \ 287 return (type*)wolfSSL_ASN1_item_new(&type##_template_data); \ 288 } \ 289 void type##_free(type *t); \ 290 void type##_free(type *t){ \ 291 wolfSSL_ASN1_item_free(t, &type##_template_data); \ 292 } \ 293 int i2d_##type(type *src, byte **dest); \ 294 int i2d_##type(type *src, byte **dest) \ 295 { \ 296 return wolfSSL_ASN1_item_i2d(src, dest, &type##_template_data); \ 297 } \ 298 type* d2i_##type(type **dst, const byte **src, long len); \ 299 type* d2i_##type(type **dst, const byte **src, long len) \ 300 { \ 301 return (type*)wolfSSL_ASN1_item_d2i((void**)dst, src, len, \ 302 &type##_template_data); \ 303 } 304 /* // NOLINTEND(readability-named-parameter,bugprone-macro-parentheses) */ 305 306 #endif /* OPENSSL_ALL */ 307 308 #define BN_to_ASN1_INTEGER wolfSSL_BN_to_ASN1_INTEGER 309 #define ASN1_TYPE_set wolfSSL_ASN1_TYPE_set 310 #define ASN1_TYPE_get wolfSSL_ASN1_TYPE_get 311 #define ASN1_TYPE_new wolfSSL_ASN1_TYPE_new 312 #define ASN1_TYPE_free wolfSSL_ASN1_TYPE_free 313 #define i2d_ASN1_TYPE wolfSSL_i2d_ASN1_TYPE 314 315 #endif /* WOLFSSL_ASN1_H_ */