我正在尝试使用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编译器可以实现吗?
答案 0 :(得分:1)
路,
你可能会对实际的ASN.1编译器有更好的运气 - 有几种可以商用,但Lev Walkin's free ASN.1 Compiler可能符合您的需求。
我对OpenSSL不太熟悉,但快速浏览asn1t.h source(以及其他)并不表示内置支持声明可扩展序列。你可能比我看起来更有动力,但我承认我不会惊讶地发现他们没有包括它。可扩展性可能是一个难以解决的问题,特别是如果您依赖预处理器宏来生成代码。
在任何情况下,依赖OpenSSL代码可能会在将来导致问题:当API或代码发生变化时,您将被迫手动更新所有代码以匹配。代码生成器(可能)可以更好地维护API(和ABI)兼容性,同时允许更灵活的代码生成和语言选择。