asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值

asn1c doesn't extract DEFAULT value of an OCTET STRING from the asn.1 module

本文关键字:八位 提取 字节 字符串 默认值 模块 asn asn1c      更新时间:2023-10-16

我想解析SIMAlliance eUICC Profile Package ASN.1模块并将其编码为DER。keyAccess参数是一个值为'00'HDEFAULTOCTET STRING。ASN1C 编译器无法检测/提取默认值并将其分配给编译器生成的相应函数。如果我将OCTET STRING更改为模块中的IA5String之类的其他内容,则可以正常工作,但不应更改标准。另外,该值应为八位字节字符串。

我已经深入研究了 asn1c 的代码,但我无法弄清楚它提取并将OCTET STRINGDEAFAULT值分配给编译期间生成的函数的机制/过程。这方面的任何帮助都是有意义的,非常感谢 - 这对我来说是救命稻草。

SIMAlliance eUICC 配置文件包 ASN.1 模块可以在这里找到,asn1c 的存储库在这里。

keyAccess 参数是一个默认值为 '00'H 的八进制字符串。 ASN1c 编译器无法检测/提取默认值并将其分配给编译器生成的相应函数。如果我将八进制字符串更改为模块中的其他内容,例如 IA5String ,它可以正常工作

这听起来像是缺少功能或asn1c中的错误。

我已经深入研究了 asn1c 的代码,但我无法弄清楚它提取八位字节字符串的 DEAFAULT 值并将其分配给它在编译期间生成的函数的机制/过程。这方面的任何帮助都是有意义的,非常感谢 - 这对我来说是救命稻草。

生成asn_DFL_4_cmp_1asn_DFL_4_set_1等函数的代码位于 libasn1compiler/asn1c_C.c:2329-2487 中的try_inline_default()函数中

static int
try_inline_default(arg_t *arg, asn1p_expr_t *expr, int out) {
int save_target = arg->target->target;
asn1p_expr_type_e etype = expr_get_type(arg, expr);
int fits_long = 0;
switch(etype) {
case ASN_BASIC_BOOLEAN:
fits_long = 1;
/* Fall through */
case ASN_BASIC_INTEGER:
case ASN_BASIC_ENUMERATED:

libasn1compiler/asn1c_C.c:2311-232 中也有emit_default_string_value()函数

static void 
emit_default_string_value(arg_t *arg, asn1p_value_t *v) {
OUT("static const uint8_t defv[] = ");