asn1_mac.h revision 160814
155714Skris/* crypto/asn1/asn1_mac.h */ 255714Skris/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 355714Skris * All rights reserved. 455714Skris * 555714Skris * This package is an SSL implementation written 655714Skris * by Eric Young (eay@cryptsoft.com). 755714Skris * The implementation was written so as to conform with Netscapes SSL. 855714Skris * 955714Skris * This library is free for commercial and non-commercial use as long as 1055714Skris * the following conditions are aheared to. The following conditions 1155714Skris * apply to all code found in this distribution, be it the RC4, RSA, 1255714Skris * lhash, DES, etc., code; not just the SSL code. The SSL documentation 1355714Skris * included with this distribution is covered by the same copyright terms 1455714Skris * except that the holder is Tim Hudson (tjh@cryptsoft.com). 1555714Skris * 1655714Skris * Copyright remains Eric Young's, and as such any Copyright notices in 1755714Skris * the code are not to be removed. 1855714Skris * If this package is used in a product, Eric Young should be given attribution 1955714Skris * as the author of the parts of the library used. 2055714Skris * This can be in the form of a textual message at program startup or 2155714Skris * in documentation (online or textual) provided with the package. 2255714Skris * 2355714Skris * Redistribution and use in source and binary forms, with or without 2455714Skris * modification, are permitted provided that the following conditions 2555714Skris * are met: 2655714Skris * 1. Redistributions of source code must retain the copyright 2755714Skris * notice, this list of conditions and the following disclaimer. 2855714Skris * 2. Redistributions in binary form must reproduce the above copyright 2955714Skris * notice, this list of conditions and the following disclaimer in the 3055714Skris * documentation and/or other materials provided with the distribution. 3155714Skris * 3. All advertising materials mentioning features or use of this software 3255714Skris * must display the following acknowledgement: 3355714Skris * "This product includes cryptographic software written by 3455714Skris * Eric Young (eay@cryptsoft.com)" 3555714Skris * The word 'cryptographic' can be left out if the rouines from the library 3655714Skris * being used are not cryptographic related :-). 3755714Skris * 4. If you include any Windows specific code (or a derivative thereof) from 3855714Skris * the apps directory (application code) you must include an acknowledgement: 3955714Skris * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 4055714Skris * 4155714Skris * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 4255714Skris * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 4355714Skris * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 4455714Skris * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 4555714Skris * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 4655714Skris * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 4755714Skris * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 4855714Skris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 4955714Skris * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 5055714Skris * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 5155714Skris * SUCH DAMAGE. 5255714Skris * 5355714Skris * The licence and distribution terms for any publically available version or 5455714Skris * derivative of this code cannot be changed. i.e. this code cannot simply be 5555714Skris * copied and put under another distribution licence 5655714Skris * [including the GNU Public Licence.] 5755714Skris */ 5855714Skris 5955714Skris#ifndef HEADER_ASN1_MAC_H 6055714Skris#define HEADER_ASN1_MAC_H 6155714Skris 6268651Skris#include <openssl/asn1.h> 6368651Skris 6455714Skris#ifdef __cplusplus 6555714Skrisextern "C" { 6655714Skris#endif 6755714Skris 6855714Skris#ifndef ASN1_MAC_ERR_LIB 6955714Skris#define ASN1_MAC_ERR_LIB ERR_LIB_ASN1 7055714Skris#endif 7155714Skris 7255714Skris#define ASN1_MAC_H_err(f,r,line) \ 73109998Smarkm ERR_PUT_error(ASN1_MAC_ERR_LIB,(f),(r),__FILE__,(line)) 7455714Skris 7555714Skris#define M_ASN1_D2I_vars(a,type,func) \ 76160814Ssimon ASN1_const_CTX c; \ 7755714Skris type ret=NULL; \ 7855714Skris \ 79160814Ssimon c.pp=(const unsigned char **)pp; \ 80160814Ssimon c.q= *(const unsigned char **)pp; \ 8155714Skris c.error=ERR_R_NESTED_ASN1_ERROR; \ 8255714Skris if ((a == NULL) || ((*a) == NULL)) \ 8355714Skris { if ((ret=(type)func()) == NULL) \ 8455714Skris { c.line=__LINE__; goto err; } } \ 8555714Skris else ret=(*a); 8655714Skris 8755714Skris#define M_ASN1_D2I_Init() \ 88160814Ssimon c.p= *(const unsigned char **)pp; \ 8955714Skris c.max=(length == 0)?0:(c.p+length); 9055714Skris 9155714Skris#define M_ASN1_D2I_Finish_2(a) \ 92160814Ssimon if (!asn1_const_Finish(&c)) \ 9355714Skris { c.line=__LINE__; goto err; } \ 94160814Ssimon *(const unsigned char **)pp=c.p; \ 9555714Skris if (a != NULL) (*a)=ret; \ 9655714Skris return(ret); 9755714Skris 9855714Skris#define M_ASN1_D2I_Finish(a,func,e) \ 9955714Skris M_ASN1_D2I_Finish_2(a); \ 10055714Skriserr:\ 10155714Skris ASN1_MAC_H_err((e),c.error,c.line); \ 102160814Ssimon asn1_add_error(*(const unsigned char **)pp,(int)(c.q- *pp)); \ 10355714Skris if ((ret != NULL) && ((a == NULL) || (*a != ret))) func(ret); \ 10455714Skris return(NULL) 10555714Skris 10655714Skris#define M_ASN1_D2I_start_sequence() \ 10755714Skris if (!asn1_GetSequence(&c,&length)) \ 10855714Skris { c.line=__LINE__; goto err; } 10959191Skris/* Begin reading ASN1 without a surrounding sequence */ 11059191Skris#define M_ASN1_D2I_begin() \ 11159191Skris c.slen = length; 11255714Skris 11359191Skris/* End reading ASN1 with no check on length */ 11459191Skris#define M_ASN1_D2I_Finish_nolen(a, func, e) \ 11559191Skris *pp=c.p; \ 11659191Skris if (a != NULL) (*a)=ret; \ 11759191Skris return(ret); \ 11859191Skriserr:\ 11959191Skris ASN1_MAC_H_err((e),c.error,c.line); \ 12059191Skris asn1_add_error(*pp,(int)(c.q- *pp)); \ 12159191Skris if ((ret != NULL) && ((a == NULL) || (*a != ret))) func(ret); \ 12259191Skris return(NULL) 12359191Skris 12455714Skris#define M_ASN1_D2I_end_sequence() \ 12555714Skris (((c.inf&1) == 0)?(c.slen <= 0): \ 126160814Ssimon (c.eos=ASN1_const_check_infinite_end(&c.p,c.slen))) 12755714Skris 12855714Skris/* Don't use this with d2i_ASN1_BOOLEAN() */ 129160814Ssimon#define M_ASN1_D2I_get(b, func) \ 13055714Skris c.q=c.p; \ 13155714Skris if (func(&(b),&c.p,c.slen) == NULL) \ 13255714Skris {c.line=__LINE__; goto err; } \ 13355714Skris c.slen-=(c.p-c.q); 13455714Skris 135160814Ssimon/* Don't use this with d2i_ASN1_BOOLEAN() */ 136160814Ssimon#define M_ASN1_D2I_get_x(type,b,func) \ 137160814Ssimon c.q=c.p; \ 138160814Ssimon if (((D2I_OF(type))func)(&(b),&c.p,c.slen) == NULL) \ 139160814Ssimon {c.line=__LINE__; goto err; } \ 140160814Ssimon c.slen-=(c.p-c.q); 141160814Ssimon 14255714Skris/* use this instead () */ 14355714Skris#define M_ASN1_D2I_get_int(b,func) \ 14455714Skris c.q=c.p; \ 14555714Skris if (func(&(b),&c.p,c.slen) < 0) \ 14655714Skris {c.line=__LINE__; goto err; } \ 14755714Skris c.slen-=(c.p-c.q); 14855714Skris 14955714Skris#define M_ASN1_D2I_get_opt(b,func,type) \ 15055714Skris if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) \ 15155714Skris == (V_ASN1_UNIVERSAL|(type)))) \ 15255714Skris { \ 15355714Skris M_ASN1_D2I_get(b,func); \ 15455714Skris } 15555714Skris 15655714Skris#define M_ASN1_D2I_get_imp(b,func, type) \ 15755714Skris M_ASN1_next=(_tmp& V_ASN1_CONSTRUCTED)|type; \ 15855714Skris c.q=c.p; \ 15955714Skris if (func(&(b),&c.p,c.slen) == NULL) \ 16055714Skris {c.line=__LINE__; M_ASN1_next_prev = _tmp; goto err; } \ 16155714Skris c.slen-=(c.p-c.q);\ 16255714Skris M_ASN1_next_prev=_tmp; 16355714Skris 16455714Skris#define M_ASN1_D2I_get_IMP_opt(b,func,tag,type) \ 16555714Skris if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) == \ 16655714Skris (V_ASN1_CONTEXT_SPECIFIC|(tag)))) \ 16755714Skris { \ 16855714Skris unsigned char _tmp = M_ASN1_next; \ 16955714Skris M_ASN1_D2I_get_imp(b,func, type);\ 17055714Skris } 17155714Skris 17255714Skris#define M_ASN1_D2I_get_set(r,func,free_func) \ 17355714Skris M_ASN1_D2I_get_imp_set(r,func,free_func, \ 17455714Skris V_ASN1_SET,V_ASN1_UNIVERSAL); 17555714Skris 17655714Skris#define M_ASN1_D2I_get_set_type(type,r,func,free_func) \ 17755714Skris M_ASN1_D2I_get_imp_set_type(type,r,func,free_func, \ 17855714Skris V_ASN1_SET,V_ASN1_UNIVERSAL); 17955714Skris 18055714Skris#define M_ASN1_D2I_get_set_opt(r,func,free_func) \ 18155714Skris if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \ 18255714Skris V_ASN1_CONSTRUCTED|V_ASN1_SET)))\ 18355714Skris { M_ASN1_D2I_get_set(r,func,free_func); } 18455714Skris 18555714Skris#define M_ASN1_D2I_get_set_opt_type(type,r,func,free_func) \ 18655714Skris if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \ 18755714Skris V_ASN1_CONSTRUCTED|V_ASN1_SET)))\ 18855714Skris { M_ASN1_D2I_get_set_type(type,r,func,free_func); } 18955714Skris 19055714Skris#define M_ASN1_I2D_len_SET_opt(a,f) \ 19155714Skris if ((a != NULL) && (sk_num(a) != 0)) \ 19255714Skris M_ASN1_I2D_len_SET(a,f); 19355714Skris 19455714Skris#define M_ASN1_I2D_put_SET_opt(a,f) \ 19555714Skris if ((a != NULL) && (sk_num(a) != 0)) \ 19655714Skris M_ASN1_I2D_put_SET(a,f); 19755714Skris 19855714Skris#define M_ASN1_I2D_put_SEQUENCE_opt(a,f) \ 19955714Skris if ((a != NULL) && (sk_num(a) != 0)) \ 20055714Skris M_ASN1_I2D_put_SEQUENCE(a,f); 20155714Skris 20255714Skris#define M_ASN1_I2D_put_SEQUENCE_opt_type(type,a,f) \ 20355714Skris if ((a != NULL) && (sk_##type##_num(a) != 0)) \ 20455714Skris M_ASN1_I2D_put_SEQUENCE_type(type,a,f); 20555714Skris 20655714Skris#define M_ASN1_D2I_get_IMP_set_opt(b,func,free_func,tag) \ 20755714Skris if ((c.slen != 0) && \ 20855714Skris (M_ASN1_next == \ 20955714Skris (V_ASN1_CONTEXT_SPECIFIC|V_ASN1_CONSTRUCTED|(tag))))\ 21055714Skris { \ 21155714Skris M_ASN1_D2I_get_imp_set(b,func,free_func,\ 21255714Skris tag,V_ASN1_CONTEXT_SPECIFIC); \ 21355714Skris } 21455714Skris 21555714Skris#define M_ASN1_D2I_get_IMP_set_opt_type(type,b,func,free_func,tag) \ 21655714Skris if ((c.slen != 0) && \ 21755714Skris (M_ASN1_next == \ 21855714Skris (V_ASN1_CONTEXT_SPECIFIC|V_ASN1_CONSTRUCTED|(tag))))\ 21955714Skris { \ 22055714Skris M_ASN1_D2I_get_imp_set_type(type,b,func,free_func,\ 22155714Skris tag,V_ASN1_CONTEXT_SPECIFIC); \ 22255714Skris } 22355714Skris 22455714Skris#define M_ASN1_D2I_get_seq(r,func,free_func) \ 22555714Skris M_ASN1_D2I_get_imp_set(r,func,free_func,\ 22655714Skris V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL); 22755714Skris 22855714Skris#define M_ASN1_D2I_get_seq_type(type,r,func,free_func) \ 22955714Skris M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\ 23055714Skris V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL) 23155714Skris 23255714Skris#define M_ASN1_D2I_get_seq_opt(r,func,free_func) \ 23355714Skris if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \ 23455714Skris V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\ 23555714Skris { M_ASN1_D2I_get_seq(r,func,free_func); } 23655714Skris 23755714Skris#define M_ASN1_D2I_get_seq_opt_type(type,r,func,free_func) \ 23855714Skris if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \ 23955714Skris V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\ 24055714Skris { M_ASN1_D2I_get_seq_type(type,r,func,free_func); } 24155714Skris 24255714Skris#define M_ASN1_D2I_get_IMP_set(r,func,free_func,x) \ 24355714Skris M_ASN1_D2I_get_imp_set(r,func,free_func,\ 24455714Skris x,V_ASN1_CONTEXT_SPECIFIC); 24555714Skris 24655714Skris#define M_ASN1_D2I_get_IMP_set_type(type,r,func,free_func,x) \ 24755714Skris M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\ 24855714Skris x,V_ASN1_CONTEXT_SPECIFIC); 24955714Skris 25055714Skris#define M_ASN1_D2I_get_imp_set(r,func,free_func,a,b) \ 25155714Skris c.q=c.p; \ 25255714Skris if (d2i_ASN1_SET(&(r),&c.p,c.slen,(char *(*)())func,\ 25355714Skris (void (*)())free_func,a,b) == NULL) \ 25455714Skris { c.line=__LINE__; goto err; } \ 25555714Skris c.slen-=(c.p-c.q); 25655714Skris 25755714Skris#define M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,a,b) \ 25855714Skris c.q=c.p; \ 25955714Skris if (d2i_ASN1_SET_OF_##type(&(r),&c.p,c.slen,func,\ 26055714Skris free_func,a,b) == NULL) \ 26155714Skris { c.line=__LINE__; goto err; } \ 26255714Skris c.slen-=(c.p-c.q); 26355714Skris 26455714Skris#define M_ASN1_D2I_get_set_strings(r,func,a,b) \ 26555714Skris c.q=c.p; \ 26655714Skris if (d2i_ASN1_STRING_SET(&(r),&c.p,c.slen,a,b) == NULL) \ 26755714Skris { c.line=__LINE__; goto err; } \ 26855714Skris c.slen-=(c.p-c.q); 26955714Skris 27055714Skris#define M_ASN1_D2I_get_EXP_opt(r,func,tag) \ 27155714Skris if ((c.slen != 0L) && (M_ASN1_next == \ 27255714Skris (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \ 27355714Skris { \ 27455714Skris int Tinf,Ttag,Tclass; \ 27555714Skris long Tlen; \ 27655714Skris \ 27755714Skris c.q=c.p; \ 27855714Skris Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \ 27955714Skris if (Tinf & 0x80) \ 28055714Skris { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \ 28155714Skris c.line=__LINE__; goto err; } \ 28255714Skris if (Tinf == (V_ASN1_CONSTRUCTED+1)) \ 28355714Skris Tlen = c.slen - (c.p - c.q) - 2; \ 28455714Skris if (func(&(r),&c.p,Tlen) == NULL) \ 28555714Skris { c.line=__LINE__; goto err; } \ 28655714Skris if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \ 28755714Skris Tlen = c.slen - (c.p - c.q); \ 288160814Ssimon if(!ASN1_const_check_infinite_end(&c.p, Tlen)) \ 28955714Skris { c.error=ERR_R_MISSING_ASN1_EOS; \ 29055714Skris c.line=__LINE__; goto err; } \ 29155714Skris }\ 29255714Skris c.slen-=(c.p-c.q); \ 29355714Skris } 29455714Skris 29555714Skris#define M_ASN1_D2I_get_EXP_set_opt(r,func,free_func,tag,b) \ 29655714Skris if ((c.slen != 0) && (M_ASN1_next == \ 29755714Skris (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \ 29855714Skris { \ 29955714Skris int Tinf,Ttag,Tclass; \ 30055714Skris long Tlen; \ 30155714Skris \ 30255714Skris c.q=c.p; \ 30355714Skris Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \ 30455714Skris if (Tinf & 0x80) \ 30555714Skris { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \ 30655714Skris c.line=__LINE__; goto err; } \ 30755714Skris if (Tinf == (V_ASN1_CONSTRUCTED+1)) \ 30855714Skris Tlen = c.slen - (c.p - c.q) - 2; \ 30955714Skris if (d2i_ASN1_SET(&(r),&c.p,Tlen,(char *(*)())func, \ 31055714Skris (void (*)())free_func, \ 31155714Skris b,V_ASN1_UNIVERSAL) == NULL) \ 31255714Skris { c.line=__LINE__; goto err; } \ 31355714Skris if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \ 31455714Skris Tlen = c.slen - (c.p - c.q); \ 31555714Skris if(!ASN1_check_infinite_end(&c.p, Tlen)) \ 31655714Skris { c.error=ERR_R_MISSING_ASN1_EOS; \ 31755714Skris c.line=__LINE__; goto err; } \ 31855714Skris }\ 31955714Skris c.slen-=(c.p-c.q); \ 32055714Skris } 32155714Skris 32255714Skris#define M_ASN1_D2I_get_EXP_set_opt_type(type,r,func,free_func,tag,b) \ 32355714Skris if ((c.slen != 0) && (M_ASN1_next == \ 32455714Skris (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \ 32555714Skris { \ 32655714Skris int Tinf,Ttag,Tclass; \ 32755714Skris long Tlen; \ 32855714Skris \ 32955714Skris c.q=c.p; \ 33055714Skris Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \ 33155714Skris if (Tinf & 0x80) \ 33255714Skris { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \ 33355714Skris c.line=__LINE__; goto err; } \ 33455714Skris if (Tinf == (V_ASN1_CONSTRUCTED+1)) \ 33555714Skris Tlen = c.slen - (c.p - c.q) - 2; \ 33655714Skris if (d2i_ASN1_SET_OF_##type(&(r),&c.p,Tlen,func, \ 33755714Skris free_func,b,V_ASN1_UNIVERSAL) == NULL) \ 33855714Skris { c.line=__LINE__; goto err; } \ 33955714Skris if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \ 34055714Skris Tlen = c.slen - (c.p - c.q); \ 34155714Skris if(!ASN1_check_infinite_end(&c.p, Tlen)) \ 34255714Skris { c.error=ERR_R_MISSING_ASN1_EOS; \ 34355714Skris c.line=__LINE__; goto err; } \ 34455714Skris }\ 34555714Skris c.slen-=(c.p-c.q); \ 34655714Skris } 34755714Skris 34855714Skris/* New macros */ 34955714Skris#define M_ASN1_New_Malloc(ret,type) \ 35068651Skris if ((ret=(type *)OPENSSL_malloc(sizeof(type))) == NULL) \ 35155714Skris { c.line=__LINE__; goto err2; } 35255714Skris 35355714Skris#define M_ASN1_New(arg,func) \ 35455714Skris if (((arg)=func()) == NULL) return(NULL) 35555714Skris 35655714Skris#define M_ASN1_New_Error(a) \ 35755714Skris/* err: ASN1_MAC_H_err((a),ERR_R_NESTED_ASN1_ERROR,c.line); \ 35855714Skris return(NULL);*/ \ 35955714Skris err2: ASN1_MAC_H_err((a),ERR_R_MALLOC_FAILURE,c.line); \ 36055714Skris return(NULL) 36155714Skris 36255714Skris 363160814Ssimon/* BIG UGLY WARNING! This is so damn ugly I wanna puke. Unfortunately, 364160814Ssimon some macros that use ASN1_const_CTX still insist on writing in the input 365160814Ssimon stream. ARGH! ARGH! ARGH! Let's get rid of this macro package. 366160814Ssimon Please? -- Richard Levitte */ 367160814Ssimon#define M_ASN1_next (*((unsigned char *)(c.p))) 368160814Ssimon#define M_ASN1_next_prev (*((unsigned char *)(c.q))) 36955714Skris 37055714Skris/*************************************************/ 37155714Skris 37255714Skris#define M_ASN1_I2D_vars(a) int r=0,ret=0; \ 37355714Skris unsigned char *p; \ 37455714Skris if (a == NULL) return(0) 37555714Skris 37655714Skris/* Length Macros */ 37755714Skris#define M_ASN1_I2D_len(a,f) ret+=f(a,NULL) 37855714Skris#define M_ASN1_I2D_len_IMP_opt(a,f) if (a != NULL) M_ASN1_I2D_len(a,f) 37955714Skris 38055714Skris#define M_ASN1_I2D_len_SET(a,f) \ 38155714Skris ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET); 38255714Skris 38355714Skris#define M_ASN1_I2D_len_SET_type(type,a,f) \ 38455714Skris ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SET, \ 38555714Skris V_ASN1_UNIVERSAL,IS_SET); 38655714Skris 38755714Skris#define M_ASN1_I2D_len_SEQUENCE(a,f) \ 38855714Skris ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \ 38955714Skris IS_SEQUENCE); 39055714Skris 39155714Skris#define M_ASN1_I2D_len_SEQUENCE_type(type,a,f) \ 39255714Skris ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SEQUENCE, \ 39355714Skris V_ASN1_UNIVERSAL,IS_SEQUENCE) 39455714Skris 39555714Skris#define M_ASN1_I2D_len_SEQUENCE_opt(a,f) \ 39655714Skris if ((a != NULL) && (sk_num(a) != 0)) \ 39755714Skris M_ASN1_I2D_len_SEQUENCE(a,f); 39855714Skris 39955714Skris#define M_ASN1_I2D_len_SEQUENCE_opt_type(type,a,f) \ 40055714Skris if ((a != NULL) && (sk_##type##_num(a) != 0)) \ 40155714Skris M_ASN1_I2D_len_SEQUENCE_type(type,a,f); 40255714Skris 40355714Skris#define M_ASN1_I2D_len_IMP_SET(a,f,x) \ 40455714Skris ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET); 40555714Skris 40655714Skris#define M_ASN1_I2D_len_IMP_SET_type(type,a,f,x) \ 40755714Skris ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \ 40855714Skris V_ASN1_CONTEXT_SPECIFIC,IS_SET); 40955714Skris 41055714Skris#define M_ASN1_I2D_len_IMP_SET_opt(a,f,x) \ 41155714Skris if ((a != NULL) && (sk_num(a) != 0)) \ 41255714Skris ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \ 41355714Skris IS_SET); 41455714Skris 41555714Skris#define M_ASN1_I2D_len_IMP_SET_opt_type(type,a,f,x) \ 41655714Skris if ((a != NULL) && (sk_##type##_num(a) != 0)) \ 41755714Skris ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \ 41855714Skris V_ASN1_CONTEXT_SPECIFIC,IS_SET); 41955714Skris 42055714Skris#define M_ASN1_I2D_len_IMP_SEQUENCE(a,f,x) \ 42155714Skris ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \ 42255714Skris IS_SEQUENCE); 42355714Skris 42455714Skris#define M_ASN1_I2D_len_IMP_SEQUENCE_opt(a,f,x) \ 42555714Skris if ((a != NULL) && (sk_num(a) != 0)) \ 42655714Skris ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \ 42755714Skris IS_SEQUENCE); 42855714Skris 42955714Skris#define M_ASN1_I2D_len_IMP_SEQUENCE_opt_type(type,a,f,x) \ 43055714Skris if ((a != NULL) && (sk_##type##_num(a) != 0)) \ 43155714Skris ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \ 43255714Skris V_ASN1_CONTEXT_SPECIFIC, \ 43355714Skris IS_SEQUENCE); 43455714Skris 43555714Skris#define M_ASN1_I2D_len_EXP_opt(a,f,mtag,v) \ 43655714Skris if (a != NULL)\ 43755714Skris { \ 43855714Skris v=f(a,NULL); \ 43955714Skris ret+=ASN1_object_size(1,v,mtag); \ 44055714Skris } 44155714Skris 44255714Skris#define M_ASN1_I2D_len_EXP_SET_opt(a,f,mtag,tag,v) \ 44355714Skris if ((a != NULL) && (sk_num(a) != 0))\ 44455714Skris { \ 44555714Skris v=i2d_ASN1_SET(a,NULL,f,tag,V_ASN1_UNIVERSAL,IS_SET); \ 44655714Skris ret+=ASN1_object_size(1,v,mtag); \ 44755714Skris } 44855714Skris 44955714Skris#define M_ASN1_I2D_len_EXP_SEQUENCE_opt(a,f,mtag,tag,v) \ 45055714Skris if ((a != NULL) && (sk_num(a) != 0))\ 45155714Skris { \ 45255714Skris v=i2d_ASN1_SET(a,NULL,f,tag,V_ASN1_UNIVERSAL, \ 45355714Skris IS_SEQUENCE); \ 45455714Skris ret+=ASN1_object_size(1,v,mtag); \ 45555714Skris } 45655714Skris 45755714Skris#define M_ASN1_I2D_len_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \ 45855714Skris if ((a != NULL) && (sk_##type##_num(a) != 0))\ 45955714Skris { \ 46055714Skris v=i2d_ASN1_SET_OF_##type(a,NULL,f,tag, \ 46155714Skris V_ASN1_UNIVERSAL, \ 46255714Skris IS_SEQUENCE); \ 46355714Skris ret+=ASN1_object_size(1,v,mtag); \ 46455714Skris } 46555714Skris 46655714Skris/* Put Macros */ 46755714Skris#define M_ASN1_I2D_put(a,f) f(a,&p) 46855714Skris 46955714Skris#define M_ASN1_I2D_put_IMP_opt(a,f,t) \ 47055714Skris if (a != NULL) \ 47155714Skris { \ 47255714Skris unsigned char *q=p; \ 47355714Skris f(a,&p); \ 47455714Skris *q=(V_ASN1_CONTEXT_SPECIFIC|t|(*q&V_ASN1_CONSTRUCTED));\ 47555714Skris } 47655714Skris 47755714Skris#define M_ASN1_I2D_put_SET(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SET,\ 47855714Skris V_ASN1_UNIVERSAL,IS_SET) 47955714Skris#define M_ASN1_I2D_put_SET_type(type,a,f) \ 48055714Skris i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET) 48155714Skris#define M_ASN1_I2D_put_IMP_SET(a,f,x) i2d_ASN1_SET(a,&p,f,x,\ 48255714Skris V_ASN1_CONTEXT_SPECIFIC,IS_SET) 48355714Skris#define M_ASN1_I2D_put_IMP_SET_type(type,a,f,x) \ 48455714Skris i2d_ASN1_SET_OF_##type(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET) 48555714Skris#define M_ASN1_I2D_put_IMP_SEQUENCE(a,f,x) i2d_ASN1_SET(a,&p,f,x,\ 48655714Skris V_ASN1_CONTEXT_SPECIFIC,IS_SEQUENCE) 48755714Skris 48855714Skris#define M_ASN1_I2D_put_SEQUENCE(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SEQUENCE,\ 48955714Skris V_ASN1_UNIVERSAL,IS_SEQUENCE) 49055714Skris 49155714Skris#define M_ASN1_I2D_put_SEQUENCE_type(type,a,f) \ 49255714Skris i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \ 49355714Skris IS_SEQUENCE) 49455714Skris 49555714Skris#define M_ASN1_I2D_put_SEQUENCE_opt(a,f) \ 49655714Skris if ((a != NULL) && (sk_num(a) != 0)) \ 49755714Skris M_ASN1_I2D_put_SEQUENCE(a,f); 49855714Skris 49955714Skris#define M_ASN1_I2D_put_IMP_SET_opt(a,f,x) \ 50055714Skris if ((a != NULL) && (sk_num(a) != 0)) \ 50155714Skris { i2d_ASN1_SET(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC, \ 50255714Skris IS_SET); } 50355714Skris 50455714Skris#define M_ASN1_I2D_put_IMP_SET_opt_type(type,a,f,x) \ 50555714Skris if ((a != NULL) && (sk_##type##_num(a) != 0)) \ 50655714Skris { i2d_ASN1_SET_OF_##type(a,&p,f,x, \ 50755714Skris V_ASN1_CONTEXT_SPECIFIC, \ 50855714Skris IS_SET); } 50955714Skris 51055714Skris#define M_ASN1_I2D_put_IMP_SEQUENCE_opt(a,f,x) \ 51155714Skris if ((a != NULL) && (sk_num(a) != 0)) \ 51255714Skris { i2d_ASN1_SET(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC, \ 51355714Skris IS_SEQUENCE); } 51455714Skris 51555714Skris#define M_ASN1_I2D_put_IMP_SEQUENCE_opt_type(type,a,f,x) \ 51655714Skris if ((a != NULL) && (sk_##type##_num(a) != 0)) \ 51755714Skris { i2d_ASN1_SET_OF_##type(a,&p,f,x, \ 51855714Skris V_ASN1_CONTEXT_SPECIFIC, \ 51955714Skris IS_SEQUENCE); } 52055714Skris 52155714Skris#define M_ASN1_I2D_put_EXP_opt(a,f,tag,v) \ 52255714Skris if (a != NULL) \ 52355714Skris { \ 52455714Skris ASN1_put_object(&p,1,v,tag,V_ASN1_CONTEXT_SPECIFIC); \ 52555714Skris f(a,&p); \ 52655714Skris } 52755714Skris 52855714Skris#define M_ASN1_I2D_put_EXP_SET_opt(a,f,mtag,tag,v) \ 52955714Skris if ((a != NULL) && (sk_num(a) != 0)) \ 53055714Skris { \ 53155714Skris ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \ 53255714Skris i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL,IS_SET); \ 53355714Skris } 53455714Skris 53555714Skris#define M_ASN1_I2D_put_EXP_SEQUENCE_opt(a,f,mtag,tag,v) \ 53655714Skris if ((a != NULL) && (sk_num(a) != 0)) \ 53755714Skris { \ 53855714Skris ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \ 53955714Skris i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL,IS_SEQUENCE); \ 54055714Skris } 54155714Skris 54255714Skris#define M_ASN1_I2D_put_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \ 54355714Skris if ((a != NULL) && (sk_##type##_num(a) != 0)) \ 54455714Skris { \ 54555714Skris ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \ 54655714Skris i2d_ASN1_SET_OF_##type(a,&p,f,tag,V_ASN1_UNIVERSAL, \ 54755714Skris IS_SEQUENCE); \ 54855714Skris } 54955714Skris 55055714Skris#define M_ASN1_I2D_seq_total() \ 55155714Skris r=ASN1_object_size(1,ret,V_ASN1_SEQUENCE); \ 55255714Skris if (pp == NULL) return(r); \ 55355714Skris p= *pp; \ 55455714Skris ASN1_put_object(&p,1,ret,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL) 55555714Skris 55655714Skris#define M_ASN1_I2D_INF_seq_start(tag,ctx) \ 55755714Skris *(p++)=(V_ASN1_CONSTRUCTED|(tag)|(ctx)); \ 55855714Skris *(p++)=0x80 55955714Skris 56055714Skris#define M_ASN1_I2D_INF_seq_end() *(p++)=0x00; *(p++)=0x00 56155714Skris 56255714Skris#define M_ASN1_I2D_finish() *pp=p; \ 56355714Skris return(r); 56455714Skris 565160814Ssimonint asn1_GetSequence(ASN1_const_CTX *c, long *length); 566160814Ssimonvoid asn1_add_error(const unsigned char *address,int offset); 56755714Skris#ifdef __cplusplus 56855714Skris} 56955714Skris#endif 57055714Skris 57155714Skris#endif 572