给出一个序列对象,一个人如何遍历它内部的对象?我尝试过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的工作方式可能是危险的幼稚视图。