Интерпретация кодирования неопределенной длины ASN.1 с несколькими инкапсулированными строками октетов

У меня есть такая структура BER...

$ openssl asn1parse -inform der -in test.der -i -dump

 ????:d=4  hl=2 l=inf  cons:     cont [ 0 ]
 ????:d=5  hl=3 l= 240 prim:      OCTET STRING
      0000 - AABBCCDD
 ????:d=5  hl=2 l=   8 prim:      OCTET STRING
      0000 - EEFF
 ????:d=5  hl=2 l=   0 prim:      EOC

...или в стиле der2ascii...

[0] `80`
  OCTET_STRING { `AABBCCDD` }
  OCTET_STRING { `EEFF` }
`0000`

Что я знаю: кодирование неопределенной длины должно содержать сконструированный тип, потому что примитивные типы могут вносить неоднозначность, например. при содержании 0x0000. Что я хочу знать: как декодер должен вести себя при анализе этой структуры BER? Включены ли в кодировку байты заголовка обеих цепочек октетов? Если да, то как кодируются байтовые данные неопределенной длины? Как приложение интерпретирует значение поля TLV с тегом [0], когда вторая СТРОКА ОКТЕТОВ, например, ЦЕЛОЕ ЧИСЛО?

Я задаю этот вопрос, потому что в стандарте CMS поле определяется как одна ОКТЕТНАЯ СТРОКА, но в большинстве кодировок BER я всегда вижу две из них. Это только из-за кодирования неопределенной длины? Я что-то пропустил?

Из МСЭ-Т X.690:

8.1.4 Октеты содержимого

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

ПРИМЕЧАНИЕ. – Октеты содержимого зависят от типа значения данных; последующие пункты следуют той же последовательности, что и определение типов в ASN.1.

Означает ли это, что я могу поместить любой сконструированный тип, а приложение должно интерпретировать только часть значения сконструированной структуры TLV?


person duesee    schedule 03.08.2017    source источник


Ответы (1)


Когда вы кодируете примитивную цепочку октетов в режиме неопределенной длины, кодировщик должен:

  • разбить значение на части меньших цепочек октетов
  • кодировать каждый фрагмент в режиме определенной длины, чтобы у каждого был свой TLV (с длиной!)
  • вся последовательность закодированных примитивных СТРООК ОКТЕТОВ определенной длины должна быть обрамлена одним «контейнером» закодированной неопределенной длины сконструированной СТРОКИ ОКТЕТОВ, имеющим свой собственный TLV (без длины, но с сигнальным индикатором конца октетов)

На другом конце декодер извлекает часть V из внутренних блоков OCTET STRING определенной длины (отбрасывая их заголовки TL). Затем объединяет/потребляет V вместе в порядке прибытия, отбрасывая часть TL внешнего кадра.

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

Размер фрагмента выбирается кодировщиком/приложением на основе доступности данных, ситуации с памятью и, возможно, оценки возможностей буферизации декодера. Я думаю, что это упоминается где-то в документах X.280/X.680.

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

Надеюсь, это должно объяснить, почему вы можете видеть несколько (в зависимости от размера фрагмента) СТРООК ОКТЕТОВ в закодированном потоке BER/CER неопределенной длины, где ожидается только одна СТРОКА ОКТЕТОВ.

DER запрещает кодирование неопределенной длины на том основании, что сериализованное представление одних и тех же данных может измениться при повторном кодировании (из-за потенциального изменения размера фрагмента).

person Ilya Etingof    schedule 03.08.2017
comment
Итак, когда фрагменты являются процессами, их заголовки должны быть отброшены, верно? Это также определено, если куски имеют разные типы, например, например. ЦЕЛОЕ? Определен ли где-нибудь процесс генерации чанков? PS: я перефразирую свой вопрос, чтобы использовать BER. Стандарт, на который я смотрю, в основном DER, но иногда допускает конструкции BER... - person duesee; 03.08.2017
comment
Обновил ответ. - person Ilya Etingof; 03.08.2017