/src/dist/public/nss/secasn1t.h
Line | Count | Source (jump to first uncovered line) |
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 | | |
10 | | #ifndef _SECASN1T_H_ |
11 | | #define _SECASN1T_H_ |
12 | | |
13 | | #include "utilrename.h" |
14 | | |
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; |
29 | | |
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; |
35 | | |
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; |
48 | | |
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; |
57 | | |
58 | | /* default size used for allocation of encoding/decoding stuff */ |
59 | | /* XXX what is the best value here? */ |
60 | 102k | #define SEC_ASN1_DEFAULT_ARENA_SIZE (2048) |
61 | | |
62 | | /* |
63 | | ** BER/DER values for ASN.1 identifier octets. |
64 | | */ |
65 | | #define SEC_ASN1_TAG_MASK 0xff |
66 | | |
67 | | /* |
68 | | * BER/DER universal type tag numbers. |
69 | | * The values are defined by the X.208 standard; do not change them! |
70 | | * NOTE: if you add anything to this list, you must add code to secasn1d.c |
71 | | * to accept the tag, and probably also to secasn1e.c to encode it. |
72 | | * XXX It appears some have been added recently without being added to |
73 | | * the code; so need to go through the list now and double-check them all. |
74 | | * (Look especially at those added in revision 1.10.) |
75 | | */ |
76 | 0 | #define SEC_ASN1_TAGNUM_MASK 0x1f |
77 | | #define SEC_ASN1_BOOLEAN 0x01 |
78 | 350 | #define SEC_ASN1_INTEGER 0x02 |
79 | | #define SEC_ASN1_BIT_STRING 0x03 |
80 | 119k | #define SEC_ASN1_OCTET_STRING 0x04 |
81 | 0 | #define SEC_ASN1_NULL 0x05 |
82 | 392k | #define SEC_ASN1_OBJECT_ID 0x06 |
83 | | #define SEC_ASN1_OBJECT_DESCRIPTOR 0x07 |
84 | | /* External type and instance-of type 0x08 */ |
85 | | #define SEC_ASN1_REAL 0x09 |
86 | | #define SEC_ASN1_ENUMERATED 0x0a |
87 | | #define SEC_ASN1_EMBEDDED_PDV 0x0b |
88 | 73.3k | #define SEC_ASN1_UTF8_STRING 0x0c |
89 | | /* 0x0d */ |
90 | | /* 0x0e */ |
91 | | /* 0x0f */ |
92 | 8.49k | #define SEC_ASN1_SEQUENCE 0x10 |
93 | | #define SEC_ASN1_SET 0x11 |
94 | | #define SEC_ASN1_NUMERIC_STRING 0x12 |
95 | 256k | #define SEC_ASN1_PRINTABLE_STRING 0x13 |
96 | 39.6k | #define SEC_ASN1_T61_STRING 0x14 |
97 | | #define SEC_ASN1_VIDEOTEX_STRING 0x15 |
98 | 72.2k | #define SEC_ASN1_IA5_STRING 0x16 |
99 | | #define SEC_ASN1_UTC_TIME 0x17 |
100 | | #define SEC_ASN1_GENERALIZED_TIME 0x18 |
101 | | #define SEC_ASN1_GRAPHIC_STRING 0x19 |
102 | 0 | #define SEC_ASN1_VISIBLE_STRING 0x1a |
103 | | #define SEC_ASN1_GENERAL_STRING 0x1b |
104 | 5.01k | #define SEC_ASN1_UNIVERSAL_STRING 0x1c |
105 | | /* 0x1d */ |
106 | 8.05k | #define SEC_ASN1_BMP_STRING 0x1e |
107 | 414k | #define SEC_ASN1_HIGH_TAG_NUMBER 0x1f |
108 | | #define SEC_ASN1_TELETEX_STRING SEC_ASN1_T61_STRING |
109 | | |
110 | | /* |
111 | | ** Modifiers to type tags. These are also specified by a/the |
112 | | ** standard, and must not be changed. |
113 | | */ |
114 | | |
115 | | #define SEC_ASN1_METHOD_MASK 0x20 |
116 | | #define SEC_ASN1_PRIMITIVE 0x00 |
117 | 311 | #define SEC_ASN1_CONSTRUCTED 0x20 |
118 | | |
119 | | #define SEC_ASN1_CLASS_MASK 0xc0 |
120 | | #define SEC_ASN1_UNIVERSAL 0x00 |
121 | | #define SEC_ASN1_APPLICATION 0x40 |
122 | | #define SEC_ASN1_CONTEXT_SPECIFIC 0x80 |
123 | | #define SEC_ASN1_PRIVATE 0xc0 |
124 | | |
125 | | /* |
126 | | ** Our additions, used for templates. |
127 | | ** These are not defined by any standard; the values are used internally only. |
128 | | ** Just be careful to keep them out of the low 8 bits. |
129 | | ** XXX finish comments |
130 | | */ |
131 | | #define SEC_ASN1_OPTIONAL 0x00100 |
132 | | #define SEC_ASN1_EXPLICIT 0x00200 |
133 | | #define SEC_ASN1_ANY 0x00400 |
134 | | #define SEC_ASN1_INLINE 0x00800 |
135 | | #define SEC_ASN1_POINTER 0x01000 |
136 | | #define SEC_ASN1_GROUP 0x02000 /* with SET or SEQUENCE means \ |
137 | | * SET OF or SEQUENCE OF */ |
138 | | #define SEC_ASN1_DYNAMIC 0x04000 /* subtemplate is found by calling \ |
139 | | * a function at runtime */ |
140 | | #define SEC_ASN1_SKIP 0x08000 /* skip a field; only for decoding */ |
141 | | #define SEC_ASN1_INNER 0x10000 /* with ANY means capture the \ |
142 | | * contents only (not the id, len, \ |
143 | | * or eoc); only for decoding */ |
144 | | #define SEC_ASN1_SAVE 0x20000 /* stash away the encoded bytes first; \ |
145 | | * only for decoding */ |
146 | | #define SEC_ASN1_MAY_STREAM 0x40000 /* field or one of its sub-fields may \ |
147 | | * stream in and so should encode as \ |
148 | | * indefinite-length when streaming \ |
149 | | * has been indicated; only for \ |
150 | | * encoding */ |
151 | | #define SEC_ASN1_SKIP_REST 0x80000 /* skip all following fields; \ |
152 | | only for decoding */ |
153 | | #define SEC_ASN1_CHOICE 0x100000 /* pick one from a template */ |
154 | | #define SEC_ASN1_NO_STREAM 0X200000 /* This entry will not stream \ |
155 | | even if the sub-template says \ |
156 | | streaming is possible. Helps \ |
157 | | to solve ambiguities with potential \ |
158 | | streaming entries that are \ |
159 | | optional */ |
160 | | #define SEC_ASN1_DEBUG_BREAK 0X400000 /* put this in your template and the \ |
161 | | decoder will assert when it \ |
162 | | processes it. Only for use with \ |
163 | | SEC_QuickDERDecodeItem */ |
164 | | |
165 | | /* Shorthand/Aliases */ |
166 | | #define SEC_ASN1_SEQUENCE_OF (SEC_ASN1_GROUP | SEC_ASN1_SEQUENCE) |
167 | | #define SEC_ASN1_SET_OF (SEC_ASN1_GROUP | SEC_ASN1_SET) |
168 | | #define SEC_ASN1_ANY_CONTENTS (SEC_ASN1_ANY | SEC_ASN1_INNER) |
169 | | |
170 | | /* Maximum depth of nested SEQUENCEs and SETs */ |
171 | | #define SEC_ASN1D_MAX_DEPTH 32 |
172 | | |
173 | | /* |
174 | | ** Function used for SEC_ASN1_DYNAMIC. |
175 | | ** "arg" is a pointer to the structure being encoded/decoded |
176 | | ** "enc", when true, means that we are encoding (false means decoding) |
177 | | */ |
178 | | typedef const SEC_ASN1Template *SEC_ASN1TemplateChooser(void *arg, PRBool enc); |
179 | | typedef SEC_ASN1TemplateChooser *SEC_ASN1TemplateChooserPtr; |
180 | | |
181 | | #if defined(_WIN32) || defined(ANDROID) |
182 | | #define SEC_ASN1_GET(x) NSS_Get_##x(NULL, PR_FALSE) |
183 | | #define SEC_ASN1_SUB(x) &p_NSS_Get_##x |
184 | | #define SEC_ASN1_XTRN SEC_ASN1_DYNAMIC |
185 | | #define SEC_ASN1_MKSUB(x) \ |
186 | | static const SEC_ASN1TemplateChooserPtr p_NSS_Get_##x = &NSS_Get_##x; |
187 | | #else |
188 | 725k | #define SEC_ASN1_GET(x) x |
189 | | #define SEC_ASN1_SUB(x) x |
190 | | #define SEC_ASN1_XTRN 0 |
191 | | #define SEC_ASN1_MKSUB(x) |
192 | | #endif |
193 | | |
194 | | #define SEC_ASN1_CHOOSER_DECLARE(x) \ |
195 | | extern const SEC_ASN1Template *NSS_Get_##x(void *arg, PRBool enc); |
196 | | |
197 | | #define SEC_ASN1_CHOOSER_IMPLEMENT(x) \ |
198 | | const SEC_ASN1Template *NSS_Get_##x(void *arg, PRBool enc) \ |
199 | 0 | { \ |
200 | 0 | return x; \ |
201 | 0 | } Unexecuted instantiation: NSS_Get_CERT_TimeChoiceTemplate Unexecuted instantiation: NSS_Get_CERT_CertificateTemplate Unexecuted instantiation: NSS_Get_SEC_SignedCertificateTemplate Unexecuted instantiation: NSS_Get_CERT_SequenceOfCertExtensionTemplate Unexecuted instantiation: NSS_Get_CERT_IssuerAndSNTemplate Unexecuted instantiation: NSS_Get_CERT_CrlTemplate Unexecuted instantiation: NSS_Get_CERT_SignedCrlTemplate Unexecuted instantiation: NSS_Get_CERT_SetOfSignedCrlTemplate Unexecuted instantiation: NSS_Get_CERT_NameTemplate Unexecuted instantiation: NSS_Get_SECKEY_DSAPublicKeyTemplate Unexecuted instantiation: NSS_Get_SECKEY_RSAPublicKeyTemplate Unexecuted instantiation: NSS_Get_SECKEY_RSAPSSParamsTemplate Unexecuted instantiation: NSS_Get_CERT_SubjectPublicKeyInfoTemplate Unexecuted instantiation: NSS_Get_CERT_SignedDataTemplate Unexecuted instantiation: NSS_Get_SECKEY_EncryptedPrivateKeyInfoTemplate Unexecuted instantiation: NSS_Get_SECKEY_PointerToEncryptedPrivateKeyInfoTemplate Unexecuted instantiation: NSS_Get_SECKEY_PrivateKeyInfoTemplate Unexecuted instantiation: NSS_Get_SECKEY_PointerToPrivateKeyInfoTemplate Unexecuted instantiation: NSS_Get_CERT_CertificateRequestTemplate Unexecuted instantiation: NSS_Get_NSSCMSGenericWrapperDataTemplate Unexecuted instantiation: NSS_Get_NSS_PointerToCMSGenericWrapperDataTemplate |
202 | | |
203 | | /* |
204 | | ** Opaque object used by the decoder to store state. |
205 | | */ |
206 | | typedef struct sec_DecoderContext_struct SEC_ASN1DecoderContext; |
207 | | |
208 | | /* |
209 | | ** Opaque object used by the encoder to store state. |
210 | | */ |
211 | | typedef struct sec_EncoderContext_struct SEC_ASN1EncoderContext; |
212 | | |
213 | | /* |
214 | | * This is used to describe to a filter function the bytes that are |
215 | | * being passed to it. This is only useful when the filter is an "outer" |
216 | | * one, meaning it expects to get *all* of the bytes not just the |
217 | | * contents octets. |
218 | | */ |
219 | | typedef enum { |
220 | | SEC_ASN1_Identifier = 0, |
221 | | SEC_ASN1_Length = 1, |
222 | | SEC_ASN1_Contents = 2, |
223 | | SEC_ASN1_EndOfContents = 3 |
224 | | } SEC_ASN1EncodingPart; |
225 | | |
226 | | /* |
227 | | * Type of the function pointer used either for decoding or encoding, |
228 | | * when doing anything "funny" (e.g. manipulating the data stream) |
229 | | */ |
230 | | typedef void (*SEC_ASN1NotifyProc)(void *arg, PRBool before, |
231 | | void *dest, int real_depth); |
232 | | |
233 | | /* |
234 | | * Type of the function pointer used for grabbing encoded bytes. |
235 | | * This can be used during either encoding or decoding, as follows... |
236 | | * |
237 | | * When decoding, this can be used to filter the encoded bytes as they |
238 | | * are parsed. This is what you would do if you wanted to process the data |
239 | | * along the way (like to decrypt it, or to perform a hash on it in order |
240 | | * to do a signature check later). See SEC_ASN1DecoderSetFilterProc(). |
241 | | * When processing only part of the encoded bytes is desired, you "watch" |
242 | | * for the field(s) you are interested in with a "notify proc" (see |
243 | | * SEC_ASN1DecoderSetNotifyProc()) and for even finer granularity (e.g. to |
244 | | * ignore all by the contents bytes) you pay attention to the "data_kind" |
245 | | * parameter. |
246 | | * |
247 | | * When encoding, this is the specification for the output function which |
248 | | * will receive the bytes as they are encoded. The output function can |
249 | | * perform any postprocessing necessary (like hashing (some of) the data |
250 | | * to create a digest that gets included at the end) as well as shoving |
251 | | * the data off wherever it needs to go. (In order to "tune" any processing, |
252 | | * you can set a "notify proc" as described above in the decoding case.) |
253 | | * |
254 | | * The parameters: |
255 | | * - "arg" is an opaque pointer that you provided at the same time you |
256 | | * specified a function of this type |
257 | | * - "data" is a buffer of length "len", containing the encoded bytes |
258 | | * - "depth" is how deep in a nested encoding we are (it is not usually |
259 | | * valuable, but can be useful sometimes so I included it) |
260 | | * - "data_kind" tells you if these bytes are part of the ASN.1 encoded |
261 | | * octets for identifier, length, contents, or end-of-contents |
262 | | */ |
263 | | typedef void (*SEC_ASN1WriteProc)(void *arg, |
264 | | const char *data, unsigned long len, |
265 | | int depth, SEC_ASN1EncodingPart data_kind); |
266 | | |
267 | | #endif /* _SECASN1T_H_ */ |