【问题标题】:Using Xcode security framework to parse asn1 format使用Xcode安全框架解析asn1格式
【发布时间】:2016-04-26 06:37:39
【问题描述】:

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

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

【问题讨论】:

  • Apple's Developer Tech Support recommends that if you want OpenSSL functionality,您构建自己的库版本并将其包含在您的应用程序中。这就是我这些天在自己的应用程序中所做的事情。
  • @MichaelDautermann,感谢您指出这一点,但我已经在“CommonCrypto/CommonCrypto.h”中找到了替代 openssl 的 Apple 替代加密框架,您可以在其中进行各种 sha/hash 计算,并且在为了完全结束我对 SDK 外部源的依赖,我需要 asn1 解析器。如果可行,我想知道如何。
  • 您可以在 /Applications/.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/System/Library/Frameworks/Security.framework/Headers/SecAsn1Templates.h 中查找模板常量。搜索SecAsn1Decode site:apple.com 时有很多点击和示例代码。您可以使用 filetype:c 进一步完善它。
  • @jww,感谢您的帮助,我查看了模板常量,但我想知道如何获取我希望提取的每个字段的模板。好吧,我想我必须在调用函数之前弄清楚。

标签: c macos security openssl asn.1


【解决方案1】:

现在 GitHub 上有几个 sn-ps 显示如何调用 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);

【讨论】:

  • 我可以解析数据的子序列吗?例如,如果数据包含整数,我可以只读取这个整数(例如,第一个整数)吗?
  • @gaussblurinc 这不是一个非常优雅的解决方案,但您可以从第一次解码中获取输出并将其传递给第二次解码。第二次解码可以让您的自定义模板解析该整数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多