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

StackOverflow https://stackoverflow.com/questions/2344217

  •  23-09-2019
  •  | 
  •  

Вопрос

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

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

Нет правильного решения

Другие советы

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

Однако есть способ обеспечить дополнительные поля еще до того, как они будут известны. Это использовать маркер расширения ("..."). Допустим, мы разрабатываем различные версии спецификации 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 to 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.

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

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

Тем не менее, более распространенные декодеры отклонят любой вход, который не соответствует синтаксису ASN.1, он должен декодировать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top