Могу ли я указать тег Application или Context-Specific с помощью C# BerConverter.Encode()?

В сборке .NET System.DirectoryServices.Protocols указан облегченный кодировщик ASN.1 BER, но документация невелика: BerConverter.

Вы вызываете его, указывая строку формата и список объектов для кодирования.

  • INTEGER могут быть закодированы символами формата i или e
  • OCTET STRINGs можно закодировать символом o
  • SEQUENCE можно закодировать с помощью { и }
  • и т.п.

Я бы очень хотел использовать этот простой конвертер, чтобы мне не приходилось брать на себя дополнительную зависимость. Принятие зависимости нежелательно, потому что C# можно вызывать из Powershell, и здорово распространять скрипт, который делает что-то интересное с C#, если для этого не требуется сборка, которая не включена в .NET.

Однако у BerConverter, похоже, нет способа указать тег Application или Context-Specific, которые часто используются для устранения неоднозначности в ASN.1, например, когда компоненты сконструированного типа помечены как OPTIONAL

Итак, я могу закодировать следующее:

BerConverter.Encode("{i{i}}", 1, 2);

Который дает:

30 84 00 00 00 0c 02 01 01 30 84 00 00 00 03 02 01 02

Но если эта вторая последовательность должна быть [Application 1] или 61... Я не уверен, что нужно указать в строке формата, чтобы передать это в кодировке.

Есть ли у BerConverter такая возможность?


person petrsnd    schedule 27.10.2016    source источник
comment
Вы можете попробовать использовать декомпилятор (например, ILSpy) и посмотреть код BerConverter, чтобы увидеть, что он делает.   -  person Andrei Bozantan    schedule 28.10.2016
comment
@bosonix Спасибо за комментарий. Не знаю, почему я не догадался декомпилировать. Я использовал JetBrains dotPeek для декомпиляции BerConverter.Encode() и обнаружил, что он вызывает ber_printf() под прикрытием. Документация у него лучше. Смотрите ответ ниже.   -  person petrsnd    schedule 28.10.2016


Ответы (1)


Я не уверен, почему я не сделал это сразу, но я использовал декомпилятор, чтобы посмотреть на код. Я обнаружил, что BerConverter.Encode() основан на ber_printf(), который имеет гораздо лучшую документацию.

Из документов:

Символ: 't'

Описание:

Отметить. Следующий аргумент — это ber_tag_t, указывающий тег для переопределения следующего элемента, записанного в BerElement. Это работает для вызовов.

Итак, я смог изменить свой код на:

BerConverter.Encode("{it{i}}", 1, 0x61, 2)

Что позволяет мне установить значение тега на 0x61, и код выдает:

30 84 00 00 00 0c 02 01 01 61 84 00 00 00 03 02 01 02

person petrsnd    schedule 28.10.2016