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