Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(64)

Side by Side Diff: mozilla/security/nss/lib/util/secasn1t.h

Issue 14249009: Change the NSS and NSPR source tree to the new directory structure to be (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/nss/
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « mozilla/security/nss/lib/util/secasn1e.c ('k') | mozilla/security/nss/lib/util/secasn1u.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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_ */
OLDNEW
« no previous file with comments | « mozilla/security/nss/lib/util/secasn1e.c ('k') | mozilla/security/nss/lib/util/secasn1u.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698