2

给定一个序列对象,如何遍历其中的对象?我试过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 的工作方式可能是一种危险的幼稚观点。

4

0 回答 0