【问题标题】:asn1c doesn't extract DEFAULT value of an OCTET STRING from the asn.1 moduleasn1c 不会从 asn.1 模块中提取 OCTET STRING 的 DEFAULT 值
【发布时间】:2020-05-28 23:11:05
【问题描述】:

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

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

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

【问题讨论】:

标签: c++ c gsm asn.1 der


【解决方案1】:

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

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

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

产生asn_DFL_4_cmp_1asn_DFL_4_set_1等函数的代码在try_inline_default()函数中,在libasn1compiler/asn1c_C.c:2329-2487

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[] = ");

【讨论】:

  • 嗨@Vasil-Velichkov!感谢您花费的时间和您的回复。我的值是'00'H,但头文件中显示的值是/* DEFAULT '00'HH */;。并且函数asn_DFL_4_cmp_1asn_DFL_4_set_1 不会在相应的C 文件中生成——它只是说/* No default value */。请您帮我弄清楚代码应该如何以asn_DFL_4_cmp_1asn_DFL_4_set_1OCTET STRING 生成的方式工作?
猜你喜欢
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-10
  • 1970-01-01
  • 2016-03-10
  • 2020-02-09
相关资源
最近更新 更多