]>
Commit | Line | Data |
---|---|---|
b1ab9ed8 A |
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 | * Support for encoding/decoding of ASN.1 using BER/DER (Basic/Distinguished | |
36 | * Encoding Rules). The routines are found in and used extensively by the | |
37 | * security library, but exported for other use. | |
38 | * | |
39 | * $Id: secasn1.h,v 1.8 2004/05/13 15:29:13 dmitch Exp $ | |
40 | */ | |
41 | ||
42 | #ifndef _SECASN1_H_ | |
43 | #define _SECASN1_H_ | |
44 | ||
45 | #include <security_asn1/plarenas.h> | |
46 | ||
47 | #include <security_asn1/seccomon.h> | |
48 | #include <Security/secasn1t.h> | |
49 | #include <Security/SecAsn1Templates.h> | |
50 | ||
51 | ||
52 | /************************************************************************/ | |
53 | SEC_BEGIN_PROTOS | |
54 | ||
55 | /* | |
56 | * XXX These function prototypes need full, explanatory comments. | |
57 | */ | |
58 | ||
59 | /* | |
60 | ** Decoding. | |
61 | */ | |
62 | ||
63 | extern SEC_ASN1DecoderContext *SEC_ASN1DecoderStart(PRArenaPool *pool, | |
64 | void *dest, | |
65 | const SecAsn1Template *t, | |
66 | /* | |
67 | * __APPLE__ addenda: | |
68 | * | |
69 | * Only needed if first element will | |
70 | * be SEC_ASN1_DYNAMIC | |
71 | */ | |
72 | const char *buf); | |
73 | ||
74 | /* XXX char or unsigned char? */ | |
75 | extern SECStatus SEC_ASN1DecoderUpdate(SEC_ASN1DecoderContext *cx, | |
76 | const char *buf, | |
77 | size_t len); | |
78 | ||
79 | extern SECStatus SEC_ASN1DecoderFinish(SEC_ASN1DecoderContext *cx); | |
80 | ||
81 | /* Higher level code detected an error, abort the rest of the processing */ | |
82 | extern void SEC_ASN1DecoderAbort(SEC_ASN1DecoderContext *cx, int error); | |
83 | ||
84 | extern void SEC_ASN1DecoderSetFilterProc(SEC_ASN1DecoderContext *cx, | |
85 | SEC_ASN1WriteProc fn, | |
86 | void *arg, PRBool no_store); | |
87 | ||
88 | extern void SEC_ASN1DecoderClearFilterProc(SEC_ASN1DecoderContext *cx); | |
89 | ||
90 | extern void SEC_ASN1DecoderSetNotifyProc(SEC_ASN1DecoderContext *cx, | |
91 | SEC_ASN1NotifyProc fn, | |
92 | void *arg); | |
93 | ||
94 | extern void SEC_ASN1DecoderClearNotifyProc(SEC_ASN1DecoderContext *cx); | |
95 | ||
96 | extern SECStatus SEC_ASN1Decode(PRArenaPool *pool, void *dest, | |
97 | const SecAsn1Template *t, | |
98 | const char *buf, size_t len); | |
99 | ||
100 | extern SECStatus SEC_ASN1DecodeItem(PRArenaPool *pool, void *dest, | |
101 | const SecAsn1Template *t, | |
102 | const SecAsn1Item *item); | |
103 | ||
104 | extern SECStatus SEC_QuickDERDecodeItem(PRArenaPool* arena, void* dest, | |
105 | const SecAsn1Template* templateEntry, | |
106 | SecAsn1Item* src); | |
107 | ||
108 | /* | |
109 | ** Encoding. | |
110 | */ | |
111 | ||
112 | extern SEC_ASN1EncoderContext *SEC_ASN1EncoderStart(const void *src, | |
113 | const SecAsn1Template *t, | |
114 | SEC_ASN1WriteProc fn, | |
115 | void *output_arg); | |
116 | ||
117 | /* XXX char or unsigned char? */ | |
118 | extern SECStatus SEC_ASN1EncoderUpdate(SEC_ASN1EncoderContext *cx, | |
119 | const char *buf, | |
120 | unsigned long len); | |
121 | ||
122 | extern void SEC_ASN1EncoderFinish(SEC_ASN1EncoderContext *cx); | |
123 | ||
124 | /* Higher level code detected an error, abort the rest of the processing */ | |
125 | extern void SEC_ASN1EncoderAbort(SEC_ASN1EncoderContext *cx, int error); | |
126 | ||
127 | extern void SEC_ASN1EncoderSetNotifyProc(SEC_ASN1EncoderContext *cx, | |
128 | SEC_ASN1NotifyProc fn, | |
129 | void *arg); | |
130 | ||
131 | extern void SEC_ASN1EncoderClearNotifyProc(SEC_ASN1EncoderContext *cx); | |
132 | ||
133 | extern void SEC_ASN1EncoderSetStreaming(SEC_ASN1EncoderContext *cx); | |
134 | ||
135 | extern void SEC_ASN1EncoderClearStreaming(SEC_ASN1EncoderContext *cx); | |
136 | ||
137 | extern void sec_ASN1EncoderSetDER(SEC_ASN1EncoderContext *cx); | |
138 | ||
139 | extern void sec_ASN1EncoderClearDER(SEC_ASN1EncoderContext *cx); | |
140 | ||
141 | extern void SEC_ASN1EncoderSetTakeFromBuf(SEC_ASN1EncoderContext *cx); | |
142 | ||
143 | extern void SEC_ASN1EncoderClearTakeFromBuf(SEC_ASN1EncoderContext *cx); | |
144 | ||
145 | extern SECStatus SEC_ASN1Encode(const void *src, | |
146 | const SecAsn1Template *t, | |
147 | SEC_ASN1WriteProc output_proc, | |
148 | void *output_arg); | |
149 | ||
150 | extern SecAsn1Item * SEC_ASN1EncodeItem(PRArenaPool *pool, SecAsn1Item *dest, | |
151 | const void *src, const SecAsn1Template *t); | |
152 | ||
153 | extern SecAsn1Item * SEC_ASN1EncodeInteger(PRArenaPool *pool, | |
154 | SecAsn1Item *dest, long value); | |
155 | ||
156 | extern SecAsn1Item * SEC_ASN1EncodeUnsignedInteger(PRArenaPool *pool, | |
157 | SecAsn1Item *dest, | |
158 | unsigned long value); | |
159 | ||
160 | extern SECStatus SEC_ASN1DecodeInteger(SecAsn1Item *src, | |
161 | unsigned long *value); | |
162 | ||
163 | /* | |
164 | ** Utilities. | |
165 | */ | |
166 | ||
167 | /* | |
168 | * We have a length that needs to be encoded; how many bytes will the | |
169 | * encoding take? | |
170 | */ | |
171 | extern int SEC_ASN1LengthLength (unsigned long len); | |
172 | ||
173 | /* encode the length and return the number of bytes we encoded. Buffer | |
174 | * must be pre allocated */ | |
175 | extern int SEC_ASN1EncodeLength(unsigned char *buf,unsigned long value); | |
176 | ||
177 | /* | |
178 | * Find the appropriate subtemplate for the given template. | |
179 | * This may involve calling a "chooser" function, or it may just | |
180 | * be right there. In either case, it is expected to *have* a | |
181 | * subtemplate; this is asserted in debug builds (in non-debug | |
182 | * builds, NULL will be returned). | |
183 | * | |
184 | * "thing" is a pointer to the structure being encoded/decoded | |
185 | * "encoding", when true, means that we are in the process of encoding | |
186 | * (as opposed to in the process of decoding) | |
187 | */ | |
188 | extern const SecAsn1Template * | |
189 | SEC_ASN1GetSubtemplate ( | |
190 | const SecAsn1Template *inTemplate, | |
191 | void *thing, | |
192 | PRBool encoding, | |
193 | const char *buf); /* __APPLE__ addenda: for decode only */ | |
194 | ||
195 | extern SecAsn1Item *sec_asn1e_allocate_item ( | |
196 | PRArenaPool *poolp, | |
197 | SecAsn1Item *dest, | |
198 | unsigned long len); | |
199 | ||
200 | /* | |
201 | * These two are exported for use by SecNssEncodeItem() | |
202 | */ | |
203 | extern void sec_asn1e_encode_item_count ( | |
204 | void *arg, | |
205 | const char *buf, | |
206 | size_t len, | |
207 | int depth, | |
208 | SEC_ASN1EncodingPart data_kind); | |
209 | ||
210 | extern void sec_asn1e_encode_item_store ( | |
211 | void *arg, | |
212 | const char *buf, | |
213 | size_t len, | |
214 | int depth, | |
215 | SEC_ASN1EncodingPart data_kind); | |
216 | ||
217 | ||
218 | SEC_END_PROTOS | |
219 | #endif /* _SECASN1_H_ */ |