security/nss/lib/util/secasn1t.h

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

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

mercurial