ASN.1编解码:asn1cenber和unber

Posted rtoax

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASN.1编解码:asn1cenber和unber相关的知识,希望对你有一定的参考价值。

ASN.1编解码:asn1c、enber和unber


荣涛
2021年8月24日


相关:
ASN.1编解码:asn1c的版本分析-诺基亚

1. 编译安装

见之前的文档。

2. asn1c指令

asn1c会安装三个可执行文件asn1cunberenber

  • asn1c:the ASN.1 Compiler,用ASN.1文件生成C语言文件;
  • unber:the ASN.1 BER Decoder,将 ber 二进制文件转化为特定的XML文件;
  • enber:Convert the unber XML output back into BER,与unber呈逆操作;

2.1. asn1c

此处就不做过多解释了,详情请见之前的文档。

2.2. unber

解码以十六进制形式指定的给定标记/长度序列:

unber  -t "bf 20"

使用双空间解码 DER 文件(就是缩进空格数):

unber  -i 2  filename.der

解码从标准输入中取出的二进制流:

cat filename.der | unber -

解码二进制流并将其编码回相同的流(参见 enber(1):)

cat filename.der | unber -p - | enber - > filename.ber

2.2.1. XML 格式

一个 XML 解析出来的 例子为:

<I O="0" T="[UNIVERSAL 16]" TL="2" V="Indefinite" A="SEQUENCE">
    <P O="2" T="[UNIVERSAL 19]" TL="2" V="2" A="PrintableString">US</P>
     <C O="6" T="[UNIVERSAL 16]" TL="2" V="6" A="SEQUENCE">
       <P O="8" T="[UNIVERSAL 2]" TL="2" V="4" A="INTEGER" F>832970823</P>
     </C O="14" T="[UNIVERSAL 16]" A="SEQUENCE" L="8">
</I O="14" T="[UNIVERSAL 0]" TL="2" L="16">

XML 通用的格式如下:

<tform O="off" T="tag" TL="t_len" V="{Indefinite|v_len}" [A="type"] [F]>

上面的格式中:

  • tform 在线面数据类型中的格式化编码
    • 原始 (“P”)
    • 结构体 (“C”)
    • 未定义长度的结构体 (“I”)
  • off 该结构在数据流中的偏移
  • tag 人类能读懂的tag class和值
  • t_len The length of the TL (BER Tag and Length) encoding.
  • v_len The length of the value (V, encoded by the L), may be “Indefinite”.
  • type Likely name of the underlying ASN.1 type (for UNIVERSAL tags).
  • [F] Indicates that the value was reformatted (pretty-printed). This will never appear in the output produced using the -p command line option.

在发布的源代码中,可以进入asn1c-0.9.28/examples/sample.source.PKIX1目录进行测试:

$ cat sample-Certificate-1.der | unber - | more
<C O="0" T="[UNIVERSAL 16]" TL="4" V="1124" A="SEQUENCE">
    <C O="4" T="[UNIVERSAL 16]" TL="4" V="844" A="SEQUENCE">
        <C O="8" T="[0]" TL="2" V="3">
            <P O="10" T="[UNIVERSAL 2]" TL="2" V="1" A="INTEGER" F>2</P>
        </C O="13" T="[0]" L="5">
        <P O="13" T="[UNIVERSAL 2]" TL="2" V="16" A="INTEGER">&#x44;&#xbe;&#x0c;&#x8b;&#x50;&#x00;&#x24;&#xb4;&#x11
;&#xd3;&#x36;&#x30;&#x4b;&#xc0;&#x33;&#x77;</P>
        <C O="31" T="[UNIVERSAL 16]" TL="2" V="13" A="SEQUENCE">
            <P O="33" T="[UNIVERSAL 6]" TL="2" V="9" A="OBJECT IDENTIFIER" F>1.2.840.113549.1.1.5</P>
            <P O="44" T="[UNIVERSAL 5]" TL="2" V="0" A="NULL"></P>
        </C O="46" T="[UNIVERSAL 16]" A="SEQUENCE" L="15">
[...此处省略一万个字]

2.3. enber

将 XML 文件再转化为 ber格式文件。

unber -p filename.ber | enber - > reconstructed.ber

还是用上面的里子,进入asn1c-0.9.28/examples/sample.source.PKIX1目录进行测试:

unber -p sample-Certificate-1.der | enber - > output.ber

对上面的输出文件进行 unber 解析,可以达到与 unber 小节同样的结果:

$ cat output.ber | unber - | more
<C O="0" T="[UNIVERSAL 16]" TL="4" V="1124" A="SEQUENCE">
    <C O="4" T="[UNIVERSAL 16]" TL="4" V="844" A="SEQUENCE">
        <C O="8" T="[0]" TL="2" V="3">
            <P O="10" T="[UNIVERSAL 2]" TL="2" V="1" A="INTEGER" F>2</P>
        </C O="13" T="[0]" L="5">
        <P O="13" T="[UNIVERSAL 2]" TL="2" V="16" A="INTEGER">&#x44;&#xbe;&#x0c;&#x8b;&#x50;&#x00;&#x24;&#xb4;&#x11
;&#xd3;&#x36;&#x30;&#x4b;&#xc0;&#x33;&#x77;</P>
        <C O="31" T="[UNIVERSAL 16]" TL="2" V="13" A="SEQUENCE">
            <P O="33" T="[UNIVERSAL 6]" TL="2" V="9" A="OBJECT IDENTIFIER" F>1.2.840.113549.1.1.5</P>
            <P O="44" T="[UNIVERSAL 5]" TL="2" V="0" A="NULL"></P>
        </C O="46" T="[UNIVERSAL 16]" A="SEQUENCE" L="15">
[...此处省略一万个字]

不能说相似吧,只能说一模一样。

4. 参考链接

  1. https://github.com/nokia/asn1c

以上是关于ASN.1编解码:asn1cenber和unber的主要内容,如果未能解决你的问题,请参考以下文章

ASN.1编解码:asn1c-ORAN-E2AP编解码示例

ASN.1解码

ASN.1编解码与编程

ASN.1编解码:asn1c的基本使用

ASN.1编解码:asn1c-ORAN-E2AP

ASN.1编解码:ORAN-E2AP分析