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

时间:2016-10-27 22:53:03

标签: c# encoding asn.1 ber

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

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

  • INTEGER可以使用格式字符ie
  • 进行编码
  • OCTET STRING可以使用o字符
  • 进行编码
  • SEQUENCE可以使用{}
  • 进行编码

我真的很想使用这个简单的转换器,所以我不需要承担额外的依赖。承担依赖是不可取的,因为C#可以从Powershell调用,并且分发一个用C#做一些奇特的脚本是很好的,只要它不需要.NET不包含的程序集。

但是,BerConverter似乎没有办法指定Application或Context-Specific标记,这些标记通常用于消除ASN.1中的歧义,例如,当构造类型的组件标记为{{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] ...我不知道在格式字符串中放入什么以在编码中发出它。

BerConverter是否具备此功能?

1 个答案:

答案 0 :(得分: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