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)


发布评论