gnunet-android

GNUnet for Android
Log | Files | Refs | README

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_ */