我想在OS-X 10.11下解析asn1格式。
不幸的是,Apple不再将openssl作为其SDK的一部分。相反,我建议使用以下标题中公开的内部包:
SDKs/MacOSX10.11.sdk/System/Library/Frameworks/Security.framework/Versions/A/Headers/SecAsn1Coder.h
不幸的是,我需要解析asn1文件并提取给定字段的API似乎与原始的openssl API非常不同。
在openssl中,函数" asn1parse"在include / openssl / asn1.h中定义,获取DER格式的文件,对其进行解码并返回表示asn1树的输出文本。
在Apple实施中,我发现了" SecAsn1Decode"可能提供相同的功能。文档说输出参数(void * dest)是一个指向"一个由调用者"分配的模板特定结构的指针,但我不明白我应该期待什么结构和多少内存我应该分配?
也许你可以帮我理解如何使用它。欢迎任何参考。
答案 0 :(得分:2)
现在GitHub上有几个片段显示了如何调用SecAsn1Decode
函数,see here for example:
typedef struct {
size_t length;
unsigned char *data;
} ASN1_Data;
typedef struct {
ASN1_Data type; // INTEGER
ASN1_Data version; // INTEGER
ASN1_Data value; // OCTET STRING
} RVNReceiptAttribute;
typedef struct {
RVNReceiptAttribute **attrs;
} RVNReceiptPayload;
// ASN.1 receipt attribute template
static const SecAsn1Template kReceiptAttributeTemplate[] = {
{ SEC_ASN1_SEQUENCE, 0, NULL, sizeof(RVNReceiptAttribute) },
{ SEC_ASN1_INTEGER, offsetof(RVNReceiptAttribute, type), NULL, 0 },
{ SEC_ASN1_INTEGER, offsetof(RVNReceiptAttribute, version), NULL, 0 },
{ SEC_ASN1_OCTET_STRING, offsetof(RVNReceiptAttribute, value), NULL, 0 },
{ 0, 0, NULL, 0 }
};
// ASN.1 receipt template set
static const SecAsn1Template kSetOfReceiptAttributeTemplate[] = {
{ SEC_ASN1_SET_OF, 0, kReceiptAttributeTemplate, sizeof(RVNReceiptPayload) },
{ 0, 0, NULL, 0 }
};
后来:
NSData *payloadData = …
RVNReceiptPayload payload = { NULL };
status = SecAsn1Decode(asn1Decoder, payloadData.bytes, payloadData.length, kSetOfReceiptAttributeTemplate, &payload);