我正在尝试使用 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 代码可能会在将来引起问题:当 API 或代码发生更改时,您将被迫手动更新所有代码以匹配。代码生成器(可能)可以更好地维护 API(和 ABI)兼容性,同时允许更灵活的代码生成和语言选择。
关于c - OpenSSL ASN.1 API 是否支持可扩展类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46977200/