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