Coverage Report

Created: 2025-06-24 06:49

/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_ */