2016-10-27 8 views
2

. NET. System.DirectoryServices.Protocols assembly указывает легкий ASN.1 BER-кодировщик, но документация невелика: BerConverter.Могу ли я указать тег приложения или контекста с C# BerConverter.Encode()?

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

  • INTEGER ы могут быть закодированы с символами формата i или e
  • OCTET STRING ы могут быть закодированы с o характером
  • SEQUENCE ы могут быть закодированы с { и }
  • т.д.

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

Однако BerConverter не кажется, есть способ указать приложение или конкретный контекст тег, который часто используется для удаления двусмысленности в 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 эта возможность?

+1

Вы может попытаться использовать декомпилятор (например, ILSpy) и посмотреть в коде BerConverter, чтобы узнать, что он делает. –

+0

@bosonix Спасибо за комментарий. Я не знаю, почему я не думал декомпилировать. Я использовал JetBrains dotPeek для декомпиляции 'BerConverter.Encode()', и я узнал, что он вызывает 'ber_printf()' под обложками. Он имеет лучшую документацию. См. Ответ ниже. – petrsnd

ответ

1

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

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

Характер: 'т'

Описание:

Tag. Следующим аргументом является 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