使用Xcode安全框架来解析asn1格式
问题描述:
我想在OS-X 10.11下解析asn1格式。使用Xcode安全框架来解析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);
[苹果的开发技术支持建议,如果你想OpenSSL的功能] (https://lists.apple.com/archives/macnetworkprog/2015/Jun/msg00025.html),您可以构建自己的库版本并将其包含在您的应用程序中。这是我现在在自己的应用中所做的。 –
@MichaelDautermann,感谢您指出了这一点,但我已经找到了Apple的替代密码框架在“CommonCrypto/CommonCrypto.h”中打开了,您可以在其中进行各种sha/hash计算,并且为了完全结束依赖关系在SDK之外的源代码,我需要asn1解析器。如果可行的话,我想知道如何。 – Zohar81
您可以在***'/Applications/.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/System/Library/Frameworks/Security.framework/Headers/SecAsn1Templates.h ***模板常量。搜索[SecAsn1Decode site:apple.com](http://www.google.com/search?q=SecAsn1Decode+site%3Aapple.com)时有很多匹配和示例代码。你可以用***'filetype:c' ***进一步细化它。 – jww