Необъявленные теги на входе декодера ASN.1 BER

У меня есть спецификация синтаксиса ASN.1, которую я хочу изменить, добавив некоторые поля. Если я создам закодированную строку, используя BER с новыми полями, а затем попытаюсь декодировать эту строку с помощью декодера, который не знает об этих дополнительных полях, каким должен быть результат? Будет ли декодирование неудачным, потому что есть поля, которые декодер не распознает? Будет ли декодер декодировать только те поля, которые он может распознать, и полностью игнорировать те, которые он не распознает? Является ли это полностью проблемой реализации декодера, поэтому возможен любой результат, в зависимости от того, как реализован декодер?

Прямо сейчас я использую компилятор/декодер ASN.1 с открытым исходным кодом, и он, кажется, полностью терпит неудачу, но я не уверен, связано ли это с реализацией или потому, что правила ASN.1 диктуют такой результат?


person Larry    schedule 26.02.2010    source источник


Ответы (2)


Это, безусловно, не зависит от реализации. То есть, если разные реализации обрабатывают это по-разному, одна из них делает это неправильно. Если вы перейдете к декодированию неизвестных полей с помощью декодера, который не ожидает неизвестных полей, декодирование должно завершиться ошибкой. Он не будет пропускать неизвестные поля.

Однако есть способ предусмотреть дополнительные поля еще до того, как они станут известны. Он заключается в использовании маркера расширения ("..."). Допустим, мы разрабатываем различные версии спецификации ASN.1. Назовем их V1, V2, V3 и т. д. V1 — это исходная спецификация, но мы понимаем, что в то время, когда мы проектируем V1, нам, вероятно, придется изменить ее в какой-то момент. Чтобы разрешить это, вместо чего-то вроде

Z ::= SEQUENCE { a INTEGER,
                 b OCTET STRING,
                 c Message1
}

мы бы объявили Z расширяемым вот так

Z ::= SEQUENCE { a INTEGER,
                 b OCTET STRING,
                 c Message1,
                 ...
}

Маркер расширения говорит, что после c могут быть другие поля, которые пока неизвестны. Декодер должен рассматривать сообщения, содержащие такие поля, если они следуют за c, как допустимые. Декодер не сможет их декодировать, поскольку он не знает, какими они должны быть, но знает, что они допустимы.

Допустим, мы обновляем V1 до V2, вставляя два новых поля примерно так:

Z ::= SEQUENCE { a INTEGER,            -- V1
                 b OCTET STRING,       -- V1
                 c Message1,           -- V1
                 ...,
             [[  d PrintableString,    -- V2
                 e BOOLEAN          ]] -- V2
}

В этом случае версия V1 может взаимодействовать с версией V2. Кодировщик V1 не будет включать d или e, а кодировщик V2 будет включать их. С точки зрения декодера, декодер V1 будет принимать (но не декодировать) d и e, тогда как декодер V2 будет декодировать d и e, если они будут найдены. Таким образом, декодер V1 будет принимать кодировки как V1, так и V2, игнорируя d и e всякий раз, когда они будут найдены; декодер V2 также будет принимать кодировку как V1, так и V2, отметив, что кодировка V1 не будет включать d или e, но остается действительной.

Мы можем продолжить это через дополнительные версии, например,

Z ::= SEQUENCE { a INTEGER,            -- V1
                 b OCTET STRING,       -- V1
                 c Message1,           -- V1
                 ...,
             [[  d PrintableString,    -- V2
                 e BOOLEAN         ]], -- V2
             [[  f PrintableString,    -- V3
                 g ExtensionMessage]]  -- V3
}

где V1, V2 и V3 могут взаимодействовать.

Обратите внимание, однако, что, поскольку мы имеем дело с ПОСЛЕДОВАТЕЛЬНОСТЬЮ, порядок должен быть сохранен. У вас не может быть ни e без d, ни g без d, e и f.

Таким образом, можно сделать вывод, что если ваше определение типа включает маркеры расширения, вы можете добавлять новые поля, а если нет, то не можете.

person Conrad Sigona    schedule 01.03.2010

Все будет зависеть от спецификации и реализации. Короче - сказать нечего. и это до реализации. В некоторых спецификациях для любого данного протокола/формата, использующего asn.1, будет явно указано, что неизвестные элементы следует игнорировать, и в этом случае декодирование не должно завершаться ошибкой.

Однако чаще всего декодеры отвергают любые входные данные, которые строго не соответствуют синтаксису ASN.1, который предполагается декодировать.

person nos    schedule 26.02.2010