| OLD | NEW |
| (Empty) |
| 1 /* This Source Code Form is subject to the terms of the Mozilla Public | |
| 2 * License, v. 2.0. If a copy of the MPL was not distributed with this | |
| 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | |
| 4 | |
| 5 /* | |
| 6 * Types for encoding/decoding of ASN.1 using BER/DER (Basic/Distinguished | |
| 7 * Encoding Rules). | |
| 8 * | |
| 9 * $Id: secasn1t.h,v 1.12 2013/01/08 16:19:09 kaie%kuix.de Exp $ | |
| 10 */ | |
| 11 | |
| 12 #ifndef _SECASN1T_H_ | |
| 13 #define _SECASN1T_H_ | |
| 14 | |
| 15 #include "utilrename.h" | |
| 16 | |
| 17 /* | |
| 18 ** An array of these structures defines a BER/DER encoding for an object. | |
| 19 ** | |
| 20 ** The array usually starts with a dummy entry whose kind is SEC_ASN1_SEQUENCE; | |
| 21 ** such an array is terminated with an entry where kind == 0. (An array | |
| 22 ** which consists of a single component does not require a second dummy | |
| 23 ** entry -- the array is only searched as long as previous component(s) | |
| 24 ** instruct it.) | |
| 25 */ | |
| 26 typedef struct sec_ASN1Template_struct { | |
| 27 /* | |
| 28 ** Kind of item being decoded/encoded, including tags and modifiers. | |
| 29 */ | |
| 30 unsigned long kind; | |
| 31 | |
| 32 /* | |
| 33 ** The value is the offset from the base of the structure to the | |
| 34 ** field that holds the value being decoded/encoded. | |
| 35 */ | |
| 36 unsigned long offset; | |
| 37 | |
| 38 /* | |
| 39 ** When kind suggests it (SEC_ASN1_POINTER, SEC_ASN1_GROUP, SEC_ASN1_INLINE, | |
| 40 ** or a component that is *not* a SEC_ASN1_UNIVERSAL), this points to | |
| 41 ** a sub-template for nested encoding/decoding, | |
| 42 ** OR, iff SEC_ASN1_DYNAMIC is set, then this is a pointer to a pointer | |
| 43 ** to a function which will return the appropriate template when called | |
| 44 ** at runtime. NOTE! that explicit level of indirection, which is | |
| 45 ** necessary because ANSI does not allow you to store a function | |
| 46 ** pointer directly as a "void *" so we must store it separately and | |
| 47 ** dereference it to get at the function pointer itself. | |
| 48 */ | |
| 49 const void *sub; | |
| 50 | |
| 51 /* | |
| 52 ** In the first element of a template array, the value is the size | |
| 53 ** of the structure to allocate when this template is being referenced | |
| 54 ** by another template via SEC_ASN1_POINTER or SEC_ASN1_GROUP. | |
| 55 ** In all other cases, the value is ignored. | |
| 56 */ | |
| 57 unsigned int size; | |
| 58 } SEC_ASN1Template; | |
| 59 | |
| 60 | |
| 61 /* default size used for allocation of encoding/decoding stuff */ | |
| 62 /* XXX what is the best value here? */ | |
| 63 #define SEC_ASN1_DEFAULT_ARENA_SIZE (2048) | |
| 64 | |
| 65 /* | |
| 66 ** BER/DER values for ASN.1 identifier octets. | |
| 67 */ | |
| 68 #define SEC_ASN1_TAG_MASK 0xff | |
| 69 | |
| 70 /* | |
| 71 * BER/DER universal type tag numbers. | |
| 72 * The values are defined by the X.208 standard; do not change them! | |
| 73 * NOTE: if you add anything to this list, you must add code to secasn1d.c | |
| 74 * to accept the tag, and probably also to secasn1e.c to encode it. | |
| 75 * XXX It appears some have been added recently without being added to | |
| 76 * the code; so need to go through the list now and double-check them all. | |
| 77 * (Look especially at those added in revision 1.10.) | |
| 78 */ | |
| 79 #define SEC_ASN1_TAGNUM_MASK 0x1f | |
| 80 #define SEC_ASN1_BOOLEAN 0x01 | |
| 81 #define SEC_ASN1_INTEGER 0x02 | |
| 82 #define SEC_ASN1_BIT_STRING 0x03 | |
| 83 #define SEC_ASN1_OCTET_STRING 0x04 | |
| 84 #define SEC_ASN1_NULL 0x05 | |
| 85 #define SEC_ASN1_OBJECT_ID 0x06 | |
| 86 #define SEC_ASN1_OBJECT_DESCRIPTOR 0x07 | |
| 87 /* External type and instance-of type 0x08 */ | |
| 88 #define SEC_ASN1_REAL 0x09 | |
| 89 #define SEC_ASN1_ENUMERATED 0x0a | |
| 90 #define SEC_ASN1_EMBEDDED_PDV 0x0b | |
| 91 #define SEC_ASN1_UTF8_STRING 0x0c | |
| 92 /* 0x0d */ | |
| 93 /* 0x0e */ | |
| 94 /* 0x0f */ | |
| 95 #define SEC_ASN1_SEQUENCE 0x10 | |
| 96 #define SEC_ASN1_SET 0x11 | |
| 97 #define SEC_ASN1_NUMERIC_STRING 0x12 | |
| 98 #define SEC_ASN1_PRINTABLE_STRING 0x13 | |
| 99 #define SEC_ASN1_T61_STRING 0x14 | |
| 100 #define SEC_ASN1_VIDEOTEX_STRING 0x15 | |
| 101 #define SEC_ASN1_IA5_STRING 0x16 | |
| 102 #define SEC_ASN1_UTC_TIME 0x17 | |
| 103 #define SEC_ASN1_GENERALIZED_TIME 0x18 | |
| 104 #define SEC_ASN1_GRAPHIC_STRING 0x19 | |
| 105 #define SEC_ASN1_VISIBLE_STRING 0x1a | |
| 106 #define SEC_ASN1_GENERAL_STRING 0x1b | |
| 107 #define SEC_ASN1_UNIVERSAL_STRING 0x1c | |
| 108 /* 0x1d */ | |
| 109 #define SEC_ASN1_BMP_STRING 0x1e | |
| 110 #define SEC_ASN1_HIGH_TAG_NUMBER 0x1f | |
| 111 #define SEC_ASN1_TELETEX_STRING SEC_ASN1_T61_STRING | |
| 112 | |
| 113 /* | |
| 114 ** Modifiers to type tags. These are also specified by a/the | |
| 115 ** standard, and must not be changed. | |
| 116 */ | |
| 117 | |
| 118 #define SEC_ASN1_METHOD_MASK 0x20 | |
| 119 #define SEC_ASN1_PRIMITIVE 0x00 | |
| 120 #define SEC_ASN1_CONSTRUCTED 0x20 | |
| 121 | |
| 122 #define SEC_ASN1_CLASS_MASK 0xc0 | |
| 123 #define SEC_ASN1_UNIVERSAL 0x00 | |
| 124 #define SEC_ASN1_APPLICATION 0x40 | |
| 125 #define SEC_ASN1_CONTEXT_SPECIFIC 0x80 | |
| 126 #define SEC_ASN1_PRIVATE 0xc0 | |
| 127 | |
| 128 /* | |
| 129 ** Our additions, used for templates. | |
| 130 ** These are not defined by any standard; the values are used internally only. | |
| 131 ** Just be careful to keep them out of the low 8 bits. | |
| 132 ** XXX finish comments | |
| 133 */ | |
| 134 #define SEC_ASN1_OPTIONAL 0x00100 | |
| 135 #define SEC_ASN1_EXPLICIT 0x00200 | |
| 136 #define SEC_ASN1_ANY 0x00400 | |
| 137 #define SEC_ASN1_INLINE 0x00800 | |
| 138 #define SEC_ASN1_POINTER 0x01000 | |
| 139 #define SEC_ASN1_GROUP 0x02000 /* with SET or SEQUENCE means | |
| 140 * SET OF or SEQUENCE OF */ | |
| 141 #define SEC_ASN1_DYNAMIC 0x04000 /* subtemplate is found by calling | |
| 142 * a function at runtime */ | |
| 143 #define SEC_ASN1_SKIP 0x08000 /* skip a field; only for decoding */ | |
| 144 #define SEC_ASN1_INNER 0x10000 /* with ANY means capture the | |
| 145 * contents only (not the id, len, | |
| 146 * or eoc); only for decoding */ | |
| 147 #define SEC_ASN1_SAVE 0x20000 /* stash away the encoded bytes first; | |
| 148 * only for decoding */ | |
| 149 #define SEC_ASN1_MAY_STREAM 0x40000 /* field or one of its sub-fields may | |
| 150 * stream in and so should encode as | |
| 151 * indefinite-length when streaming | |
| 152 * has been indicated; only for | |
| 153 * encoding */ | |
| 154 #define SEC_ASN1_SKIP_REST 0x80000 /* skip all following fields; | |
| 155 only for decoding */ | |
| 156 #define SEC_ASN1_CHOICE 0x100000 /* pick one from a template */ | |
| 157 #define SEC_ASN1_NO_STREAM 0X200000 /* This entry will not stream | |
| 158 even if the sub-template says | |
| 159 streaming is possible. Helps | |
| 160 to solve ambiguities with potential | |
| 161 streaming entries that are | |
| 162 optional */ | |
| 163 #define SEC_ASN1_DEBUG_BREAK 0X400000 /* put this in your template and the | |
| 164 decoder will assert when it | |
| 165 processes it. Only for use with | |
| 166 SEC_QuickDERDecodeItem */ | |
| 167 | |
| 168 | |
| 169 | |
| 170 /* Shorthand/Aliases */ | |
| 171 #define SEC_ASN1_SEQUENCE_OF (SEC_ASN1_GROUP | SEC_ASN1_SEQUENCE) | |
| 172 #define SEC_ASN1_SET_OF (SEC_ASN1_GROUP | SEC_ASN1_SET) | |
| 173 #define SEC_ASN1_ANY_CONTENTS (SEC_ASN1_ANY | SEC_ASN1_INNER) | |
| 174 | |
| 175 /* Maximum depth of nested SEQUENCEs and SETs */ | |
| 176 #define SEC_ASN1D_MAX_DEPTH 32 | |
| 177 | |
| 178 /* | |
| 179 ** Function used for SEC_ASN1_DYNAMIC. | |
| 180 ** "arg" is a pointer to the structure being encoded/decoded | |
| 181 ** "enc", when true, means that we are encoding (false means decoding) | |
| 182 */ | |
| 183 typedef const SEC_ASN1Template * SEC_ASN1TemplateChooser(void *arg, PRBool enc); | |
| 184 typedef SEC_ASN1TemplateChooser * SEC_ASN1TemplateChooserPtr; | |
| 185 | |
| 186 #if defined(_WIN32) || defined(ANDROID) | |
| 187 #define SEC_ASN1_GET(x) NSS_Get_##x(NULL, PR_FALSE) | |
| 188 #define SEC_ASN1_SUB(x) &p_NSS_Get_##x | |
| 189 #define SEC_ASN1_XTRN SEC_ASN1_DYNAMIC | |
| 190 #define SEC_ASN1_MKSUB(x) \ | |
| 191 static const SEC_ASN1TemplateChooserPtr p_NSS_Get_##x = &NSS_Get_##x; | |
| 192 #else | |
| 193 #define SEC_ASN1_GET(x) x | |
| 194 #define SEC_ASN1_SUB(x) x | |
| 195 #define SEC_ASN1_XTRN 0 | |
| 196 #define SEC_ASN1_MKSUB(x) | |
| 197 #endif | |
| 198 | |
| 199 #define SEC_ASN1_CHOOSER_DECLARE(x) \ | |
| 200 extern const SEC_ASN1Template * NSS_Get_##x (void *arg, PRBool enc); | |
| 201 | |
| 202 #define SEC_ASN1_CHOOSER_IMPLEMENT(x) \ | |
| 203 const SEC_ASN1Template * NSS_Get_##x(void * arg, PRBool enc) \ | |
| 204 { return x; } | |
| 205 | |
| 206 /* | |
| 207 ** Opaque object used by the decoder to store state. | |
| 208 */ | |
| 209 typedef struct sec_DecoderContext_struct SEC_ASN1DecoderContext; | |
| 210 | |
| 211 /* | |
| 212 ** Opaque object used by the encoder to store state. | |
| 213 */ | |
| 214 typedef struct sec_EncoderContext_struct SEC_ASN1EncoderContext; | |
| 215 | |
| 216 /* | |
| 217 * This is used to describe to a filter function the bytes that are | |
| 218 * being passed to it. This is only useful when the filter is an "outer" | |
| 219 * one, meaning it expects to get *all* of the bytes not just the | |
| 220 * contents octets. | |
| 221 */ | |
| 222 typedef enum { | |
| 223 SEC_ASN1_Identifier = 0, | |
| 224 SEC_ASN1_Length = 1, | |
| 225 SEC_ASN1_Contents = 2, | |
| 226 SEC_ASN1_EndOfContents = 3 | |
| 227 } SEC_ASN1EncodingPart; | |
| 228 | |
| 229 /* | |
| 230 * Type of the function pointer used either for decoding or encoding, | |
| 231 * when doing anything "funny" (e.g. manipulating the data stream) | |
| 232 */ | |
| 233 typedef void (* SEC_ASN1NotifyProc)(void *arg, PRBool before, | |
| 234 void *dest, int real_depth); | |
| 235 | |
| 236 /* | |
| 237 * Type of the function pointer used for grabbing encoded bytes. | |
| 238 * This can be used during either encoding or decoding, as follows... | |
| 239 * | |
| 240 * When decoding, this can be used to filter the encoded bytes as they | |
| 241 * are parsed. This is what you would do if you wanted to process the data | |
| 242 * along the way (like to decrypt it, or to perform a hash on it in order | |
| 243 * to do a signature check later). See SEC_ASN1DecoderSetFilterProc(). | |
| 244 * When processing only part of the encoded bytes is desired, you "watch" | |
| 245 * for the field(s) you are interested in with a "notify proc" (see | |
| 246 * SEC_ASN1DecoderSetNotifyProc()) and for even finer granularity (e.g. to | |
| 247 * ignore all by the contents bytes) you pay attention to the "data_kind" | |
| 248 * parameter. | |
| 249 * | |
| 250 * When encoding, this is the specification for the output function which | |
| 251 * will receive the bytes as they are encoded. The output function can | |
| 252 * perform any postprocessing necessary (like hashing (some of) the data | |
| 253 * to create a digest that gets included at the end) as well as shoving | |
| 254 * the data off wherever it needs to go. (In order to "tune" any processing, | |
| 255 * you can set a "notify proc" as described above in the decoding case.) | |
| 256 * | |
| 257 * The parameters: | |
| 258 * - "arg" is an opaque pointer that you provided at the same time you | |
| 259 * specified a function of this type | |
| 260 * - "data" is a buffer of length "len", containing the encoded bytes | |
| 261 * - "depth" is how deep in a nested encoding we are (it is not usually | |
| 262 * valuable, but can be useful sometimes so I included it) | |
| 263 * - "data_kind" tells you if these bytes are part of the ASN.1 encoded | |
| 264 * octets for identifier, length, contents, or end-of-contents | |
| 265 */ | |
| 266 typedef void (* SEC_ASN1WriteProc)(void *arg, | |
| 267 const char *data, unsigned long len, | |
| 268 int depth, SEC_ASN1EncodingPart data_kind); | |
| 269 | |
| 270 #endif /* _SECASN1T_H_ */ | |
| OLD | NEW |