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

标签 c macos security openssl asn.1

我想在 OS-X 10.11 下解析 asn1 格式。

不幸的是,Apple 不再将 openssl 作为其 SDK 的一部分。相反,建议我在以下 header 中公开使用一个内部包:

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

关于c - 使用Xcode安全框架解析asn1格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34899657/

相关文章:

c - 我想知道,为什么执行后得到 "Attempt to execute non-instruction at 0x00400138"?

C读取conf文件

c - FFmpeg av_hwdevice_ctx_create 返回 ENOMEM

macos - Ansible-galaxy 抛出 ImportError : No module named yaml

macos - Pycharm docker 远程 python 解释器

php - PHP 中的定时 session 变量?我正试图将登录失败的人拒之门外

c - 禁用 Code::Blocks 中的编译和链接?

ruby-on-rails - 在 Mac 上安装 do_postgres

javascript - 使用外部 URL 获取 iframe 的高度

java - 在服务器之间共享 REST token