diff options
| author | markus <> | 2002-09-05 12:51:50 +0000 |
|---|---|---|
| committer | markus <> | 2002-09-05 12:51:50 +0000 |
| commit | 15b5d84f9da2ce4bfae8580e56e34a859f74ad71 (patch) | |
| tree | bf939e82d7fd73cc8a01cf6959002209972091bc /src/lib/libcrypto/asn1/asn1_mac.h | |
| parent | 027351f729b9e837200dae6e1520cda6577ab930 (diff) | |
| download | openbsd-15b5d84f9da2ce4bfae8580e56e34a859f74ad71.tar.gz openbsd-15b5d84f9da2ce4bfae8580e56e34a859f74ad71.tar.bz2 openbsd-15b5d84f9da2ce4bfae8580e56e34a859f74ad71.zip | |
import openssl-0.9.7-beta1
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 |
