ASN.1 compiler asn1c
ASN.1概述
ASN.1抽象语法标记(Abstract Syntax Notation One)是一种 ISO/ITU-T 标准,描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行及这些数据的具体指代,也不用去管到底是什么样的应用程序。–来自百度百科 ASN.1_百度百科 (baidu.com)
ASN.1抽象语法描述信息的示例如下:
TestModule DEFINITIONS ::= BEGIN -- Module parameters preambleCircle ::= SEQUENCE { -- Definition of Circle typeposition-x INTEGER, -- Integer positionposition-y INTEGER, -- Position along Y-axisradius INTEGER (0..MAX) -- Positive radius} -- End of Circle type
END -- End of TestModule
ASN.1 广泛应用于5G协议语法定义,以及部分通用协议和工控协议语法定义。
编码
除了描述数据的抽象语法,ASN.1还定义了一些方法去编码数据,各种编码方式在空间,互操作性,效率方面的能力不同,协议设计者可以选择文本,字节或者位的编码规则。
asn1c
asn1c是一个开源的ASN.1编译器,它能把ASN.1的描述文件转化成c++兼容的c源代码,该代码可用于将本机C语言结构序列化为紧凑且明确的基于 BER/OER/PER/XER 的数据文件,并能将这些文件反序列化回来。BER/OER/PER/XER是编码方式。这是官网地址:Lev Walkin’s home site (lionet.info)
从官网下载linux源码,编译之后能得到一个可执行程序asn1c,这就是ASN.1的编译器。编译器的输入就是使用ASN.1编写的数据文件,称为ASN.1模块,如果多个模块之间有依赖,编译时必须同时指定所有模块。编译后的输出主要分为3部分:
- 由ASN.1模块定义的数据类型转化的对应的.c .h文件
- 通用编码解码文件(BER/OER/PER/XER)和一些帮助程序
- 一个主程序可以负责PDU(协议数据单元)和各种编码之间的转化
举例
1、这是LDAP协议中使用ASN.1描述 LDAPMessage 消息的部分内容
LDAPMessage ::= SEQUENCE {messageID MessageID,protocolOp CHOICE {bindRequest BindRequest,bindResponse BindResponse,...,intermediateResponse IntermediateResponse },controls [0] Controls OPTIONAL }
2、使用编译器转化成C语言类型
/* LDAPMessage */
typedef struct LDAPMessage {MessageID_t messageID;struct LDAPMessage__protocolOp {LDAPMessage__protocolOp_PR present;union LDAPMessage__protocolOp_u {BindRequest_t bindRequest;BindResponse_t bindResponse;...IntermediateResponse_t intermediateResponse;} choice;asn_struct_ctx_t _asn_ctx;} protocolOp;struct Controls *controls /* OPTIONAL */;asn_struct_ctx_t _asn_ctx;
} LDAPMessage_t;
3、组装一条 LDAPMessage 消息,组装的参数如下:
messageID: 1
protocolOp: BindRequest
BindRequest中version: 3
BindRequest中name: uid=a,dc=com
BindRequest中authentication: password
然后使用BER编码得到字节序:
0000000: 3020 0201 0160 1b02 0103 040c 7569 643d 0 ...`......uid=
0000010: 612c 6463 3d63 6f6d 8008 7061 7373 776f a,dc=com..passwo
0000020: 7264 rd
4、通过网络传输序列化后的内容到对端,对端采用BER解码器以及已知协议消息结构,反序列化得到xml表示的数据内容,也可以反序列化成其他格式:
<LDAPMessage><messageID>1</messageID><protocolOp><bindRequest><version>3</version><name>75 69 64 3D 61 2C 64 63 3D 63 6F 6D</name><authentication><simple>70 61 73 73 77 6F 72 64</simple></authentication></bindRequest></protocolOp>
</LDAPMessage>
总结:如何解析ASN.1相关协议
若要解析使用到ASN.1语法描述和编码的协议,首先其编解码的实现是相同的,也就是针对BER,PER等编码规则的解码逻辑应该是相同的;
另一方面常规的思路下若要解析协议,清楚其结构逆向解码即可,对ASN.1语法描述的协议而言,其ASN.1模块(也就是ASN.1描述文件)不就是现成的协议文档吗,其内容就是现成的协议结构,人可读,但是困难,费时,若用机器阅读并翻译成解码代码,就是现成的解码器。上面的工具也许可用。
纰漏之处,敬请指正,一起学习,天天向上
ASN.1 compiler asn1c相关推荐
- ASN.1 -- 使用asn1c完成ASN encode/decode
asn1c官网:http://lionet.info/asn1c/blog/ asn1c源代码:https://github.com/vlm/asn1c 一. 下载asn1c并编译生成可执行文件(关掉 ...
- ASN.1编解码:asn1c、enber和unber
ASN.1编解码:asn1c.enber和unber 荣涛 2021年8月24日 相关: ASN.1编解码:asn1c的版本分析-诺基亚 1. 编译安装 见之前的文档. 2. asn1c指令 asn1 ...
- ASN.1编解码:asn1c的版本分析-诺基亚
ASN.1编解码:asn1c的版本分析 荣涛 2021年8月24日 前面两个文档,已经对 ASN.1 编码和 asn1c 的使用做出了详细说明,那么如何将 ASN.1编解码与编程 ASN.1编解码:a ...
- ASN.1编解码:asn1c的基本使用
ASN.1编解码:asn1c的基本使用 荣涛 2021年8月23日 上篇主要讲了ASN.1编码<ASN.1编解码与编程> 本文主要介绍 ASN.1 编码的C语言实现,asn1c.ASN.1 ...
- Ubuntu ASN1C实例分析
1 环境准备 实验平台:ubuntu16.04 2 ASN.1介绍 ASN.1是定义抽象数据类型规格形式的标准.是用于描述数据的表示.编码.传输.解码的灵活的记法.它提供了一套正式.无歧义和精确的规则 ...
- Scapy3.0 Documentation ( Advanced usage )
说明:写到这里来,只是因为原文链接打开太慢了,至于翻译什么的就不误导大家了,还是原文好看 原文链接:http://phaethon.github.io/scapy/api/advanced_usage ...
- [Erlang] XML处理方案
转载自http://www.cnblogs.com/me-sa/archive/2012/07/20/erlang_xml.html XML以及相关的XSLT,XPath,XSD工具在数据层面为我们提 ...
- asn.1 java_【密码工程】asn1——asn1c、javaAsn1Comilper、protobuf的使用示例
1 使用asn1c实现编码 参考网址:http://lengxuezhixuan.blog.chinaunix.net/uid-28765492-id-3765759.html PS:这个网址就是根据 ...
- ASN.1编解码:asn1c-ORAN-E2AP编解码示例
ASN.1编解码:asn1c-ORAN-E2AP编解码示例 荣涛 2021年9月2日 整体代码:https://gitee.com/rtoax/test/tree/master/ASN.1/asn1c ...
最新文章
- oracle rpad mysql_Oracle生成不重复票号与LPAD,RPAD与NEXTVAL函数解析
- 全球及中国食品行业发展潜力与投资机会评估报告2022版
- C语言试题三十一之判断字符串是否为回文?若是则函数返回1,主函数中输出yes,否则返回0,主函数中输出no。回文是指顺读和倒读都是一样的字符串。
- Android官方开发文档Training系列课程中文版:管理系统UI之变暗系统条
- 12.1 LNMP架构介绍 12.2 MySQL安装 12.3/12.4 PHP安装 12.5 Nginx介绍
- Windows创建自动化任务
- java异步编程的面试_去年去阿里面试,被问到java 多线程,我是这样手撕面试官的...
- 生成BDS卫星1和卫星2的B1C信号的数据分量主码、 导频分量主码和子码
- wordpress建站我们如何选择虚拟主机和VPS服务器呢?
- 用命令如何返回上级目录
- Mac软件推荐:Soulver原来这么好用
- 商业智能BI与业务管理决策思维之三:业务质量分析
- 布兰迪斯大学计算机科学专业,布兰迪斯大学计算机科学专业
- eslint plugins与extends的区别
- 浅说ksm的适用范围
- 【系统分析师之路】2009年上系统分析师综合知识真题
- eclipse中tomcat简单配置
- PyTorch中文文档阅读笔记-day1
- 【打印技术01】获取及设置系统默认打印机
- Android Studio启用新代号,新版本Arctic Fox(白狐)重点新特性一览!