summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/asn1/asn1_mac.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/asn1/asn1_mac.h')
-rw-r--r--src/lib/libcrypto/asn1/asn1_mac.h355
1 files changed, 290 insertions, 65 deletions
diff --git a/src/lib/libcrypto/asn1/asn1_mac.h b/src/lib/libcrypto/asn1/asn1_mac.h
index 4fba70e4bb..93f9c5193c 100644
--- a/src/lib/libcrypto/asn1/asn1_mac.h
+++ b/src/lib/libcrypto/asn1/asn1_mac.h
@@ -63,18 +63,25 @@
63extern "C" { 63extern "C" {
64#endif 64#endif
65 65
66#include "asn1.h" 66#include <openssl/asn1.h>
67#include "x509.h" 67
68#include "pkcs7.h" 68#ifndef ASN1_MAC_ERR_LIB
69#define ASN1_MAC_ERR_LIB ERR_LIB_ASN1
70#endif
71
72#define ASN1_MAC_H_err(f,r,line) \
73 ERR_PUT_error(ASN1_MAC_ERR_LIB,(f),(r),ERR_file_name,(line))
69 74
70#define M_ASN1_D2I_vars(a,type,func) \ 75#define M_ASN1_D2I_vars(a,type,func) \
71 ASN1_CTX c; \ 76 ASN1_CTX c; \
72 type ret=NULL; \ 77 type ret=NULL; \
73 \ 78 \
74 c.pp=pp; \ 79 c.pp=pp; \
75 c.error=ASN1_R_ERROR_STACK; \ 80 c.q= *pp; \
81 c.error=ERR_R_NESTED_ASN1_ERROR; \
76 if ((a == NULL) || ((*a) == NULL)) \ 82 if ((a == NULL) || ((*a) == NULL)) \
77 { if ((ret=(type)func()) == NULL) goto err; } \ 83 { if ((ret=(type)func()) == NULL) \
84 { c.line=__LINE__; goto err; } } \
78 else ret=(*a); 85 else ret=(*a);
79 86
80#define M_ASN1_D2I_Init() \ 87#define M_ASN1_D2I_Init() \
@@ -82,7 +89,8 @@ extern "C" {
82 c.max=(length == 0)?0:(c.p+length); 89 c.max=(length == 0)?0:(c.p+length);
83 90
84#define M_ASN1_D2I_Finish_2(a) \ 91#define M_ASN1_D2I_Finish_2(a) \
85 if (!asn1_Finish(&c)) goto err; \ 92 if (!asn1_Finish(&c)) \
93 { c.line=__LINE__; goto err; } \
86 *pp=c.p; \ 94 *pp=c.p; \
87 if (a != NULL) (*a)=ret; \ 95 if (a != NULL) (*a)=ret; \
88 return(ret); 96 return(ret);
@@ -90,21 +98,31 @@ extern "C" {
90#define M_ASN1_D2I_Finish(a,func,e) \ 98#define M_ASN1_D2I_Finish(a,func,e) \
91 M_ASN1_D2I_Finish_2(a); \ 99 M_ASN1_D2I_Finish_2(a); \
92err:\ 100err:\
93 ASN1err((e),c.error); \ 101 ASN1_MAC_H_err((e),c.error,c.line); \
94 asn1_add_error(*pp,(int)(c.q- *pp)); \ 102 asn1_add_error(*pp,(int)(c.q- *pp)); \
95 if ((ret != NULL) && ((a == NULL) || (*a != ret))) func(ret); \ 103 if ((ret != NULL) && ((a == NULL) || (*a != ret))) func(ret); \
96 return(NULL) 104 return(NULL)
97 105
98#define M_ASN1_D2I_start_sequence() \ 106#define M_ASN1_D2I_start_sequence() \
99 if (!asn1_GetSequence(&c,&length)) goto err; 107 if (!asn1_GetSequence(&c,&length)) \
108 { c.line=__LINE__; goto err; }
100 109
101#define M_ASN1_D2I_end_sequence() \ 110#define M_ASN1_D2I_end_sequence() \
102 (((c.inf&1) == 0)?(c.slen <= 0): \ 111 (((c.inf&1) == 0)?(c.slen <= 0): \
103 (c.eos=ASN1_check_infinite_end(&c.p,c.slen))) 112 (c.eos=ASN1_check_infinite_end(&c.p,c.slen)))
104 113
114/* Don't use this with d2i_ASN1_BOOLEAN() */
105#define M_ASN1_D2I_get(b,func) \ 115#define M_ASN1_D2I_get(b,func) \
106 c.q=c.p; \ 116 c.q=c.p; \
107 if (func(&(b),&c.p,c.slen) == NULL) goto err; \ 117 if (func(&(b),&c.p,c.slen) == NULL) \
118 {c.line=__LINE__; goto err; } \
119 c.slen-=(c.p-c.q);
120
121/* use this instead () */
122#define M_ASN1_D2I_get_int(b,func) \
123 c.q=c.p; \
124 if (func(&(b),&c.p,c.slen) < 0) \
125 {c.line=__LINE__; goto err; } \
108 c.slen-=(c.p-c.q); 126 c.slen-=(c.p-c.q);
109 127
110#define M_ASN1_D2I_get_opt(b,func,type) \ 128#define M_ASN1_D2I_get_opt(b,func,type) \
@@ -114,49 +132,118 @@ err:\
114 M_ASN1_D2I_get(b,func); \ 132 M_ASN1_D2I_get(b,func); \
115 } 133 }
116 134
135#define M_ASN1_D2I_get_imp(b,func, type) \
136 M_ASN1_next=(_tmp& V_ASN1_CONSTRUCTED)|type; \
137 c.q=c.p; \
138 if (func(&(b),&c.p,c.slen) == NULL) \
139 {c.line=__LINE__; M_ASN1_next_prev = _tmp; goto err; } \
140 c.slen-=(c.p-c.q);\
141 M_ASN1_next_prev=_tmp;
142
117#define M_ASN1_D2I_get_IMP_opt(b,func,tag,type) \ 143#define M_ASN1_D2I_get_IMP_opt(b,func,tag,type) \
118 if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) == \ 144 if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) == \
119 (V_ASN1_CONTEXT_SPECIFIC|(tag)))) \ 145 (V_ASN1_CONTEXT_SPECIFIC|(tag)))) \
120 { \ 146 { \
121 unsigned char tmp; \ 147 unsigned char _tmp = M_ASN1_next; \
122 tmp=M_ASN1_next; \ 148 M_ASN1_D2I_get_imp(b,func, type);\
123 M_ASN1_next=(tmp& ~V_ASN1_PRIMATIVE_TAG)|type; \
124 M_ASN1_D2I_get(b,func); \
125 M_ASN1_next_prev=tmp; \
126 } 149 }
127 150
128#define M_ASN1_D2I_get_set(r,func) \ 151#define M_ASN1_D2I_get_set(r,func,free_func) \
129 M_ASN1_D2I_get_imp_set(r,func,V_ASN1_SET,V_ASN1_UNIVERSAL); 152 M_ASN1_D2I_get_imp_set(r,func,free_func, \
153 V_ASN1_SET,V_ASN1_UNIVERSAL);
154
155#define M_ASN1_D2I_get_set_type(type,r,func,free_func) \
156 M_ASN1_D2I_get_imp_set_type(type,r,func,free_func, \
157 V_ASN1_SET,V_ASN1_UNIVERSAL);
158
159#define M_ASN1_D2I_get_set_opt(r,func,free_func) \
160 if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
161 V_ASN1_CONSTRUCTED|V_ASN1_SET)))\
162 { M_ASN1_D2I_get_set(r,func,free_func); }
163
164#define M_ASN1_D2I_get_set_opt_type(type,r,func,free_func) \
165 if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
166 V_ASN1_CONSTRUCTED|V_ASN1_SET)))\
167 { M_ASN1_D2I_get_set_type(type,r,func,free_func); }
168
169#define M_ASN1_I2D_len_SET_opt(a,f) \
170 if ((a != NULL) && (sk_num(a) != 0)) \
171 M_ASN1_I2D_len_SET(a,f);
172
173#define M_ASN1_I2D_put_SET_opt(a,f) \
174 if ((a != NULL) && (sk_num(a) != 0)) \
175 M_ASN1_I2D_put_SET(a,f);
176
177#define M_ASN1_I2D_put_SEQUENCE_opt(a,f) \
178 if ((a != NULL) && (sk_num(a) != 0)) \
179 M_ASN1_I2D_put_SEQUENCE(a,f);
180
181#define M_ASN1_I2D_put_SEQUENCE_opt_type(type,a,f) \
182 if ((a != NULL) && (sk_##type##_num(a) != 0)) \
183 M_ASN1_I2D_put_SEQUENCE_type(type,a,f);
184
185#define M_ASN1_D2I_get_IMP_set_opt(b,func,free_func,tag) \
186 if ((c.slen != 0) && \
187 (M_ASN1_next == \
188 (V_ASN1_CONTEXT_SPECIFIC|V_ASN1_CONSTRUCTED|(tag))))\
189 { \
190 M_ASN1_D2I_get_imp_set(b,func,free_func,\
191 tag,V_ASN1_CONTEXT_SPECIFIC); \
192 }
130 193
131#define M_ASN1_D2I_get_IMP_set_opt(b,func,tag) \ 194#define M_ASN1_D2I_get_IMP_set_opt_type(type,b,func,free_func,tag) \
132 if ((c.slen != 0) && \ 195 if ((c.slen != 0) && \
133 (M_ASN1_next == \ 196 (M_ASN1_next == \
134 (V_ASN1_CONTEXT_SPECIFIC|V_ASN1_CONSTRUCTED|(tag))))\ 197 (V_ASN1_CONTEXT_SPECIFIC|V_ASN1_CONSTRUCTED|(tag))))\
135 { \ 198 { \
136 M_ASN1_D2I_get_imp_set(b,func,tag,V_ASN1_CONTEXT_SPECIFIC); \ 199 M_ASN1_D2I_get_imp_set_type(type,b,func,free_func,\
200 tag,V_ASN1_CONTEXT_SPECIFIC); \
137 } 201 }
138 202
139#define M_ASN1_D2I_get_seq(r,func) \ 203#define M_ASN1_D2I_get_seq(r,func,free_func) \
140 M_ASN1_D2I_get_imp_set(r,func,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL); 204 M_ASN1_D2I_get_imp_set(r,func,free_func,\
205 V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL);
206
207#define M_ASN1_D2I_get_seq_type(type,r,func,free_func) \
208 M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\
209 V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL)
141 210
142#define M_ASN1_D2I_get_seq_opt(r,func) \ 211#define M_ASN1_D2I_get_seq_opt(r,func,free_func) \
143 if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \ 212 if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
144 V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\ 213 V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\
145 { M_ASN1_D2I_get_seq(r,func); } 214 { M_ASN1_D2I_get_seq(r,func,free_func); }
146 215
147#define M_ASN1_D2I_get_IMP_set(r,func,x) \ 216#define M_ASN1_D2I_get_seq_opt_type(type,r,func,free_func) \
148 M_ASN1_D2I_get_imp_set(r,func,x,V_ASN1_CONTEXT_SPECIFIC); 217 if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
218 V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\
219 { M_ASN1_D2I_get_seq_type(type,r,func,free_func); }
220
221#define M_ASN1_D2I_get_IMP_set(r,func,free_func,x) \
222 M_ASN1_D2I_get_imp_set(r,func,free_func,\
223 x,V_ASN1_CONTEXT_SPECIFIC);
149 224
150#define M_ASN1_D2I_get_imp_set(r,func,a,b) \ 225#define M_ASN1_D2I_get_IMP_set_type(type,r,func,free_func,x) \
226 M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\
227 x,V_ASN1_CONTEXT_SPECIFIC);
228
229#define M_ASN1_D2I_get_imp_set(r,func,free_func,a,b) \
151 c.q=c.p; \ 230 c.q=c.p; \
152 if (d2i_ASN1_SET(&(r),&c.p,c.slen,(char *(*)())func,a,b) == NULL) \ 231 if (d2i_ASN1_SET(&(r),&c.p,c.slen,(char *(*)())func,\
153 goto err; \ 232 (void (*)())free_func,a,b) == NULL) \
233 { c.line=__LINE__; goto err; } \
234 c.slen-=(c.p-c.q);
235
236#define M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,a,b) \
237 c.q=c.p; \
238 if (d2i_ASN1_SET_OF_##type(&(r),&c.p,c.slen,func,\
239 free_func,a,b) == NULL) \
240 { c.line=__LINE__; goto err; } \
154 c.slen-=(c.p-c.q); 241 c.slen-=(c.p-c.q);
155 242
156#define M_ASN1_D2I_get_set_strings(r,func,a,b) \ 243#define M_ASN1_D2I_get_set_strings(r,func,a,b) \
157 c.q=c.p; \ 244 c.q=c.p; \
158 if (d2i_ASN1_STRING_SET(&(r),&c.p,c.slen,a,b) == NULL) \ 245 if (d2i_ASN1_STRING_SET(&(r),&c.p,c.slen,a,b) == NULL) \
159 goto err; \ 246 { c.line=__LINE__; goto err; } \
160 c.slen-=(c.p-c.q); 247 c.slen-=(c.p-c.q);
161 248
162#define M_ASN1_D2I_get_EXP_opt(r,func,tag) \ 249#define M_ASN1_D2I_get_EXP_opt(r,func,tag) \
@@ -169,13 +256,22 @@ err:\
169 c.q=c.p; \ 256 c.q=c.p; \
170 Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \ 257 Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \
171 if (Tinf & 0x80) \ 258 if (Tinf & 0x80) \
172 { c.error=ASN1_R_BAD_OBJECT_HEADER; goto err; } \ 259 { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \
260 c.line=__LINE__; goto err; } \
261 if (Tinf == (V_ASN1_CONSTRUCTED+1)) \
262 Tlen = c.slen - (c.p - c.q) - 2; \
173 if (func(&(r),&c.p,Tlen) == NULL) \ 263 if (func(&(r),&c.p,Tlen) == NULL) \
174 goto err; \ 264 { c.line=__LINE__; goto err; } \
265 if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \
266 Tlen = c.slen - (c.p - c.q); \
267 if(!ASN1_check_infinite_end(&c.p, Tlen)) \
268 { c.error=ERR_R_MISSING_ASN1_EOS; \
269 c.line=__LINE__; goto err; } \
270 }\
175 c.slen-=(c.p-c.q); \ 271 c.slen-=(c.p-c.q); \
176 } 272 }
177 273
178#define M_ASN1_D2I_get_EXP_set_opt(r,func,tag,b) \ 274#define M_ASN1_D2I_get_EXP_set_opt(r,func,free_func,tag,b) \
179 if ((c.slen != 0) && (M_ASN1_next == \ 275 if ((c.slen != 0) && (M_ASN1_next == \
180 (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \ 276 (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \
181 { \ 277 { \
@@ -185,24 +281,61 @@ err:\
185 c.q=c.p; \ 281 c.q=c.p; \
186 Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \ 282 Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \
187 if (Tinf & 0x80) \ 283 if (Tinf & 0x80) \
188 { c.error=ASN1_R_BAD_OBJECT_HEADER; goto err; } \ 284 { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \
285 c.line=__LINE__; goto err; } \
286 if (Tinf == (V_ASN1_CONSTRUCTED+1)) \
287 Tlen = c.slen - (c.p - c.q) - 2; \
189 if (d2i_ASN1_SET(&(r),&c.p,Tlen,(char *(*)())func, \ 288 if (d2i_ASN1_SET(&(r),&c.p,Tlen,(char *(*)())func, \
289 (void (*)())free_func, \
190 b,V_ASN1_UNIVERSAL) == NULL) \ 290 b,V_ASN1_UNIVERSAL) == NULL) \
191 goto err; \ 291 { c.line=__LINE__; goto err; } \
292 if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \
293 Tlen = c.slen - (c.p - c.q); \
294 if(!ASN1_check_infinite_end(&c.p, Tlen)) \
295 { c.error=ERR_R_MISSING_ASN1_EOS; \
296 c.line=__LINE__; goto err; } \
297 }\
298 c.slen-=(c.p-c.q); \
299 }
300
301#define M_ASN1_D2I_get_EXP_set_opt_type(type,r,func,free_func,tag,b) \
302 if ((c.slen != 0) && (M_ASN1_next == \
303 (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \
304 { \
305 int Tinf,Ttag,Tclass; \
306 long Tlen; \
307 \
308 c.q=c.p; \
309 Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \
310 if (Tinf & 0x80) \
311 { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \
312 c.line=__LINE__; goto err; } \
313 if (Tinf == (V_ASN1_CONSTRUCTED+1)) \
314 Tlen = c.slen - (c.p - c.q) - 2; \
315 if (d2i_ASN1_SET_OF_##type(&(r),&c.p,Tlen,func, \
316 free_func,b,V_ASN1_UNIVERSAL) == NULL) \
317 { c.line=__LINE__; goto err; } \
318 if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \
319 Tlen = c.slen - (c.p - c.q); \
320 if(!ASN1_check_infinite_end(&c.p, Tlen)) \
321 { c.error=ERR_R_MISSING_ASN1_EOS; \
322 c.line=__LINE__; goto err; } \
323 }\
192 c.slen-=(c.p-c.q); \ 324 c.slen-=(c.p-c.q); \
193 } 325 }
194 326
195/* New macros */ 327/* New macros */
196#define M_ASN1_New_Malloc(ret,type) \ 328#define M_ASN1_New_Malloc(ret,type) \
197 if ((ret=(type *)Malloc(sizeof(type))) == NULL) goto err2; 329 if ((ret=(type *)Malloc(sizeof(type))) == NULL) \
330 { c.line=__LINE__; goto err2; }
198 331
199#define M_ASN1_New(arg,func) \ 332#define M_ASN1_New(arg,func) \
200 if (((arg)=func()) == NULL) return(NULL) 333 if (((arg)=func()) == NULL) return(NULL)
201 334
202#define M_ASN1_New_Error(a) \ 335#define M_ASN1_New_Error(a) \
203/* err: ASN1err((a),ASN1_R_ERROR_STACK); \ 336/* err: ASN1_MAC_H_err((a),ERR_R_NESTED_ASN1_ERROR,c.line); \
204 return(NULL);*/ \ 337 return(NULL);*/ \
205 err2: ASN1err((a),ERR_R_MALLOC_FAILURE); \ 338 err2: ASN1_MAC_H_err((a),ERR_R_MALLOC_FAILURE,c.line); \
206 return(NULL) 339 return(NULL)
207 340
208 341
@@ -220,21 +353,59 @@ err:\
220#define M_ASN1_I2D_len_IMP_opt(a,f) if (a != NULL) M_ASN1_I2D_len(a,f) 353#define M_ASN1_I2D_len_IMP_opt(a,f) if (a != NULL) M_ASN1_I2D_len(a,f)
221 354
222#define M_ASN1_I2D_len_SET(a,f) \ 355#define M_ASN1_I2D_len_SET(a,f) \
223 ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SET,V_ASN1_UNIVERSAL); 356 ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET);
224 357
225#define M_ASN1_I2D_len_SEQ(a,f) \ 358#define M_ASN1_I2D_len_SET_type(type,a,f) \
226 ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL); 359 ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SET, \
360 V_ASN1_UNIVERSAL,IS_SET);
227 361
228#define M_ASN1_I2D_len_SEQ_opt(a,f) \ 362#define M_ASN1_I2D_len_SEQUENCE(a,f) \
363 ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \
364 IS_SEQUENCE);
365
366#define M_ASN1_I2D_len_SEQUENCE_type(type,a,f) \
367 ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SEQUENCE, \
368 V_ASN1_UNIVERSAL,IS_SEQUENCE)
369
370#define M_ASN1_I2D_len_SEQUENCE_opt(a,f) \
229 if ((a != NULL) && (sk_num(a) != 0)) \ 371 if ((a != NULL) && (sk_num(a) != 0)) \
230 M_ASN1_I2D_len_SEQ(a,f); 372 M_ASN1_I2D_len_SEQUENCE(a,f);
373
374#define M_ASN1_I2D_len_SEQUENCE_opt_type(type,a,f) \
375 if ((a != NULL) && (sk_##type##_num(a) != 0)) \
376 M_ASN1_I2D_len_SEQUENCE_type(type,a,f);
231 377
232#define M_ASN1_I2D_len_IMP_set(a,f,x) \ 378#define M_ASN1_I2D_len_IMP_SET(a,f,x) \
233 ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC); 379 ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET);
234 380
235#define M_ASN1_I2D_len_IMP_set_opt(a,f,x) \ 381#define M_ASN1_I2D_len_IMP_SET_type(type,a,f,x) \
382 ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \
383 V_ASN1_CONTEXT_SPECIFIC,IS_SET);
384
385#define M_ASN1_I2D_len_IMP_SET_opt(a,f,x) \
236 if ((a != NULL) && (sk_num(a) != 0)) \ 386 if ((a != NULL) && (sk_num(a) != 0)) \
237 ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC); 387 ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \
388 IS_SET);
389
390#define M_ASN1_I2D_len_IMP_SET_opt_type(type,a,f,x) \
391 if ((a != NULL) && (sk_##type##_num(a) != 0)) \
392 ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \
393 V_ASN1_CONTEXT_SPECIFIC,IS_SET);
394
395#define M_ASN1_I2D_len_IMP_SEQUENCE(a,f,x) \
396 ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \
397 IS_SEQUENCE);
398
399#define M_ASN1_I2D_len_IMP_SEQUENCE_opt(a,f,x) \
400 if ((a != NULL) && (sk_num(a) != 0)) \
401 ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \
402 IS_SEQUENCE);
403
404#define M_ASN1_I2D_len_IMP_SEQUENCE_opt_type(type,a,f,x) \
405 if ((a != NULL) && (sk_##type##_num(a) != 0)) \
406 ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \
407 V_ASN1_CONTEXT_SPECIFIC, \
408 IS_SEQUENCE);
238 409
239#define M_ASN1_I2D_len_EXP_opt(a,f,mtag,v) \ 410#define M_ASN1_I2D_len_EXP_opt(a,f,mtag,v) \
240 if (a != NULL)\ 411 if (a != NULL)\
@@ -243,10 +414,27 @@ err:\
243 ret+=ASN1_object_size(1,v,mtag); \ 414 ret+=ASN1_object_size(1,v,mtag); \
244 } 415 }
245 416
246#define M_ASN1_I2D_len_EXP_set_opt(a,f,mtag,tag,v) \ 417#define M_ASN1_I2D_len_EXP_SET_opt(a,f,mtag,tag,v) \
418 if ((a != NULL) && (sk_num(a) != 0))\
419 { \
420 v=i2d_ASN1_SET(a,NULL,f,tag,V_ASN1_UNIVERSAL,IS_SET); \
421 ret+=ASN1_object_size(1,v,mtag); \
422 }
423
424#define M_ASN1_I2D_len_EXP_SEQUENCE_opt(a,f,mtag,tag,v) \
247 if ((a != NULL) && (sk_num(a) != 0))\ 425 if ((a != NULL) && (sk_num(a) != 0))\
248 { \ 426 { \
249 v=i2d_ASN1_SET(a,NULL,f,tag,V_ASN1_UNIVERSAL); \ 427 v=i2d_ASN1_SET(a,NULL,f,tag,V_ASN1_UNIVERSAL, \
428 IS_SEQUENCE); \
429 ret+=ASN1_object_size(1,v,mtag); \
430 }
431
432#define M_ASN1_I2D_len_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \
433 if ((a != NULL) && (sk_##type##_num(a) != 0))\
434 { \
435 v=i2d_ASN1_SET_OF_##type(a,NULL,f,tag, \
436 V_ASN1_UNIVERSAL, \
437 IS_SEQUENCE); \
250 ret+=ASN1_object_size(1,v,mtag); \ 438 ret+=ASN1_object_size(1,v,mtag); \
251 } 439 }
252 440
@@ -262,20 +450,48 @@ err:\
262 } 450 }
263 451
264#define M_ASN1_I2D_put_SET(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SET,\ 452#define M_ASN1_I2D_put_SET(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SET,\
265 V_ASN1_UNIVERSAL) 453 V_ASN1_UNIVERSAL,IS_SET)
266#define M_ASN1_I2D_put_IMP_set(a,f,x) i2d_ASN1_SET(a,&p,f,x,\ 454#define M_ASN1_I2D_put_SET_type(type,a,f) \
267 V_ASN1_CONTEXT_SPECIFIC) 455 i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET)
268 456#define M_ASN1_I2D_put_IMP_SET(a,f,x) i2d_ASN1_SET(a,&p,f,x,\
269#define M_ASN1_I2D_put_SEQ(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SEQUENCE,\ 457 V_ASN1_CONTEXT_SPECIFIC,IS_SET)
270 V_ASN1_UNIVERSAL) 458#define M_ASN1_I2D_put_IMP_SET_type(type,a,f,x) \
459 i2d_ASN1_SET_OF_##type(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET)
460#define M_ASN1_I2D_put_IMP_SEQUENCE(a,f,x) i2d_ASN1_SET(a,&p,f,x,\
461 V_ASN1_CONTEXT_SPECIFIC,IS_SEQUENCE)
462
463#define M_ASN1_I2D_put_SEQUENCE(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SEQUENCE,\
464 V_ASN1_UNIVERSAL,IS_SEQUENCE)
465
466#define M_ASN1_I2D_put_SEQUENCE_type(type,a,f) \
467 i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \
468 IS_SEQUENCE)
469
470#define M_ASN1_I2D_put_SEQUENCE_opt(a,f) \
471 if ((a != NULL) && (sk_num(a) != 0)) \
472 M_ASN1_I2D_put_SEQUENCE(a,f);
271 473
272#define M_ASN1_I2D_put_SEQ_opt(a,f) \ 474#define M_ASN1_I2D_put_IMP_SET_opt(a,f,x) \
273 if ((a != NULL) && (sk_num(a) != 0)) \ 475 if ((a != NULL) && (sk_num(a) != 0)) \
274 M_ASN1_I2D_put_SEQ(a,f); 476 { i2d_ASN1_SET(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC, \
477 IS_SET); }
478
479#define M_ASN1_I2D_put_IMP_SET_opt_type(type,a,f,x) \
480 if ((a != NULL) && (sk_##type##_num(a) != 0)) \
481 { i2d_ASN1_SET_OF_##type(a,&p,f,x, \
482 V_ASN1_CONTEXT_SPECIFIC, \
483 IS_SET); }
275 484
276#define M_ASN1_I2D_put_IMP_set_opt(a,f,x) \ 485#define M_ASN1_I2D_put_IMP_SEQUENCE_opt(a,f,x) \
277 if ((a != NULL) && (sk_num(a) != 0)) \ 486 if ((a != NULL) && (sk_num(a) != 0)) \
278 { i2d_ASN1_SET(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC); } 487 { i2d_ASN1_SET(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC, \
488 IS_SEQUENCE); }
489
490#define M_ASN1_I2D_put_IMP_SEQUENCE_opt_type(type,a,f,x) \
491 if ((a != NULL) && (sk_##type##_num(a) != 0)) \
492 { i2d_ASN1_SET_OF_##type(a,&p,f,x, \
493 V_ASN1_CONTEXT_SPECIFIC, \
494 IS_SEQUENCE); }
279 495
280#define M_ASN1_I2D_put_EXP_opt(a,f,tag,v) \ 496#define M_ASN1_I2D_put_EXP_opt(a,f,tag,v) \
281 if (a != NULL) \ 497 if (a != NULL) \
@@ -284,11 +500,26 @@ err:\
284 f(a,&p); \ 500 f(a,&p); \
285 } 501 }
286 502
287#define M_ASN1_I2D_put_EXP_set_opt(a,f,mtag,tag,v) \ 503#define M_ASN1_I2D_put_EXP_SET_opt(a,f,mtag,tag,v) \
288 if ((a != NULL) && (sk_num(a) != 0)) \ 504 if ((a != NULL) && (sk_num(a) != 0)) \
289 { \ 505 { \
290 ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \ 506 ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \
291 i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL); \ 507 i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL,IS_SET); \
508 }
509
510#define M_ASN1_I2D_put_EXP_SEQUENCE_opt(a,f,mtag,tag,v) \
511 if ((a != NULL) && (sk_num(a) != 0)) \
512 { \
513 ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \
514 i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL,IS_SEQUENCE); \
515 }
516
517#define M_ASN1_I2D_put_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \
518 if ((a != NULL) && (sk_##type##_num(a) != 0)) \
519 { \
520 ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \
521 i2d_ASN1_SET_OF_##type(a,&p,f,tag,V_ASN1_UNIVERSAL, \
522 IS_SEQUENCE); \
292 } 523 }
293 524
294#define M_ASN1_I2D_seq_total() \ 525#define M_ASN1_I2D_seq_total() \
@@ -306,14 +537,8 @@ err:\
306#define M_ASN1_I2D_finish() *pp=p; \ 537#define M_ASN1_I2D_finish() *pp=p; \
307 return(r); 538 return(r);
308 539
309#ifndef NOPROTO
310int asn1_GetSequence(ASN1_CTX *c, long *length); 540int asn1_GetSequence(ASN1_CTX *c, long *length);
311void asn1_add_error(unsigned char *address,int offset); 541void asn1_add_error(unsigned char *address,int offset);
312#else
313int asn1_GetSequence();
314void asn1_add_error();
315#endif
316
317#ifdef __cplusplus 542#ifdef __cplusplus
318} 543}
319#endif 544#endif