1*de0e0e4dSAntonio Huete Jimenez /* $OpenBSD: asn1t.h,v 1.22 2022/09/03 16:01:23 jsing Exp $ */ 2f5b1c8a1SJohn Marino /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 3f5b1c8a1SJohn Marino * project 2000. 4f5b1c8a1SJohn Marino */ 5f5b1c8a1SJohn Marino /* ==================================================================== 6f5b1c8a1SJohn Marino * Copyright (c) 2000-2005 The OpenSSL Project. All rights reserved. 7f5b1c8a1SJohn Marino * 8f5b1c8a1SJohn Marino * Redistribution and use in source and binary forms, with or without 9f5b1c8a1SJohn Marino * modification, are permitted provided that the following conditions 10f5b1c8a1SJohn Marino * are met: 11f5b1c8a1SJohn Marino * 12f5b1c8a1SJohn Marino * 1. Redistributions of source code must retain the above copyright 13f5b1c8a1SJohn Marino * notice, this list of conditions and the following disclaimer. 14f5b1c8a1SJohn Marino * 15f5b1c8a1SJohn Marino * 2. Redistributions in binary form must reproduce the above copyright 16f5b1c8a1SJohn Marino * notice, this list of conditions and the following disclaimer in 17f5b1c8a1SJohn Marino * the documentation and/or other materials provided with the 18f5b1c8a1SJohn Marino * distribution. 19f5b1c8a1SJohn Marino * 20f5b1c8a1SJohn Marino * 3. All advertising materials mentioning features or use of this 21f5b1c8a1SJohn Marino * software must display the following acknowledgment: 22f5b1c8a1SJohn Marino * "This product includes software developed by the OpenSSL Project 23f5b1c8a1SJohn Marino * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 24f5b1c8a1SJohn Marino * 25f5b1c8a1SJohn Marino * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 26f5b1c8a1SJohn Marino * endorse or promote products derived from this software without 27f5b1c8a1SJohn Marino * prior written permission. For written permission, please contact 28f5b1c8a1SJohn Marino * licensing@OpenSSL.org. 29f5b1c8a1SJohn Marino * 30f5b1c8a1SJohn Marino * 5. Products derived from this software may not be called "OpenSSL" 31f5b1c8a1SJohn Marino * nor may "OpenSSL" appear in their names without prior written 32f5b1c8a1SJohn Marino * permission of the OpenSSL Project. 33f5b1c8a1SJohn Marino * 34f5b1c8a1SJohn Marino * 6. Redistributions of any form whatsoever must retain the following 35f5b1c8a1SJohn Marino * acknowledgment: 36f5b1c8a1SJohn Marino * "This product includes software developed by the OpenSSL Project 37f5b1c8a1SJohn Marino * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 38f5b1c8a1SJohn Marino * 39f5b1c8a1SJohn Marino * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 40f5b1c8a1SJohn Marino * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 41f5b1c8a1SJohn Marino * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 42f5b1c8a1SJohn Marino * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 43f5b1c8a1SJohn Marino * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 44f5b1c8a1SJohn Marino * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 45f5b1c8a1SJohn Marino * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 46f5b1c8a1SJohn Marino * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 47f5b1c8a1SJohn Marino * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 48f5b1c8a1SJohn Marino * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 49f5b1c8a1SJohn Marino * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 50f5b1c8a1SJohn Marino * OF THE POSSIBILITY OF SUCH DAMAGE. 51f5b1c8a1SJohn Marino * ==================================================================== 52f5b1c8a1SJohn Marino * 53f5b1c8a1SJohn Marino * This product includes cryptographic software written by Eric Young 54f5b1c8a1SJohn Marino * (eay@cryptsoft.com). This product includes software written by Tim 55f5b1c8a1SJohn Marino * Hudson (tjh@cryptsoft.com). 56f5b1c8a1SJohn Marino * 57f5b1c8a1SJohn Marino */ 58f5b1c8a1SJohn Marino #ifndef HEADER_ASN1T_H 59f5b1c8a1SJohn Marino #define HEADER_ASN1T_H 60f5b1c8a1SJohn Marino 61f5b1c8a1SJohn Marino #include <stddef.h> 62f5b1c8a1SJohn Marino 63f5b1c8a1SJohn Marino #include <openssl/opensslconf.h> 64f5b1c8a1SJohn Marino 65f5b1c8a1SJohn Marino #include <openssl/asn1.h> 66f5b1c8a1SJohn Marino 67f5b1c8a1SJohn Marino /* ASN1 template defines, structures and functions */ 68f5b1c8a1SJohn Marino 69f5b1c8a1SJohn Marino #ifdef __cplusplus 70f5b1c8a1SJohn Marino extern "C" { 71f5b1c8a1SJohn Marino #endif 72f5b1c8a1SJohn Marino 73f5b1c8a1SJohn Marino #ifndef LIBRESSL_INTERNAL 74f5b1c8a1SJohn Marino 75f5b1c8a1SJohn Marino /* Macro to obtain ASN1_ADB pointer from a type (only used internally) */ 76f5b1c8a1SJohn Marino #define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)(iptr)) 77f5b1c8a1SJohn Marino 78f5b1c8a1SJohn Marino 79f5b1c8a1SJohn Marino /* Macros for start and end of ASN1_ITEM definition */ 80f5b1c8a1SJohn Marino 81f5b1c8a1SJohn Marino #define ASN1_ITEM_start(itname) \ 82f5b1c8a1SJohn Marino const ASN1_ITEM itname##_it = { 83f5b1c8a1SJohn Marino 84cca6fc52SDaniel Fojt #define static_ASN1_ITEM_start(itname) \ 85cca6fc52SDaniel Fojt static const ASN1_ITEM itname##_it = { 86cca6fc52SDaniel Fojt 87f5b1c8a1SJohn Marino #define ASN1_ITEM_end(itname) \ 88f5b1c8a1SJohn Marino }; 89f5b1c8a1SJohn Marino 90f5b1c8a1SJohn Marino 91f5b1c8a1SJohn Marino 92f5b1c8a1SJohn Marino /* Macros to aid ASN1 template writing */ 93f5b1c8a1SJohn Marino 94f5b1c8a1SJohn Marino #define ASN1_ITEM_TEMPLATE(tname) \ 95f5b1c8a1SJohn Marino static const ASN1_TEMPLATE tname##_item_tt 96f5b1c8a1SJohn Marino 97f5b1c8a1SJohn Marino #define ASN1_ITEM_TEMPLATE_END(tname) \ 98f5b1c8a1SJohn Marino ;\ 99f5b1c8a1SJohn Marino ASN1_ITEM_start(tname) \ 100f5b1c8a1SJohn Marino ASN1_ITYPE_PRIMITIVE,\ 101f5b1c8a1SJohn Marino -1,\ 102f5b1c8a1SJohn Marino &tname##_item_tt,\ 103f5b1c8a1SJohn Marino 0,\ 104f5b1c8a1SJohn Marino NULL,\ 105f5b1c8a1SJohn Marino 0,\ 106f5b1c8a1SJohn Marino #tname \ 107f5b1c8a1SJohn Marino ASN1_ITEM_end(tname) 108f5b1c8a1SJohn Marino 109cca6fc52SDaniel Fojt #define static_ASN1_ITEM_TEMPLATE_END(tname) \ 110cca6fc52SDaniel Fojt ;\ 111cca6fc52SDaniel Fojt static_ASN1_ITEM_start(tname) \ 112cca6fc52SDaniel Fojt ASN1_ITYPE_PRIMITIVE,\ 113cca6fc52SDaniel Fojt -1,\ 114cca6fc52SDaniel Fojt &tname##_item_tt,\ 115cca6fc52SDaniel Fojt 0,\ 116cca6fc52SDaniel Fojt NULL,\ 117cca6fc52SDaniel Fojt 0,\ 118cca6fc52SDaniel Fojt #tname \ 119cca6fc52SDaniel Fojt ASN1_ITEM_end(tname) 120cca6fc52SDaniel Fojt 121f5b1c8a1SJohn Marino 122f5b1c8a1SJohn Marino /* This is a ASN1 type which just embeds a template */ 123f5b1c8a1SJohn Marino 124*de0e0e4dSAntonio Huete Jimenez /* 125*de0e0e4dSAntonio Huete Jimenez * This pair helps declare a SEQUENCE. We can do: 126f5b1c8a1SJohn Marino * 127f5b1c8a1SJohn Marino * ASN1_SEQUENCE(stname) = { 128f5b1c8a1SJohn Marino * ... SEQUENCE components ... 129f5b1c8a1SJohn Marino * } ASN1_SEQUENCE_END(stname) 130f5b1c8a1SJohn Marino * 131f5b1c8a1SJohn Marino * This will produce an ASN1_ITEM called stname_it 132f5b1c8a1SJohn Marino * for a structure called stname. 133f5b1c8a1SJohn Marino * 134f5b1c8a1SJohn Marino * If you want the same structure but a different 135f5b1c8a1SJohn Marino * name then use: 136f5b1c8a1SJohn Marino * 137f5b1c8a1SJohn Marino * ASN1_SEQUENCE(itname) = { 138f5b1c8a1SJohn Marino * ... SEQUENCE components ... 139f5b1c8a1SJohn Marino * } ASN1_SEQUENCE_END_name(stname, itname) 140f5b1c8a1SJohn Marino * 141f5b1c8a1SJohn Marino * This will create an item called itname_it using 142f5b1c8a1SJohn Marino * a structure called stname. 143f5b1c8a1SJohn Marino */ 144f5b1c8a1SJohn Marino 145f5b1c8a1SJohn Marino #define ASN1_SEQUENCE(tname) \ 146f5b1c8a1SJohn Marino static const ASN1_TEMPLATE tname##_seq_tt[] 147f5b1c8a1SJohn Marino 148f5b1c8a1SJohn Marino #define ASN1_SEQUENCE_END(stname) ASN1_SEQUENCE_END_name(stname, stname) 149f5b1c8a1SJohn Marino 150cca6fc52SDaniel Fojt #define static_ASN1_SEQUENCE_END(stname) static_ASN1_SEQUENCE_END_name(stname, stname) 151cca6fc52SDaniel Fojt 152f5b1c8a1SJohn Marino #define ASN1_SEQUENCE_END_name(stname, tname) \ 153f5b1c8a1SJohn Marino ;\ 154f5b1c8a1SJohn Marino ASN1_ITEM_start(tname) \ 155f5b1c8a1SJohn Marino ASN1_ITYPE_SEQUENCE,\ 156f5b1c8a1SJohn Marino V_ASN1_SEQUENCE,\ 157f5b1c8a1SJohn Marino tname##_seq_tt,\ 158f5b1c8a1SJohn Marino sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ 159f5b1c8a1SJohn Marino NULL,\ 160f5b1c8a1SJohn Marino sizeof(stname),\ 161f5b1c8a1SJohn Marino #stname \ 162f5b1c8a1SJohn Marino ASN1_ITEM_end(tname) 163f5b1c8a1SJohn Marino 164cca6fc52SDaniel Fojt #define static_ASN1_SEQUENCE_END_name(stname, tname) \ 165cca6fc52SDaniel Fojt ;\ 166cca6fc52SDaniel Fojt static_ASN1_ITEM_start(tname) \ 167cca6fc52SDaniel Fojt ASN1_ITYPE_SEQUENCE,\ 168cca6fc52SDaniel Fojt V_ASN1_SEQUENCE,\ 169cca6fc52SDaniel Fojt tname##_seq_tt,\ 170cca6fc52SDaniel Fojt sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ 171cca6fc52SDaniel Fojt NULL,\ 172cca6fc52SDaniel Fojt sizeof(stname),\ 173cca6fc52SDaniel Fojt #stname \ 174cca6fc52SDaniel Fojt ASN1_ITEM_end(tname) 175cca6fc52SDaniel Fojt 176f5b1c8a1SJohn Marino #define ASN1_NDEF_SEQUENCE(tname) \ 177f5b1c8a1SJohn Marino ASN1_SEQUENCE(tname) 178f5b1c8a1SJohn Marino 179f5b1c8a1SJohn Marino #define ASN1_NDEF_SEQUENCE_cb(tname, cb) \ 180f5b1c8a1SJohn Marino ASN1_SEQUENCE_cb(tname, cb) 181f5b1c8a1SJohn Marino 182f5b1c8a1SJohn Marino #define ASN1_SEQUENCE_cb(tname, cb) \ 183f5b1c8a1SJohn Marino static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; \ 184f5b1c8a1SJohn Marino ASN1_SEQUENCE(tname) 185f5b1c8a1SJohn Marino 186f5b1c8a1SJohn Marino #define ASN1_SEQUENCE_ref(tname, cb, lck) \ 187f5b1c8a1SJohn Marino static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_REFCOUNT, offsetof(tname, references), lck, cb, 0}; \ 188f5b1c8a1SJohn Marino ASN1_SEQUENCE(tname) 189f5b1c8a1SJohn Marino 190f5b1c8a1SJohn Marino #define ASN1_SEQUENCE_enc(tname, enc, cb) \ 191f5b1c8a1SJohn Marino static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_ENCODING, 0, 0, cb, offsetof(tname, enc)}; \ 192f5b1c8a1SJohn Marino ASN1_SEQUENCE(tname) 193f5b1c8a1SJohn Marino 194f5b1c8a1SJohn Marino #define ASN1_NDEF_SEQUENCE_END(tname) \ 195f5b1c8a1SJohn Marino ;\ 196f5b1c8a1SJohn Marino ASN1_ITEM_start(tname) \ 197f5b1c8a1SJohn Marino ASN1_ITYPE_NDEF_SEQUENCE,\ 198f5b1c8a1SJohn Marino V_ASN1_SEQUENCE,\ 199f5b1c8a1SJohn Marino tname##_seq_tt,\ 200f5b1c8a1SJohn Marino sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ 201f5b1c8a1SJohn Marino NULL,\ 202f5b1c8a1SJohn Marino sizeof(tname),\ 203f5b1c8a1SJohn Marino #tname \ 204f5b1c8a1SJohn Marino ASN1_ITEM_end(tname) 205f5b1c8a1SJohn Marino 206cca6fc52SDaniel Fojt #define static_ASN1_NDEF_SEQUENCE_END(tname) \ 207cca6fc52SDaniel Fojt ;\ 208cca6fc52SDaniel Fojt static_ASN1_ITEM_start(tname) \ 209cca6fc52SDaniel Fojt ASN1_ITYPE_NDEF_SEQUENCE,\ 210cca6fc52SDaniel Fojt V_ASN1_SEQUENCE,\ 211cca6fc52SDaniel Fojt tname##_seq_tt,\ 212cca6fc52SDaniel Fojt sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ 213cca6fc52SDaniel Fojt NULL,\ 214cca6fc52SDaniel Fojt sizeof(tname),\ 215cca6fc52SDaniel Fojt #tname \ 216cca6fc52SDaniel Fojt ASN1_ITEM_end(tname) 217cca6fc52SDaniel Fojt 218f5b1c8a1SJohn Marino #define ASN1_SEQUENCE_END_enc(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname) 219f5b1c8a1SJohn Marino 220f5b1c8a1SJohn Marino #define ASN1_SEQUENCE_END_cb(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname) 221f5b1c8a1SJohn Marino 222cca6fc52SDaniel Fojt #define static_ASN1_SEQUENCE_END_cb(stname, tname) static_ASN1_SEQUENCE_END_ref(stname, tname) 223cca6fc52SDaniel Fojt 224f5b1c8a1SJohn Marino #define ASN1_SEQUENCE_END_ref(stname, tname) \ 225f5b1c8a1SJohn Marino ;\ 226f5b1c8a1SJohn Marino ASN1_ITEM_start(tname) \ 227f5b1c8a1SJohn Marino ASN1_ITYPE_SEQUENCE,\ 228f5b1c8a1SJohn Marino V_ASN1_SEQUENCE,\ 229f5b1c8a1SJohn Marino tname##_seq_tt,\ 230f5b1c8a1SJohn Marino sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ 231f5b1c8a1SJohn Marino &tname##_aux,\ 232f5b1c8a1SJohn Marino sizeof(stname),\ 233f5b1c8a1SJohn Marino #stname \ 234f5b1c8a1SJohn Marino ASN1_ITEM_end(tname) 235f5b1c8a1SJohn Marino 236cca6fc52SDaniel Fojt #define static_ASN1_SEQUENCE_END_ref(stname, tname) \ 237cca6fc52SDaniel Fojt ;\ 238cca6fc52SDaniel Fojt static_ASN1_ITEM_start(tname) \ 239cca6fc52SDaniel Fojt ASN1_ITYPE_SEQUENCE,\ 240cca6fc52SDaniel Fojt V_ASN1_SEQUENCE,\ 241cca6fc52SDaniel Fojt tname##_seq_tt,\ 242cca6fc52SDaniel Fojt sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ 243cca6fc52SDaniel Fojt &tname##_aux,\ 244cca6fc52SDaniel Fojt sizeof(stname),\ 245cca6fc52SDaniel Fojt #stname \ 246cca6fc52SDaniel Fojt ASN1_ITEM_end(tname) 247cca6fc52SDaniel Fojt 248f5b1c8a1SJohn Marino #define ASN1_NDEF_SEQUENCE_END_cb(stname, tname) \ 249f5b1c8a1SJohn Marino ;\ 250f5b1c8a1SJohn Marino ASN1_ITEM_start(tname) \ 251f5b1c8a1SJohn Marino ASN1_ITYPE_NDEF_SEQUENCE,\ 252f5b1c8a1SJohn Marino V_ASN1_SEQUENCE,\ 253f5b1c8a1SJohn Marino tname##_seq_tt,\ 254f5b1c8a1SJohn Marino sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ 255f5b1c8a1SJohn Marino &tname##_aux,\ 256f5b1c8a1SJohn Marino sizeof(stname),\ 257f5b1c8a1SJohn Marino #stname \ 258f5b1c8a1SJohn Marino ASN1_ITEM_end(tname) 259f5b1c8a1SJohn Marino 260f5b1c8a1SJohn Marino 261*de0e0e4dSAntonio Huete Jimenez /* 262*de0e0e4dSAntonio Huete Jimenez * This pair helps declare a CHOICE type. We can do: 263f5b1c8a1SJohn Marino * 264f5b1c8a1SJohn Marino * ASN1_CHOICE(chname) = { 265f5b1c8a1SJohn Marino * ... CHOICE options ... 266f5b1c8a1SJohn Marino * ASN1_CHOICE_END(chname) 267f5b1c8a1SJohn Marino * 268f5b1c8a1SJohn Marino * This will produce an ASN1_ITEM called chname_it 269f5b1c8a1SJohn Marino * for a structure called chname. The structure 270f5b1c8a1SJohn Marino * definition must look like this: 271f5b1c8a1SJohn Marino * typedef struct { 272f5b1c8a1SJohn Marino * int type; 273f5b1c8a1SJohn Marino * union { 274f5b1c8a1SJohn Marino * ASN1_SOMETHING *opt1; 275f5b1c8a1SJohn Marino * ASN1_SOMEOTHER *opt2; 276f5b1c8a1SJohn Marino * } value; 277f5b1c8a1SJohn Marino * } chname; 278f5b1c8a1SJohn Marino * 279f5b1c8a1SJohn Marino * the name of the selector must be 'type'. 280f5b1c8a1SJohn Marino * to use an alternative selector name use the 281f5b1c8a1SJohn Marino * ASN1_CHOICE_END_selector() version. 282f5b1c8a1SJohn Marino */ 283f5b1c8a1SJohn Marino 284f5b1c8a1SJohn Marino #define ASN1_CHOICE(tname) \ 285f5b1c8a1SJohn Marino static const ASN1_TEMPLATE tname##_ch_tt[] 286f5b1c8a1SJohn Marino 287f5b1c8a1SJohn Marino #define ASN1_CHOICE_cb(tname, cb) \ 288f5b1c8a1SJohn Marino static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; \ 289f5b1c8a1SJohn Marino ASN1_CHOICE(tname) 290f5b1c8a1SJohn Marino 291f5b1c8a1SJohn Marino #define ASN1_CHOICE_END(stname) ASN1_CHOICE_END_name(stname, stname) 292f5b1c8a1SJohn Marino 293cca6fc52SDaniel Fojt #define static_ASN1_CHOICE_END(stname) static_ASN1_CHOICE_END_name(stname, stname) 294cca6fc52SDaniel Fojt 295f5b1c8a1SJohn Marino #define ASN1_CHOICE_END_name(stname, tname) ASN1_CHOICE_END_selector(stname, tname, type) 296f5b1c8a1SJohn Marino 297cca6fc52SDaniel Fojt #define static_ASN1_CHOICE_END_name(stname, tname) static_ASN1_CHOICE_END_selector(stname, tname, type) 298cca6fc52SDaniel Fojt 299f5b1c8a1SJohn Marino #define ASN1_CHOICE_END_selector(stname, tname, selname) \ 300f5b1c8a1SJohn Marino ;\ 301f5b1c8a1SJohn Marino ASN1_ITEM_start(tname) \ 302f5b1c8a1SJohn Marino ASN1_ITYPE_CHOICE,\ 303f5b1c8a1SJohn Marino offsetof(stname,selname) ,\ 304f5b1c8a1SJohn Marino tname##_ch_tt,\ 305f5b1c8a1SJohn Marino sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\ 306f5b1c8a1SJohn Marino NULL,\ 307f5b1c8a1SJohn Marino sizeof(stname),\ 308f5b1c8a1SJohn Marino #stname \ 309f5b1c8a1SJohn Marino ASN1_ITEM_end(tname) 310f5b1c8a1SJohn Marino 311cca6fc52SDaniel Fojt #define static_ASN1_CHOICE_END_selector(stname, tname, selname) \ 312cca6fc52SDaniel Fojt ;\ 313cca6fc52SDaniel Fojt static_ASN1_ITEM_start(tname) \ 314cca6fc52SDaniel Fojt ASN1_ITYPE_CHOICE,\ 315cca6fc52SDaniel Fojt offsetof(stname,selname) ,\ 316cca6fc52SDaniel Fojt tname##_ch_tt,\ 317cca6fc52SDaniel Fojt sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\ 318cca6fc52SDaniel Fojt NULL,\ 319cca6fc52SDaniel Fojt sizeof(stname),\ 320cca6fc52SDaniel Fojt #stname \ 321cca6fc52SDaniel Fojt ASN1_ITEM_end(tname) 322cca6fc52SDaniel Fojt 323f5b1c8a1SJohn Marino #define ASN1_CHOICE_END_cb(stname, tname, selname) \ 324f5b1c8a1SJohn Marino ;\ 325f5b1c8a1SJohn Marino ASN1_ITEM_start(tname) \ 326f5b1c8a1SJohn Marino ASN1_ITYPE_CHOICE,\ 327f5b1c8a1SJohn Marino offsetof(stname,selname) ,\ 328f5b1c8a1SJohn Marino tname##_ch_tt,\ 329f5b1c8a1SJohn Marino sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\ 330f5b1c8a1SJohn Marino &tname##_aux,\ 331f5b1c8a1SJohn Marino sizeof(stname),\ 332f5b1c8a1SJohn Marino #stname \ 333f5b1c8a1SJohn Marino ASN1_ITEM_end(tname) 334f5b1c8a1SJohn Marino 335f5b1c8a1SJohn Marino /* This helps with the template wrapper form of ASN1_ITEM */ 336f5b1c8a1SJohn Marino 337f5b1c8a1SJohn Marino #define ASN1_EX_TEMPLATE_TYPE(flags, tag, name, type) { \ 338f5b1c8a1SJohn Marino (flags), (tag), 0,\ 339f5b1c8a1SJohn Marino #name, ASN1_ITEM_ref(type) } 340f5b1c8a1SJohn Marino 341f5b1c8a1SJohn Marino /* These help with SEQUENCE or CHOICE components */ 342f5b1c8a1SJohn Marino 343f5b1c8a1SJohn Marino /* used to declare other types */ 344f5b1c8a1SJohn Marino 345f5b1c8a1SJohn Marino #define ASN1_EX_TYPE(flags, tag, stname, field, type) { \ 346f5b1c8a1SJohn Marino (flags), (tag), offsetof(stname, field),\ 347f5b1c8a1SJohn Marino #field, ASN1_ITEM_ref(type) } 348f5b1c8a1SJohn Marino 349f5b1c8a1SJohn Marino /* implicit and explicit helper macros */ 350f5b1c8a1SJohn Marino 351f5b1c8a1SJohn Marino #define ASN1_IMP_EX(stname, field, type, tag, ex) \ 352f5b1c8a1SJohn Marino ASN1_EX_TYPE(ASN1_TFLG_IMPLICIT | ex, tag, stname, field, type) 353f5b1c8a1SJohn Marino 354f5b1c8a1SJohn Marino #define ASN1_EXP_EX(stname, field, type, tag, ex) \ 355f5b1c8a1SJohn Marino ASN1_EX_TYPE(ASN1_TFLG_EXPLICIT | ex, tag, stname, field, type) 356f5b1c8a1SJohn Marino 357f5b1c8a1SJohn Marino /* Any defined by macros: the field used is in the table itself */ 358f5b1c8a1SJohn Marino 359f5b1c8a1SJohn Marino #define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) } 360f5b1c8a1SJohn Marino #define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) } 361f5b1c8a1SJohn Marino /* Plain simple type */ 362f5b1c8a1SJohn Marino #define ASN1_SIMPLE(stname, field, type) ASN1_EX_TYPE(0,0, stname, field, type) 363f5b1c8a1SJohn Marino 364f5b1c8a1SJohn Marino /* OPTIONAL simple type */ 365f5b1c8a1SJohn Marino #define ASN1_OPT(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_OPTIONAL, 0, stname, field, type) 366f5b1c8a1SJohn Marino 367f5b1c8a1SJohn Marino /* IMPLICIT tagged simple type */ 368f5b1c8a1SJohn Marino #define ASN1_IMP(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, 0) 369f5b1c8a1SJohn Marino 370f5b1c8a1SJohn Marino /* IMPLICIT tagged OPTIONAL simple type */ 371f5b1c8a1SJohn Marino #define ASN1_IMP_OPT(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL) 372f5b1c8a1SJohn Marino 373f5b1c8a1SJohn Marino /* Same as above but EXPLICIT */ 374f5b1c8a1SJohn Marino 375f5b1c8a1SJohn Marino #define ASN1_EXP(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, 0) 376f5b1c8a1SJohn Marino #define ASN1_EXP_OPT(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL) 377f5b1c8a1SJohn Marino 378f5b1c8a1SJohn Marino /* SEQUENCE OF type */ 379f5b1c8a1SJohn Marino #define ASN1_SEQUENCE_OF(stname, field, type) \ 380f5b1c8a1SJohn Marino ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, stname, field, type) 381f5b1c8a1SJohn Marino 382f5b1c8a1SJohn Marino /* OPTIONAL SEQUENCE OF */ 383f5b1c8a1SJohn Marino #define ASN1_SEQUENCE_OF_OPT(stname, field, type) \ 384f5b1c8a1SJohn Marino ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type) 385f5b1c8a1SJohn Marino 386f5b1c8a1SJohn Marino /* Same as above but for SET OF */ 387f5b1c8a1SJohn Marino 388f5b1c8a1SJohn Marino #define ASN1_SET_OF(stname, field, type) \ 389f5b1c8a1SJohn Marino ASN1_EX_TYPE(ASN1_TFLG_SET_OF, 0, stname, field, type) 390f5b1c8a1SJohn Marino 391f5b1c8a1SJohn Marino #define ASN1_SET_OF_OPT(stname, field, type) \ 392f5b1c8a1SJohn Marino ASN1_EX_TYPE(ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type) 393f5b1c8a1SJohn Marino 394f5b1c8a1SJohn Marino /* Finally compound types of SEQUENCE, SET, IMPLICIT, EXPLICIT and OPTIONAL */ 395f5b1c8a1SJohn Marino 396f5b1c8a1SJohn Marino #define ASN1_IMP_SET_OF(stname, field, type, tag) \ 397f5b1c8a1SJohn Marino ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF) 398f5b1c8a1SJohn Marino 399f5b1c8a1SJohn Marino #define ASN1_EXP_SET_OF(stname, field, type, tag) \ 400f5b1c8a1SJohn Marino ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF) 401f5b1c8a1SJohn Marino 402f5b1c8a1SJohn Marino #define ASN1_IMP_SET_OF_OPT(stname, field, type, tag) \ 403f5b1c8a1SJohn Marino ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL) 404f5b1c8a1SJohn Marino 405f5b1c8a1SJohn Marino #define ASN1_EXP_SET_OF_OPT(stname, field, type, tag) \ 406f5b1c8a1SJohn Marino ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL) 407f5b1c8a1SJohn Marino 408f5b1c8a1SJohn Marino #define ASN1_IMP_SEQUENCE_OF(stname, field, type, tag) \ 409f5b1c8a1SJohn Marino ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF) 410f5b1c8a1SJohn Marino 411f5b1c8a1SJohn Marino #define ASN1_IMP_SEQUENCE_OF_OPT(stname, field, type, tag) \ 412f5b1c8a1SJohn Marino ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL) 413f5b1c8a1SJohn Marino 414f5b1c8a1SJohn Marino #define ASN1_EXP_SEQUENCE_OF(stname, field, type, tag) \ 415f5b1c8a1SJohn Marino ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF) 416f5b1c8a1SJohn Marino 417f5b1c8a1SJohn Marino #define ASN1_EXP_SEQUENCE_OF_OPT(stname, field, type, tag) \ 418f5b1c8a1SJohn Marino ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL) 419f5b1c8a1SJohn Marino 420f5b1c8a1SJohn Marino /* EXPLICIT using indefinite length constructed form */ 421f5b1c8a1SJohn Marino #define ASN1_NDEF_EXP(stname, field, type, tag) \ 422f5b1c8a1SJohn Marino ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_NDEF) 423f5b1c8a1SJohn Marino 424f5b1c8a1SJohn Marino /* EXPLICIT OPTIONAL using indefinite length constructed form */ 425f5b1c8a1SJohn Marino #define ASN1_NDEF_EXP_OPT(stname, field, type, tag) \ 426f5b1c8a1SJohn Marino ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL|ASN1_TFLG_NDEF) 427f5b1c8a1SJohn Marino 428f5b1c8a1SJohn Marino /* Macros for the ASN1_ADB structure */ 429f5b1c8a1SJohn Marino 430f5b1c8a1SJohn Marino #define ASN1_ADB(name) \ 431f5b1c8a1SJohn Marino static const ASN1_ADB_TABLE name##_adbtbl[] 432f5b1c8a1SJohn Marino 433f5b1c8a1SJohn Marino 434f5b1c8a1SJohn Marino #define ASN1_ADB_END(name, flags, field, app_table, def, none) \ 435f5b1c8a1SJohn Marino ;\ 436f5b1c8a1SJohn Marino static const ASN1_ADB name##_adb = {\ 437f5b1c8a1SJohn Marino flags,\ 438f5b1c8a1SJohn Marino offsetof(name, field),\ 439f5b1c8a1SJohn Marino app_table,\ 440f5b1c8a1SJohn Marino name##_adbtbl,\ 441f5b1c8a1SJohn Marino sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),\ 442f5b1c8a1SJohn Marino def,\ 443f5b1c8a1SJohn Marino none\ 444f5b1c8a1SJohn Marino } 445f5b1c8a1SJohn Marino 446f5b1c8a1SJohn Marino 447f5b1c8a1SJohn Marino #define ADB_ENTRY(val, template) {val, template} 448f5b1c8a1SJohn Marino 449f5b1c8a1SJohn Marino #define ASN1_ADB_TEMPLATE(name) \ 450f5b1c8a1SJohn Marino static const ASN1_TEMPLATE name##_tt 451f5b1c8a1SJohn Marino 452f5b1c8a1SJohn Marino #endif /* !LIBRESSL_INTERNAL */ 453f5b1c8a1SJohn Marino 454f5b1c8a1SJohn Marino /* This is the ASN1 template structure that defines 455f5b1c8a1SJohn Marino * a wrapper round the actual type. It determines the 456f5b1c8a1SJohn Marino * actual position of the field in the value structure, 457f5b1c8a1SJohn Marino * various flags such as OPTIONAL and the field name. 458f5b1c8a1SJohn Marino */ 459f5b1c8a1SJohn Marino 460f5b1c8a1SJohn Marino struct ASN1_TEMPLATE_st { 461f5b1c8a1SJohn Marino unsigned long flags; /* Various flags */ 462f5b1c8a1SJohn Marino long tag; /* tag, not used if no tagging */ 463f5b1c8a1SJohn Marino unsigned long offset; /* Offset of this field in structure */ 464f5b1c8a1SJohn Marino const char *field_name; /* Field name */ 465f5b1c8a1SJohn Marino ASN1_ITEM_EXP *item; /* Relevant ASN1_ITEM or ASN1_ADB */ 466f5b1c8a1SJohn Marino }; 467f5b1c8a1SJohn Marino 468f5b1c8a1SJohn Marino /* Macro to extract ASN1_ITEM and ASN1_ADB pointer from ASN1_TEMPLATE */ 469f5b1c8a1SJohn Marino 470f5b1c8a1SJohn Marino #define ASN1_TEMPLATE_item(t) (t->item_ptr) 471f5b1c8a1SJohn Marino #define ASN1_TEMPLATE_adb(t) (t->item_ptr) 472f5b1c8a1SJohn Marino 473f5b1c8a1SJohn Marino typedef struct ASN1_ADB_TABLE_st ASN1_ADB_TABLE; 474f5b1c8a1SJohn Marino typedef struct ASN1_ADB_st ASN1_ADB; 475f5b1c8a1SJohn Marino 476f5b1c8a1SJohn Marino struct ASN1_ADB_st { 477f5b1c8a1SJohn Marino unsigned long flags; /* Various flags */ 478f5b1c8a1SJohn Marino unsigned long offset; /* Offset of selector field */ 479f5b1c8a1SJohn Marino const ASN1_ADB_TABLE *tbl; /* Table of possible types */ 480f5b1c8a1SJohn Marino long tblcount; /* Number of entries in tbl */ 481f5b1c8a1SJohn Marino const ASN1_TEMPLATE *default_tt; /* Type to use if no match */ 482f5b1c8a1SJohn Marino const ASN1_TEMPLATE *null_tt; /* Type to use if selector is NULL */ 483f5b1c8a1SJohn Marino }; 484f5b1c8a1SJohn Marino 485f5b1c8a1SJohn Marino struct ASN1_ADB_TABLE_st { 486f5b1c8a1SJohn Marino long value; /* NID for an object or value for an int */ 487f5b1c8a1SJohn Marino const ASN1_TEMPLATE tt; /* item for this value */ 488f5b1c8a1SJohn Marino }; 489f5b1c8a1SJohn Marino 490f5b1c8a1SJohn Marino /* template flags */ 491f5b1c8a1SJohn Marino 492f5b1c8a1SJohn Marino /* Field is optional */ 493f5b1c8a1SJohn Marino #define ASN1_TFLG_OPTIONAL (0x1) 494f5b1c8a1SJohn Marino 495f5b1c8a1SJohn Marino /* Field is a SET OF */ 496f5b1c8a1SJohn Marino #define ASN1_TFLG_SET_OF (0x1 << 1) 497f5b1c8a1SJohn Marino 498f5b1c8a1SJohn Marino /* Field is a SEQUENCE OF */ 499f5b1c8a1SJohn Marino #define ASN1_TFLG_SEQUENCE_OF (0x2 << 1) 500f5b1c8a1SJohn Marino 501f5b1c8a1SJohn Marino /* Special case: this refers to a SET OF that 502f5b1c8a1SJohn Marino * will be sorted into DER order when encoded *and* 503f5b1c8a1SJohn Marino * the corresponding STACK will be modified to match 504f5b1c8a1SJohn Marino * the new order. 505f5b1c8a1SJohn Marino */ 506f5b1c8a1SJohn Marino #define ASN1_TFLG_SET_ORDER (0x3 << 1) 507f5b1c8a1SJohn Marino 508f5b1c8a1SJohn Marino /* Mask for SET OF or SEQUENCE OF */ 509f5b1c8a1SJohn Marino #define ASN1_TFLG_SK_MASK (0x3 << 1) 510f5b1c8a1SJohn Marino 511f5b1c8a1SJohn Marino /* These flags mean the tag should be taken from the 512f5b1c8a1SJohn Marino * tag field. If EXPLICIT then the underlying type 513f5b1c8a1SJohn Marino * is used for the inner tag. 514f5b1c8a1SJohn Marino */ 515f5b1c8a1SJohn Marino 516f5b1c8a1SJohn Marino /* IMPLICIT tagging */ 517f5b1c8a1SJohn Marino #define ASN1_TFLG_IMPTAG (0x1 << 3) 518f5b1c8a1SJohn Marino 519f5b1c8a1SJohn Marino 520f5b1c8a1SJohn Marino /* EXPLICIT tagging, inner tag from underlying type */ 521f5b1c8a1SJohn Marino #define ASN1_TFLG_EXPTAG (0x2 << 3) 522f5b1c8a1SJohn Marino 523f5b1c8a1SJohn Marino #define ASN1_TFLG_TAG_MASK (0x3 << 3) 524f5b1c8a1SJohn Marino 525f5b1c8a1SJohn Marino /* context specific IMPLICIT */ 526f5b1c8a1SJohn Marino #define ASN1_TFLG_IMPLICIT ASN1_TFLG_IMPTAG|ASN1_TFLG_CONTEXT 527f5b1c8a1SJohn Marino 528f5b1c8a1SJohn Marino /* context specific EXPLICIT */ 529f5b1c8a1SJohn Marino #define ASN1_TFLG_EXPLICIT ASN1_TFLG_EXPTAG|ASN1_TFLG_CONTEXT 530f5b1c8a1SJohn Marino 531*de0e0e4dSAntonio Huete Jimenez /* 532*de0e0e4dSAntonio Huete Jimenez * If tagging is in force these determine the type of tag to use. Otherwiser 533*de0e0e4dSAntonio Huete Jimenez * the tag is determined by the underlying type. These values reflect the 534*de0e0e4dSAntonio Huete Jimenez * actual octet format. 535f5b1c8a1SJohn Marino */ 536f5b1c8a1SJohn Marino 537f5b1c8a1SJohn Marino /* Universal tag */ 538f5b1c8a1SJohn Marino #define ASN1_TFLG_UNIVERSAL (0x0<<6) 539f5b1c8a1SJohn Marino /* Application tag */ 540f5b1c8a1SJohn Marino #define ASN1_TFLG_APPLICATION (0x1<<6) 541f5b1c8a1SJohn Marino /* Context specific tag */ 542f5b1c8a1SJohn Marino #define ASN1_TFLG_CONTEXT (0x2<<6) 543f5b1c8a1SJohn Marino /* Private tag */ 544f5b1c8a1SJohn Marino #define ASN1_TFLG_PRIVATE (0x3<<6) 545f5b1c8a1SJohn Marino 546f5b1c8a1SJohn Marino #define ASN1_TFLG_TAG_CLASS (0x3<<6) 547f5b1c8a1SJohn Marino 548*de0e0e4dSAntonio Huete Jimenez /* 549*de0e0e4dSAntonio Huete Jimenez * These are for ANY DEFINED BY type. In this case 550f5b1c8a1SJohn Marino * the 'item' field points to an ASN1_ADB structure 551f5b1c8a1SJohn Marino * which contains a table of values to decode the 552f5b1c8a1SJohn Marino * relevant type 553f5b1c8a1SJohn Marino */ 554f5b1c8a1SJohn Marino 555f5b1c8a1SJohn Marino #define ASN1_TFLG_ADB_MASK (0x3<<8) 556f5b1c8a1SJohn Marino 557f5b1c8a1SJohn Marino #define ASN1_TFLG_ADB_OID (0x1<<8) 558f5b1c8a1SJohn Marino 559f5b1c8a1SJohn Marino #define ASN1_TFLG_ADB_INT (0x1<<9) 560f5b1c8a1SJohn Marino 561*de0e0e4dSAntonio Huete Jimenez /* 562*de0e0e4dSAntonio Huete Jimenez * This flag when present in a SEQUENCE OF, SET OF 563f5b1c8a1SJohn Marino * or EXPLICIT causes indefinite length constructed 564f5b1c8a1SJohn Marino * encoding to be used if required. 565f5b1c8a1SJohn Marino */ 566f5b1c8a1SJohn Marino 567f5b1c8a1SJohn Marino #define ASN1_TFLG_NDEF (0x1<<11) 568f5b1c8a1SJohn Marino 569f5b1c8a1SJohn Marino /* This is the actual ASN1 item itself */ 570f5b1c8a1SJohn Marino 571f5b1c8a1SJohn Marino struct ASN1_ITEM_st { 572f5b1c8a1SJohn Marino char itype; /* The item type, primitive, SEQUENCE, CHOICE or extern */ 573f5b1c8a1SJohn Marino long utype; /* underlying type */ 574f5b1c8a1SJohn Marino const ASN1_TEMPLATE *templates; /* If SEQUENCE or CHOICE this contains the contents */ 575f5b1c8a1SJohn Marino long tcount; /* Number of templates if SEQUENCE or CHOICE */ 576f5b1c8a1SJohn Marino const void *funcs; /* functions that handle this type */ 577f5b1c8a1SJohn Marino long size; /* Structure size (usually)*/ 578f5b1c8a1SJohn Marino const char *sname; /* Structure name */ 579f5b1c8a1SJohn Marino }; 580f5b1c8a1SJohn Marino 581f5b1c8a1SJohn Marino /* These are values for the itype field and 582f5b1c8a1SJohn Marino * determine how the type is interpreted. 583f5b1c8a1SJohn Marino * 584f5b1c8a1SJohn Marino * For PRIMITIVE types the underlying type 585f5b1c8a1SJohn Marino * determines the behaviour if items is NULL. 586f5b1c8a1SJohn Marino * 587f5b1c8a1SJohn Marino * Otherwise templates must contain a single 588f5b1c8a1SJohn Marino * template and the type is treated in the 589f5b1c8a1SJohn Marino * same way as the type specified in the template. 590f5b1c8a1SJohn Marino * 591f5b1c8a1SJohn Marino * For SEQUENCE types the templates field points 592f5b1c8a1SJohn Marino * to the members, the size field is the 593f5b1c8a1SJohn Marino * structure size. 594f5b1c8a1SJohn Marino * 595f5b1c8a1SJohn Marino * For CHOICE types the templates field points 596f5b1c8a1SJohn Marino * to each possible member (typically a union) 597f5b1c8a1SJohn Marino * and the 'size' field is the offset of the 598f5b1c8a1SJohn Marino * selector. 599f5b1c8a1SJohn Marino * 600f5b1c8a1SJohn Marino * The 'funcs' field is used for application 601f5b1c8a1SJohn Marino * specific functions. 602f5b1c8a1SJohn Marino * 603f5b1c8a1SJohn Marino * The EXTERN type uses a new style d2i/i2d. 604f5b1c8a1SJohn Marino * The new style should be used where possible 605f5b1c8a1SJohn Marino * because it avoids things like the d2i IMPLICIT 606f5b1c8a1SJohn Marino * hack. 607f5b1c8a1SJohn Marino * 608f5b1c8a1SJohn Marino * MSTRING is a multiple string type, it is used 609f5b1c8a1SJohn Marino * for a CHOICE of character strings where the 610f5b1c8a1SJohn Marino * actual strings all occupy an ASN1_STRING 611f5b1c8a1SJohn Marino * structure. In this case the 'utype' field 612f5b1c8a1SJohn Marino * has a special meaning, it is used as a mask 613f5b1c8a1SJohn Marino * of acceptable types using the B_ASN1 constants. 614f5b1c8a1SJohn Marino * 615f5b1c8a1SJohn Marino * NDEF_SEQUENCE is the same as SEQUENCE except 616f5b1c8a1SJohn Marino * that it will use indefinite length constructed 617f5b1c8a1SJohn Marino * encoding if requested. 618f5b1c8a1SJohn Marino * 619f5b1c8a1SJohn Marino */ 620f5b1c8a1SJohn Marino 621f5b1c8a1SJohn Marino #define ASN1_ITYPE_PRIMITIVE 0x0 622f5b1c8a1SJohn Marino 623f5b1c8a1SJohn Marino #define ASN1_ITYPE_SEQUENCE 0x1 624f5b1c8a1SJohn Marino 625f5b1c8a1SJohn Marino #define ASN1_ITYPE_CHOICE 0x2 626f5b1c8a1SJohn Marino 627f5b1c8a1SJohn Marino #define ASN1_ITYPE_EXTERN 0x4 628f5b1c8a1SJohn Marino 629f5b1c8a1SJohn Marino #define ASN1_ITYPE_MSTRING 0x5 630f5b1c8a1SJohn Marino 631f5b1c8a1SJohn Marino #define ASN1_ITYPE_NDEF_SEQUENCE 0x6 632f5b1c8a1SJohn Marino 633f5b1c8a1SJohn Marino /* Cache for ASN1 tag and length, so we 634f5b1c8a1SJohn Marino * don't keep re-reading it for things 635f5b1c8a1SJohn Marino * like CHOICE 636f5b1c8a1SJohn Marino */ 637f5b1c8a1SJohn Marino 638f5b1c8a1SJohn Marino struct ASN1_TLC_st { 639f5b1c8a1SJohn Marino char valid; /* Values below are valid */ 640f5b1c8a1SJohn Marino int ret; /* return value */ 641f5b1c8a1SJohn Marino long plen; /* length */ 642f5b1c8a1SJohn Marino int ptag; /* class value */ 643f5b1c8a1SJohn Marino int pclass; /* class value */ 644f5b1c8a1SJohn Marino int hdrlen; /* header length */ 645f5b1c8a1SJohn Marino }; 646f5b1c8a1SJohn Marino 647f5b1c8a1SJohn Marino /* Typedefs for ASN1 function pointers */ 648f5b1c8a1SJohn Marino 649f5b1c8a1SJohn Marino typedef ASN1_VALUE * ASN1_new_func(void); 650f5b1c8a1SJohn Marino typedef void ASN1_free_func(ASN1_VALUE *a); 651f5b1c8a1SJohn Marino typedef ASN1_VALUE * ASN1_d2i_func(ASN1_VALUE **a, const unsigned char ** in, long length); 652f5b1c8a1SJohn Marino typedef int ASN1_i2d_func(ASN1_VALUE * a, unsigned char **in); 653f5b1c8a1SJohn Marino 654f5b1c8a1SJohn Marino typedef int ASN1_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_ITEM *it, 655f5b1c8a1SJohn Marino int tag, int aclass, char opt, ASN1_TLC *ctx); 656f5b1c8a1SJohn Marino 657f5b1c8a1SJohn Marino typedef int ASN1_ex_i2d(ASN1_VALUE **pval, unsigned char **out, const ASN1_ITEM *it, int tag, int aclass); 658f5b1c8a1SJohn Marino typedef int ASN1_ex_new_func(ASN1_VALUE **pval, const ASN1_ITEM *it); 659f5b1c8a1SJohn Marino typedef void ASN1_ex_free_func(ASN1_VALUE **pval, const ASN1_ITEM *it); 660f5b1c8a1SJohn Marino 661f5b1c8a1SJohn Marino typedef int ASN1_ex_print_func(BIO *out, ASN1_VALUE **pval, 662f5b1c8a1SJohn Marino int indent, const char *fname, 663f5b1c8a1SJohn Marino const ASN1_PCTX *pctx); 664f5b1c8a1SJohn Marino 665f5b1c8a1SJohn Marino typedef int ASN1_primitive_i2c(ASN1_VALUE **pval, unsigned char *cont, int *putype, const ASN1_ITEM *it); 666f5b1c8a1SJohn Marino typedef int ASN1_primitive_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, int utype, char *free_cont, const ASN1_ITEM *it); 667f5b1c8a1SJohn Marino typedef int ASN1_primitive_print(BIO *out, ASN1_VALUE **pval, const ASN1_ITEM *it, int indent, const ASN1_PCTX *pctx); 668f5b1c8a1SJohn Marino 669f5b1c8a1SJohn Marino typedef struct ASN1_EXTERN_FUNCS_st { 670f5b1c8a1SJohn Marino void *app_data; 671f5b1c8a1SJohn Marino ASN1_ex_new_func *asn1_ex_new; 672f5b1c8a1SJohn Marino ASN1_ex_free_func *asn1_ex_free; 673f5b1c8a1SJohn Marino ASN1_ex_free_func *asn1_ex_clear; 674f5b1c8a1SJohn Marino ASN1_ex_d2i *asn1_ex_d2i; 675f5b1c8a1SJohn Marino ASN1_ex_i2d *asn1_ex_i2d; 676f5b1c8a1SJohn Marino ASN1_ex_print_func *asn1_ex_print; 677f5b1c8a1SJohn Marino } ASN1_EXTERN_FUNCS; 678f5b1c8a1SJohn Marino 679f5b1c8a1SJohn Marino typedef struct ASN1_PRIMITIVE_FUNCS_st { 680f5b1c8a1SJohn Marino void *app_data; 681f5b1c8a1SJohn Marino unsigned long flags; 682f5b1c8a1SJohn Marino ASN1_ex_new_func *prim_new; 683f5b1c8a1SJohn Marino ASN1_ex_free_func *prim_free; 684f5b1c8a1SJohn Marino ASN1_ex_free_func *prim_clear; 685f5b1c8a1SJohn Marino ASN1_primitive_c2i *prim_c2i; 686f5b1c8a1SJohn Marino ASN1_primitive_i2c *prim_i2c; 687f5b1c8a1SJohn Marino ASN1_primitive_print *prim_print; 688f5b1c8a1SJohn Marino } ASN1_PRIMITIVE_FUNCS; 689f5b1c8a1SJohn Marino 690f5b1c8a1SJohn Marino /* This is the ASN1_AUX structure: it handles various 691f5b1c8a1SJohn Marino * miscellaneous requirements. For example the use of 692f5b1c8a1SJohn Marino * reference counts and an informational callback. 693f5b1c8a1SJohn Marino * 694f5b1c8a1SJohn Marino * The "informational callback" is called at various 695f5b1c8a1SJohn Marino * points during the ASN1 encoding and decoding. It can 696f5b1c8a1SJohn Marino * be used to provide minor customisation of the structures 697f5b1c8a1SJohn Marino * used. This is most useful where the supplied routines 698f5b1c8a1SJohn Marino * *almost* do the right thing but need some extra help 699f5b1c8a1SJohn Marino * at a few points. If the callback returns zero then 700f5b1c8a1SJohn Marino * it is assumed a fatal error has occurred and the 701f5b1c8a1SJohn Marino * main operation should be abandoned. 702f5b1c8a1SJohn Marino * 703f5b1c8a1SJohn Marino * If major changes in the default behaviour are required 704f5b1c8a1SJohn Marino * then an external type is more appropriate. 705f5b1c8a1SJohn Marino */ 706f5b1c8a1SJohn Marino 707f5b1c8a1SJohn Marino typedef int ASN1_aux_cb(int operation, ASN1_VALUE **in, const ASN1_ITEM *it, 708f5b1c8a1SJohn Marino void *exarg); 709f5b1c8a1SJohn Marino 710f5b1c8a1SJohn Marino typedef struct ASN1_AUX_st { 711f5b1c8a1SJohn Marino void *app_data; 712f5b1c8a1SJohn Marino int flags; 713f5b1c8a1SJohn Marino int ref_offset; /* Offset of reference value */ 714f5b1c8a1SJohn Marino int ref_lock; /* Lock type to use */ 715f5b1c8a1SJohn Marino ASN1_aux_cb *asn1_cb; 716f5b1c8a1SJohn Marino int enc_offset; /* Offset of ASN1_ENCODING structure */ 717f5b1c8a1SJohn Marino } ASN1_AUX; 718f5b1c8a1SJohn Marino 719f5b1c8a1SJohn Marino /* For print related callbacks exarg points to this structure */ 720f5b1c8a1SJohn Marino typedef struct ASN1_PRINT_ARG_st { 721f5b1c8a1SJohn Marino BIO *out; 722f5b1c8a1SJohn Marino int indent; 723f5b1c8a1SJohn Marino const ASN1_PCTX *pctx; 724f5b1c8a1SJohn Marino } ASN1_PRINT_ARG; 725f5b1c8a1SJohn Marino 726f5b1c8a1SJohn Marino /* For streaming related callbacks exarg points to this structure */ 727f5b1c8a1SJohn Marino typedef struct ASN1_STREAM_ARG_st { 728f5b1c8a1SJohn Marino /* BIO to stream through */ 729f5b1c8a1SJohn Marino BIO *out; 730f5b1c8a1SJohn Marino /* BIO with filters appended */ 731f5b1c8a1SJohn Marino BIO *ndef_bio; 732f5b1c8a1SJohn Marino /* Streaming I/O boundary */ 733f5b1c8a1SJohn Marino unsigned char **boundary; 734f5b1c8a1SJohn Marino } ASN1_STREAM_ARG; 735f5b1c8a1SJohn Marino 736f5b1c8a1SJohn Marino /* Flags in ASN1_AUX */ 737f5b1c8a1SJohn Marino 738f5b1c8a1SJohn Marino /* Use a reference count */ 739f5b1c8a1SJohn Marino #define ASN1_AFLG_REFCOUNT 1 740f5b1c8a1SJohn Marino /* Save the encoding of structure (useful for signatures) */ 741f5b1c8a1SJohn Marino #define ASN1_AFLG_ENCODING 2 742f5b1c8a1SJohn Marino 743f5b1c8a1SJohn Marino /* operation values for asn1_cb */ 744f5b1c8a1SJohn Marino 745f5b1c8a1SJohn Marino #define ASN1_OP_NEW_PRE 0 746f5b1c8a1SJohn Marino #define ASN1_OP_NEW_POST 1 747f5b1c8a1SJohn Marino #define ASN1_OP_FREE_PRE 2 748f5b1c8a1SJohn Marino #define ASN1_OP_FREE_POST 3 749f5b1c8a1SJohn Marino #define ASN1_OP_D2I_PRE 4 750f5b1c8a1SJohn Marino #define ASN1_OP_D2I_POST 5 751f5b1c8a1SJohn Marino #define ASN1_OP_I2D_PRE 6 752f5b1c8a1SJohn Marino #define ASN1_OP_I2D_POST 7 753f5b1c8a1SJohn Marino #define ASN1_OP_PRINT_PRE 8 754f5b1c8a1SJohn Marino #define ASN1_OP_PRINT_POST 9 755f5b1c8a1SJohn Marino #define ASN1_OP_STREAM_PRE 10 756f5b1c8a1SJohn Marino #define ASN1_OP_STREAM_POST 11 757f5b1c8a1SJohn Marino #define ASN1_OP_DETACHED_PRE 12 758f5b1c8a1SJohn Marino #define ASN1_OP_DETACHED_POST 13 759f5b1c8a1SJohn Marino 760f5b1c8a1SJohn Marino #ifndef LIBRESSL_INTERNAL 761f5b1c8a1SJohn Marino 762f5b1c8a1SJohn Marino /* Macro to implement a primitive type */ 763f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_TYPE(stname) IMPLEMENT_ASN1_TYPE_ex(stname, stname, 0) 764f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_TYPE_ex(itname, vname, ex) \ 765f5b1c8a1SJohn Marino ASN1_ITEM_start(itname) \ 766f5b1c8a1SJohn Marino ASN1_ITYPE_PRIMITIVE, V_##vname, NULL, 0, NULL, ex, #itname \ 767f5b1c8a1SJohn Marino ASN1_ITEM_end(itname) 768f5b1c8a1SJohn Marino 769f5b1c8a1SJohn Marino /* Macro to implement a multi string type */ 770f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_MSTRING(itname, mask) \ 771f5b1c8a1SJohn Marino ASN1_ITEM_start(itname) \ 772f5b1c8a1SJohn Marino ASN1_ITYPE_MSTRING, mask, NULL, 0, NULL, sizeof(ASN1_STRING), #itname \ 773f5b1c8a1SJohn Marino ASN1_ITEM_end(itname) 774f5b1c8a1SJohn Marino #define IMPLEMENT_EXTERN_ASN1(sname, tag, fptrs) \ 775f5b1c8a1SJohn Marino ASN1_ITEM_start(sname) \ 776f5b1c8a1SJohn Marino ASN1_ITYPE_EXTERN, \ 777f5b1c8a1SJohn Marino tag, \ 778f5b1c8a1SJohn Marino NULL, \ 779f5b1c8a1SJohn Marino 0, \ 780f5b1c8a1SJohn Marino &fptrs, \ 781f5b1c8a1SJohn Marino 0, \ 782f5b1c8a1SJohn Marino #sname \ 783f5b1c8a1SJohn Marino ASN1_ITEM_end(sname) 784f5b1c8a1SJohn Marino 785f5b1c8a1SJohn Marino /* Macro to implement standard functions in terms of ASN1_ITEM structures */ 786f5b1c8a1SJohn Marino 787f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_FUNCTIONS(stname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, stname, stname) 788f5b1c8a1SJohn Marino 789f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_FUNCTIONS_name(stname, itname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, itname) 790f5b1c8a1SJohn Marino 791f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_FUNCTIONS_ENCODE_name(stname, itname) \ 792f5b1c8a1SJohn Marino IMPLEMENT_ASN1_FUNCTIONS_ENCODE_fname(stname, itname, itname) 793f5b1c8a1SJohn Marino 794f5b1c8a1SJohn Marino #define IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(stname) \ 795f5b1c8a1SJohn Marino IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(static, stname, stname, stname) 796f5b1c8a1SJohn Marino 797f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_ALLOC_FUNCTIONS(stname) \ 798f5b1c8a1SJohn Marino IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, stname, stname) 799f5b1c8a1SJohn Marino 800f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(pre, stname, itname, fname) \ 801f5b1c8a1SJohn Marino pre stname *fname##_new(void) \ 802f5b1c8a1SJohn Marino { \ 803f5b1c8a1SJohn Marino return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \ 804f5b1c8a1SJohn Marino } \ 805f5b1c8a1SJohn Marino pre void fname##_free(stname *a) \ 806f5b1c8a1SJohn Marino { \ 807f5b1c8a1SJohn Marino ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \ 808f5b1c8a1SJohn Marino } 809f5b1c8a1SJohn Marino 810f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) \ 811f5b1c8a1SJohn Marino stname *fname##_new(void) \ 812f5b1c8a1SJohn Marino { \ 813f5b1c8a1SJohn Marino return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \ 814f5b1c8a1SJohn Marino } \ 815f5b1c8a1SJohn Marino void fname##_free(stname *a) \ 816f5b1c8a1SJohn Marino { \ 817f5b1c8a1SJohn Marino ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \ 818f5b1c8a1SJohn Marino } 819f5b1c8a1SJohn Marino 820f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, fname) \ 821f5b1c8a1SJohn Marino IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \ 822f5b1c8a1SJohn Marino IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) 823f5b1c8a1SJohn Marino 824f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \ 825f5b1c8a1SJohn Marino stname *d2i_##fname(stname **a, const unsigned char **in, long len) \ 826f5b1c8a1SJohn Marino { \ 827f5b1c8a1SJohn Marino return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\ 828f5b1c8a1SJohn Marino } \ 829f5b1c8a1SJohn Marino int i2d_##fname(stname *a, unsigned char **out) \ 830f5b1c8a1SJohn Marino { \ 831f5b1c8a1SJohn Marino return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\ 832f5b1c8a1SJohn Marino } 833f5b1c8a1SJohn Marino 834f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_NDEF_FUNCTION(stname) \ 835f5b1c8a1SJohn Marino int i2d_##stname##_NDEF(stname *a, unsigned char **out) \ 836f5b1c8a1SJohn Marino { \ 837f5b1c8a1SJohn Marino return ASN1_item_ndef_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(stname));\ 838f5b1c8a1SJohn Marino } 839f5b1c8a1SJohn Marino 840f5b1c8a1SJohn Marino /* This includes evil casts to remove const: they will go away when full 841f5b1c8a1SJohn Marino * ASN1 constification is done. 842f5b1c8a1SJohn Marino */ 843f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \ 844f5b1c8a1SJohn Marino stname *d2i_##fname(stname **a, const unsigned char **in, long len) \ 845f5b1c8a1SJohn Marino { \ 846f5b1c8a1SJohn Marino return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\ 847f5b1c8a1SJohn Marino } \ 848f5b1c8a1SJohn Marino int i2d_##fname(const stname *a, unsigned char **out) \ 849f5b1c8a1SJohn Marino { \ 850f5b1c8a1SJohn Marino return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\ 851f5b1c8a1SJohn Marino } 852f5b1c8a1SJohn Marino 853f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_DUP_FUNCTION(stname) \ 854f5b1c8a1SJohn Marino stname * stname##_dup(stname *x) \ 855f5b1c8a1SJohn Marino { \ 856f5b1c8a1SJohn Marino return ASN1_item_dup(ASN1_ITEM_rptr(stname), x); \ 857f5b1c8a1SJohn Marino } 858f5b1c8a1SJohn Marino 859f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_PRINT_FUNCTION(stname) \ 860f5b1c8a1SJohn Marino IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, stname, stname) 861f5b1c8a1SJohn Marino 862f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, itname, fname) \ 863f5b1c8a1SJohn Marino int fname##_print_ctx(BIO *out, stname *x, int indent, \ 864f5b1c8a1SJohn Marino const ASN1_PCTX *pctx) \ 865f5b1c8a1SJohn Marino { \ 866f5b1c8a1SJohn Marino return ASN1_item_print(out, (ASN1_VALUE *)x, indent, \ 867f5b1c8a1SJohn Marino ASN1_ITEM_rptr(itname), pctx); \ 868f5b1c8a1SJohn Marino } 869f5b1c8a1SJohn Marino 870f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_FUNCTIONS_const(name) \ 871f5b1c8a1SJohn Marino IMPLEMENT_ASN1_FUNCTIONS_const_fname(name, name, name) 872f5b1c8a1SJohn Marino 873f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_FUNCTIONS_const_fname(stname, itname, fname) \ 874f5b1c8a1SJohn Marino IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \ 875f5b1c8a1SJohn Marino IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) 876f5b1c8a1SJohn Marino 877f5b1c8a1SJohn Marino #endif /* !LIBRESSL_INTERNAL */ 878f5b1c8a1SJohn Marino 879f5b1c8a1SJohn Marino /* external definitions for primitive types */ 880f5b1c8a1SJohn Marino 88172c33676SMaxim Ag extern const ASN1_ITEM ASN1_BOOLEAN_it; 88272c33676SMaxim Ag extern const ASN1_ITEM ASN1_TBOOLEAN_it; 88372c33676SMaxim Ag extern const ASN1_ITEM ASN1_FBOOLEAN_it; 88472c33676SMaxim Ag extern const ASN1_ITEM ASN1_SEQUENCE_it; 88572c33676SMaxim Ag extern const ASN1_ITEM BIGNUM_it; 88672c33676SMaxim Ag extern const ASN1_ITEM LONG_it; 88772c33676SMaxim Ag extern const ASN1_ITEM ZLONG_it; 888f5b1c8a1SJohn Marino 889*de0e0e4dSAntonio Huete Jimenez #ifndef LIBRESSL_INTERNAL 890*de0e0e4dSAntonio Huete Jimenez extern const ASN1_ITEM CBIGNUM_it; 891*de0e0e4dSAntonio Huete Jimenez #endif 892*de0e0e4dSAntonio Huete Jimenez 893f5b1c8a1SJohn Marino DECLARE_STACK_OF(ASN1_VALUE) 894f5b1c8a1SJohn Marino 895f5b1c8a1SJohn Marino /* Functions used internally by the ASN1 code */ 896f5b1c8a1SJohn Marino 897f5b1c8a1SJohn Marino int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it); 898f5b1c8a1SJohn Marino void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it); 899f5b1c8a1SJohn Marino int ASN1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); 900f5b1c8a1SJohn Marino int ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it); 901f5b1c8a1SJohn Marino 902f5b1c8a1SJohn Marino void ASN1_template_free(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); 903f5b1c8a1SJohn Marino int ASN1_template_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_TEMPLATE *tt); 904f5b1c8a1SJohn Marino int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_ITEM *it, 905f5b1c8a1SJohn Marino int tag, int aclass, char opt, ASN1_TLC *ctx); 906f5b1c8a1SJohn Marino 907f5b1c8a1SJohn Marino int ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out, const ASN1_ITEM *it, int tag, int aclass); 908f5b1c8a1SJohn Marino int ASN1_template_i2d(ASN1_VALUE **pval, unsigned char **out, const ASN1_TEMPLATE *tt); 909f5b1c8a1SJohn Marino void ASN1_primitive_free(ASN1_VALUE **pval, const ASN1_ITEM *it); 910f5b1c8a1SJohn Marino 911f5b1c8a1SJohn Marino #ifdef __cplusplus 912f5b1c8a1SJohn Marino } 913f5b1c8a1SJohn Marino #endif 914f5b1c8a1SJohn Marino #endif 915