使用OpenSSL Libcrypto遍历ASN.1序列

时间:2019-07-16 23:41:43

标签: c openssl asn.1 der libcrypto

给出一个序列对象,一个人如何遍历它内部的对象?我尝试过ASN1_TYPE_unpack_sequence,但不知道如何解释它返回的对象。

这是一个玩具示例,其中包含空八位字节串的序列的DER编码。

#include <stdio.h>
#include <openssl/asn1.h>

int main()
{
    unsigned char der_bytes[] = {48, 2, 4, 0};

    //Parse DER

    ASN1_TYPE *sequence = 0;
    const unsigned char * der_bytes_iterator = der_bytes;
    sequence = d2i_ASN1_TYPE(sequence, &der_bytes_iterator, sizeof der_bytes);

    //Make sure it was parsed properly

    if (der_bytes_iterator != der_bytes.data + sizeof der_bytes)
    {
        puts("Failed to consume DER string\n");
        return 1;
    }

    if (sequence->type != V_ASN1_SEQUENCE)
    {
        printf("Expected type tag %d, got %d.\n", V_ASN1_SEQUENCE, sequence->type);
        return 2;
    }

    //Try to iterate using ASN1_TYPE_unpack_sequece

    const ASN1_ITEM *item = ASN1_ITEM_rptr(ASN1_ANY);
    void * unpack_result = ASN1_TYPE_unpack_sequence(item, sequence);

    //Now what?
    return 0;
}

有趣的是,{48, 0}编码为空序列,而{4, 0}编码为空八位字节串。因此,似乎如果我只能解析序列的标头以了解标头本身有多长时间以及有多少“有效载荷”,我可以跳过标头并保持逐一解析对象,直到负载用尽,不需要额外的上下文。尽管这对于DER的工作方式可能是危险的幼稚视图。

0 个答案:

没有答案