1*cca6fc52SDaniel Fojt /* $OpenBSD: asn1t.h,v 1.15 2019/08/20 13:10:09 inoguchi 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 84*cca6fc52SDaniel Fojt #define static_ASN1_ITEM_start(itname) \ 85*cca6fc52SDaniel Fojt static const ASN1_ITEM itname##_it = { 86*cca6fc52SDaniel 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 109*cca6fc52SDaniel Fojt #define static_ASN1_ITEM_TEMPLATE_END(tname) \ 110*cca6fc52SDaniel Fojt ;\ 111*cca6fc52SDaniel Fojt static_ASN1_ITEM_start(tname) \ 112*cca6fc52SDaniel Fojt ASN1_ITYPE_PRIMITIVE,\ 113*cca6fc52SDaniel Fojt -1,\ 114*cca6fc52SDaniel Fojt &tname##_item_tt,\ 115*cca6fc52SDaniel Fojt 0,\ 116*cca6fc52SDaniel Fojt NULL,\ 117*cca6fc52SDaniel Fojt 0,\ 118*cca6fc52SDaniel Fojt #tname \ 119*cca6fc52SDaniel Fojt ASN1_ITEM_end(tname) 120*cca6fc52SDaniel Fojt 121f5b1c8a1SJohn Marino 122f5b1c8a1SJohn Marino /* This is a ASN1 type which just embeds a template */ 123f5b1c8a1SJohn Marino 124f5b1c8a1SJohn Marino /* This pair helps declare a SEQUENCE. We can do: 125f5b1c8a1SJohn Marino * 126f5b1c8a1SJohn Marino * ASN1_SEQUENCE(stname) = { 127f5b1c8a1SJohn Marino * ... SEQUENCE components ... 128f5b1c8a1SJohn Marino * } ASN1_SEQUENCE_END(stname) 129f5b1c8a1SJohn Marino * 130f5b1c8a1SJohn Marino * This will produce an ASN1_ITEM called stname_it 131f5b1c8a1SJohn Marino * for a structure called stname. 132f5b1c8a1SJohn Marino * 133f5b1c8a1SJohn Marino * If you want the same structure but a different 134f5b1c8a1SJohn Marino * name then use: 135f5b1c8a1SJohn Marino * 136f5b1c8a1SJohn Marino * ASN1_SEQUENCE(itname) = { 137f5b1c8a1SJohn Marino * ... SEQUENCE components ... 138f5b1c8a1SJohn Marino * } ASN1_SEQUENCE_END_name(stname, itname) 139f5b1c8a1SJohn Marino * 140f5b1c8a1SJohn Marino * This will create an item called itname_it using 141f5b1c8a1SJohn Marino * a structure called stname. 142f5b1c8a1SJohn Marino */ 143f5b1c8a1SJohn Marino 144f5b1c8a1SJohn Marino #define ASN1_SEQUENCE(tname) \ 145f5b1c8a1SJohn Marino static const ASN1_TEMPLATE tname##_seq_tt[] 146f5b1c8a1SJohn Marino 147f5b1c8a1SJohn Marino #define ASN1_SEQUENCE_END(stname) ASN1_SEQUENCE_END_name(stname, stname) 148f5b1c8a1SJohn Marino 149*cca6fc52SDaniel Fojt #define static_ASN1_SEQUENCE_END(stname) static_ASN1_SEQUENCE_END_name(stname, stname) 150*cca6fc52SDaniel Fojt 151f5b1c8a1SJohn Marino #define ASN1_SEQUENCE_END_name(stname, tname) \ 152f5b1c8a1SJohn Marino ;\ 153f5b1c8a1SJohn Marino ASN1_ITEM_start(tname) \ 154f5b1c8a1SJohn Marino ASN1_ITYPE_SEQUENCE,\ 155f5b1c8a1SJohn Marino V_ASN1_SEQUENCE,\ 156f5b1c8a1SJohn Marino tname##_seq_tt,\ 157f5b1c8a1SJohn Marino sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ 158f5b1c8a1SJohn Marino NULL,\ 159f5b1c8a1SJohn Marino sizeof(stname),\ 160f5b1c8a1SJohn Marino #stname \ 161f5b1c8a1SJohn Marino ASN1_ITEM_end(tname) 162f5b1c8a1SJohn Marino 163*cca6fc52SDaniel Fojt #define static_ASN1_SEQUENCE_END_name(stname, tname) \ 164*cca6fc52SDaniel Fojt ;\ 165*cca6fc52SDaniel Fojt static_ASN1_ITEM_start(tname) \ 166*cca6fc52SDaniel Fojt ASN1_ITYPE_SEQUENCE,\ 167*cca6fc52SDaniel Fojt V_ASN1_SEQUENCE,\ 168*cca6fc52SDaniel Fojt tname##_seq_tt,\ 169*cca6fc52SDaniel Fojt sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ 170*cca6fc52SDaniel Fojt NULL,\ 171*cca6fc52SDaniel Fojt sizeof(stname),\ 172*cca6fc52SDaniel Fojt #stname \ 173*cca6fc52SDaniel Fojt ASN1_ITEM_end(tname) 174*cca6fc52SDaniel Fojt 175f5b1c8a1SJohn Marino #define ASN1_NDEF_SEQUENCE(tname) \ 176f5b1c8a1SJohn Marino ASN1_SEQUENCE(tname) 177f5b1c8a1SJohn Marino 178f5b1c8a1SJohn Marino #define ASN1_NDEF_SEQUENCE_cb(tname, cb) \ 179f5b1c8a1SJohn Marino ASN1_SEQUENCE_cb(tname, cb) 180f5b1c8a1SJohn Marino 181f5b1c8a1SJohn Marino #define ASN1_SEQUENCE_cb(tname, cb) \ 182f5b1c8a1SJohn Marino static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; \ 183f5b1c8a1SJohn Marino ASN1_SEQUENCE(tname) 184f5b1c8a1SJohn Marino 185f5b1c8a1SJohn Marino #define ASN1_BROKEN_SEQUENCE(tname) \ 186f5b1c8a1SJohn Marino static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_BROKEN, 0, 0, 0, 0}; \ 187f5b1c8a1SJohn Marino ASN1_SEQUENCE(tname) 188f5b1c8a1SJohn Marino 189f5b1c8a1SJohn Marino #define ASN1_SEQUENCE_ref(tname, cb, lck) \ 190f5b1c8a1SJohn Marino static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_REFCOUNT, offsetof(tname, references), lck, cb, 0}; \ 191f5b1c8a1SJohn Marino ASN1_SEQUENCE(tname) 192f5b1c8a1SJohn Marino 193f5b1c8a1SJohn Marino #define ASN1_SEQUENCE_enc(tname, enc, cb) \ 194f5b1c8a1SJohn Marino static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_ENCODING, 0, 0, cb, offsetof(tname, enc)}; \ 195f5b1c8a1SJohn Marino ASN1_SEQUENCE(tname) 196f5b1c8a1SJohn Marino 197f5b1c8a1SJohn Marino #define ASN1_NDEF_SEQUENCE_END(tname) \ 198f5b1c8a1SJohn Marino ;\ 199f5b1c8a1SJohn Marino ASN1_ITEM_start(tname) \ 200f5b1c8a1SJohn Marino ASN1_ITYPE_NDEF_SEQUENCE,\ 201f5b1c8a1SJohn Marino V_ASN1_SEQUENCE,\ 202f5b1c8a1SJohn Marino tname##_seq_tt,\ 203f5b1c8a1SJohn Marino sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ 204f5b1c8a1SJohn Marino NULL,\ 205f5b1c8a1SJohn Marino sizeof(tname),\ 206f5b1c8a1SJohn Marino #tname \ 207f5b1c8a1SJohn Marino ASN1_ITEM_end(tname) 208f5b1c8a1SJohn Marino 209*cca6fc52SDaniel Fojt #define static_ASN1_NDEF_SEQUENCE_END(tname) \ 210*cca6fc52SDaniel Fojt ;\ 211*cca6fc52SDaniel Fojt static_ASN1_ITEM_start(tname) \ 212*cca6fc52SDaniel Fojt ASN1_ITYPE_NDEF_SEQUENCE,\ 213*cca6fc52SDaniel Fojt V_ASN1_SEQUENCE,\ 214*cca6fc52SDaniel Fojt tname##_seq_tt,\ 215*cca6fc52SDaniel Fojt sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ 216*cca6fc52SDaniel Fojt NULL,\ 217*cca6fc52SDaniel Fojt sizeof(tname),\ 218*cca6fc52SDaniel Fojt #tname \ 219*cca6fc52SDaniel Fojt ASN1_ITEM_end(tname) 220*cca6fc52SDaniel Fojt 221f5b1c8a1SJohn Marino #define ASN1_BROKEN_SEQUENCE_END(stname) ASN1_SEQUENCE_END_ref(stname, stname) 222f5b1c8a1SJohn Marino 223f5b1c8a1SJohn Marino #define ASN1_SEQUENCE_END_enc(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname) 224f5b1c8a1SJohn Marino 225f5b1c8a1SJohn Marino #define ASN1_SEQUENCE_END_cb(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname) 226f5b1c8a1SJohn Marino 227*cca6fc52SDaniel Fojt #define static_ASN1_SEQUENCE_END_cb(stname, tname) static_ASN1_SEQUENCE_END_ref(stname, tname) 228*cca6fc52SDaniel Fojt 229f5b1c8a1SJohn Marino #define ASN1_SEQUENCE_END_ref(stname, tname) \ 230f5b1c8a1SJohn Marino ;\ 231f5b1c8a1SJohn Marino ASN1_ITEM_start(tname) \ 232f5b1c8a1SJohn Marino ASN1_ITYPE_SEQUENCE,\ 233f5b1c8a1SJohn Marino V_ASN1_SEQUENCE,\ 234f5b1c8a1SJohn Marino tname##_seq_tt,\ 235f5b1c8a1SJohn Marino sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ 236f5b1c8a1SJohn Marino &tname##_aux,\ 237f5b1c8a1SJohn Marino sizeof(stname),\ 238f5b1c8a1SJohn Marino #stname \ 239f5b1c8a1SJohn Marino ASN1_ITEM_end(tname) 240f5b1c8a1SJohn Marino 241*cca6fc52SDaniel Fojt #define static_ASN1_SEQUENCE_END_ref(stname, tname) \ 242*cca6fc52SDaniel Fojt ;\ 243*cca6fc52SDaniel Fojt static_ASN1_ITEM_start(tname) \ 244*cca6fc52SDaniel Fojt ASN1_ITYPE_SEQUENCE,\ 245*cca6fc52SDaniel Fojt V_ASN1_SEQUENCE,\ 246*cca6fc52SDaniel Fojt tname##_seq_tt,\ 247*cca6fc52SDaniel Fojt sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ 248*cca6fc52SDaniel Fojt &tname##_aux,\ 249*cca6fc52SDaniel Fojt sizeof(stname),\ 250*cca6fc52SDaniel Fojt #stname \ 251*cca6fc52SDaniel Fojt ASN1_ITEM_end(tname) 252*cca6fc52SDaniel Fojt 253f5b1c8a1SJohn Marino #define ASN1_NDEF_SEQUENCE_END_cb(stname, tname) \ 254f5b1c8a1SJohn Marino ;\ 255f5b1c8a1SJohn Marino ASN1_ITEM_start(tname) \ 256f5b1c8a1SJohn Marino ASN1_ITYPE_NDEF_SEQUENCE,\ 257f5b1c8a1SJohn Marino V_ASN1_SEQUENCE,\ 258f5b1c8a1SJohn Marino tname##_seq_tt,\ 259f5b1c8a1SJohn Marino sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ 260f5b1c8a1SJohn Marino &tname##_aux,\ 261f5b1c8a1SJohn Marino sizeof(stname),\ 262f5b1c8a1SJohn Marino #stname \ 263f5b1c8a1SJohn Marino ASN1_ITEM_end(tname) 264f5b1c8a1SJohn Marino 265f5b1c8a1SJohn Marino 266f5b1c8a1SJohn Marino /* This pair helps declare a CHOICE type. We can do: 267f5b1c8a1SJohn Marino * 268f5b1c8a1SJohn Marino * ASN1_CHOICE(chname) = { 269f5b1c8a1SJohn Marino * ... CHOICE options ... 270f5b1c8a1SJohn Marino * ASN1_CHOICE_END(chname) 271f5b1c8a1SJohn Marino * 272f5b1c8a1SJohn Marino * This will produce an ASN1_ITEM called chname_it 273f5b1c8a1SJohn Marino * for a structure called chname. The structure 274f5b1c8a1SJohn Marino * definition must look like this: 275f5b1c8a1SJohn Marino * typedef struct { 276f5b1c8a1SJohn Marino * int type; 277f5b1c8a1SJohn Marino * union { 278f5b1c8a1SJohn Marino * ASN1_SOMETHING *opt1; 279f5b1c8a1SJohn Marino * ASN1_SOMEOTHER *opt2; 280f5b1c8a1SJohn Marino * } value; 281f5b1c8a1SJohn Marino * } chname; 282f5b1c8a1SJohn Marino * 283f5b1c8a1SJohn Marino * the name of the selector must be 'type'. 284f5b1c8a1SJohn Marino * to use an alternative selector name use the 285f5b1c8a1SJohn Marino * ASN1_CHOICE_END_selector() version. 286f5b1c8a1SJohn Marino */ 287f5b1c8a1SJohn Marino 288f5b1c8a1SJohn Marino #define ASN1_CHOICE(tname) \ 289f5b1c8a1SJohn Marino static const ASN1_TEMPLATE tname##_ch_tt[] 290f5b1c8a1SJohn Marino 291f5b1c8a1SJohn Marino #define ASN1_CHOICE_cb(tname, cb) \ 292f5b1c8a1SJohn Marino static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; \ 293f5b1c8a1SJohn Marino ASN1_CHOICE(tname) 294f5b1c8a1SJohn Marino 295f5b1c8a1SJohn Marino #define ASN1_CHOICE_END(stname) ASN1_CHOICE_END_name(stname, stname) 296f5b1c8a1SJohn Marino 297*cca6fc52SDaniel Fojt #define static_ASN1_CHOICE_END(stname) static_ASN1_CHOICE_END_name(stname, stname) 298*cca6fc52SDaniel Fojt 299f5b1c8a1SJohn Marino #define ASN1_CHOICE_END_name(stname, tname) ASN1_CHOICE_END_selector(stname, tname, type) 300f5b1c8a1SJohn Marino 301*cca6fc52SDaniel Fojt #define static_ASN1_CHOICE_END_name(stname, tname) static_ASN1_CHOICE_END_selector(stname, tname, type) 302*cca6fc52SDaniel Fojt 303f5b1c8a1SJohn Marino #define ASN1_CHOICE_END_selector(stname, tname, selname) \ 304f5b1c8a1SJohn Marino ;\ 305f5b1c8a1SJohn Marino ASN1_ITEM_start(tname) \ 306f5b1c8a1SJohn Marino ASN1_ITYPE_CHOICE,\ 307f5b1c8a1SJohn Marino offsetof(stname,selname) ,\ 308f5b1c8a1SJohn Marino tname##_ch_tt,\ 309f5b1c8a1SJohn Marino sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\ 310f5b1c8a1SJohn Marino NULL,\ 311f5b1c8a1SJohn Marino sizeof(stname),\ 312f5b1c8a1SJohn Marino #stname \ 313f5b1c8a1SJohn Marino ASN1_ITEM_end(tname) 314f5b1c8a1SJohn Marino 315*cca6fc52SDaniel Fojt #define static_ASN1_CHOICE_END_selector(stname, tname, selname) \ 316*cca6fc52SDaniel Fojt ;\ 317*cca6fc52SDaniel Fojt static_ASN1_ITEM_start(tname) \ 318*cca6fc52SDaniel Fojt ASN1_ITYPE_CHOICE,\ 319*cca6fc52SDaniel Fojt offsetof(stname,selname) ,\ 320*cca6fc52SDaniel Fojt tname##_ch_tt,\ 321*cca6fc52SDaniel Fojt sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\ 322*cca6fc52SDaniel Fojt NULL,\ 323*cca6fc52SDaniel Fojt sizeof(stname),\ 324*cca6fc52SDaniel Fojt #stname \ 325*cca6fc52SDaniel Fojt ASN1_ITEM_end(tname) 326*cca6fc52SDaniel Fojt 327f5b1c8a1SJohn Marino #define ASN1_CHOICE_END_cb(stname, tname, selname) \ 328f5b1c8a1SJohn Marino ;\ 329f5b1c8a1SJohn Marino ASN1_ITEM_start(tname) \ 330f5b1c8a1SJohn Marino ASN1_ITYPE_CHOICE,\ 331f5b1c8a1SJohn Marino offsetof(stname,selname) ,\ 332f5b1c8a1SJohn Marino tname##_ch_tt,\ 333f5b1c8a1SJohn Marino sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\ 334f5b1c8a1SJohn Marino &tname##_aux,\ 335f5b1c8a1SJohn Marino sizeof(stname),\ 336f5b1c8a1SJohn Marino #stname \ 337f5b1c8a1SJohn Marino ASN1_ITEM_end(tname) 338f5b1c8a1SJohn Marino 339f5b1c8a1SJohn Marino /* This helps with the template wrapper form of ASN1_ITEM */ 340f5b1c8a1SJohn Marino 341f5b1c8a1SJohn Marino #define ASN1_EX_TEMPLATE_TYPE(flags, tag, name, type) { \ 342f5b1c8a1SJohn Marino (flags), (tag), 0,\ 343f5b1c8a1SJohn Marino #name, ASN1_ITEM_ref(type) } 344f5b1c8a1SJohn Marino 345f5b1c8a1SJohn Marino /* These help with SEQUENCE or CHOICE components */ 346f5b1c8a1SJohn Marino 347f5b1c8a1SJohn Marino /* used to declare other types */ 348f5b1c8a1SJohn Marino 349f5b1c8a1SJohn Marino #define ASN1_EX_TYPE(flags, tag, stname, field, type) { \ 350f5b1c8a1SJohn Marino (flags), (tag), offsetof(stname, field),\ 351f5b1c8a1SJohn Marino #field, ASN1_ITEM_ref(type) } 352f5b1c8a1SJohn Marino 353f5b1c8a1SJohn Marino /* used when the structure is combined with the parent */ 354f5b1c8a1SJohn Marino 355f5b1c8a1SJohn Marino #define ASN1_EX_COMBINE(flags, tag, type) { \ 356f5b1c8a1SJohn Marino (flags)|ASN1_TFLG_COMBINE, (tag), 0, NULL, ASN1_ITEM_ref(type) } 357f5b1c8a1SJohn Marino 358f5b1c8a1SJohn Marino /* implicit and explicit helper macros */ 359f5b1c8a1SJohn Marino 360f5b1c8a1SJohn Marino #define ASN1_IMP_EX(stname, field, type, tag, ex) \ 361f5b1c8a1SJohn Marino ASN1_EX_TYPE(ASN1_TFLG_IMPLICIT | ex, tag, stname, field, type) 362f5b1c8a1SJohn Marino 363f5b1c8a1SJohn Marino #define ASN1_EXP_EX(stname, field, type, tag, ex) \ 364f5b1c8a1SJohn Marino ASN1_EX_TYPE(ASN1_TFLG_EXPLICIT | ex, tag, stname, field, type) 365f5b1c8a1SJohn Marino 366f5b1c8a1SJohn Marino /* Any defined by macros: the field used is in the table itself */ 367f5b1c8a1SJohn Marino 368f5b1c8a1SJohn Marino #define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) } 369f5b1c8a1SJohn Marino #define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) } 370f5b1c8a1SJohn Marino /* Plain simple type */ 371f5b1c8a1SJohn Marino #define ASN1_SIMPLE(stname, field, type) ASN1_EX_TYPE(0,0, stname, field, type) 372f5b1c8a1SJohn Marino 373f5b1c8a1SJohn Marino /* OPTIONAL simple type */ 374f5b1c8a1SJohn Marino #define ASN1_OPT(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_OPTIONAL, 0, stname, field, type) 375f5b1c8a1SJohn Marino 376f5b1c8a1SJohn Marino /* IMPLICIT tagged simple type */ 377f5b1c8a1SJohn Marino #define ASN1_IMP(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, 0) 378f5b1c8a1SJohn Marino 379f5b1c8a1SJohn Marino /* IMPLICIT tagged OPTIONAL simple type */ 380f5b1c8a1SJohn Marino #define ASN1_IMP_OPT(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL) 381f5b1c8a1SJohn Marino 382f5b1c8a1SJohn Marino /* Same as above but EXPLICIT */ 383f5b1c8a1SJohn Marino 384f5b1c8a1SJohn Marino #define ASN1_EXP(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, 0) 385f5b1c8a1SJohn Marino #define ASN1_EXP_OPT(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL) 386f5b1c8a1SJohn Marino 387f5b1c8a1SJohn Marino /* SEQUENCE OF type */ 388f5b1c8a1SJohn Marino #define ASN1_SEQUENCE_OF(stname, field, type) \ 389f5b1c8a1SJohn Marino ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, stname, field, type) 390f5b1c8a1SJohn Marino 391f5b1c8a1SJohn Marino /* OPTIONAL SEQUENCE OF */ 392f5b1c8a1SJohn Marino #define ASN1_SEQUENCE_OF_OPT(stname, field, type) \ 393f5b1c8a1SJohn Marino ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type) 394f5b1c8a1SJohn Marino 395f5b1c8a1SJohn Marino /* Same as above but for SET OF */ 396f5b1c8a1SJohn Marino 397f5b1c8a1SJohn Marino #define ASN1_SET_OF(stname, field, type) \ 398f5b1c8a1SJohn Marino ASN1_EX_TYPE(ASN1_TFLG_SET_OF, 0, stname, field, type) 399f5b1c8a1SJohn Marino 400f5b1c8a1SJohn Marino #define ASN1_SET_OF_OPT(stname, field, type) \ 401f5b1c8a1SJohn Marino ASN1_EX_TYPE(ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type) 402f5b1c8a1SJohn Marino 403f5b1c8a1SJohn Marino /* Finally compound types of SEQUENCE, SET, IMPLICIT, EXPLICIT and OPTIONAL */ 404f5b1c8a1SJohn Marino 405f5b1c8a1SJohn Marino #define ASN1_IMP_SET_OF(stname, field, type, tag) \ 406f5b1c8a1SJohn Marino ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF) 407f5b1c8a1SJohn Marino 408f5b1c8a1SJohn Marino #define ASN1_EXP_SET_OF(stname, field, type, tag) \ 409f5b1c8a1SJohn Marino ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF) 410f5b1c8a1SJohn Marino 411f5b1c8a1SJohn Marino #define ASN1_IMP_SET_OF_OPT(stname, field, type, tag) \ 412f5b1c8a1SJohn Marino ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL) 413f5b1c8a1SJohn Marino 414f5b1c8a1SJohn Marino #define ASN1_EXP_SET_OF_OPT(stname, field, type, tag) \ 415f5b1c8a1SJohn Marino ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL) 416f5b1c8a1SJohn Marino 417f5b1c8a1SJohn Marino #define ASN1_IMP_SEQUENCE_OF(stname, field, type, tag) \ 418f5b1c8a1SJohn Marino ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF) 419f5b1c8a1SJohn Marino 420f5b1c8a1SJohn Marino #define ASN1_IMP_SEQUENCE_OF_OPT(stname, field, type, tag) \ 421f5b1c8a1SJohn Marino ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL) 422f5b1c8a1SJohn Marino 423f5b1c8a1SJohn Marino #define ASN1_EXP_SEQUENCE_OF(stname, field, type, tag) \ 424f5b1c8a1SJohn Marino ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF) 425f5b1c8a1SJohn Marino 426f5b1c8a1SJohn Marino #define ASN1_EXP_SEQUENCE_OF_OPT(stname, field, type, tag) \ 427f5b1c8a1SJohn Marino ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL) 428f5b1c8a1SJohn Marino 429f5b1c8a1SJohn Marino /* EXPLICIT using indefinite length constructed form */ 430f5b1c8a1SJohn Marino #define ASN1_NDEF_EXP(stname, field, type, tag) \ 431f5b1c8a1SJohn Marino ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_NDEF) 432f5b1c8a1SJohn Marino 433f5b1c8a1SJohn Marino /* EXPLICIT OPTIONAL using indefinite length constructed form */ 434f5b1c8a1SJohn Marino #define ASN1_NDEF_EXP_OPT(stname, field, type, tag) \ 435f5b1c8a1SJohn Marino ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL|ASN1_TFLG_NDEF) 436f5b1c8a1SJohn Marino 437f5b1c8a1SJohn Marino /* Macros for the ASN1_ADB structure */ 438f5b1c8a1SJohn Marino 439f5b1c8a1SJohn Marino #define ASN1_ADB(name) \ 440f5b1c8a1SJohn Marino static const ASN1_ADB_TABLE name##_adbtbl[] 441f5b1c8a1SJohn Marino 442f5b1c8a1SJohn Marino 443f5b1c8a1SJohn Marino #define ASN1_ADB_END(name, flags, field, app_table, def, none) \ 444f5b1c8a1SJohn Marino ;\ 445f5b1c8a1SJohn Marino static const ASN1_ADB name##_adb = {\ 446f5b1c8a1SJohn Marino flags,\ 447f5b1c8a1SJohn Marino offsetof(name, field),\ 448f5b1c8a1SJohn Marino app_table,\ 449f5b1c8a1SJohn Marino name##_adbtbl,\ 450f5b1c8a1SJohn Marino sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),\ 451f5b1c8a1SJohn Marino def,\ 452f5b1c8a1SJohn Marino none\ 453f5b1c8a1SJohn Marino } 454f5b1c8a1SJohn Marino 455f5b1c8a1SJohn Marino 456f5b1c8a1SJohn Marino #define ADB_ENTRY(val, template) {val, template} 457f5b1c8a1SJohn Marino 458f5b1c8a1SJohn Marino #define ASN1_ADB_TEMPLATE(name) \ 459f5b1c8a1SJohn Marino static const ASN1_TEMPLATE name##_tt 460f5b1c8a1SJohn Marino 461f5b1c8a1SJohn Marino #endif /* !LIBRESSL_INTERNAL */ 462f5b1c8a1SJohn Marino 463f5b1c8a1SJohn Marino /* This is the ASN1 template structure that defines 464f5b1c8a1SJohn Marino * a wrapper round the actual type. It determines the 465f5b1c8a1SJohn Marino * actual position of the field in the value structure, 466f5b1c8a1SJohn Marino * various flags such as OPTIONAL and the field name. 467f5b1c8a1SJohn Marino */ 468f5b1c8a1SJohn Marino 469f5b1c8a1SJohn Marino struct ASN1_TEMPLATE_st { 470f5b1c8a1SJohn Marino unsigned long flags; /* Various flags */ 471f5b1c8a1SJohn Marino long tag; /* tag, not used if no tagging */ 472f5b1c8a1SJohn Marino unsigned long offset; /* Offset of this field in structure */ 473f5b1c8a1SJohn Marino #ifndef NO_ASN1_FIELD_NAMES 474f5b1c8a1SJohn Marino const char *field_name; /* Field name */ 475f5b1c8a1SJohn Marino #endif 476f5b1c8a1SJohn Marino ASN1_ITEM_EXP *item; /* Relevant ASN1_ITEM or ASN1_ADB */ 477f5b1c8a1SJohn Marino }; 478f5b1c8a1SJohn Marino 479f5b1c8a1SJohn Marino /* Macro to extract ASN1_ITEM and ASN1_ADB pointer from ASN1_TEMPLATE */ 480f5b1c8a1SJohn Marino 481f5b1c8a1SJohn Marino #define ASN1_TEMPLATE_item(t) (t->item_ptr) 482f5b1c8a1SJohn Marino #define ASN1_TEMPLATE_adb(t) (t->item_ptr) 483f5b1c8a1SJohn Marino 484f5b1c8a1SJohn Marino typedef struct ASN1_ADB_TABLE_st ASN1_ADB_TABLE; 485f5b1c8a1SJohn Marino typedef struct ASN1_ADB_st ASN1_ADB; 486f5b1c8a1SJohn Marino 487f5b1c8a1SJohn Marino struct ASN1_ADB_st { 488f5b1c8a1SJohn Marino unsigned long flags; /* Various flags */ 489f5b1c8a1SJohn Marino unsigned long offset; /* Offset of selector field */ 490f5b1c8a1SJohn Marino STACK_OF(ASN1_ADB_TABLE) **app_items; /* Application defined items */ 491f5b1c8a1SJohn Marino const ASN1_ADB_TABLE *tbl; /* Table of possible types */ 492f5b1c8a1SJohn Marino long tblcount; /* Number of entries in tbl */ 493f5b1c8a1SJohn Marino const ASN1_TEMPLATE *default_tt; /* Type to use if no match */ 494f5b1c8a1SJohn Marino const ASN1_TEMPLATE *null_tt; /* Type to use if selector is NULL */ 495f5b1c8a1SJohn Marino }; 496f5b1c8a1SJohn Marino 497f5b1c8a1SJohn Marino struct ASN1_ADB_TABLE_st { 498f5b1c8a1SJohn Marino long value; /* NID for an object or value for an int */ 499f5b1c8a1SJohn Marino const ASN1_TEMPLATE tt; /* item for this value */ 500f5b1c8a1SJohn Marino }; 501f5b1c8a1SJohn Marino 502f5b1c8a1SJohn Marino /* template flags */ 503f5b1c8a1SJohn Marino 504f5b1c8a1SJohn Marino /* Field is optional */ 505f5b1c8a1SJohn Marino #define ASN1_TFLG_OPTIONAL (0x1) 506f5b1c8a1SJohn Marino 507f5b1c8a1SJohn Marino /* Field is a SET OF */ 508f5b1c8a1SJohn Marino #define ASN1_TFLG_SET_OF (0x1 << 1) 509f5b1c8a1SJohn Marino 510f5b1c8a1SJohn Marino /* Field is a SEQUENCE OF */ 511f5b1c8a1SJohn Marino #define ASN1_TFLG_SEQUENCE_OF (0x2 << 1) 512f5b1c8a1SJohn Marino 513f5b1c8a1SJohn Marino /* Special case: this refers to a SET OF that 514f5b1c8a1SJohn Marino * will be sorted into DER order when encoded *and* 515f5b1c8a1SJohn Marino * the corresponding STACK will be modified to match 516f5b1c8a1SJohn Marino * the new order. 517f5b1c8a1SJohn Marino */ 518f5b1c8a1SJohn Marino #define ASN1_TFLG_SET_ORDER (0x3 << 1) 519f5b1c8a1SJohn Marino 520f5b1c8a1SJohn Marino /* Mask for SET OF or SEQUENCE OF */ 521f5b1c8a1SJohn Marino #define ASN1_TFLG_SK_MASK (0x3 << 1) 522f5b1c8a1SJohn Marino 523f5b1c8a1SJohn Marino /* These flags mean the tag should be taken from the 524f5b1c8a1SJohn Marino * tag field. If EXPLICIT then the underlying type 525f5b1c8a1SJohn Marino * is used for the inner tag. 526f5b1c8a1SJohn Marino */ 527f5b1c8a1SJohn Marino 528f5b1c8a1SJohn Marino /* IMPLICIT tagging */ 529f5b1c8a1SJohn Marino #define ASN1_TFLG_IMPTAG (0x1 << 3) 530f5b1c8a1SJohn Marino 531f5b1c8a1SJohn Marino 532f5b1c8a1SJohn Marino /* EXPLICIT tagging, inner tag from underlying type */ 533f5b1c8a1SJohn Marino #define ASN1_TFLG_EXPTAG (0x2 << 3) 534f5b1c8a1SJohn Marino 535f5b1c8a1SJohn Marino #define ASN1_TFLG_TAG_MASK (0x3 << 3) 536f5b1c8a1SJohn Marino 537f5b1c8a1SJohn Marino /* context specific IMPLICIT */ 538f5b1c8a1SJohn Marino #define ASN1_TFLG_IMPLICIT ASN1_TFLG_IMPTAG|ASN1_TFLG_CONTEXT 539f5b1c8a1SJohn Marino 540f5b1c8a1SJohn Marino /* context specific EXPLICIT */ 541f5b1c8a1SJohn Marino #define ASN1_TFLG_EXPLICIT ASN1_TFLG_EXPTAG|ASN1_TFLG_CONTEXT 542f5b1c8a1SJohn Marino 543f5b1c8a1SJohn Marino /* If tagging is in force these determine the 544f5b1c8a1SJohn Marino * type of tag to use. Otherwise the tag is 545f5b1c8a1SJohn Marino * determined by the underlying type. These 546f5b1c8a1SJohn Marino * values reflect the actual octet format. 547f5b1c8a1SJohn Marino */ 548f5b1c8a1SJohn Marino 549f5b1c8a1SJohn Marino /* Universal tag */ 550f5b1c8a1SJohn Marino #define ASN1_TFLG_UNIVERSAL (0x0<<6) 551f5b1c8a1SJohn Marino /* Application tag */ 552f5b1c8a1SJohn Marino #define ASN1_TFLG_APPLICATION (0x1<<6) 553f5b1c8a1SJohn Marino /* Context specific tag */ 554f5b1c8a1SJohn Marino #define ASN1_TFLG_CONTEXT (0x2<<6) 555f5b1c8a1SJohn Marino /* Private tag */ 556f5b1c8a1SJohn Marino #define ASN1_TFLG_PRIVATE (0x3<<6) 557f5b1c8a1SJohn Marino 558f5b1c8a1SJohn Marino #define ASN1_TFLG_TAG_CLASS (0x3<<6) 559f5b1c8a1SJohn Marino 560f5b1c8a1SJohn Marino /* These are for ANY DEFINED BY type. In this case 561f5b1c8a1SJohn Marino * the 'item' field points to an ASN1_ADB structure 562f5b1c8a1SJohn Marino * which contains a table of values to decode the 563f5b1c8a1SJohn Marino * relevant type 564f5b1c8a1SJohn Marino */ 565f5b1c8a1SJohn Marino 566f5b1c8a1SJohn Marino #define ASN1_TFLG_ADB_MASK (0x3<<8) 567f5b1c8a1SJohn Marino 568f5b1c8a1SJohn Marino #define ASN1_TFLG_ADB_OID (0x1<<8) 569f5b1c8a1SJohn Marino 570f5b1c8a1SJohn Marino #define ASN1_TFLG_ADB_INT (0x1<<9) 571f5b1c8a1SJohn Marino 572f5b1c8a1SJohn Marino /* This flag means a parent structure is passed 573f5b1c8a1SJohn Marino * instead of the field: this is useful is a 574f5b1c8a1SJohn Marino * SEQUENCE is being combined with a CHOICE for 575f5b1c8a1SJohn Marino * example. Since this means the structure and 576f5b1c8a1SJohn Marino * item name will differ we need to use the 577f5b1c8a1SJohn Marino * ASN1_CHOICE_END_name() macro for example. 578f5b1c8a1SJohn Marino */ 579f5b1c8a1SJohn Marino 580f5b1c8a1SJohn Marino #define ASN1_TFLG_COMBINE (0x1<<10) 581f5b1c8a1SJohn Marino 582f5b1c8a1SJohn Marino /* This flag when present in a SEQUENCE OF, SET OF 583f5b1c8a1SJohn Marino * or EXPLICIT causes indefinite length constructed 584f5b1c8a1SJohn Marino * encoding to be used if required. 585f5b1c8a1SJohn Marino */ 586f5b1c8a1SJohn Marino 587f5b1c8a1SJohn Marino #define ASN1_TFLG_NDEF (0x1<<11) 588f5b1c8a1SJohn Marino 589f5b1c8a1SJohn Marino /* This is the actual ASN1 item itself */ 590f5b1c8a1SJohn Marino 591f5b1c8a1SJohn Marino struct ASN1_ITEM_st { 592f5b1c8a1SJohn Marino char itype; /* The item type, primitive, SEQUENCE, CHOICE or extern */ 593f5b1c8a1SJohn Marino long utype; /* underlying type */ 594f5b1c8a1SJohn Marino const ASN1_TEMPLATE *templates; /* If SEQUENCE or CHOICE this contains the contents */ 595f5b1c8a1SJohn Marino long tcount; /* Number of templates if SEQUENCE or CHOICE */ 596f5b1c8a1SJohn Marino const void *funcs; /* functions that handle this type */ 597f5b1c8a1SJohn Marino long size; /* Structure size (usually)*/ 598f5b1c8a1SJohn Marino #ifndef NO_ASN1_FIELD_NAMES 599f5b1c8a1SJohn Marino const char *sname; /* Structure name */ 600f5b1c8a1SJohn Marino #endif 601f5b1c8a1SJohn Marino }; 602f5b1c8a1SJohn Marino 603f5b1c8a1SJohn Marino /* These are values for the itype field and 604f5b1c8a1SJohn Marino * determine how the type is interpreted. 605f5b1c8a1SJohn Marino * 606f5b1c8a1SJohn Marino * For PRIMITIVE types the underlying type 607f5b1c8a1SJohn Marino * determines the behaviour if items is NULL. 608f5b1c8a1SJohn Marino * 609f5b1c8a1SJohn Marino * Otherwise templates must contain a single 610f5b1c8a1SJohn Marino * template and the type is treated in the 611f5b1c8a1SJohn Marino * same way as the type specified in the template. 612f5b1c8a1SJohn Marino * 613f5b1c8a1SJohn Marino * For SEQUENCE types the templates field points 614f5b1c8a1SJohn Marino * to the members, the size field is the 615f5b1c8a1SJohn Marino * structure size. 616f5b1c8a1SJohn Marino * 617f5b1c8a1SJohn Marino * For CHOICE types the templates field points 618f5b1c8a1SJohn Marino * to each possible member (typically a union) 619f5b1c8a1SJohn Marino * and the 'size' field is the offset of the 620f5b1c8a1SJohn Marino * selector. 621f5b1c8a1SJohn Marino * 622f5b1c8a1SJohn Marino * The 'funcs' field is used for application 623f5b1c8a1SJohn Marino * specific functions. 624f5b1c8a1SJohn Marino * 625f5b1c8a1SJohn Marino * The EXTERN type uses a new style d2i/i2d. 626f5b1c8a1SJohn Marino * The new style should be used where possible 627f5b1c8a1SJohn Marino * because it avoids things like the d2i IMPLICIT 628f5b1c8a1SJohn Marino * hack. 629f5b1c8a1SJohn Marino * 630f5b1c8a1SJohn Marino * MSTRING is a multiple string type, it is used 631f5b1c8a1SJohn Marino * for a CHOICE of character strings where the 632f5b1c8a1SJohn Marino * actual strings all occupy an ASN1_STRING 633f5b1c8a1SJohn Marino * structure. In this case the 'utype' field 634f5b1c8a1SJohn Marino * has a special meaning, it is used as a mask 635f5b1c8a1SJohn Marino * of acceptable types using the B_ASN1 constants. 636f5b1c8a1SJohn Marino * 637f5b1c8a1SJohn Marino * NDEF_SEQUENCE is the same as SEQUENCE except 638f5b1c8a1SJohn Marino * that it will use indefinite length constructed 639f5b1c8a1SJohn Marino * encoding if requested. 640f5b1c8a1SJohn Marino * 641f5b1c8a1SJohn Marino */ 642f5b1c8a1SJohn Marino 643f5b1c8a1SJohn Marino #define ASN1_ITYPE_PRIMITIVE 0x0 644f5b1c8a1SJohn Marino 645f5b1c8a1SJohn Marino #define ASN1_ITYPE_SEQUENCE 0x1 646f5b1c8a1SJohn Marino 647f5b1c8a1SJohn Marino #define ASN1_ITYPE_CHOICE 0x2 648f5b1c8a1SJohn Marino 649f5b1c8a1SJohn Marino #define ASN1_ITYPE_EXTERN 0x4 650f5b1c8a1SJohn Marino 651f5b1c8a1SJohn Marino #define ASN1_ITYPE_MSTRING 0x5 652f5b1c8a1SJohn Marino 653f5b1c8a1SJohn Marino #define ASN1_ITYPE_NDEF_SEQUENCE 0x6 654f5b1c8a1SJohn Marino 655f5b1c8a1SJohn Marino /* Cache for ASN1 tag and length, so we 656f5b1c8a1SJohn Marino * don't keep re-reading it for things 657f5b1c8a1SJohn Marino * like CHOICE 658f5b1c8a1SJohn Marino */ 659f5b1c8a1SJohn Marino 660f5b1c8a1SJohn Marino struct ASN1_TLC_st{ 661f5b1c8a1SJohn Marino char valid; /* Values below are valid */ 662f5b1c8a1SJohn Marino int ret; /* return value */ 663f5b1c8a1SJohn Marino long plen; /* length */ 664f5b1c8a1SJohn Marino int ptag; /* class value */ 665f5b1c8a1SJohn Marino int pclass; /* class value */ 666f5b1c8a1SJohn Marino int hdrlen; /* header length */ 667f5b1c8a1SJohn Marino }; 668f5b1c8a1SJohn Marino 669f5b1c8a1SJohn Marino /* Typedefs for ASN1 function pointers */ 670f5b1c8a1SJohn Marino 671f5b1c8a1SJohn Marino typedef ASN1_VALUE * ASN1_new_func(void); 672f5b1c8a1SJohn Marino typedef void ASN1_free_func(ASN1_VALUE *a); 673f5b1c8a1SJohn Marino typedef ASN1_VALUE * ASN1_d2i_func(ASN1_VALUE **a, const unsigned char ** in, long length); 674f5b1c8a1SJohn Marino typedef int ASN1_i2d_func(ASN1_VALUE * a, unsigned char **in); 675f5b1c8a1SJohn Marino 676f5b1c8a1SJohn Marino typedef int ASN1_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_ITEM *it, 677f5b1c8a1SJohn Marino int tag, int aclass, char opt, ASN1_TLC *ctx); 678f5b1c8a1SJohn Marino 679f5b1c8a1SJohn Marino typedef int ASN1_ex_i2d(ASN1_VALUE **pval, unsigned char **out, const ASN1_ITEM *it, int tag, int aclass); 680f5b1c8a1SJohn Marino typedef int ASN1_ex_new_func(ASN1_VALUE **pval, const ASN1_ITEM *it); 681f5b1c8a1SJohn Marino typedef void ASN1_ex_free_func(ASN1_VALUE **pval, const ASN1_ITEM *it); 682f5b1c8a1SJohn Marino 683f5b1c8a1SJohn Marino typedef int ASN1_ex_print_func(BIO *out, ASN1_VALUE **pval, 684f5b1c8a1SJohn Marino int indent, const char *fname, 685f5b1c8a1SJohn Marino const ASN1_PCTX *pctx); 686f5b1c8a1SJohn Marino 687f5b1c8a1SJohn Marino typedef int ASN1_primitive_i2c(ASN1_VALUE **pval, unsigned char *cont, int *putype, const ASN1_ITEM *it); 688f5b1c8a1SJohn Marino typedef int ASN1_primitive_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, int utype, char *free_cont, const ASN1_ITEM *it); 689f5b1c8a1SJohn Marino typedef int ASN1_primitive_print(BIO *out, ASN1_VALUE **pval, const ASN1_ITEM *it, int indent, const ASN1_PCTX *pctx); 690f5b1c8a1SJohn Marino 691f5b1c8a1SJohn Marino typedef struct ASN1_EXTERN_FUNCS_st { 692f5b1c8a1SJohn Marino void *app_data; 693f5b1c8a1SJohn Marino ASN1_ex_new_func *asn1_ex_new; 694f5b1c8a1SJohn Marino ASN1_ex_free_func *asn1_ex_free; 695f5b1c8a1SJohn Marino ASN1_ex_free_func *asn1_ex_clear; 696f5b1c8a1SJohn Marino ASN1_ex_d2i *asn1_ex_d2i; 697f5b1c8a1SJohn Marino ASN1_ex_i2d *asn1_ex_i2d; 698f5b1c8a1SJohn Marino ASN1_ex_print_func *asn1_ex_print; 699f5b1c8a1SJohn Marino } ASN1_EXTERN_FUNCS; 700f5b1c8a1SJohn Marino 701f5b1c8a1SJohn Marino typedef struct ASN1_PRIMITIVE_FUNCS_st { 702f5b1c8a1SJohn Marino void *app_data; 703f5b1c8a1SJohn Marino unsigned long flags; 704f5b1c8a1SJohn Marino ASN1_ex_new_func *prim_new; 705f5b1c8a1SJohn Marino ASN1_ex_free_func *prim_free; 706f5b1c8a1SJohn Marino ASN1_ex_free_func *prim_clear; 707f5b1c8a1SJohn Marino ASN1_primitive_c2i *prim_c2i; 708f5b1c8a1SJohn Marino ASN1_primitive_i2c *prim_i2c; 709f5b1c8a1SJohn Marino ASN1_primitive_print *prim_print; 710f5b1c8a1SJohn Marino } ASN1_PRIMITIVE_FUNCS; 711f5b1c8a1SJohn Marino 712f5b1c8a1SJohn Marino /* This is the ASN1_AUX structure: it handles various 713f5b1c8a1SJohn Marino * miscellaneous requirements. For example the use of 714f5b1c8a1SJohn Marino * reference counts and an informational callback. 715f5b1c8a1SJohn Marino * 716f5b1c8a1SJohn Marino * The "informational callback" is called at various 717f5b1c8a1SJohn Marino * points during the ASN1 encoding and decoding. It can 718f5b1c8a1SJohn Marino * be used to provide minor customisation of the structures 719f5b1c8a1SJohn Marino * used. This is most useful where the supplied routines 720f5b1c8a1SJohn Marino * *almost* do the right thing but need some extra help 721f5b1c8a1SJohn Marino * at a few points. If the callback returns zero then 722f5b1c8a1SJohn Marino * it is assumed a fatal error has occurred and the 723f5b1c8a1SJohn Marino * main operation should be abandoned. 724f5b1c8a1SJohn Marino * 725f5b1c8a1SJohn Marino * If major changes in the default behaviour are required 726f5b1c8a1SJohn Marino * then an external type is more appropriate. 727f5b1c8a1SJohn Marino */ 728f5b1c8a1SJohn Marino 729f5b1c8a1SJohn Marino typedef int ASN1_aux_cb(int operation, ASN1_VALUE **in, const ASN1_ITEM *it, 730f5b1c8a1SJohn Marino void *exarg); 731f5b1c8a1SJohn Marino 732f5b1c8a1SJohn Marino typedef struct ASN1_AUX_st { 733f5b1c8a1SJohn Marino void *app_data; 734f5b1c8a1SJohn Marino int flags; 735f5b1c8a1SJohn Marino int ref_offset; /* Offset of reference value */ 736f5b1c8a1SJohn Marino int ref_lock; /* Lock type to use */ 737f5b1c8a1SJohn Marino ASN1_aux_cb *asn1_cb; 738f5b1c8a1SJohn Marino int enc_offset; /* Offset of ASN1_ENCODING structure */ 739f5b1c8a1SJohn Marino } ASN1_AUX; 740f5b1c8a1SJohn Marino 741f5b1c8a1SJohn Marino /* For print related callbacks exarg points to this structure */ 742f5b1c8a1SJohn Marino typedef struct ASN1_PRINT_ARG_st { 743f5b1c8a1SJohn Marino BIO *out; 744f5b1c8a1SJohn Marino int indent; 745f5b1c8a1SJohn Marino const ASN1_PCTX *pctx; 746f5b1c8a1SJohn Marino } ASN1_PRINT_ARG; 747f5b1c8a1SJohn Marino 748f5b1c8a1SJohn Marino /* For streaming related callbacks exarg points to this structure */ 749f5b1c8a1SJohn Marino typedef struct ASN1_STREAM_ARG_st { 750f5b1c8a1SJohn Marino /* BIO to stream through */ 751f5b1c8a1SJohn Marino BIO *out; 752f5b1c8a1SJohn Marino /* BIO with filters appended */ 753f5b1c8a1SJohn Marino BIO *ndef_bio; 754f5b1c8a1SJohn Marino /* Streaming I/O boundary */ 755f5b1c8a1SJohn Marino unsigned char **boundary; 756f5b1c8a1SJohn Marino } ASN1_STREAM_ARG; 757f5b1c8a1SJohn Marino 758f5b1c8a1SJohn Marino /* Flags in ASN1_AUX */ 759f5b1c8a1SJohn Marino 760f5b1c8a1SJohn Marino /* Use a reference count */ 761f5b1c8a1SJohn Marino #define ASN1_AFLG_REFCOUNT 1 762f5b1c8a1SJohn Marino /* Save the encoding of structure (useful for signatures) */ 763f5b1c8a1SJohn Marino #define ASN1_AFLG_ENCODING 2 764f5b1c8a1SJohn Marino /* The Sequence length is invalid */ 765f5b1c8a1SJohn Marino #define ASN1_AFLG_BROKEN 4 766f5b1c8a1SJohn Marino 767f5b1c8a1SJohn Marino /* operation values for asn1_cb */ 768f5b1c8a1SJohn Marino 769f5b1c8a1SJohn Marino #define ASN1_OP_NEW_PRE 0 770f5b1c8a1SJohn Marino #define ASN1_OP_NEW_POST 1 771f5b1c8a1SJohn Marino #define ASN1_OP_FREE_PRE 2 772f5b1c8a1SJohn Marino #define ASN1_OP_FREE_POST 3 773f5b1c8a1SJohn Marino #define ASN1_OP_D2I_PRE 4 774f5b1c8a1SJohn Marino #define ASN1_OP_D2I_POST 5 775f5b1c8a1SJohn Marino #define ASN1_OP_I2D_PRE 6 776f5b1c8a1SJohn Marino #define ASN1_OP_I2D_POST 7 777f5b1c8a1SJohn Marino #define ASN1_OP_PRINT_PRE 8 778f5b1c8a1SJohn Marino #define ASN1_OP_PRINT_POST 9 779f5b1c8a1SJohn Marino #define ASN1_OP_STREAM_PRE 10 780f5b1c8a1SJohn Marino #define ASN1_OP_STREAM_POST 11 781f5b1c8a1SJohn Marino #define ASN1_OP_DETACHED_PRE 12 782f5b1c8a1SJohn Marino #define ASN1_OP_DETACHED_POST 13 783f5b1c8a1SJohn Marino 784f5b1c8a1SJohn Marino #ifndef LIBRESSL_INTERNAL 785f5b1c8a1SJohn Marino 786f5b1c8a1SJohn Marino /* Macro to implement a primitive type */ 787f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_TYPE(stname) IMPLEMENT_ASN1_TYPE_ex(stname, stname, 0) 788f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_TYPE_ex(itname, vname, ex) \ 789f5b1c8a1SJohn Marino ASN1_ITEM_start(itname) \ 790f5b1c8a1SJohn Marino ASN1_ITYPE_PRIMITIVE, V_##vname, NULL, 0, NULL, ex, #itname \ 791f5b1c8a1SJohn Marino ASN1_ITEM_end(itname) 792f5b1c8a1SJohn Marino 793f5b1c8a1SJohn Marino /* Macro to implement a multi string type */ 794f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_MSTRING(itname, mask) \ 795f5b1c8a1SJohn Marino ASN1_ITEM_start(itname) \ 796f5b1c8a1SJohn Marino ASN1_ITYPE_MSTRING, mask, NULL, 0, NULL, sizeof(ASN1_STRING), #itname \ 797f5b1c8a1SJohn Marino ASN1_ITEM_end(itname) 798f5b1c8a1SJohn Marino #define IMPLEMENT_EXTERN_ASN1(sname, tag, fptrs) \ 799f5b1c8a1SJohn Marino ASN1_ITEM_start(sname) \ 800f5b1c8a1SJohn Marino ASN1_ITYPE_EXTERN, \ 801f5b1c8a1SJohn Marino tag, \ 802f5b1c8a1SJohn Marino NULL, \ 803f5b1c8a1SJohn Marino 0, \ 804f5b1c8a1SJohn Marino &fptrs, \ 805f5b1c8a1SJohn Marino 0, \ 806f5b1c8a1SJohn Marino #sname \ 807f5b1c8a1SJohn Marino ASN1_ITEM_end(sname) 808f5b1c8a1SJohn Marino 809f5b1c8a1SJohn Marino /* Macro to implement standard functions in terms of ASN1_ITEM structures */ 810f5b1c8a1SJohn Marino 811f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_FUNCTIONS(stname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, stname, stname) 812f5b1c8a1SJohn Marino 813f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_FUNCTIONS_name(stname, itname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, itname) 814f5b1c8a1SJohn Marino 815f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_FUNCTIONS_ENCODE_name(stname, itname) \ 816f5b1c8a1SJohn Marino IMPLEMENT_ASN1_FUNCTIONS_ENCODE_fname(stname, itname, itname) 817f5b1c8a1SJohn Marino 818f5b1c8a1SJohn Marino #define IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(stname) \ 819f5b1c8a1SJohn Marino IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(static, stname, stname, stname) 820f5b1c8a1SJohn Marino 821f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_ALLOC_FUNCTIONS(stname) \ 822f5b1c8a1SJohn Marino IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, stname, stname) 823f5b1c8a1SJohn Marino 824f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(pre, stname, itname, fname) \ 825f5b1c8a1SJohn Marino pre stname *fname##_new(void) \ 826f5b1c8a1SJohn Marino { \ 827f5b1c8a1SJohn Marino return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \ 828f5b1c8a1SJohn Marino } \ 829f5b1c8a1SJohn Marino pre void fname##_free(stname *a) \ 830f5b1c8a1SJohn Marino { \ 831f5b1c8a1SJohn Marino ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \ 832f5b1c8a1SJohn Marino } 833f5b1c8a1SJohn Marino 834f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) \ 835f5b1c8a1SJohn Marino stname *fname##_new(void) \ 836f5b1c8a1SJohn Marino { \ 837f5b1c8a1SJohn Marino return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \ 838f5b1c8a1SJohn Marino } \ 839f5b1c8a1SJohn Marino void fname##_free(stname *a) \ 840f5b1c8a1SJohn Marino { \ 841f5b1c8a1SJohn Marino ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \ 842f5b1c8a1SJohn Marino } 843f5b1c8a1SJohn Marino 844f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, fname) \ 845f5b1c8a1SJohn Marino IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \ 846f5b1c8a1SJohn Marino IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) 847f5b1c8a1SJohn Marino 848f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \ 849f5b1c8a1SJohn Marino stname *d2i_##fname(stname **a, const unsigned char **in, long len) \ 850f5b1c8a1SJohn Marino { \ 851f5b1c8a1SJohn Marino return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\ 852f5b1c8a1SJohn Marino } \ 853f5b1c8a1SJohn Marino int i2d_##fname(stname *a, unsigned char **out) \ 854f5b1c8a1SJohn Marino { \ 855f5b1c8a1SJohn Marino return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\ 856f5b1c8a1SJohn Marino } 857f5b1c8a1SJohn Marino 858f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_NDEF_FUNCTION(stname) \ 859f5b1c8a1SJohn Marino int i2d_##stname##_NDEF(stname *a, unsigned char **out) \ 860f5b1c8a1SJohn Marino { \ 861f5b1c8a1SJohn Marino return ASN1_item_ndef_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(stname));\ 862f5b1c8a1SJohn Marino } 863f5b1c8a1SJohn Marino 864f5b1c8a1SJohn Marino /* This includes evil casts to remove const: they will go away when full 865f5b1c8a1SJohn Marino * ASN1 constification is done. 866f5b1c8a1SJohn Marino */ 867f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \ 868f5b1c8a1SJohn Marino stname *d2i_##fname(stname **a, const unsigned char **in, long len) \ 869f5b1c8a1SJohn Marino { \ 870f5b1c8a1SJohn Marino return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\ 871f5b1c8a1SJohn Marino } \ 872f5b1c8a1SJohn Marino int i2d_##fname(const stname *a, unsigned char **out) \ 873f5b1c8a1SJohn Marino { \ 874f5b1c8a1SJohn Marino return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\ 875f5b1c8a1SJohn Marino } 876f5b1c8a1SJohn Marino 877f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_DUP_FUNCTION(stname) \ 878f5b1c8a1SJohn Marino stname * stname##_dup(stname *x) \ 879f5b1c8a1SJohn Marino { \ 880f5b1c8a1SJohn Marino return ASN1_item_dup(ASN1_ITEM_rptr(stname), x); \ 881f5b1c8a1SJohn Marino } 882f5b1c8a1SJohn Marino 883f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_PRINT_FUNCTION(stname) \ 884f5b1c8a1SJohn Marino IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, stname, stname) 885f5b1c8a1SJohn Marino 886f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, itname, fname) \ 887f5b1c8a1SJohn Marino int fname##_print_ctx(BIO *out, stname *x, int indent, \ 888f5b1c8a1SJohn Marino const ASN1_PCTX *pctx) \ 889f5b1c8a1SJohn Marino { \ 890f5b1c8a1SJohn Marino return ASN1_item_print(out, (ASN1_VALUE *)x, indent, \ 891f5b1c8a1SJohn Marino ASN1_ITEM_rptr(itname), pctx); \ 892f5b1c8a1SJohn Marino } 893f5b1c8a1SJohn Marino 894f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_FUNCTIONS_const(name) \ 895f5b1c8a1SJohn Marino IMPLEMENT_ASN1_FUNCTIONS_const_fname(name, name, name) 896f5b1c8a1SJohn Marino 897f5b1c8a1SJohn Marino #define IMPLEMENT_ASN1_FUNCTIONS_const_fname(stname, itname, fname) \ 898f5b1c8a1SJohn Marino IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \ 899f5b1c8a1SJohn Marino IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) 900f5b1c8a1SJohn Marino 901f5b1c8a1SJohn Marino #endif /* !LIBRESSL_INTERNAL */ 902f5b1c8a1SJohn Marino 903f5b1c8a1SJohn Marino /* external definitions for primitive types */ 904f5b1c8a1SJohn Marino 90572c33676SMaxim Ag extern const ASN1_ITEM ASN1_BOOLEAN_it; 90672c33676SMaxim Ag extern const ASN1_ITEM ASN1_TBOOLEAN_it; 90772c33676SMaxim Ag extern const ASN1_ITEM ASN1_FBOOLEAN_it; 90872c33676SMaxim Ag extern const ASN1_ITEM ASN1_SEQUENCE_it; 90972c33676SMaxim Ag extern const ASN1_ITEM CBIGNUM_it; 91072c33676SMaxim Ag extern const ASN1_ITEM BIGNUM_it; 91172c33676SMaxim Ag extern const ASN1_ITEM LONG_it; 91272c33676SMaxim Ag extern const ASN1_ITEM ZLONG_it; 913f5b1c8a1SJohn Marino 914f5b1c8a1SJohn Marino DECLARE_STACK_OF(ASN1_VALUE) 915f5b1c8a1SJohn Marino 916f5b1c8a1SJohn Marino /* Functions used internally by the ASN1 code */ 917f5b1c8a1SJohn Marino 918f5b1c8a1SJohn Marino int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it); 919f5b1c8a1SJohn Marino void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it); 920f5b1c8a1SJohn Marino int ASN1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); 921f5b1c8a1SJohn Marino int ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it); 922f5b1c8a1SJohn Marino 923f5b1c8a1SJohn Marino void ASN1_template_free(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); 924f5b1c8a1SJohn Marino int ASN1_template_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_TEMPLATE *tt); 925f5b1c8a1SJohn Marino int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_ITEM *it, 926f5b1c8a1SJohn Marino int tag, int aclass, char opt, ASN1_TLC *ctx); 927f5b1c8a1SJohn Marino 928f5b1c8a1SJohn Marino int ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out, const ASN1_ITEM *it, int tag, int aclass); 929f5b1c8a1SJohn Marino int ASN1_template_i2d(ASN1_VALUE **pval, unsigned char **out, const ASN1_TEMPLATE *tt); 930f5b1c8a1SJohn Marino void ASN1_primitive_free(ASN1_VALUE **pval, const ASN1_ITEM *it); 931f5b1c8a1SJohn Marino 932f5b1c8a1SJohn Marino int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, int utype, char *free_cont, const ASN1_ITEM *it); 933f5b1c8a1SJohn Marino 934f5b1c8a1SJohn Marino int asn1_get_choice_selector(ASN1_VALUE **pval, const ASN1_ITEM *it); 935f5b1c8a1SJohn Marino int asn1_set_choice_selector(ASN1_VALUE **pval, int value, const ASN1_ITEM *it); 936f5b1c8a1SJohn Marino 937f5b1c8a1SJohn Marino ASN1_VALUE ** asn1_get_field_ptr(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); 938f5b1c8a1SJohn Marino 939f5b1c8a1SJohn Marino const ASN1_TEMPLATE *asn1_do_adb(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt, int nullerr); 940f5b1c8a1SJohn Marino 941f5b1c8a1SJohn Marino int asn1_do_lock(ASN1_VALUE **pval, int op, const ASN1_ITEM *it); 942f5b1c8a1SJohn Marino 943f5b1c8a1SJohn Marino void asn1_enc_init(ASN1_VALUE **pval, const ASN1_ITEM *it); 944f5b1c8a1SJohn Marino void asn1_enc_free(ASN1_VALUE **pval, const ASN1_ITEM *it); 945f5b1c8a1SJohn Marino int asn1_enc_restore(int *len, unsigned char **out, ASN1_VALUE **pval, const ASN1_ITEM *it); 946f5b1c8a1SJohn Marino int asn1_enc_save(ASN1_VALUE **pval, const unsigned char *in, int inlen, const ASN1_ITEM *it); 947f5b1c8a1SJohn Marino 948f5b1c8a1SJohn Marino #ifdef __cplusplus 949f5b1c8a1SJohn Marino } 950f5b1c8a1SJohn Marino #endif 951f5b1c8a1SJohn Marino #endif 952