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/
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.
12 * The Original Code is the Netscape security libraries.
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
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
35 * Private (SPI) types libsecurity_asn1.h.
41 #include <CoreFoundation/CFBase.h> /* Boolean */
42 #include <sys/types.h>
43 #include <Security/SecAsn1Types.h> /* public types */
46 /* default size used for allocation of encoding/decoding stuff */
47 #define SEC_ASN1_DEFAULT_ARENA_SIZE (2048)
50 * Tempalte flags we don't export in the public API in SecAsn1Types.h
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
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
64 /* Maximum depth of nested SEQUENCEs and SETs */
65 #define SEC_ASN1D_MAX_DEPTH 32
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)
72 #define SEC_ASN1_CHOOSER_DECLARE(x) \
73 extern const SecAsn1Template * NSS_Get_##x (void *arg, Boolean enc);
75 #define SEC_ASN1_CHOOSER_IMPLEMENT(x) \
76 const SecAsn1Template * NSS_Get_##x(void * arg, Boolean enc) \
80 ** Opaque object used by the decoder to store state.
82 typedef struct sec_DecoderContext_struct SEC_ASN1DecoderContext
;
85 ** Opaque object used by the encoder to store state.
87 typedef struct sec_EncoderContext_struct SEC_ASN1EncoderContext
;
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
96 SEC_ASN1_Identifier
= 0,
98 SEC_ASN1_Contents
= 2,
99 SEC_ASN1_EndOfContents
= 3
100 } SEC_ASN1EncodingPart
;
103 * Type of the function pointer used either for decoding or encoding,
104 * when doing anything "funny" (e.g. manipulating the data stream)
106 typedef void (* SEC_ASN1NotifyProc
)(void *arg
, Boolean before
,
107 void *dest
, int real_depth
);
110 * Type of the function pointer used for grabbing encoded bytes.
111 * This can be used during either encoding or decoding, as follows...
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"
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.)
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
139 typedef void (* SEC_ASN1WriteProc
)(void *arg
,
140 const char *data
, size_t len
,
141 int depth
, SEC_ASN1EncodingPart data_kind
);
143 #endif /* _SECASN1T_H_ */