Могу ли я указать тег приложения или контекста с помощью 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