Могу ли я указать тег приложения или контекста с помощью C# BerConverter.Encode()?

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

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

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

Я действительно хотел бы использовать этот простой конвертер, поэтому мне не нужно брать на себя дополнительную зависимость. Получение зависимости нежелательно, потому что 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 ответ

Решение

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

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

Персонаж: 'т'

Описание:

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

Другие вопросы по тегам