我可以使用 C# BerConverter.Encode() 指定应用程序或特定于上下文的标记吗?

Can I specify an Application or Context-Specific tag with C# BerConverter.Encode()?

.NET 的 System.DirectoryServices.Protocols 程序集指定了一个轻量级的 ASN.1 BER 编码器,但文档不是很好:BerConverter.

您可以通过指定格式字符串和要编码的对象列表来调用它。

我真的很想使用这个简单的转换器,这样我就不必承担额外的依赖性。承担依赖性是不可取的,因为 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 有这个能力吗?

我不确定我为什么不直接这样做,但我使用了反编译器来查看代码。我发现 BerConverter.Encode() 基于 ber_printf(),它有更好的文档。

来自文档:

Character: 't'

Description:

Tag. The next argument is a ber_tag_t that specifies the tag to override the next element written to the BerElement. This works across calls.

因此,我能够将我的代码更改为:

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