OpenSSL ASN.1 API是否支持可扩展类型?

时间:2017-10-27 14:17:56

标签: c openssl asn.1

我正在尝试使用OpenSSL ASN.1 API来实现我自己的自定义类型。我期望将来扩展这些类型,ASN.1标准本身通过可扩展类型的概念支持这一点(有关我想要的概述,请参阅here)。但是,我无法弄清楚OpenSSL ASN.1 API是否支持这个概念,如果支持,如何实现它。我使用OpenSSL提供的宏定义了以下结构:

typedef struct _TEST_STRUCT_V1 {
    ASN1_INTEGER* Field1;
} TEST_STRUCT_V1;

typedef struct _TEST_STRUCT_V2 {
    ASN1_INTEGER* Field1;
    ASN1_INTEGER* Field2;
} TEST_STRUCT_V2;

ASN1_SEQUENCE(TEST_STRUCT_V1) = {
    ASN1_SIMPLE(TEST_STRUCT_V1, Field1, ASN1_INTEGER),
} ASN1_SEQUENCE_END(TEST_STRUCT_V1);

IMPLEMENT_ASN1_FUNCTIONS(TEST_STRUCT_V1);

ASN1_SEQUENCE(TEST_STRUCT_V2) = {
    ASN1_SIMPLE(TEST_STRUCT_V2, Field1, ASN1_INTEGER),
    ASN1_SIMPLE(TEST_STRUCT_V2, Field2, ASN1_INTEGER),
} ASN1_SEQUENCE_END(TEST_STRUCT_V2);

IMPLEMENT_ASN1_FUNCTIONS(TEST_STRUCT_V2);

这些宏生成编码和解码功能。但是,这两个函数对都不适用于结构的其他版本。

也许我正在咆哮错误的树?我只是尝试使用OpenSSL的ASN.1实现,因为我已经在使用该库进行加密,但是可能有一个合适的ASN.1编译器可以实现吗?

1 个答案:

答案 0 :(得分:1)

路,

你可能会对实际的ASN.1编译器有更好的运气 - 有几种可以商用,但Lev Walkin's free ASN.1 Compiler可能符合您的需求。

我对OpenSSL不太熟悉,但快速浏览asn1t.h source(以及其他)并不表示内置支持声明可扩展序列。你可能比我看起来更有动力,但我承认我不会惊讶地发现他们没有包括它。可扩展性可能是一个难以解决的问题,特别是如果您依赖预处理器宏来生成代码。

在任何情况下,依赖OpenSSL代码可能会在将来导致问题:当API或代码发生变化时,您将被迫手动更新所有代码以匹配。代码生成器(可能)可以更好地维护API(和ABI)兼容性,同时允许更灵活的代码生成和语言选择。