* tar xzf utvpn-src-unix-v101-7101-public-2010.06.27.tar.gz
[lab.git] / utvpn / utvpn-unix-v101-7101-public / src / Mayaqua / openssl / asn1_mac.h
1 /* crypto/asn1/asn1_mac.h */\r
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)\r
3  * All rights reserved.\r
4  *\r
5  * This package is an SSL implementation written\r
6  * by Eric Young (eay@cryptsoft.com).\r
7  * The implementation was written so as to conform with Netscapes SSL.\r
8  * \r
9  * This library is free for commercial and non-commercial use as long as\r
10  * the following conditions are aheared to.  The following conditions\r
11  * apply to all code found in this distribution, be it the RC4, RSA,\r
12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation\r
13  * included with this distribution is covered by the same copyright terms\r
14  * except that the holder is Tim Hudson (tjh@cryptsoft.com).\r
15  * \r
16  * Copyright remains Eric Young's, and as such any Copyright notices in\r
17  * the code are not to be removed.\r
18  * If this package is used in a product, Eric Young should be given attribution\r
19  * as the author of the parts of the library used.\r
20  * This can be in the form of a textual message at program startup or\r
21  * in documentation (online or textual) provided with the package.\r
22  * \r
23  * Redistribution and use in source and binary forms, with or without\r
24  * modification, are permitted provided that the following conditions\r
25  * are met:\r
26  * 1. Redistributions of source code must retain the copyright\r
27  *    notice, this list of conditions and the following disclaimer.\r
28  * 2. Redistributions in binary form must reproduce the above copyright\r
29  *    notice, this list of conditions and the following disclaimer in the\r
30  *    documentation and/or other materials provided with the distribution.\r
31  * 3. All advertising materials mentioning features or use of this software\r
32  *    must display the following acknowledgement:\r
33  *    "This product includes cryptographic software written by\r
34  *     Eric Young (eay@cryptsoft.com)"\r
35  *    The word 'cryptographic' can be left out if the rouines from the library\r
36  *    being used are not cryptographic related :-).\r
37  * 4. If you include any Windows specific code (or a derivative thereof) from \r
38  *    the apps directory (application code) you must include an acknowledgement:\r
39  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"\r
40  * \r
41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND\r
42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\r
45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
51  * SUCH DAMAGE.\r
52  * \r
53  * The licence and distribution terms for any publically available version or\r
54  * derivative of this code cannot be changed.  i.e. this code cannot simply be\r
55  * copied and put under another distribution licence\r
56  * [including the GNU Public Licence.]\r
57  */\r
58 \r
59 #ifndef HEADER_ASN1_MAC_H\r
60 #define HEADER_ASN1_MAC_H\r
61 \r
62 #include <openssl/asn1.h>\r
63 \r
64 #ifdef  __cplusplus\r
65 extern "C" {\r
66 #endif\r
67 \r
68 #ifndef ASN1_MAC_ERR_LIB\r
69 #define ASN1_MAC_ERR_LIB        ERR_LIB_ASN1\r
70 #endif \r
71 \r
72 #define ASN1_MAC_H_err(f,r,line) \\r
73         ERR_PUT_error(ASN1_MAC_ERR_LIB,(f),(r),__FILE__,(line))\r
74 \r
75 #define M_ASN1_D2I_vars(a,type,func) \\r
76         ASN1_const_CTX c; \\r
77         type ret=NULL; \\r
78         \\r
79         c.pp=(const unsigned char **)pp; \\r
80         c.q= *(const unsigned char **)pp; \\r
81         c.error=ERR_R_NESTED_ASN1_ERROR; \\r
82         if ((a == NULL) || ((*a) == NULL)) \\r
83                 { if ((ret=(type)func()) == NULL) \\r
84                         { c.line=__LINE__; goto err; } } \\r
85         else    ret=(*a);\r
86 \r
87 #define M_ASN1_D2I_Init() \\r
88         c.p= *(const unsigned char **)pp; \\r
89         c.max=(length == 0)?0:(c.p+length);\r
90 \r
91 #define M_ASN1_D2I_Finish_2(a) \\r
92         if (!asn1_const_Finish(&c)) \\r
93                 { c.line=__LINE__; goto err; } \\r
94         *(const unsigned char **)pp=c.p; \\r
95         if (a != NULL) (*a)=ret; \\r
96         return(ret);\r
97 \r
98 #define M_ASN1_D2I_Finish(a,func,e) \\r
99         M_ASN1_D2I_Finish_2(a); \\r
100 err:\\r
101         ASN1_MAC_H_err((e),c.error,c.line); \\r
102         asn1_add_error(*(const unsigned char **)pp,(int)(c.q- *pp)); \\r
103         if ((ret != NULL) && ((a == NULL) || (*a != ret))) func(ret); \\r
104         return(NULL)\r
105 \r
106 #define M_ASN1_D2I_start_sequence() \\r
107         if (!asn1_GetSequence(&c,&length)) \\r
108                 { c.line=__LINE__; goto err; }\r
109 /* Begin reading ASN1 without a surrounding sequence */\r
110 #define M_ASN1_D2I_begin() \\r
111         c.slen = length;\r
112 \r
113 /* End reading ASN1 with no check on length */\r
114 #define M_ASN1_D2I_Finish_nolen(a, func, e) \\r
115         *pp=c.p; \\r
116         if (a != NULL) (*a)=ret; \\r
117         return(ret); \\r
118 err:\\r
119         ASN1_MAC_H_err((e),c.error,c.line); \\r
120         asn1_add_error(*pp,(int)(c.q- *pp)); \\r
121         if ((ret != NULL) && ((a == NULL) || (*a != ret))) func(ret); \\r
122         return(NULL)\r
123 \r
124 #define M_ASN1_D2I_end_sequence() \\r
125         (((c.inf&1) == 0)?(c.slen <= 0): \\r
126                 (c.eos=ASN1_const_check_infinite_end(&c.p,c.slen)))\r
127 \r
128 /* Don't use this with d2i_ASN1_BOOLEAN() */\r
129 #define M_ASN1_D2I_get(b, func) \\r
130         c.q=c.p; \\r
131         if (func(&(b),&c.p,c.slen) == NULL) \\r
132                 {c.line=__LINE__; goto err; } \\r
133         c.slen-=(c.p-c.q);\r
134 \r
135 /* Don't use this with d2i_ASN1_BOOLEAN() */\r
136 #define M_ASN1_D2I_get_x(type,b,func) \\r
137         c.q=c.p; \\r
138         if (((D2I_OF(type))func)(&(b),&c.p,c.slen) == NULL) \\r
139                 {c.line=__LINE__; goto err; } \\r
140         c.slen-=(c.p-c.q);\r
141 \r
142 /* use this instead () */\r
143 #define M_ASN1_D2I_get_int(b,func) \\r
144         c.q=c.p; \\r
145         if (func(&(b),&c.p,c.slen) < 0) \\r
146                 {c.line=__LINE__; goto err; } \\r
147         c.slen-=(c.p-c.q);\r
148 \r
149 #define M_ASN1_D2I_get_opt(b,func,type) \\r
150         if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) \\r
151                 == (V_ASN1_UNIVERSAL|(type)))) \\r
152                 { \\r
153                 M_ASN1_D2I_get(b,func); \\r
154                 }\r
155 \r
156 #define M_ASN1_D2I_get_imp(b,func, type) \\r
157         M_ASN1_next=(_tmp& V_ASN1_CONSTRUCTED)|type; \\r
158         c.q=c.p; \\r
159         if (func(&(b),&c.p,c.slen) == NULL) \\r
160                 {c.line=__LINE__; M_ASN1_next_prev = _tmp; goto err; } \\r
161         c.slen-=(c.p-c.q);\\r
162         M_ASN1_next_prev=_tmp;\r
163 \r
164 #define M_ASN1_D2I_get_IMP_opt(b,func,tag,type) \\r
165         if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) == \\r
166                 (V_ASN1_CONTEXT_SPECIFIC|(tag)))) \\r
167                 { \\r
168                 unsigned char _tmp = M_ASN1_next; \\r
169                 M_ASN1_D2I_get_imp(b,func, type);\\r
170                 }\r
171 \r
172 #define M_ASN1_D2I_get_set(r,func,free_func) \\r
173                 M_ASN1_D2I_get_imp_set(r,func,free_func, \\r
174                         V_ASN1_SET,V_ASN1_UNIVERSAL);\r
175 \r
176 #define M_ASN1_D2I_get_set_type(type,r,func,free_func) \\r
177                 M_ASN1_D2I_get_imp_set_type(type,r,func,free_func, \\r
178                         V_ASN1_SET,V_ASN1_UNIVERSAL);\r
179 \r
180 #define M_ASN1_D2I_get_set_opt(r,func,free_func) \\r
181         if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \\r
182                 V_ASN1_CONSTRUCTED|V_ASN1_SET)))\\r
183                 { M_ASN1_D2I_get_set(r,func,free_func); }\r
184 \r
185 #define M_ASN1_D2I_get_set_opt_type(type,r,func,free_func) \\r
186         if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \\r
187                 V_ASN1_CONSTRUCTED|V_ASN1_SET)))\\r
188                 { M_ASN1_D2I_get_set_type(type,r,func,free_func); }\r
189 \r
190 #define M_ASN1_I2D_len_SET_opt(a,f) \\r
191         if ((a != NULL) && (sk_num(a) != 0)) \\r
192                 M_ASN1_I2D_len_SET(a,f);\r
193 \r
194 #define M_ASN1_I2D_put_SET_opt(a,f) \\r
195         if ((a != NULL) && (sk_num(a) != 0)) \\r
196                 M_ASN1_I2D_put_SET(a,f);\r
197 \r
198 #define M_ASN1_I2D_put_SEQUENCE_opt(a,f) \\r
199         if ((a != NULL) && (sk_num(a) != 0)) \\r
200                 M_ASN1_I2D_put_SEQUENCE(a,f);\r
201 \r
202 #define M_ASN1_I2D_put_SEQUENCE_opt_type(type,a,f) \\r
203         if ((a != NULL) && (sk_##type##_num(a) != 0)) \\r
204                 M_ASN1_I2D_put_SEQUENCE_type(type,a,f);\r
205 \r
206 #define M_ASN1_D2I_get_IMP_set_opt(b,func,free_func,tag) \\r
207         if ((c.slen != 0) && \\r
208                 (M_ASN1_next == \\r
209                 (V_ASN1_CONTEXT_SPECIFIC|V_ASN1_CONSTRUCTED|(tag))))\\r
210                 { \\r
211                 M_ASN1_D2I_get_imp_set(b,func,free_func,\\r
212                         tag,V_ASN1_CONTEXT_SPECIFIC); \\r
213                 }\r
214 \r
215 #define M_ASN1_D2I_get_IMP_set_opt_type(type,b,func,free_func,tag) \\r
216         if ((c.slen != 0) && \\r
217                 (M_ASN1_next == \\r
218                 (V_ASN1_CONTEXT_SPECIFIC|V_ASN1_CONSTRUCTED|(tag))))\\r
219                 { \\r
220                 M_ASN1_D2I_get_imp_set_type(type,b,func,free_func,\\r
221                         tag,V_ASN1_CONTEXT_SPECIFIC); \\r
222                 }\r
223 \r
224 #define M_ASN1_D2I_get_seq(r,func,free_func) \\r
225                 M_ASN1_D2I_get_imp_set(r,func,free_func,\\r
226                         V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL);\r
227 \r
228 #define M_ASN1_D2I_get_seq_type(type,r,func,free_func) \\r
229                 M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\\r
230                                             V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL)\r
231 \r
232 #define M_ASN1_D2I_get_seq_opt(r,func,free_func) \\r
233         if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \\r
234                 V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\\r
235                 { M_ASN1_D2I_get_seq(r,func,free_func); }\r
236 \r
237 #define M_ASN1_D2I_get_seq_opt_type(type,r,func,free_func) \\r
238         if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \\r
239                 V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\\r
240                 { M_ASN1_D2I_get_seq_type(type,r,func,free_func); }\r
241 \r
242 #define M_ASN1_D2I_get_IMP_set(r,func,free_func,x) \\r
243                 M_ASN1_D2I_get_imp_set(r,func,free_func,\\r
244                         x,V_ASN1_CONTEXT_SPECIFIC);\r
245 \r
246 #define M_ASN1_D2I_get_IMP_set_type(type,r,func,free_func,x) \\r
247                 M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\\r
248                         x,V_ASN1_CONTEXT_SPECIFIC);\r
249 \r
250 #define M_ASN1_D2I_get_imp_set(r,func,free_func,a,b) \\r
251         c.q=c.p; \\r
252         if (d2i_ASN1_SET(&(r),&c.p,c.slen,(char *(*)())func,\\r
253                 (void (*)())free_func,a,b) == NULL) \\r
254                 { c.line=__LINE__; goto err; } \\r
255         c.slen-=(c.p-c.q);\r
256 \r
257 #define M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,a,b) \\r
258         c.q=c.p; \\r
259         if (d2i_ASN1_SET_OF_##type(&(r),&c.p,c.slen,func,\\r
260                                    free_func,a,b) == NULL) \\r
261                 { c.line=__LINE__; goto err; } \\r
262         c.slen-=(c.p-c.q);\r
263 \r
264 #define M_ASN1_D2I_get_set_strings(r,func,a,b) \\r
265         c.q=c.p; \\r
266         if (d2i_ASN1_STRING_SET(&(r),&c.p,c.slen,a,b) == NULL) \\r
267                 { c.line=__LINE__; goto err; } \\r
268         c.slen-=(c.p-c.q);\r
269 \r
270 #define M_ASN1_D2I_get_EXP_opt(r,func,tag) \\r
271         if ((c.slen != 0L) && (M_ASN1_next == \\r
272                 (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \\r
273                 { \\r
274                 int Tinf,Ttag,Tclass; \\r
275                 long Tlen; \\r
276                 \\r
277                 c.q=c.p; \\r
278                 Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \\r
279                 if (Tinf & 0x80) \\r
280                         { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \\r
281                         c.line=__LINE__; goto err; } \\r
282                 if (Tinf == (V_ASN1_CONSTRUCTED+1)) \\r
283                                         Tlen = c.slen - (c.p - c.q) - 2; \\r
284                 if (func(&(r),&c.p,Tlen) == NULL) \\r
285                         { c.line=__LINE__; goto err; } \\r
286                 if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \\r
287                         Tlen = c.slen - (c.p - c.q); \\r
288                         if(!ASN1_const_check_infinite_end(&c.p, Tlen)) \\r
289                                 { c.error=ERR_R_MISSING_ASN1_EOS; \\r
290                                 c.line=__LINE__; goto err; } \\r
291                 }\\r
292                 c.slen-=(c.p-c.q); \\r
293                 }\r
294 \r
295 #define M_ASN1_D2I_get_EXP_set_opt(r,func,free_func,tag,b) \\r
296         if ((c.slen != 0) && (M_ASN1_next == \\r
297                 (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \\r
298                 { \\r
299                 int Tinf,Ttag,Tclass; \\r
300                 long Tlen; \\r
301                 \\r
302                 c.q=c.p; \\r
303                 Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \\r
304                 if (Tinf & 0x80) \\r
305                         { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \\r
306                         c.line=__LINE__; goto err; } \\r
307                 if (Tinf == (V_ASN1_CONSTRUCTED+1)) \\r
308                                         Tlen = c.slen - (c.p - c.q) - 2; \\r
309                 if (d2i_ASN1_SET(&(r),&c.p,Tlen,(char *(*)())func, \\r
310                         (void (*)())free_func, \\r
311                         b,V_ASN1_UNIVERSAL) == NULL) \\r
312                         { c.line=__LINE__; goto err; } \\r
313                 if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \\r
314                         Tlen = c.slen - (c.p - c.q); \\r
315                         if(!ASN1_check_infinite_end(&c.p, Tlen)) \\r
316                                 { c.error=ERR_R_MISSING_ASN1_EOS; \\r
317                                 c.line=__LINE__; goto err; } \\r
318                 }\\r
319                 c.slen-=(c.p-c.q); \\r
320                 }\r
321 \r
322 #define M_ASN1_D2I_get_EXP_set_opt_type(type,r,func,free_func,tag,b) \\r
323         if ((c.slen != 0) && (M_ASN1_next == \\r
324                 (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \\r
325                 { \\r
326                 int Tinf,Ttag,Tclass; \\r
327                 long Tlen; \\r
328                 \\r
329                 c.q=c.p; \\r
330                 Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \\r
331                 if (Tinf & 0x80) \\r
332                         { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \\r
333                         c.line=__LINE__; goto err; } \\r
334                 if (Tinf == (V_ASN1_CONSTRUCTED+1)) \\r
335                                         Tlen = c.slen - (c.p - c.q) - 2; \\r
336                 if (d2i_ASN1_SET_OF_##type(&(r),&c.p,Tlen,func, \\r
337                         free_func,b,V_ASN1_UNIVERSAL) == NULL) \\r
338                         { c.line=__LINE__; goto err; } \\r
339                 if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \\r
340                         Tlen = c.slen - (c.p - c.q); \\r
341                         if(!ASN1_check_infinite_end(&c.p, Tlen)) \\r
342                                 { c.error=ERR_R_MISSING_ASN1_EOS; \\r
343                                 c.line=__LINE__; goto err; } \\r
344                 }\\r
345                 c.slen-=(c.p-c.q); \\r
346                 }\r
347 \r
348 /* New macros */\r
349 #define M_ASN1_New_Malloc(ret,type) \\r
350         if ((ret=(type *)OPENSSL_malloc(sizeof(type))) == NULL) \\r
351                 { c.line=__LINE__; goto err2; }\r
352 \r
353 #define M_ASN1_New(arg,func) \\r
354         if (((arg)=func()) == NULL) return(NULL)\r
355 \r
356 #define M_ASN1_New_Error(a) \\r
357 /*      err:    ASN1_MAC_H_err((a),ERR_R_NESTED_ASN1_ERROR,c.line); \\r
358                 return(NULL);*/ \\r
359         err2:   ASN1_MAC_H_err((a),ERR_R_MALLOC_FAILURE,c.line); \\r
360                 return(NULL)\r
361 \r
362 \r
363 /* BIG UGLY WARNING!  This is so damn ugly I wanna puke.  Unfortunately,\r
364    some macros that use ASN1_const_CTX still insist on writing in the input\r
365    stream.  ARGH!  ARGH!  ARGH!  Let's get rid of this macro package.\r
366    Please?                                              -- Richard Levitte */\r
367 #define M_ASN1_next             (*((unsigned char *)(c.p)))\r
368 #define M_ASN1_next_prev        (*((unsigned char *)(c.q)))\r
369 \r
370 /*************************************************/\r
371 \r
372 #define M_ASN1_I2D_vars(a)      int r=0,ret=0; \\r
373                                 unsigned char *p; \\r
374                                 if (a == NULL) return(0)\r
375 \r
376 /* Length Macros */\r
377 #define M_ASN1_I2D_len(a,f)     ret+=f(a,NULL)\r
378 #define M_ASN1_I2D_len_IMP_opt(a,f)     if (a != NULL) M_ASN1_I2D_len(a,f)\r
379 \r
380 #define M_ASN1_I2D_len_SET(a,f) \\r
381                 ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET);\r
382 \r
383 #define M_ASN1_I2D_len_SET_type(type,a,f) \\r
384                 ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SET, \\r
385                                             V_ASN1_UNIVERSAL,IS_SET);\r
386 \r
387 #define M_ASN1_I2D_len_SEQUENCE(a,f) \\r
388                 ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \\r
389                                   IS_SEQUENCE);\r
390 \r
391 #define M_ASN1_I2D_len_SEQUENCE_type(type,a,f) \\r
392                 ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SEQUENCE, \\r
393                                             V_ASN1_UNIVERSAL,IS_SEQUENCE)\r
394 \r
395 #define M_ASN1_I2D_len_SEQUENCE_opt(a,f) \\r
396                 if ((a != NULL) && (sk_num(a) != 0)) \\r
397                         M_ASN1_I2D_len_SEQUENCE(a,f);\r
398 \r
399 #define M_ASN1_I2D_len_SEQUENCE_opt_type(type,a,f) \\r
400                 if ((a != NULL) && (sk_##type##_num(a) != 0)) \\r
401                         M_ASN1_I2D_len_SEQUENCE_type(type,a,f);\r
402 \r
403 #define M_ASN1_I2D_len_IMP_SET(a,f,x) \\r
404                 ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET);\r
405 \r
406 #define M_ASN1_I2D_len_IMP_SET_type(type,a,f,x) \\r
407                 ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \\r
408                                             V_ASN1_CONTEXT_SPECIFIC,IS_SET);\r
409 \r
410 #define M_ASN1_I2D_len_IMP_SET_opt(a,f,x) \\r
411                 if ((a != NULL) && (sk_num(a) != 0)) \\r
412                         ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \\r
413                                           IS_SET);\r
414 \r
415 #define M_ASN1_I2D_len_IMP_SET_opt_type(type,a,f,x) \\r
416                 if ((a != NULL) && (sk_##type##_num(a) != 0)) \\r
417                         ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \\r
418                                                V_ASN1_CONTEXT_SPECIFIC,IS_SET);\r
419 \r
420 #define M_ASN1_I2D_len_IMP_SEQUENCE(a,f,x) \\r
421                 ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \\r
422                                   IS_SEQUENCE);\r
423 \r
424 #define M_ASN1_I2D_len_IMP_SEQUENCE_opt(a,f,x) \\r
425                 if ((a != NULL) && (sk_num(a) != 0)) \\r
426                         ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \\r
427                                           IS_SEQUENCE);\r
428 \r
429 #define M_ASN1_I2D_len_IMP_SEQUENCE_opt_type(type,a,f,x) \\r
430                 if ((a != NULL) && (sk_##type##_num(a) != 0)) \\r
431                         ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \\r
432                                                     V_ASN1_CONTEXT_SPECIFIC, \\r
433                                                     IS_SEQUENCE);\r
434 \r
435 #define M_ASN1_I2D_len_EXP_opt(a,f,mtag,v) \\r
436                 if (a != NULL)\\r
437                         { \\r
438                         v=f(a,NULL); \\r
439                         ret+=ASN1_object_size(1,v,mtag); \\r
440                         }\r
441 \r
442 #define M_ASN1_I2D_len_EXP_SET_opt(a,f,mtag,tag,v) \\r
443                 if ((a != NULL) && (sk_num(a) != 0))\\r
444                         { \\r
445                         v=i2d_ASN1_SET(a,NULL,f,tag,V_ASN1_UNIVERSAL,IS_SET); \\r
446                         ret+=ASN1_object_size(1,v,mtag); \\r
447                         }\r
448 \r
449 #define M_ASN1_I2D_len_EXP_SEQUENCE_opt(a,f,mtag,tag,v) \\r
450                 if ((a != NULL) && (sk_num(a) != 0))\\r
451                         { \\r
452                         v=i2d_ASN1_SET(a,NULL,f,tag,V_ASN1_UNIVERSAL, \\r
453                                        IS_SEQUENCE); \\r
454                         ret+=ASN1_object_size(1,v,mtag); \\r
455                         }\r
456 \r
457 #define M_ASN1_I2D_len_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \\r
458                 if ((a != NULL) && (sk_##type##_num(a) != 0))\\r
459                         { \\r
460                         v=i2d_ASN1_SET_OF_##type(a,NULL,f,tag, \\r
461                                                  V_ASN1_UNIVERSAL, \\r
462                                                  IS_SEQUENCE); \\r
463                         ret+=ASN1_object_size(1,v,mtag); \\r
464                         }\r
465 \r
466 /* Put Macros */\r
467 #define M_ASN1_I2D_put(a,f)     f(a,&p)\r
468 \r
469 #define M_ASN1_I2D_put_IMP_opt(a,f,t)   \\r
470                 if (a != NULL) \\r
471                         { \\r
472                         unsigned char *q=p; \\r
473                         f(a,&p); \\r
474                         *q=(V_ASN1_CONTEXT_SPECIFIC|t|(*q&V_ASN1_CONSTRUCTED));\\r
475                         }\r
476 \r
477 #define M_ASN1_I2D_put_SET(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SET,\\r
478                         V_ASN1_UNIVERSAL,IS_SET)\r
479 #define M_ASN1_I2D_put_SET_type(type,a,f) \\r
480      i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET)\r
481 #define M_ASN1_I2D_put_IMP_SET(a,f,x) i2d_ASN1_SET(a,&p,f,x,\\r
482                         V_ASN1_CONTEXT_SPECIFIC,IS_SET)\r
483 #define M_ASN1_I2D_put_IMP_SET_type(type,a,f,x) \\r
484      i2d_ASN1_SET_OF_##type(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET)\r
485 #define M_ASN1_I2D_put_IMP_SEQUENCE(a,f,x) i2d_ASN1_SET(a,&p,f,x,\\r
486                         V_ASN1_CONTEXT_SPECIFIC,IS_SEQUENCE)\r
487 \r
488 #define M_ASN1_I2D_put_SEQUENCE(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SEQUENCE,\\r
489                                              V_ASN1_UNIVERSAL,IS_SEQUENCE)\r
490 \r
491 #define M_ASN1_I2D_put_SEQUENCE_type(type,a,f) \\r
492      i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \\r
493                             IS_SEQUENCE)\r
494 \r
495 #define M_ASN1_I2D_put_SEQUENCE_opt(a,f) \\r
496                 if ((a != NULL) && (sk_num(a) != 0)) \\r
497                         M_ASN1_I2D_put_SEQUENCE(a,f);\r
498 \r
499 #define M_ASN1_I2D_put_IMP_SET_opt(a,f,x) \\r
500                 if ((a != NULL) && (sk_num(a) != 0)) \\r
501                         { i2d_ASN1_SET(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC, \\r
502                                        IS_SET); }\r
503 \r
504 #define M_ASN1_I2D_put_IMP_SET_opt_type(type,a,f,x) \\r
505                 if ((a != NULL) && (sk_##type##_num(a) != 0)) \\r
506                         { i2d_ASN1_SET_OF_##type(a,&p,f,x, \\r
507                                                  V_ASN1_CONTEXT_SPECIFIC, \\r
508                                                  IS_SET); }\r
509 \r
510 #define M_ASN1_I2D_put_IMP_SEQUENCE_opt(a,f,x) \\r
511                 if ((a != NULL) && (sk_num(a) != 0)) \\r
512                         { i2d_ASN1_SET(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC, \\r
513                                        IS_SEQUENCE); }\r
514 \r
515 #define M_ASN1_I2D_put_IMP_SEQUENCE_opt_type(type,a,f,x) \\r
516                 if ((a != NULL) && (sk_##type##_num(a) != 0)) \\r
517                         { i2d_ASN1_SET_OF_##type(a,&p,f,x, \\r
518                                                  V_ASN1_CONTEXT_SPECIFIC, \\r
519                                                  IS_SEQUENCE); }\r
520 \r
521 #define M_ASN1_I2D_put_EXP_opt(a,f,tag,v) \\r
522                 if (a != NULL) \\r
523                         { \\r
524                         ASN1_put_object(&p,1,v,tag,V_ASN1_CONTEXT_SPECIFIC); \\r
525                         f(a,&p); \\r
526                         }\r
527 \r
528 #define M_ASN1_I2D_put_EXP_SET_opt(a,f,mtag,tag,v) \\r
529                 if ((a != NULL) && (sk_num(a) != 0)) \\r
530                         { \\r
531                         ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \\r
532                         i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL,IS_SET); \\r
533                         }\r
534 \r
535 #define M_ASN1_I2D_put_EXP_SEQUENCE_opt(a,f,mtag,tag,v) \\r
536                 if ((a != NULL) && (sk_num(a) != 0)) \\r
537                         { \\r
538                         ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \\r
539                         i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL,IS_SEQUENCE); \\r
540                         }\r
541 \r
542 #define M_ASN1_I2D_put_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \\r
543                 if ((a != NULL) && (sk_##type##_num(a) != 0)) \\r
544                         { \\r
545                         ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \\r
546                         i2d_ASN1_SET_OF_##type(a,&p,f,tag,V_ASN1_UNIVERSAL, \\r
547                                                IS_SEQUENCE); \\r
548                         }\r
549 \r
550 #define M_ASN1_I2D_seq_total() \\r
551                 r=ASN1_object_size(1,ret,V_ASN1_SEQUENCE); \\r
552                 if (pp == NULL) return(r); \\r
553                 p= *pp; \\r
554                 ASN1_put_object(&p,1,ret,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL)\r
555 \r
556 #define M_ASN1_I2D_INF_seq_start(tag,ctx) \\r
557                 *(p++)=(V_ASN1_CONSTRUCTED|(tag)|(ctx)); \\r
558                 *(p++)=0x80\r
559 \r
560 #define M_ASN1_I2D_INF_seq_end() *(p++)=0x00; *(p++)=0x00\r
561 \r
562 #define M_ASN1_I2D_finish()     *pp=p; \\r
563                                 return(r);\r
564 \r
565 int asn1_GetSequence(ASN1_const_CTX *c, long *length);\r
566 void asn1_add_error(const unsigned char *address,int offset);\r
567 #ifdef  __cplusplus\r
568 }\r
569 #endif\r
570 \r
571 #endif\r