00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 #ifndef HEADER_ASN1_MAC_H
00060 #define HEADER_ASN1_MAC_H
00061
00062 #include <openssl/asn1.h>
00063
00064 #ifdef __cplusplus
00065 extern "C" {
00066 #endif
00067
00068 #ifndef ASN1_MAC_ERR_LIB
00069 #define ASN1_MAC_ERR_LIB ERR_LIB_ASN1
00070 #endif
00071
00072 #define ASN1_MAC_H_err(f,r,line) \
00073 ERR_PUT_error(ASN1_MAC_ERR_LIB,(f),(r),__FILE__,(line))
00074
00075 #define M_ASN1_D2I_vars(a,type,func) \
00076 ASN1_const_CTX c; \
00077 type ret=NULL; \
00078 \
00079 c.pp=(const unsigned char **)pp; \
00080 c.q= *(const unsigned char **)pp; \
00081 c.error=ERR_R_NESTED_ASN1_ERROR; \
00082 if ((a == NULL) || ((*a) == NULL)) \
00083 { if ((ret=(type)func()) == NULL) \
00084 { c.line=__LINE__; goto err; } } \
00085 else ret=(*a);
00086
00087 #define M_ASN1_D2I_Init() \
00088 c.p= *(const unsigned char **)pp; \
00089 c.max=(length == 0)?0:(c.p+length);
00090
00091 #define M_ASN1_D2I_Finish_2(a) \
00092 if (!asn1_const_Finish(&c)) \
00093 { c.line=__LINE__; goto err; } \
00094 *(const unsigned char **)pp=c.p; \
00095 if (a != NULL) (*a)=ret; \
00096 return(ret);
00097
00098 #define M_ASN1_D2I_Finish(a,func,e) \
00099 M_ASN1_D2I_Finish_2(a); \
00100 err:\
00101 ASN1_MAC_H_err((e),c.error,c.line); \
00102 asn1_add_error(*(const unsigned char **)pp,(int)(c.q- *pp)); \
00103 if ((ret != NULL) && ((a == NULL) || (*a != ret))) func(ret); \
00104 return(NULL)
00105
00106 #define M_ASN1_D2I_start_sequence() \
00107 if (!asn1_GetSequence(&c,&length)) \
00108 { c.line=__LINE__; goto err; }
00109
00110 #define M_ASN1_D2I_begin() \
00111 c.slen = length;
00112
00113
00114 #define M_ASN1_D2I_Finish_nolen(a, func, e) \
00115 *pp=c.p; \
00116 if (a != NULL) (*a)=ret; \
00117 return(ret); \
00118 err:\
00119 ASN1_MAC_H_err((e),c.error,c.line); \
00120 asn1_add_error(*pp,(int)(c.q- *pp)); \
00121 if ((ret != NULL) && ((a == NULL) || (*a != ret))) func(ret); \
00122 return(NULL)
00123
00124 #define M_ASN1_D2I_end_sequence() \
00125 (((c.inf&1) == 0)?(c.slen <= 0): \
00126 (c.eos=ASN1_const_check_infinite_end(&c.p,c.slen)))
00127
00128
00129 #define M_ASN1_D2I_get(b, func) \
00130 c.q=c.p; \
00131 if (func(&(b),&c.p,c.slen) == NULL) \
00132 {c.line=__LINE__; goto err; } \
00133 c.slen-=(c.p-c.q);
00134
00135
00136 #define M_ASN1_D2I_get_x(type,b,func) \
00137 c.q=c.p; \
00138 if (((D2I_OF(type))func)(&(b),&c.p,c.slen) == NULL) \
00139 {c.line=__LINE__; goto err; } \
00140 c.slen-=(c.p-c.q);
00141
00142
00143 #define M_ASN1_D2I_get_int(b,func) \
00144 c.q=c.p; \
00145 if (func(&(b),&c.p,c.slen) < 0) \
00146 {c.line=__LINE__; goto err; } \
00147 c.slen-=(c.p-c.q);
00148
00149 #define M_ASN1_D2I_get_opt(b,func,type) \
00150 if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) \
00151 == (V_ASN1_UNIVERSAL|(type)))) \
00152 { \
00153 M_ASN1_D2I_get(b,func); \
00154 }
00155
00156 #define M_ASN1_D2I_get_imp(b,func, type) \
00157 M_ASN1_next=(_tmp& V_ASN1_CONSTRUCTED)|type; \
00158 c.q=c.p; \
00159 if (func(&(b),&c.p,c.slen) == NULL) \
00160 {c.line=__LINE__; M_ASN1_next_prev = _tmp; goto err; } \
00161 c.slen-=(c.p-c.q);\
00162 M_ASN1_next_prev=_tmp;
00163
00164 #define M_ASN1_D2I_get_IMP_opt(b,func,tag,type) \
00165 if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) == \
00166 (V_ASN1_CONTEXT_SPECIFIC|(tag)))) \
00167 { \
00168 unsigned char _tmp = M_ASN1_next; \
00169 M_ASN1_D2I_get_imp(b,func, type);\
00170 }
00171
00172 #define M_ASN1_D2I_get_set(r,func,free_func) \
00173 M_ASN1_D2I_get_imp_set(r,func,free_func, \
00174 V_ASN1_SET,V_ASN1_UNIVERSAL);
00175
00176 #define M_ASN1_D2I_get_set_type(type,r,func,free_func) \
00177 M_ASN1_D2I_get_imp_set_type(type,r,func,free_func, \
00178 V_ASN1_SET,V_ASN1_UNIVERSAL);
00179
00180 #define M_ASN1_D2I_get_set_opt(r,func,free_func) \
00181 if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
00182 V_ASN1_CONSTRUCTED|V_ASN1_SET)))\
00183 { M_ASN1_D2I_get_set(r,func,free_func); }
00184
00185 #define M_ASN1_D2I_get_set_opt_type(type,r,func,free_func) \
00186 if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
00187 V_ASN1_CONSTRUCTED|V_ASN1_SET)))\
00188 { M_ASN1_D2I_get_set_type(type,r,func,free_func); }
00189
00190 #define M_ASN1_I2D_len_SET_opt(a,f) \
00191 if ((a != NULL) && (sk_num(a) != 0)) \
00192 M_ASN1_I2D_len_SET(a,f);
00193
00194 #define M_ASN1_I2D_put_SET_opt(a,f) \
00195 if ((a != NULL) && (sk_num(a) != 0)) \
00196 M_ASN1_I2D_put_SET(a,f);
00197
00198 #define M_ASN1_I2D_put_SEQUENCE_opt(a,f) \
00199 if ((a != NULL) && (sk_num(a) != 0)) \
00200 M_ASN1_I2D_put_SEQUENCE(a,f);
00201
00202 #define M_ASN1_I2D_put_SEQUENCE_opt_type(type,a,f) \
00203 if ((a != NULL) && (sk_##type##_num(a) != 0)) \
00204 M_ASN1_I2D_put_SEQUENCE_type(type,a,f);
00205
00206 #define M_ASN1_D2I_get_IMP_set_opt(b,func,free_func,tag) \
00207 if ((c.slen != 0) && \
00208 (M_ASN1_next == \
00209 (V_ASN1_CONTEXT_SPECIFIC|V_ASN1_CONSTRUCTED|(tag))))\
00210 { \
00211 M_ASN1_D2I_get_imp_set(b,func,free_func,\
00212 tag,V_ASN1_CONTEXT_SPECIFIC); \
00213 }
00214
00215 #define M_ASN1_D2I_get_IMP_set_opt_type(type,b,func,free_func,tag) \
00216 if ((c.slen != 0) && \
00217 (M_ASN1_next == \
00218 (V_ASN1_CONTEXT_SPECIFIC|V_ASN1_CONSTRUCTED|(tag))))\
00219 { \
00220 M_ASN1_D2I_get_imp_set_type(type,b,func,free_func,\
00221 tag,V_ASN1_CONTEXT_SPECIFIC); \
00222 }
00223
00224 #define M_ASN1_D2I_get_seq(r,func,free_func) \
00225 M_ASN1_D2I_get_imp_set(r,func,free_func,\
00226 V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL);
00227
00228 #define M_ASN1_D2I_get_seq_type(type,r,func,free_func) \
00229 M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\
00230 V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL)
00231
00232 #define M_ASN1_D2I_get_seq_opt(r,func,free_func) \
00233 if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
00234 V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\
00235 { M_ASN1_D2I_get_seq(r,func,free_func); }
00236
00237 #define M_ASN1_D2I_get_seq_opt_type(type,r,func,free_func) \
00238 if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
00239 V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\
00240 { M_ASN1_D2I_get_seq_type(type,r,func,free_func); }
00241
00242 #define M_ASN1_D2I_get_IMP_set(r,func,free_func,x) \
00243 M_ASN1_D2I_get_imp_set(r,func,free_func,\
00244 x,V_ASN1_CONTEXT_SPECIFIC);
00245
00246 #define M_ASN1_D2I_get_IMP_set_type(type,r,func,free_func,x) \
00247 M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\
00248 x,V_ASN1_CONTEXT_SPECIFIC);
00249
00250 #define M_ASN1_D2I_get_imp_set(r,func,free_func,a,b) \
00251 c.q=c.p; \
00252 if (d2i_ASN1_SET(&(r),&c.p,c.slen,(char *(*)())func,\
00253 (void (*)())free_func,a,b) == NULL) \
00254 { c.line=__LINE__; goto err; } \
00255 c.slen-=(c.p-c.q);
00256
00257 #define M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,a,b) \
00258 c.q=c.p; \
00259 if (d2i_ASN1_SET_OF_##type(&(r),&c.p,c.slen,func,\
00260 free_func,a,b) == NULL) \
00261 { c.line=__LINE__; goto err; } \
00262 c.slen-=(c.p-c.q);
00263
00264 #define M_ASN1_D2I_get_set_strings(r,func,a,b) \
00265 c.q=c.p; \
00266 if (d2i_ASN1_STRING_SET(&(r),&c.p,c.slen,a,b) == NULL) \
00267 { c.line=__LINE__; goto err; } \
00268 c.slen-=(c.p-c.q);
00269
00270 #define M_ASN1_D2I_get_EXP_opt(r,func,tag) \
00271 if ((c.slen != 0L) && (M_ASN1_next == \
00272 (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \
00273 { \
00274 int Tinf,Ttag,Tclass; \
00275 long Tlen; \
00276 \
00277 c.q=c.p; \
00278 Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \
00279 if (Tinf & 0x80) \
00280 { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \
00281 c.line=__LINE__; goto err; } \
00282 if (Tinf == (V_ASN1_CONSTRUCTED+1)) \
00283 Tlen = c.slen - (c.p - c.q) - 2; \
00284 if (func(&(r),&c.p,Tlen) == NULL) \
00285 { c.line=__LINE__; goto err; } \
00286 if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \
00287 Tlen = c.slen - (c.p - c.q); \
00288 if(!ASN1_const_check_infinite_end(&c.p, Tlen)) \
00289 { c.error=ERR_R_MISSING_ASN1_EOS; \
00290 c.line=__LINE__; goto err; } \
00291 }\
00292 c.slen-=(c.p-c.q); \
00293 }
00294
00295 #define M_ASN1_D2I_get_EXP_set_opt(r,func,free_func,tag,b) \
00296 if ((c.slen != 0) && (M_ASN1_next == \
00297 (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \
00298 { \
00299 int Tinf,Ttag,Tclass; \
00300 long Tlen; \
00301 \
00302 c.q=c.p; \
00303 Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \
00304 if (Tinf & 0x80) \
00305 { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \
00306 c.line=__LINE__; goto err; } \
00307 if (Tinf == (V_ASN1_CONSTRUCTED+1)) \
00308 Tlen = c.slen - (c.p - c.q) - 2; \
00309 if (d2i_ASN1_SET(&(r),&c.p,Tlen,(char *(*)())func, \
00310 (void (*)())free_func, \
00311 b,V_ASN1_UNIVERSAL) == NULL) \
00312 { c.line=__LINE__; goto err; } \
00313 if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \
00314 Tlen = c.slen - (c.p - c.q); \
00315 if(!ASN1_check_infinite_end(&c.p, Tlen)) \
00316 { c.error=ERR_R_MISSING_ASN1_EOS; \
00317 c.line=__LINE__; goto err; } \
00318 }\
00319 c.slen-=(c.p-c.q); \
00320 }
00321
00322 #define M_ASN1_D2I_get_EXP_set_opt_type(type,r,func,free_func,tag,b) \
00323 if ((c.slen != 0) && (M_ASN1_next == \
00324 (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \
00325 { \
00326 int Tinf,Ttag,Tclass; \
00327 long Tlen; \
00328 \
00329 c.q=c.p; \
00330 Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \
00331 if (Tinf & 0x80) \
00332 { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \
00333 c.line=__LINE__; goto err; } \
00334 if (Tinf == (V_ASN1_CONSTRUCTED+1)) \
00335 Tlen = c.slen - (c.p - c.q) - 2; \
00336 if (d2i_ASN1_SET_OF_##type(&(r),&c.p,Tlen,func, \
00337 free_func,b,V_ASN1_UNIVERSAL) == NULL) \
00338 { c.line=__LINE__; goto err; } \
00339 if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \
00340 Tlen = c.slen - (c.p - c.q); \
00341 if(!ASN1_check_infinite_end(&c.p, Tlen)) \
00342 { c.error=ERR_R_MISSING_ASN1_EOS; \
00343 c.line=__LINE__; goto err; } \
00344 }\
00345 c.slen-=(c.p-c.q); \
00346 }
00347
00348
00349 #define M_ASN1_New_Malloc(ret,type) \
00350 if ((ret=(type *)OPENSSL_malloc(sizeof(type))) == NULL) \
00351 { c.line=__LINE__; goto err2; }
00352
00353 #define M_ASN1_New(arg,func) \
00354 if (((arg)=func()) == NULL) return(NULL)
00355
00356 #define M_ASN1_New_Error(a) \
00357
00358 \
00359 err2: ASN1_MAC_H_err((a),ERR_R_MALLOC_FAILURE,c.line); \
00360 return(NULL)
00361
00362
00363
00364
00365
00366
00367 #define M_ASN1_next (*((unsigned char *)(c.p)))
00368 #define M_ASN1_next_prev (*((unsigned char *)(c.q)))
00369
00370
00371
00372 #define M_ASN1_I2D_vars(a) int r=0,ret=0; \
00373 unsigned char *p; \
00374 if (a == NULL) return(0)
00375
00376
00377 #define M_ASN1_I2D_len(a,f) ret+=f(a,NULL)
00378 #define M_ASN1_I2D_len_IMP_opt(a,f) if (a != NULL) M_ASN1_I2D_len(a,f)
00379
00380 #define M_ASN1_I2D_len_SET(a,f) \
00381 ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET);
00382
00383 #define M_ASN1_I2D_len_SET_type(type,a,f) \
00384 ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SET, \
00385 V_ASN1_UNIVERSAL,IS_SET);
00386
00387 #define M_ASN1_I2D_len_SEQUENCE(a,f) \
00388 ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \
00389 IS_SEQUENCE);
00390
00391 #define M_ASN1_I2D_len_SEQUENCE_type(type,a,f) \
00392 ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SEQUENCE, \
00393 V_ASN1_UNIVERSAL,IS_SEQUENCE)
00394
00395 #define M_ASN1_I2D_len_SEQUENCE_opt(a,f) \
00396 if ((a != NULL) && (sk_num(a) != 0)) \
00397 M_ASN1_I2D_len_SEQUENCE(a,f);
00398
00399 #define M_ASN1_I2D_len_SEQUENCE_opt_type(type,a,f) \
00400 if ((a != NULL) && (sk_##type##_num(a) != 0)) \
00401 M_ASN1_I2D_len_SEQUENCE_type(type,a,f);
00402
00403 #define M_ASN1_I2D_len_IMP_SET(a,f,x) \
00404 ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET);
00405
00406 #define M_ASN1_I2D_len_IMP_SET_type(type,a,f,x) \
00407 ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \
00408 V_ASN1_CONTEXT_SPECIFIC,IS_SET);
00409
00410 #define M_ASN1_I2D_len_IMP_SET_opt(a,f,x) \
00411 if ((a != NULL) && (sk_num(a) != 0)) \
00412 ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \
00413 IS_SET);
00414
00415 #define M_ASN1_I2D_len_IMP_SET_opt_type(type,a,f,x) \
00416 if ((a != NULL) && (sk_##type##_num(a) != 0)) \
00417 ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \
00418 V_ASN1_CONTEXT_SPECIFIC,IS_SET);
00419
00420 #define M_ASN1_I2D_len_IMP_SEQUENCE(a,f,x) \
00421 ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \
00422 IS_SEQUENCE);
00423
00424 #define M_ASN1_I2D_len_IMP_SEQUENCE_opt(a,f,x) \
00425 if ((a != NULL) && (sk_num(a) != 0)) \
00426 ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \
00427 IS_SEQUENCE);
00428
00429 #define M_ASN1_I2D_len_IMP_SEQUENCE_opt_type(type,a,f,x) \
00430 if ((a != NULL) && (sk_##type##_num(a) != 0)) \
00431 ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \
00432 V_ASN1_CONTEXT_SPECIFIC, \
00433 IS_SEQUENCE);
00434
00435 #define M_ASN1_I2D_len_EXP_opt(a,f,mtag,v) \
00436 if (a != NULL)\
00437 { \
00438 v=f(a,NULL); \
00439 ret+=ASN1_object_size(1,v,mtag); \
00440 }
00441
00442 #define M_ASN1_I2D_len_EXP_SET_opt(a,f,mtag,tag,v) \
00443 if ((a != NULL) && (sk_num(a) != 0))\
00444 { \
00445 v=i2d_ASN1_SET(a,NULL,f,tag,V_ASN1_UNIVERSAL,IS_SET); \
00446 ret+=ASN1_object_size(1,v,mtag); \
00447 }
00448
00449 #define M_ASN1_I2D_len_EXP_SEQUENCE_opt(a,f,mtag,tag,v) \
00450 if ((a != NULL) && (sk_num(a) != 0))\
00451 { \
00452 v=i2d_ASN1_SET(a,NULL,f,tag,V_ASN1_UNIVERSAL, \
00453 IS_SEQUENCE); \
00454 ret+=ASN1_object_size(1,v,mtag); \
00455 }
00456
00457 #define M_ASN1_I2D_len_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \
00458 if ((a != NULL) && (sk_##type##_num(a) != 0))\
00459 { \
00460 v=i2d_ASN1_SET_OF_##type(a,NULL,f,tag, \
00461 V_ASN1_UNIVERSAL, \
00462 IS_SEQUENCE); \
00463 ret+=ASN1_object_size(1,v,mtag); \
00464 }
00465
00466
00467 #define M_ASN1_I2D_put(a,f) f(a,&p)
00468
00469 #define M_ASN1_I2D_put_IMP_opt(a,f,t) \
00470 if (a != NULL) \
00471 { \
00472 unsigned char *q=p; \
00473 f(a,&p); \
00474 *q=(V_ASN1_CONTEXT_SPECIFIC|t|(*q&V_ASN1_CONSTRUCTED));\
00475 }
00476
00477 #define M_ASN1_I2D_put_SET(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SET,\
00478 V_ASN1_UNIVERSAL,IS_SET)
00479 #define M_ASN1_I2D_put_SET_type(type,a,f) \
00480 i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET)
00481 #define M_ASN1_I2D_put_IMP_SET(a,f,x) i2d_ASN1_SET(a,&p,f,x,\
00482 V_ASN1_CONTEXT_SPECIFIC,IS_SET)
00483 #define M_ASN1_I2D_put_IMP_SET_type(type,a,f,x) \
00484 i2d_ASN1_SET_OF_##type(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET)
00485 #define M_ASN1_I2D_put_IMP_SEQUENCE(a,f,x) i2d_ASN1_SET(a,&p,f,x,\
00486 V_ASN1_CONTEXT_SPECIFIC,IS_SEQUENCE)
00487
00488 #define M_ASN1_I2D_put_SEQUENCE(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SEQUENCE,\
00489 V_ASN1_UNIVERSAL,IS_SEQUENCE)
00490
00491 #define M_ASN1_I2D_put_SEQUENCE_type(type,a,f) \
00492 i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \
00493 IS_SEQUENCE)
00494
00495 #define M_ASN1_I2D_put_SEQUENCE_opt(a,f) \
00496 if ((a != NULL) && (sk_num(a) != 0)) \
00497 M_ASN1_I2D_put_SEQUENCE(a,f);
00498
00499 #define M_ASN1_I2D_put_IMP_SET_opt(a,f,x) \
00500 if ((a != NULL) && (sk_num(a) != 0)) \
00501 { i2d_ASN1_SET(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC, \
00502 IS_SET); }
00503
00504 #define M_ASN1_I2D_put_IMP_SET_opt_type(type,a,f,x) \
00505 if ((a != NULL) && (sk_##type##_num(a) != 0)) \
00506 { i2d_ASN1_SET_OF_##type(a,&p,f,x, \
00507 V_ASN1_CONTEXT_SPECIFIC, \
00508 IS_SET); }
00509
00510 #define M_ASN1_I2D_put_IMP_SEQUENCE_opt(a,f,x) \
00511 if ((a != NULL) && (sk_num(a) != 0)) \
00512 { i2d_ASN1_SET(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC, \
00513 IS_SEQUENCE); }
00514
00515 #define M_ASN1_I2D_put_IMP_SEQUENCE_opt_type(type,a,f,x) \
00516 if ((a != NULL) && (sk_##type##_num(a) != 0)) \
00517 { i2d_ASN1_SET_OF_##type(a,&p,f,x, \
00518 V_ASN1_CONTEXT_SPECIFIC, \
00519 IS_SEQUENCE); }
00520
00521 #define M_ASN1_I2D_put_EXP_opt(a,f,tag,v) \
00522 if (a != NULL) \
00523 { \
00524 ASN1_put_object(&p,1,v,tag,V_ASN1_CONTEXT_SPECIFIC); \
00525 f(a,&p); \
00526 }
00527
00528 #define M_ASN1_I2D_put_EXP_SET_opt(a,f,mtag,tag,v) \
00529 if ((a != NULL) && (sk_num(a) != 0)) \
00530 { \
00531 ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \
00532 i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL,IS_SET); \
00533 }
00534
00535 #define M_ASN1_I2D_put_EXP_SEQUENCE_opt(a,f,mtag,tag,v) \
00536 if ((a != NULL) && (sk_num(a) != 0)) \
00537 { \
00538 ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \
00539 i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL,IS_SEQUENCE); \
00540 }
00541
00542 #define M_ASN1_I2D_put_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \
00543 if ((a != NULL) && (sk_##type##_num(a) != 0)) \
00544 { \
00545 ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \
00546 i2d_ASN1_SET_OF_##type(a,&p,f,tag,V_ASN1_UNIVERSAL, \
00547 IS_SEQUENCE); \
00548 }
00549
00550 #define M_ASN1_I2D_seq_total() \
00551 r=ASN1_object_size(1,ret,V_ASN1_SEQUENCE); \
00552 if (pp == NULL) return(r); \
00553 p= *pp; \
00554 ASN1_put_object(&p,1,ret,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL)
00555
00556 #define M_ASN1_I2D_INF_seq_start(tag,ctx) \
00557 *(p++)=(V_ASN1_CONSTRUCTED|(tag)|(ctx)); \
00558 *(p++)=0x80
00559
00560 #define M_ASN1_I2D_INF_seq_end() *(p++)=0x00; *(p++)=0x00
00561
00562 #define M_ASN1_I2D_finish() *pp=p; \
00563 return(r);
00564
00565 int asn1_GetSequence(ASN1_const_CTX *c, long *length);
00566 void asn1_add_error(const unsigned char *address,int offset);
00567 #ifdef __cplusplus
00568 }
00569 #endif
00570
00571 #endif