使用Xcode安全框架解析asn1格式

我想在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中,include / openssl / asn1.h中定义的函数“asn1parse”获取DER格式的文件,对其进行解码并返回表示asn1树的输出文本.

在Apple实现中,我发现可能提供相同功能的“SecAsn1Decode”.文档说输出参数(void * dest)是指向“调用者分配的特定于模板的结构”的指针,但是我不明白我应该期待什么结构以及我应该分配多少内存?

也许你可以帮我理解如何使用它.欢迎任何参考.

最佳答案 现在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);
点赞