1/*
2 * The contents of this file are subject to the Mozilla Public
3 * License Version 1.1 (the "License"); you may not use this file
4 * except in compliance with the License. You may obtain a copy of
5 * the License at http://www.mozilla.org/MPL/
6 *
7 * Software distributed under the License is distributed on an "AS
8 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
9 * implied. See the License for the specific language governing
10 * rights and limitations under the License.
11 *
12 * The Original Code is the Netscape security libraries.
13 *
14 * The Initial Developer of the Original Code is Netscape
15 * Communications Corporation.  Portions created by Netscape are
16 * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
17 * Rights Reserved.
18 *
19 * Contributor(s):
20 *
21 * Alternatively, the contents of this file may be used under the
22 * terms of the GNU General Public License Version 2 or later (the
23 * "GPL"), in which case the provisions of the GPL are applicable
24 * instead of those above.  If you wish to allow use of your
25 * version of this file only under the terms of the GPL and not to
26 * allow others to use your version of this file under the MPL,
27 * indicate your decision by deleting the provisions above and
28 * replace them with the notice and other provisions required by
29 * the GPL.  If you do not delete the provisions above, a recipient
30 * may use your version of this file under either the MPL or the
31 * GPL.
32 */
33
34/*
35 * Private (SPI) types libsecurity_asn1.h.
36 */
37
38#ifndef _SECASN1T_H_
39#define _SECASN1T_H_
40
41#include <CoreFoundation/CFBase.h>		/* Boolean */
42#include <sys/types.h>
43#include <Security/SecAsn1Types.h>		/* public types */
44
45
46/* default size used for allocation of encoding/decoding stuff */
47#define SEC_ASN1_DEFAULT_ARENA_SIZE	(2048)
48
49/*
50 * Tempalte flags we don't export in the public API in SecAsn1Types.h
51 */
52#define SEC_ASN1_MAY_STREAM	0x40000	/* field or one of its sub-fields may
53									 * stream in and so should encode as
54									 * indefinite-length when streaming
55									 * has been indicated; only for
56									 * encoding */
57#define SEC_ASN1_NO_STREAM  0X200000 /* This entry will not stream
58									  * even if the sub-template says
59									  * streaming is possible.  Helps
60									  * to solve ambiguities with potential
61									  * streaming entries that are
62									  * optional */
63
64/* Maximum depth of nested SEQUENCEs and SETs */
65#define SEC_ASN1D_MAX_DEPTH 32
66
67#define SEC_ASN1_GET(x)        x
68#define SEC_ASN1_SUB(x)        x
69#define SEC_ASN1_XTRN          0
70#define SEC_ASN1_MKSUB(x)
71
72#define SEC_ASN1_CHOOSER_DECLARE(x) \
73extern const SecAsn1Template * NSS_Get_##x (void *arg, Boolean enc);
74
75#define SEC_ASN1_CHOOSER_IMPLEMENT(x) \
76const SecAsn1Template * NSS_Get_##x(void * arg, Boolean enc) \
77{ return x; }
78
79/*
80** Opaque object used by the decoder to store state.
81*/
82typedef struct sec_DecoderContext_struct SEC_ASN1DecoderContext;
83
84/*
85** Opaque object used by the encoder to store state.
86*/
87typedef struct sec_EncoderContext_struct SEC_ASN1EncoderContext;
88
89/*
90 * This is used to describe to a filter function the bytes that are
91 * being passed to it.  This is only useful when the filter is an "outer"
92 * one, meaning it expects to get *all* of the bytes not just the
93 * contents octets.
94 */
95typedef enum {
96    SEC_ASN1_Identifier = 0,
97    SEC_ASN1_Length = 1,
98    SEC_ASN1_Contents = 2,
99    SEC_ASN1_EndOfContents = 3
100} SEC_ASN1EncodingPart;
101
102/*
103 * Type of the function pointer used either for decoding or encoding,
104 * when doing anything "funny" (e.g. manipulating the data stream)
105 */
106typedef void (* SEC_ASN1NotifyProc)(void *arg, Boolean before,
107				    void *dest, int real_depth);
108
109/*
110 * Type of the function pointer used for grabbing encoded bytes.
111 * This can be used during either encoding or decoding, as follows...
112 *
113 * When decoding, this can be used to filter the encoded bytes as they
114 * are parsed.  This is what you would do if you wanted to process the data
115 * along the way (like to decrypt it, or to perform a hash on it in order
116 * to do a signature check later).  See SEC_ASN1DecoderSetFilterProc().
117 * When processing only part of the encoded bytes is desired, you "watch"
118 * for the field(s) you are interested in with a "notify proc" (see
119 * SEC_ASN1DecoderSetNotifyProc()) and for even finer granularity (e.g. to
120 * ignore all by the contents bytes) you pay attention to the "data_kind"
121 * parameter.
122 *
123 * When encoding, this is the specification for the output function which
124 * will receive the bytes as they are encoded.  The output function can
125 * perform any postprocessing necessary (like hashing (some of) the data
126 * to create a digest that gets included at the end) as well as shoving
127 * the data off wherever it needs to go.  (In order to "tune" any processing,
128 * you can set a "notify proc" as described above in the decoding case.)
129 *
130 * The parameters:
131 * - "arg" is an opaque pointer that you provided at the same time you
132 *   specified a function of this type
133 * - "data" is a buffer of length "len", containing the encoded bytes
134 * - "depth" is how deep in a nested encoding we are (it is not usually
135 *   valuable, but can be useful sometimes so I included it)
136 * - "data_kind" tells you if these bytes are part of the ASN.1 encoded
137 *   octets for identifier, length, contents, or end-of-contents
138 */
139typedef void (* SEC_ASN1WriteProc)(void *arg,
140				   const char *data, size_t len,
141				   int depth, SEC_ASN1EncodingPart data_kind);
142
143#endif /* _SECASN1T_H_ */
144