使用c++编解码der编码的asn1,里边有基础类型如ASN1_INTEGER、ASN1_OCTET_STRING;也有复杂的类型,如SEQUENCE、CHOICE,但这些结合在一起,代码怎么写呢?
以下是定义的一些结构体:
struct ExportCertReq {
ASN1_OCTET_STRING *identification;
};
struct ParseCertReq {
ASN1_INTEGER *info_type;
// Certificate *cert;
};
struct ValidateCertReq {
// Certificate *cert;
ASN1_BOOLEAN *ocsp; // default false
};
struct SignDataReq {
ASN1_INTEGER *sign_method;
ASN1_INTEGER *key_index;
ASN1_OCTET_STRING *key_value;
ASN1_INTEGER *in_data_len;
ASN1_OCTET_STRING *in_data;
};
struct VerifySignedDataReq {
ASN1_INTEGER *type;
// Certificate *cert; //[0] implict optional
ASN1_OCTET_STRING *cert_sn; //[1] implict optional
ASN1_INTEGER *in_data_len;
ASN1_OCTET_STRING *in_data;
ASN1_OCTET_STRING *signature;
ASN1_INTEGER *verify_level;
};
struct SignMessageReq {
ASN1_INTEGER *sign_mothod;
ASN1_INTEGER *key_index;
ASN1_OCTET_STRING *key_value;
ASN1_INTEGER *in_data_len;
ASN1_OCTET_STRING *in_data;
ASN1_BOOLEAN *hash_flag; // boolean default false
ASN1_BOOLEAN *original_text; //[0] implict optional
ASN1_BOOLEAN *certificate_chain; //[1] implict optional
ASN1_BOOLEAN *crl; //[2] implict optional
ASN1_BOOLEAN *authentication_attributes; //[3] implict optional
};
struct VerifySignedMessageReq {
ASN1_INTEGER *in_data_len;
ASN1_OCTET_STRING *in_data;
ASN1_OCTET_STRING *signed_message;
ASN1_BOOLEAN *hash_flag; // boolean default false
ASN1_BOOLEAN *original_text; //[0] implict optional
ASN1_BOOLEAN *certificate_chain; //[1] implict optional
ASN1_BOOLEAN *crl; //[2] implict optional
ASN1_BOOLEAN *authentication_attributes; //[3] implict optional
};
typedef struct {
int type;
union {
ExportCertReq *export_user_cert_req; //[0] implict
ParseCertReq *parse_cert_req; //[1] implict
ValidateCertReq *validate_cert_req; //[2] implict
SignDataReq *sign_data_req; //[3] implict
VerifySignedDataReq *verify_signed_data_req; //[4] implict
SignMessageReq *sign_message_req; //[11] implict
VerifySignedMessageReq *verify_signed_message_req; //[12] implict
} value;
} Request;
struct SVSRequest {
ASN1_INTEGER *version;
ASN1_INTEGER *req_type;
Request *request;
ASN1_GENERALIZEDTIME *req_time;
};
以下是关联这些结构体的宏声明
ASN1_SEQUENCE(ExportCertReq) = {
ASN1_SIMPLE(ExportCertReq, identification, ASN1_OCTET_STRING),
} ASN1_SEQUENCE_END(ExportCertReq);
IMPLEMENT_ASN1_FUNCTIONS(ExportCertReq);
ASN1_CHOICE(Request) = {
// ASN1_SIMPLE(Request, value, ExportCertReq),
// ASN1_IMP(Request, value, ExportCertReq, 0),
} ASN1_CHOICE_END(Request);
ASN1_SEQUENCE(SVSRequest) = {
ASN1_SIMPLE(SVSRequest, version, ASN1_INTEGER),
ASN1_SIMPLE(SVSRequest, req_type, ASN1_INTEGER),
ASN1_SIMPLE(SVSRequest, request, Request),
ASN1_SIMPLE(SVSRequest, req_time, ASN1_GENERALIZEDTIME),
} ASN1_SEQUENCE_END(SVSRequest);
IMPLEMENT_ASN1_FUNCTIONS(SVSRequest);
想问下,这个ASN1_CHOICE(Request) 里边的代码怎么写,看官方文档实在是没看懂,百度谷歌也没搜到相对应的代码,或者说我想要的方向搞错了吗?