2016-01-20 104 views
3

我想在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)是一个指向“由调用者分配的模板特定的结构体”的指针,但我不明白我应该期待什么结构体以及应该分配多少内存?

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

+0

[苹果的开发技术支持建议,如果你想OpenSSL的功能] (https://lists.apple.com/archives/macnetworkprog/2015/Jun/msg00025.html),您可以构建自己的库版本并将其包含在您的应用程序中。这是我现在在自己的应用中所做的。 –

+0

@MichaelDautermann,感谢您指出了这一点,但我已经找到了Apple的替代密码框架在“CommonCrypto/CommonCrypto.h”中打开了,您可以在其中进行各种sha/hash计算,并且为了完全结束依赖关系在SDK之外的源代码,我需要asn1解析器。如果可行的话,我想知道如何。 – Zohar81

+0

您可以在***'/Applications/.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/System/Library/Frameworks/Security.framework/Headers/SecAsn1T​​emplates.h ***模板常量。搜索[SecAsn1Decode site:apple.com](http://www.google.com/search?q=SecAsn1Decode+site%3Aapple.com)时有很多匹配和示例代码。你可以用***'filetype:c' ***进一步细化它。 – jww

回答

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);