DECLARE_ASN1_FUNCTIONS宏函数的解析

typedef struct {

ASN1_INTEGER  *version; /*协议版本 */

ASN1_INTEGER  *reqType; /*请求类型*/

SVSREQUSET  *request; /*请求包*/

ASN1_GENERALIZEDTIME  *reqTime; /*请求时间*/

} GM_0029_SVSREQUEST;

DECLARE_ASN1_FUNCTIONS(GM_0029_SVSREQUEST);

查询openssl 在ASN1.H 头文件中有以下定义:

1、# define DECLARE_ASN1_FUNCTIONS(type) DECLARE_ASN1_FUNCTIONS_name(type, type)

展开得到DECLARE_ASN1_FUNCTIONS_name(GM_0029_SVSREQUEST, GM_0029_SVSREQUEST)

  1. 继续查找到得到

# define DECLARE_ASN1_FUNCTIONS_name(type, name) \

        DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \

        DECLARE_ASN1_ENCODE_FUNCTIONS(type, name, name)

继续展开得到

DECLARE_ASN1_ALLOC_FUNCTIONS_name(GM_0029_SVSREQUEST, GM_0029_SVSREQUEST)

DECLARE_ASN1_ENCODE_FUNCTIONS(GM_0029_SVSREQUEST, GM_0029_SVSREQUEST, GM_0029_SVSREQUEST)

2.1 继续查到分为2个宏函数(DECLARE_ASN1_ALLOC_FUNCTIONS_name)

# define DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \

        type *name##_new(void); \

        void name##_free(type *a);

展开DECLARE_ASN1_ALLOC_FUNCTIONS_name(GM_0029_SVSREQUEST, GM_0029_SVSREQUEST)

得到2个函数

1、GM_0029_SVSREQUEST* GM_0029_SVSREQUEST_new(void)

2、void GM_0029_SVSREQUEST_free(GM_0029_SVSREQUEST*a);

2.2 DECLARE_ASN1_ALLOC_FUNCTIONS_name

继续展开得到

# define DECLARE_ASN1_ENCODE_FUNCTIONS_const(type, name) \

        type *d2i_##name(type **a, const unsigned char **in, long len); \

        int i2d_##name(const type *a, unsigned char **out); \

        DECLARE_ASN1_ITEM(name)

DECLARE_ASN1_ENCODE_FUNCTIONS(GM_0029_SVSREQUEST, GM_0029_SVSREQUEST, GM_0029_SVSREQUEST)

展开得到:

3、GM_0029_SVSREQUEST* d2i_GM_0029_SVSREQUEST(GM_0029_SVSREQUEST**a,const unsigned char**in,long len )

和函数/

4、Int i2d_GM_0029_SVSREQUEST(const GM_0029_SVSREQUEST*a,unsigned char **out)

3、即可得到4个函数,分别是:

GM_0029_SVSREQUEST* GM_0029_SVSREQUEST_new(void)

void GM_0029_SVSREQUEST_free(GM_0029_SVSREQUEST*a);

GM_0029_SVSREQUEST* d2i_GM_0029_SVSREQUEST(GM_0029_SVSREQUEST**a,const unsigned char**in,long len )

Int i2d_GM_0029_SVSREQUEST(const GM_0029_SVSREQUEST*a,unsigned char **out)

new函数用于分配空间、生成ASN1数据结构、free用于释放空间、i2d函数将ASN1数据结构转换为DER编码、d2i将DER编码转换为ASN1数据结构

猜你喜欢

转载自blog.csdn.net/weixin_38638777/article/details/107346532
ASN