2024年6月14日发(作者:)

Openssl源代码的特点:

1、openssl中只有实现而没有调用的函数

2、openssl中各系列的函数都是用宏定义的(因而无法用代码浏览工具找到其定义)

用于定义X509的new、free、i2d和d2i函数的宏:

1、函数声明DECLARE_ASN1_FUNCTIONS(X509)

用于声明函数x509x509.h

在openssl中的具体定义如下:asn1asn1.h

/* Declare ASN1 functions: the implement macro in in asn1t.h */

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

#define DECLARE_ASN1_ALLOC_FUNCTIONS(type)

#define DECLARE_ASN1_FUNCTIONS_name(type, name)

#define DECLARE_ASN1_FUNCTIONS_fname(type, itname, name)

#define DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name)

#define DECLARE_ASN1_ENCODE_FUNCTIONS_const(type, name)

#define DECLARE_ASN1_NDEF_FUNCTION(name)

#define DECLARE_ASN1_FUNCTIONS_const(name)

int i2d_##name##_NDEF(name *a, unsigned char **out);

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

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

DECLARE_ASN1_ITEM(name)

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

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

DECLARE_ASN1_ITEM(itname)

DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name)

DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name)

DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name)

DECLARE_ASN1_ENCODE_FUNCTIONS(type, name, name)

DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, type)

DECLARE_ASN1_ALLOC_FUNCTIONS(name)

DECLARE_ASN1_ENCODE_FUNCTIONS_const(name, name)

#define DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name)

type *name##_new(void);

void name##_free(type *a);

用于函数的实现asn1x_x509.c

ASN1_SEQUENCE_ref(X509, x509_cb, CRYPTO_LOCK_X509) = {

ASN1_SIMPLE(X509, cert_info, X509_CINF),

ASN1_SIMPLE(X509, sig_alg, X509_ALGOR),

ASN1_SIMPLE(X509, signature, ASN1_BIT_STRING)

} ASN1_SEQUENCE_END_ref(X509, X509)

IMPLEMENT_ASN1_FUNCTIONS(X509)

2、ASN1_SEQUENCE_ref:

ASN1_SEQUENCE_ref:asn1asn1t.h

#define ASN1_SEQUENCE_ref(tname, cb, lck)

static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_REFCOUNT, offsetof(tname,

ASN1_SEQUENCE(tname)

references), lck, cb, 0};

3、ASN1_SEQUENCE

用于SEQUENCE,表明下面的编码是一个SEQUENCE。

#define ASN1_SEQUENCE(tname)

#define ASN1_SEQUENCE_END(stname) ASN1_SEQUENCE_END_name(stname, stname)

#define ASN1_SEQUENCE_END_name(stname, tname)

;

ASN1_ITEM_start(tname)

ASN1_ITYPE_SEQUENCE,

V_ASN1_SEQUENCE,

tname##_seq_tt,

sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),

NULL,

sizeof(stname),

#stname

static const ASN1_TEMPLATE tname##_seq_tt[]

ASN1_ITEM_end(tname)