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

Does the OpenSSL ASN.1 API support extensible types?

我正在尝试使用 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 编译器才是正确的选择?

卢克,

使用实际的 ASN.1 编译器可能会好运 — 市面上有多种编译器,但 Lev Walkin's free ASN.1 Compiler 可能满足您的需求。

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

无论如何,依赖 OpenSSL 代码可能会在将来引起问题:当 APIs 或代码更改时,您将被迫手动更新所有代码以匹配。代码生成器(可能)会更好地维护 API(和 ABI)兼容性,同时允许更灵活的代码生成和语言选择。