2016-01-20 107 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);