@@ -110,182 +110,186 @@ int asn1_tag_from_der(int tag, const uint8_t **in, size_t *inlen);
int asn1_any_tag_from_der ( int * tag , const uint8_t * * in , size_t * inlen ) ;
int asn1_tag_get ( int * tag , const uint8_t * * in , size_t * inlen ) ; // 这个函数是看看下一个tag是什么, 并不修改in,inlen
int asn1_tag_is_cstring ( int tag ) ;
int asn1_length_to_der ( size_t len , uint8_t * * in , size_t * in len) ;
int asn1_length_from_der ( size_t * len , const uint8_t * * in , size_t * inlen ) ;
int asn1_length_to_der ( size_t d len, uint8_t * * out , size_t * out len) ;
int asn1_length_from_der ( size_t * d len, const uint8_t * * in , size_t * inlen ) ;
int asn1_length_is_zero ( size_t len ) ;
int asn1_length_le ( size_t len1 , size_t len2 ) ;
int asn1_data_to_der ( const uint8_t * d , size_t dlen , uint8_t * * out , size_t * outlen ) ;
int asn1_data_from_der ( const uint8_t * * d , size_t dlen , const uint8_t * * in , size_t * inlen ) ;
int asn1_type_to_der ( int tag , const uint8_t * d , size_t dlen , uint8_t * * out , size_t * outlen ) ;
int asn1_type_from_der ( int tag , const uint8_t * * d , size_t * dlen , const uint8_t * * in , size_t * inlen ) ;
int asn1_any_type_from_der ( int * tag , const uint8_t * * d , size_t * dlen , const uint8_t * * in , size_t * inlen ) ;
int asn1_any_to_der ( const uint8_t * a , size_t alen , uint8_t * * out , size_t * outlen ) ;
int asn1_any_from_der ( const uint8_t * * a , size_t * alen , const uint8_t * * in , size_t * inlen ) ;
int asn1_any_to_der ( const uint8_t * a , size_t alen , uint8_t * * out , size_t * outlen ) ; // 调用方应保证a,alen为TLV
int asn1_any_from_der ( const uint8_t * * a , size_t * alen , const uint8_t * * in , size_t * inlen ) ; // 检查输入为TLV
int asn1_boolean_to_der_ex ( int tag , int val , uint8_t * * out , size_t * outlen ) ;
int asn1_boolean_from_der_ex ( int tag , int * val , const uint8_t * * in , size_t * inlen ) ;
# define asn1_boolean_to_der(val,out,outlen) asn1_boolean_to_der_ex(ASN1_TAG_BOOLEAN,val,out,outlen)
# define asn1_boolean_from_der(val,in,inlen) asn1_boolean_from_der_ex(ASN1_TAG_BOOLEAN,val,in,inlen)
# define asn1_implicit_boolean_to_der(idx ,val,out,outlen) asn1_boolean_to_der_ex(ASN1_TAG_IMPLICIT(idx ),val,out,outlen)
# define asn1_implicit_boolean_from_der(idx ,val,in,inlen) asn1_boolean_from_der_ex(ASN1_TAG_IMPLICIT(idx ),val,in,inlen)
# define asn1_boolean_to_der(val,out,outlen) asn1_boolean_to_der_ex(ASN1_TAG_BOOLEAN,val,out,outlen)
# define asn1_boolean_from_der(val,in,inlen) asn1_boolean_from_der_ex(ASN1_TAG_BOOLEAN,val,in,inlen)
# define asn1_implicit_boolean_to_der(i,val,out,outlen) asn1_boolean_to_der_ex(ASN1_TAG_IMPLICIT(i),val,out,outlen)
# define asn1_implicit_boolean_from_der(i,val,in,inlen) asn1_boolean_from_der_ex(ASN1_TAG_IMPLICIT(i),val,in,inlen)
// asn1_integer_ 不支持负数编解码
int asn1_integer_to_der_ex ( int tag , const uint8_t * d , size_t dlen , uint8_t * * out , size_t * outlen ) ;
int asn1_integer_from_der_ex ( int tag , const uint8_t * * d , size_t * dlen , const uint8_t * * in , size_t * inlen ) ;
# define asn1_integer_to_der(d,dlen,out,outlen) asn1_integer_to_der_ex(ASN1_TAG_INTEGER,d,dlen,out,outlen)
# define asn1_integer_from_der(d,dlen,in,inlen) asn1_integer_from_der_ex(ASN1_TAG_INTEGER,d,dlen,in,inlen)
# define asn1_implicit_integer_to_der(idx ,d,dlen,out,outlen) asn1_integer_to_der_ex(ASN1_TAG_IMPLICIT(idx ),d,dlen,out,outlen)
# define asn1_implicit_integer_from_der(idx ,d,dlen,in,inlen) asn1_integer_from_der_ex(ASN1_TAG_IMPLICIT(idx ),d,dlen,in,inlen)
# define asn1_integer_to_der(d,dlen,out,outlen) asn1_integer_to_der_ex(ASN1_TAG_INTEGER,d,dlen,out,outlen)
# define asn1_integer_from_der(d,dlen,in,inlen) asn1_integer_from_der_ex(ASN1_TAG_INTEGER,d,dlen,in,inlen)
# define asn1_implicit_integer_to_der(i,d,dlen,out,outlen) asn1_integer_to_der_ex(ASN1_TAG_IMPLICIT(i),d,dlen,out,outlen)
# define asn1_implicit_integer_from_der(i,d,dlen,in,inlen) asn1_integer_from_der_ex(ASN1_TAG_IMPLICIT(i),d,dlen,in,inlen)
int asn1_int_to_der_ex ( int tag , int a , uint8_t * * out , size_t * outlen ) ;
int asn1_int_from _der_ex ( int tag , int * a , const uint8_t * * in , size_t * in len) ;
# define asn1_int_to_der(val,out,outlen) asn1_ int_to_der_ex(ASN1_TAG_INTEGER,val,out,outlen)
# define asn1_int_from _der(val,in,inlen) asn1_int_from _der_ex(ASN1_TAG_INTEGER,val,in,in len)
# define asn1_implicit_int_to_der(idx,val,out,out len) asn1_int_to _der_ex(ASN1_TAG_IMPLICIT(idx),val,out,out len)
# define asn1_implicit_int_from _der(idx ,val,in,in len) asn1_int_from _der_ex(ASN1_TAG_IMPLICIT(idx ),val,in,in len)
// asn1_int_ 只支持小的无符号整数的编解码,不支持负数
int asn1_int_to _der_ex ( int tag , int val , uint8_t * * out , size_t * out len) ; // 当 val == -1 时,不输出,返回 0
int asn1_int_from_der_ex ( int tag , int * val , const u int8 _t * * in , size_t * inlen ) ; // 不支持负数, 返回0时 *val 设置为 -1
# define asn1_int_to _der(val,out,outlen) asn1_int_to _der_ex(ASN1_TAG_INTEGER,val,out,out len)
# define asn1_int_from_der(val,in,in len) asn1_int_from _der_ex(ASN1_TAG_INTEGER,val,in,in len)
# define asn1_implicit_int_to _der(i,val,out,out len) asn1_int_to _der_ex(ASN1_TAG_IMPLICIT(i),val,out,out len)
# define asn1_implicit_int_from_der(i,val,in,inlen) asn1_int_from_der_ex(ASN1_TAG_IMPLICIT(i),val,in,inlen)
// 比特长度不必须为8的整数倍
int asn1_bit_string_to_der_ex ( int tag , const uint8_t * d , size_t nbits , uint8_t * * out , size_t * outlen ) ;
int asn1_bit_string_from_der_ex ( int tag , const uint8_t * * d , size_t * nbits , const uint8_t * * in , size_t * inlen ) ;
# define asn1_bit_string_to_der(d,nbits,out,outlen) asn1_bit_string_to_der_ex(ASN1_TAG_BIT_STRING,d,nbits,out,outlen)
# define asn1_bit_string_from_der(d,nbits,in,inlen) asn1_bit_string_from_der_ex(ASN1_TAG_BIT_STRING,d,nbits,in,inlen)
# define asn1_implicit_bit_string_to_der(idx ,d,nbits,out,outlen) asn1_bit_string_to_der_ex(ASN1_TAG_IMPLICIT(idx ),d,nbits,out,outlen)
# define asn1_implicit_bit_string_from_der(idx ,d,nbits,in,inlen) asn1_bit_string_from_der_ex(ASN1_TAG_IMPLICIT(idx ),d,nbits,in,inlen)
# define asn1_bit_string_to_der(d,nbits,out,outlen) asn1_bit_string_to_der_ex(ASN1_TAG_BIT_STRING,d,nbits,out,outlen)
# define asn1_bit_string_from_der(d,nbits,in,inlen) asn1_bit_string_from_der_ex(ASN1_TAG_BIT_STRING,d,nbits,in,inlen)
# define asn1_implicit_bit_string_to_der(i,d,nbits,out,outlen) asn1_bit_string_to_der_ex(ASN1_TAG_IMPLICIT(i),d,nbits,out,outlen)
# define asn1_implicit_bit_string_from_der(i,d,nbits,in,inlen) asn1_bit_string_from_der_ex(ASN1_TAG_IMPLICIT(i),d,nbits,in,inlen)
// 比特长度必须为8的整数倍, 因此使用字节长度
int asn1_bit_octets_to_der_ex ( int tag , const uint8_t * d , size_t dlen , uint8_t * * out , size_t * outlen ) ;
int asn1_bit_octets_from_der_ex ( int tag , const uint8_t * * d , size_t * dlen , const uint8_t * * in , size_t * inlen ) ;
# define asn1_bit_octets_to_der(d,dlen,out,outlen) asn1_bit_octets_to_der_ex(ASN1_TAG_BIT_STRING,d,dlen,out,outlen)
# define asn1_bit_octets_from_der(d,dlen,in,inlen) asn1_bit_octets_from_der_ex(ASN1_TAG_BIT_STRING,d,dlen,out,out len)
# define asn1_implicit_bit_octets_to_der(idx ,d,dlen,out,outlen) asn1_bit_octets_to_der_ex(ASN1_TAG_IMPLICIT(idx ),d,dlen,out,outlen)
# define asn1_implicit_bit_octets_from_der(idx ,d,dlen,in,inlen) asn1_bit_octets_from_der_ex(ASN1_TAG_IMPLICIT(idx ),d,dlen,out,out len)
# define asn1_bit_octets_to_der(d,dlen,out,outlen) asn1_bit_octets_to_der_ex(ASN1_TAG_BIT_STRING,d,dlen,out,outlen)
# define asn1_bit_octets_from_der(d,dlen,in,inlen) asn1_bit_octets_from_der_ex(ASN1_TAG_BIT_STRING,d,dlen,in,in len)
# define asn1_implicit_bit_octets_to_der(i,d,dlen,out,outlen) asn1_bit_octets_to_der_ex(ASN1_TAG_IMPLICIT(i),d,dlen,out,outlen)
# define asn1_implicit_bit_octets_from_der(i,d,dlen,in,inlen) asn1_bit_octets_from_der_ex(ASN1_TAG_IMPLICIT(i),d,dlen,in,in len)
// bits == -1 不编码,只支持较少的比特数量
int asn1_bits_to_der_ex ( int tag , int bits , uint8_t * * out , size_t * outlen ) ;
int asn1_bits_from_der_ex ( int tag , int * bits , const uint8_t * * in , size_t * inlen ) ;
# define asn1_bits_to_der(val ,out,outlen) asn1_bits_to_der_ex(ASN1_TAG_BIT_STRING,val ,out,outlen)
# define asn1_bits_from_der(val,out,out len) asn1_bits_from_der_ex(ASN1_TAG_BIT_STRING,val,out,out len)
# define asn1_implicit_bits_to_der(idx,val ,out,outlen) asn1_bits_to_der_ex(ASN1_TAG_IMPLICIT(idx),val ,out,outlen)
# define asn1_implicit_bits_from_der(idx,val,out,out len) asn1_bits_from_der_ex(ASN1_TAG_IMPLICIT(idx),val,out,out len)
# define asn1_bits_to_der(bits ,out,outlen) asn1_bits_to_der_ex(ASN1_TAG_BIT_STRING,bits ,out,outlen)
# define asn1_bits_from_der(bits,in,in len) asn1_bits_from_der_ex(ASN1_TAG_BIT_STRING,bits,in,in len)
# define asn1_implicit_bits_to_der(i,bits ,out,outlen) asn1_bits_to_der_ex(ASN1_TAG_IMPLICIT(i),bits ,out,outlen)
# define asn1_implicit_bits_from_der(i,bits,in,in len) asn1_bits_from_der_ex(ASN1_TAG_IMPLICIT(i),bits,in,in len)
// names[i]对应第i个比特
int asn1_bits_print ( FILE * fp , int fmt , int ind , const char * label , const char * * names , size_t names_cnt , int bits ) ;
# define asn1_octet_string_to_der_ex(tag,a,a len,d,d len) asn1_type_to_der(tag,a,a len,d,d len)
# define asn1_octet_string_from_der_ex(tag,a,a len,d,d len) asn1_type_from_der(tag,a,a len,d,d len)
# define asn1_octet_string_to_der(val, d,dlen,out,outlen) asn1_type_to_der(ASN1_TAG_OCTET_STRING,val, d,dlen,out,outlen)
# define asn1_octet_string_from_der(val, d,dlen,out,out len) asn1_type_from_der(ASN1_TAG_OCTET_STRING,val, d,dlen,out,out len)
# define asn1_implicit_octet_string_to_der(idx,val ,d,dlen,out,outlen) asn1_type_to_der(ASN1_TAG_IMPLICIT(idx),val ,d,dlen,out,outlen)
# define asn1_implicit_octet_string_from_der(idx,val ,d,dlen,out,out len) asn1_type_from_der(ASN1_TAG_IMPLICIT(idx),val,d,dlen,out,out len)
# define asn1_octet_string_to_der_ex(tag,d,d len,out,out len) asn1_type_to_der(tag,d,d len,out,out len)
# define asn1_octet_string_from_der_ex(tag,d,d len,in,in len) asn1_type_from_der(tag,d,d len,in,in len)
# define asn1_octet_string_to_der(d,dlen,out,outlen) asn1_type_to_der(ASN1_TAG_OCTET_STRING,d,dlen,out,outlen)
# define asn1_octet_string_from_der(d,dlen,in,in len) asn1_type_from_der(ASN1_TAG_OCTET_STRING,d,dlen,in,in len)
# define asn1_implicit_octet_string_to_der(i,d,dlen,out,outlen) asn1_type_to_der(ASN1_TAG_IMPLICIT(i) ,d,dlen,out,outlen)
# define asn1_implicit_octet_string_from_der(i,d,dlen,in,in len) asn1_type_from_der(ASN1_TAG_IMPLICIT(i),d,dlen,in,in len)
int asn1_null_to_der ( uint8_t * * out , size_t * outlen ) ;
int asn1_null_from_der ( const uint8_t * * in , size_t * inlen ) ;
# define ASN1_OID_MAX_NODES 32
int asn1_object_identifier_to_octets ( const uint32_t * nodes , size_t nodes_cou nt , uint8_t * out , size_t * outlen ) ;
int asn1_object_identifier_from_octets ( uint32_t * nodes , size_t * nodes_cou nt , const uint8_t * in , size_t inlen ) ;
int asn1_object_identifier_to_octets ( const uint32_t * nodes , size_t nodes_cnt , uint8_t * out , size_t * outlen ) ;
int asn1_object_identifier_from_octets ( uint32_t * nodes , size_t * nodes_cnt , const uint8_t * in , size_t inlen ) ;
int asn1_object_identifier_equ ( const uint32_t * a , size_t a_cou nt , const uint32_t * b , size_t b_cou nt ) ;
int asn1_object_identifier_to_der_ex ( int tag , const uint32_t * nodes , size_t nodes_cou nt , uint8_t * * out , size_t * outlen ) ;
int asn1_object_identifier_from_der_ex ( int tag , uint32_t * nodes , size_t * nodes_cou nt , const uint8_t * * in , size_t * inlen ) ;
# define asn1_object_identifier_to_der(val,d,dlen ,out,outlen) asn1_object_identifier_to_der_ex(ASN1_TAG_OBJECT_IDENTIFIER,val,d,dlen ,out,outlen)
# define asn1_object_identifier_from_der(val,d,dlen,out,out len) asn1_object_identifier_from_der_ex(ASN1_TAG_OBJECT_IDENTIFIER,val,d,dlen,out,out len)
# define asn1_implicit_object_identifier_to_der(idx,val,d,dlen ,out,outlen) asn1_object_identifier_to_der_ex(ASN1_TAG_IMPLICIT(idx),val,d,dlen ,out,outlen)
# define asn1_implicit_object_identifier_from_der(idx,val,d,dlen,out,out len) asn1_object_identifier_from_der_ex(ASN1_TAG_IMPLICIT(idx),val,d,dlen,out,out len)
int asn1_object_identifier_equ ( const uint32_t * a , size_t a_cnt , const uint32_t * b , size_t b_cnt ) ;
int asn1_object_identifier_to_der_ex ( int tag , const uint32_t * nodes , size_t nodes_cnt , uint8_t * * out , size_t * outlen ) ;
int asn1_object_identifier_from_der_ex ( int tag , uint32_t * nodes , size_t * nodes_cnt , const uint8_t * * in , size_t * inlen ) ;
# define asn1_object_identifier_to_der(nodes,nodes_cnt ,out,outlen) asn1_object_identifier_to_der_ex(ASN1_TAG_OBJECT_IDENTIFIER,nodes,nodes_cnt ,out,outlen)
# define asn1_object_identifier_from_der(nodes,nodes_cnt,in,in len) asn1_object_identifier_from_der_ex(ASN1_TAG_OBJECT_IDENTIFIER,nodes,nodes_cnt,in,in len)
# define asn1_implicit_object_identifier_to_der(i,nodes,nodes_cnt ,out,outlen) asn1_object_identifier_to_der_ex(ASN1_TAG_IMPLICIT(i),nodes,nodes_cnt ,out,outlen)
# define asn1_implicit_object_identifier_from_der(i,nodes,nodes_cnt,in,in len) asn1_object_identifier_from_der_ex(ASN1_TAG_IMPLICIT(i),nodes,nodes_cnt,in,in len)
int asn1_object_identifier_print ( FILE * fp , int fmt , int ind , const char * label , const char * name ,
const uint32_t * nodes , size_t nodes_cou nt ) ;
const uint32_t * nodes , size_t nodes_cnt ) ;
# define asn1_enumerated_to_der_ex(tag,val,out,outlen) asn1_int_to_der_ex(tag,val,out,outlen)
# define asn1_enumerated_from_der_ex(tag,val,out,out len) asn1_int_from_der_ex(tag,val,out,out len)
# define asn1_enumerated_to_der(val,out,outlen) asn1_int_to_der_ex(ASN1_TAG_ENUMERATED,val,out,outlen)
# define asn1_enumerated_from_der(val,out,out len) asn1_int_from_der_ex(ASN1_TAG_ENUMERATED,val,out,out len)
# define asn1_implicit_enumerated_to_der(idx ,val,out,outlen) asn1_int_to_der_ex(ASN1_TAG_IMPLICIT(idx ),val,out,outlen)
# define asn1_implicit_enumerated_from_der(idx ,val,out,out len) asn1_int_from_der_ex(ASN1_TAG_IMPLICIT(idx ),val,out,out len)
# define asn1_enumerated_to_der_ex(tag,val,out,outlen) asn1_int_to_der_ex(tag,val,out,outlen)
# define asn1_enumerated_from_der_ex(tag,val,in,in len) asn1_int_from_der_ex(tag,val,in,in len)
# define asn1_enumerated_to_der(val,out,outlen) asn1_int_to_der_ex(ASN1_TAG_ENUMERATED,val,out,outlen)
# define asn1_enumerated_from_der(val,in,in len) asn1_int_from_der_ex(ASN1_TAG_ENUMERATED,val,in,in len)
# define asn1_implicit_enumerated_to_der(i,val,out,outlen) asn1_int_to_der_ex(ASN1_TAG_IMPLICIT(i),val,out,outlen)
# define asn1_implicit_enumerated_from_der(i,val,in,in len) asn1_int_from_der_ex(ASN1_TAG_IMPLICIT(i),val,in,in len)
int asn1_utf8_string_check ( const char * d , size_t dlen ) ;
int asn1_utf8_string_to_der_ex ( int tag , const char * a , uint8_t * * out , size_t * outlen ) ;
int asn1_utf8_string_from_der_ex ( int tag , const char * * a , size_t * a len, const uint8_t * * in , size_t * inlen ) ;
# define asn1_utf8_string_to_der(val ,out,outlen) asn1_utf8_string_to_der_ex(ASN1_TAG_UTF8String,val ,out,outlen)
# define asn1_utf8_string_from_der(val, d,dlen,out,out len) asn1_utf8_string_from_der_ex(ASN1_TAG_UTF8String,val, d,dlen,out,out len)
# define asn1_implicit_utf8_string_to_der(i,val ,out,outlen) asn1_utf8_string_to_der_ex(ASN1_TAG_IMPLICIT(i),val ,out,outlen)
# define asn1_implicit_utf8_string_from_der(i,val,out,out len) asn1_utf8_string_from_der_ex(ASN1_TAG_IMPLICIT(i),val,out,out len)
int asn1_utf8_string_to_der_ex ( int tag , const char * d , size_t dlen , uint8_t * * out , size_t * outlen ) ;
int asn1_utf8_string_from_der_ex ( int tag , const char * * d , size_t * d len, const uint8_t * * in , size_t * inlen ) ;
# define asn1_utf8_string_to_der(d,dlen ,out,outlen) asn1_utf8_string_to_der_ex(ASN1_TAG_UTF8String,d,dlen ,out,outlen)
# define asn1_utf8_string_from_der(d,dlen,in,in len) asn1_utf8_string_from_der_ex(ASN1_TAG_UTF8String,d,dlen,in,in len)
# define asn1_implicit_utf8_string_to_der(i,d,dlen ,out,outlen) asn1_utf8_string_to_der_ex(ASN1_TAG_IMPLICIT(i),d,dlen ,out,outlen)
# define asn1_implicit_utf8_string_from_der(i,d,dlen,in,in len) asn1_utf8_string_from_der_ex(ASN1_TAG_IMPLICIT(i),d,dlen,in,in len)
int asn1_printable_string_check ( const char * d , size_t dlen ) ;
int asn1_printable_string_to_der_ex ( int tag , const char * a , uint8_t * * out , size_t * outlen ) ;
int asn1_printable_string_from_der_ex ( int tag , const char * * a , size_t * a len, const uint8_t * * in , size_t * inlen ) ;
# define asn1_printable_string_to_der(val ,out,outlen) asn1_printable_string_to_der_ex(ASN1_TAG_PrintableString,val ,out,outlen)
# define asn1_printable_string_from_der(val, d,dlen,out,out len) asn1_printable_string_from_der_ex(ASN1_TAG_PrintableString,val, d,dlen,out,out len)
# define asn1_implicit_printable_string_to_der(i,val ,out,outlen) asn1_printable_string_to_der_ex(ASN1_TAG_IMPLICIT(i),val ,out,outlen)
# define asn1_implicit_printable_string_from_der(i,val,out,out len) asn1_printable_string_from_der_ex(ASN1_TAG_IMPLICIT(i),val,out,out len)
int asn1_printable_string_to_der_ex ( int tag , const char * d , size_t dlen , uint8_t * * out , size_t * outlen ) ;
int asn1_printable_string_from_der_ex ( int tag , const char * * d , size_t * d len, const uint8_t * * in , size_t * inlen ) ;
# define asn1_printable_string_to_der(d,dlen ,out,outlen) asn1_printable_string_to_der_ex(ASN1_TAG_PrintableString,d,dlen ,out,outlen)
# define asn1_printable_string_from_der(d,dlen,in,in len) asn1_printable_string_from_der_ex(ASN1_TAG_PrintableString,d,dlen,in,in len)
# define asn1_implicit_printable_string_to_der(i,d,dlen ,out,outlen) asn1_printable_string_to_der_ex(ASN1_TAG_IMPLICIT(i),d,dlen ,out,outlen)
# define asn1_implicit_printable_string_from_der(i,d,dlen,in,in len) asn1_printable_string_from_der_ex(ASN1_TAG_IMPLICIT(i),d,dlen,in,in len)
int asn1_ia5_string_check ( const char * d , size_t dlen ) ;
int asn1_ia5_string_to_der_ex ( int tag , const char * a , uint8_t * * out , size_t * outlen ) ;
int asn1_ia5_string_from_der_ex ( int tag , const char * * a , size_t * a len, const uint8_t * * in , size_t * inlen ) ;
# define asn1_ia5_string_to_der(val ,out,outlen) asn1_ia5_string_to_der_ex(ASN1_TAG_IA5String,val ,out,outlen)
# define asn1_ia5_string_from_der(val, d,dlen,out,out len) asn1_ia5_string_from_der_ex(ASN1_TAG_IA5String,val, d,dlen,out,out len)
# define asn1_implicit_ia5_string_to_der(i,val ,out,outlen) asn1_ia5_string_to_der_ex(ASN1_TAG_IMPLICIT(i),val ,out,outlen)
# define asn1_implicit_ia5_string_from_der(i,val,out,out len) asn1_ia5_string_from_der_ex(ASN1_TAG_IMPLICIT(i),val,out,out len)
int asn1_ia5_string_to_der_ex ( int tag , const char * d , size_t dlen , uint8_t * * out , size_t * outlen ) ;
int asn1_ia5_string_from_der_ex ( int tag , const char * * d , size_t * d len, const uint8_t * * in , size_t * inlen ) ;
# define asn1_ia5_string_to_der(d,dlen ,out,outlen) asn1_ia5_string_to_der_ex(ASN1_TAG_IA5String,d,dlen ,out,outlen)
# define asn1_ia5_string_from_der(d,dlen,in,in len) asn1_ia5_string_from_der_ex(ASN1_TAG_IA5String,d,dlen,in,in len)
# define asn1_implicit_ia5_string_to_der(i,d,dlen ,out,outlen) asn1_ia5_string_to_der_ex(ASN1_TAG_IMPLICIT(i),d,dlen ,out,outlen)
# define asn1_implicit_ia5_string_from_der(i,d,dlen,in,in len) asn1_ia5_string_from_der_ex(ASN1_TAG_IMPLICIT(i),d,dlen,in,in len)
int asn1_string_print ( FILE * fp , int fmt , int ind , const char * label , int tag , const uint8_t * d , size_t dlen ) ;
int asn1_utc_time_to_der_ex ( int tag , time_t tv , uint8_t * * out , size_t * outlen ) ;
int asn1_utc_time_from_der_ex ( int tag , time_t * tv , const uint8_t * * in , size_t * inlen ) ;
# define asn1_utc_time_to_der(tv,out,outlen) asn1_utc_time_to_der_ex(ASN1_TAG_UTCTime,tv,out,outlen)
# define asn1_utc_time_from_der(tv,in,inlen) asn1_utc_time_from_der_ex(ASN1_TAG_UTCTime,tv,in,inlen)
# define asn1_implicit_utc_time_to_der(i,tv,out,outlen) asn1_utc_time_to_der_ex(ASN1_TAG_IMPLICIT(i),tv,out,outlen)
# define asn1_implicit_utc_time_from_der(i,tv,in,inlen) asn1_utc_time_from_der_ex(ASN1_TAG_IMPLICIT(i),tv,in,inlen)
int asn1_utc _time_to_der_ex ( int tag , time_t a , uint8_t * * out , size_t * outlen ) ;
int asn1_utc _time_from_der_ex ( int tag , time_t * t , const uint8_t * * in , size_t * inlen ) ;
# define asn1_utc _time_to_der(val ,out,outlen) asn1_utc _time_to_der_ex(ASN1_TAG_UTC Time,val ,out,outlen)
# define asn1_utc _time_from_der(val,out,out len) asn1_utc _time_from_der_ex(ASN1_TAG_UTCTime,val,out,out len)
# define asn1_implicit_utc _time_to_der(i,val ,out,outlen) asn1_utc _time_to_der_ex(ASN1_TAG_IMPLICIT(i),val ,out,outlen)
# define asn1_implicit_utc _time_from_der(i,val,out,out len) asn1_utc _time_from_der_ex(ASN1_TAG_IMPLICIT(i),val,out,out len)
int asn1_generalized _time_to_der_ex ( int tag , time_t tv , uint8_t * * out , size_t * outlen ) ;
int asn1_generalized _time_from_der_ex ( int tag , time_t * tv , const uint8_t * * in , size_t * inlen ) ;
# define asn1_generalized _time_to_der(t v,out,outlen) asn1_generalized _time_to_der_ex(ASN1_TAG_Generalized Time,t v,out,outlen)
# define asn1_generalized _time_from_der(tv,in,in len) asn1_generalized _time_from_der_ex(ASN1_TAG_GeneralizedTime,tv,in,in len)
# define asn1_implicit_generalized _time_to_der(i,t v,out,outlen) asn1_generalized _time_to_der_ex(ASN1_TAG_IMPLICIT(i),t v,out,outlen)
# define asn1_implicit_generalized _time_from_der(i,tv,in,in len) asn1_generalized _time_from_der_ex(ASN1_TAG_IMPLICIT(i),tv,in,in len)
int asn1_generalized_time_to_der_ex ( int tag , time_t a , uint8_t * * out , size_t * outlen ) ;
int asn1_generalized_time_from_der_ex ( int tag , time_t * t , const uint8_t * * in , size_t * inlen ) ;
# define asn1_generalized_tim e_to_der(val ,out,outlen) asn1_generalized_tim e_to_der_ex (ASN1_TAG_GeneralizedTime,val ,out,outlen)
# define asn1_generalized_time_from_der(val,out,out len) asn1_generalized_tim e_from_der_ex (ASN1_TAG_GeneralizedTime,val,out,out len)
# define asn1_implicit_generalized_time_to_der(i,val,out,outlen) asn1_generalized_time_to_der_ex(ASN1_TAG_IMPLICIT(i),val,out,outlen)
# define asn1_implicit_generalized_time_from_der(i,val,out,outlen) asn1_generalized_time_from_der_ex(ASN1_TAG_IMPLICIT(i),val,out,outlen)
# define asn1_sequence_to_der(d,dlen,out,outlen) asn1_type_to_der(ASN1_TAG_SEQUENCE,d,dlen,out,outlen)
# define asn1_sequence_from_der(d,dlen,in,inlen) asn1_type_from_der(ASN1_TAG_SEQUENCE,d,dlen,in,inlen)
# define asn1_implicit_sequenc e_to_der(i,d,dlen ,out,outlen) asn1_typ e_to_der(ASN1_TAG_EXPLICIT(i),d,dlen ,out,outlen)
# define asn1_implicit_sequence_from_der(i,d,dlen,in,in len) asn1_typ e_from_der(ASN1_TAG_EXPLICIT(i),d,dlen,in,in len)
# define asn1_set_to_der(d,dlen,out,outlen) asn1_type_to_der(ASN1_TAG_SET,d,dlen,out,outlen)
# define asn1_set_from_der(d,dlen,in,inlen) asn1_type_from_der(ASN1_TAG_SET,d,dlen,in,inlen)
# define asn1_implicit_set_to_der(i,d,dlen,out,outlen) asn1_type_to_der(ASN1_TAG_EXPLICIT(i),d,dlen,out,outlen)
# define asn1_implicit_set_from_der(i,d,dlen,in,inlen) asn1_type_from_der(ASN1_TAG_EXPLICIT(i),d,dlen,in,inlen)
# define asn1_sequence _to_der(val ,d,dlen,out,outlen) asn1_type_to_der(ASN1_TAG_SEQUENCE,val ,d,dlen,out,outlen)
# define asn1_sequence _from_der(val ,d,dlen,out,out len) asn1_type_from_der(ASN1_TAG_SEQUENCE,val ,d,dlen,out,out len)
# define asn1_implicit_sequence_to_der(i,val,d,dlen,out,outlen) asn1_type_to_der(ASN1_TAG_EXPLICIT(i),val,d,dlen,out,outlen)
# define asn1_implicit_sequence_from_der(i,val,d,dlen,out,outlen) asn1_type_from_der(ASN1_TAG_EXPLICIT(i),val,d,dlen,out,outlen)
# define asn1_implicit _to_der(i ,d,dlen,out,outlen) asn1_type_to_der(ASN1_TAG_EXPLICIT(i) ,d,dlen,out,outlen)
# define asn1_implicit _from_der(i ,d,dlen,in,in len) asn1_type_from_der(ASN1_TAG_EXPLICIT(i) ,d,dlen,in,in len)
int asn1_header_to_der ( int tag , size_t dlen , uint8_t * * out , size_t * outlen ) ;
# define asn1_sequence_header_to_der(dlen,out,outlen) asn1_header_to_der(ASN1_TAG_SEQUENCE,dlen,out,outlen)
# define asn1_implicit_sequence_header_to_der(i,dlen,out,outlen) asn1_header_to_der(ASN1_TAG_EXPLICIT(i),dlen,out,outlen)
# define asn1_set_to_der(val,d, dlen,out,outlen) asn1_type _to_der(ASN1_TAG_SET,val,d, dlen,out,outlen)
# define asn1_set_from_der(val,d ,dlen,out,outlen) asn1_type_from _der(ASN1_TAG_SET,val,d ,dlen,out,outlen)
# define asn1_implicit_set_to_der(i,val,d,dlen,out,outlen) asn1_type_to_der(ASN1_TAG_EXPLICIT(i),val,d,dlen,out,outlen)
# define asn1_implicit_set_from_der(i,val,d,dlen,out,outlen) asn1_type_from_der(ASN1_TAG_EXPLICIT(i),val,d,dlen,out,outlen)
# define asn1_set_header_ to_der(dlen,out,outlen) asn1_header _to_der(ASN1_TAG_SET,dlen,out,outlen)
# define asn1_implicit_set_header_to_der(i ,dlen,out,outlen) asn1_header_to _der(ASN1_TAG_EXPLICIT(i) ,dlen,out,outlen)
# define asn1_im plicit_to_der(i,val,d, dlen,out,outlen) asn1_type _to_der(ASN1_TAG_EXPLICIT(i),val,d, dlen,out,outlen)
# define asn1_implicit_from_der(i,val,d,dlen,out,outlen) asn1_type_from_der(ASN1_TAG_EXPLICIT(i),val,d,dlen,out,outlen)
# define asn1_ex plicit_header_ to_der(i,dlen,out,outlen) asn1_header _to_der(ASN1_TAG_EXPLICIT(i),dlen,out,outlen)
# define asn1_explicit_to_der(i,d,dlen,out,outlen) asn1_type_to_der(ASN1_TAG_EXPLICIT(i),d,dlen,out,outlen)
# define asn1_explicit_from_der(i,d,dlen,in,inlen) asn1_type_from_der(ASN1_TAG_EXPLICIT(i),d,dlen,in,inlen)
int asn1_header_to_der ( int tag , size_t len , uint8_t * * out , size_t * outlen ) ;
# define asn1_sequence_header_to_der(al,d,dl) asn1_header_to_der(ASN1_TAG_SEQUENCE,al,d,dl)
# define asn1_implicit_sequence_header_to_der(i,al,d,dl) asn1_header_to_der(ASN1_TAG_EXPLICIT(i),al,d,dl)
// d,dlen 是 SEQUENCE OF, SET OF 中的值
int asn1_types_get_count ( const uint8_t * d , size_t dlen , int tag , size_t * cnt ) ;
int asn1_types_get_item_by_index ( const uint8_t * d , size_t * dlen , int tag ,
int index , const uint8_t * * item_d , size_t * item_dlen ) ;
# define asn1_set_header_to_der(al,d,dl) asn1_header_to_der(ASN1_TAG_SET,al,d,dl)
# define asn1_implicit_set_header_to_der(i,al,d,dl) asn1_header_to_der(ASN1_TAG_EXPLICIT(i),al,d,dl)
# define asn1_explicit_header_to_der(i,al,d,dl) asn1_header_to_der(ASN1_TAG_EXPLICIT(i),al,d,dl)
# define asn1_explicit_to_der(i,val,d,dlen,out,outlen) asn1_type_to_der(ASN1_TAG_EXPLICIT(i),val,d,dlen,out,outlen)
# define asn1_explicit_from_der(i,val,d,dlen,out,outlen) asn1_type_from_der(ASN1_TAG_EXPLICIT(i),val,d,dlen,out,outlen)
int asn1_types_get_count ( const uint8_t * d , size_t dlen , int tag , int * count ) ;
int asn1_types_get_type_by_index ( const uint8_t * d , size_t * dlen , int tag , const uint8_t * * val , size_t * vlen ) ;
int asn1_sequence_of_integer_to_der ( const int * nums , size_t nums_cnt , uint8_t * * out , size_t * outlen ) ;
int asn1_sequence_of_integer_from_der ( int * nums , size_t * nums_cnt , const uint8_t * * in , size_t * inlen ) ;
int asn1_sequence_of_integer_print ( FILE * fp , int fmt , int ind , const char * label , const uint8_t * d , size_t dlen ) ;
int asn1_sequence_of_int_to_der ( const int * nums , size_t nums_cnt , uint8_t * * out , size_t * outlen ) ;
int asn1_sequence_of_int_from_der ( int * nums , size_t * nums_cnt , const uint8_t * * in , size_t * inlen ) ;
int asn1_sequence_of_int_print ( FILE * fp , int fmt , int ind , const char * label , const uint8_t * d , size_t dlen ) ;
typedef struct {
int oid ;
char * name ;
uint32_t * nodes ;
size_t nodes_cou nt ;
size_t nodes_cnt ;
int flags ;
char * description ;
} ASN1_OID_INFO ;
const ASN1_OID_INFO * asn1_oid_info_from_name ( const ASN1_OID_INFO * infos , size_t count , const char * name ) ;
const ASN1_OID_INFO * asn1_oid_info_from_oid ( const ASN1_OID_INFO * infos , size_t count , int oid ) ;
int asn1_oid_info_from_der_ex ( const ASN1_OID_INFO * * info , uint32_t * nodes , size_t * nodes_cou nt ,
int asn1_oid_info_from_der_ex ( const ASN1_OID_INFO * * info , uint32_t * nodes , size_t * nodes_cnt ,
const ASN1_OID_INFO * infos , size_t count , const uint8_t * * in , size_t * inlen ) ;
int asn1_oid_info_from_der ( const ASN1_OID_INFO * * info ,
const ASN1_OID_INFO * infos , size_t count , const uint8_t * * in , size_t * inlen ) ;