大家好,欢迎来到IT知识分享网。
ASN.1编解码:asn1c、enber和unber
荣涛
2021年8月24日
1. 编译安装
见之前的文档。
2. asn1c指令
asn1c会安装三个可执行文件asn1c
,unber
,enber
:
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></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">D¾‹P�$´ ;Ó60KÀ3w</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..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">D¾‹P�$´ ;Ó60KÀ3w</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..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. 参考链接
- https://github.com/nokia/asn1c
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/143527.html