asn1 c не извлекает значение DEFAULT STRING OCTET из модуля asn.1 - PullRequest
0 голосов
/ 13 февраля 2020

Я хотел бы проанализировать SIMAlliance eUI CC Модуль профиля пакета ASN.1 и кодировать его в DER. Параметр keyAccess представляет собой OCTET STRING со значением DEFAULT, равным '00'H. Компилятор asn1 c не может обнаружить / извлечь значение по умолчанию и назначить его соответствующей функции, созданной компилятором. Это прекрасно работает, если я заменю OCTET STRING на что-то другое, например IA5String в модуле, но стандарт не должен быть изменен. Плюс значение должно быть строкой октета.

Я углубился в код asn1 c, но не смог выяснить механизм / процедуру, которую он извлекает и присваивает DEAFAULT значение OCTET STRING для функций, которые он производит во время компиляции. Любая помощь по этому вопросу будет иметь большое значение и ценится - это спасение для меня.

SIMAlliance eUI CC пакет профиля Модуль ASN.1 можно найти здесь и asn1 c Хранилище здесь .

1 Ответ

1 голос
/ 13 февраля 2020

Параметр keyAccess - это строка OCTET со значением по умолчанию '00'H. Компилятор asn1 c не может обнаружить / извлечь значение по умолчанию и назначить его соответствующей функции, созданной компилятором. Это прекрасно работает, если я заменю строку OCTET на что-то еще, например IA5String в модуле

Это звучит как отсутствующая функция или ошибка в asn1c.

I Я углубился в код asn1 c, но я не смог выяснить механизм / процедуру, которую он извлекает, и присваивает значение DEAFAULT STRING OCTET функциям, которые он генерирует во время компиляции. Любая помощь по этому вопросу будет иметь большое значение и ценится для меня - это спасение для меня.

Код, который производит такие функции, как asn_DFL_4_cmp_1 и asn_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:

Также есть emit_default_string_value() функция в libasn1compiler / asn1c_ C. c: 2311- 232

static void 
emit_default_string_value(arg_t *arg, asn1p_value_t *v) {

    OUT("static const uint8_t defv[] = ");

...