ASN.1 BER格式简介

这段时间在做mms协议解析相关的工作,而mms协议的报文是用asn.1格式编码的,所以了解了一些相关知识。现在把asn.1相关的总结分享一下,如有不当的地方欢迎指正。

参考资料

  1. LDAPv3 Wire Protocol Reference: The ASN.1 Basic Encoding Rules – LDAP.com (一个非常详细的网站,关于LDAP的asn.1表示)
  2. 《asn1 complete》( 一本书)
  3. 《ISO8825》 (官方文档)

结构

asn.1有很多种格式,如BER,CER,PER等,常用的就是BER:Basic Encoding Rulse
对于BER,简单得说就是通过tlv(tag, length, value)三元组进行编码,且tlv三者都支持嵌套结构,也就是说length的表示也可以通过tlv形式编码。

tag

tag 表示的是后续数据的类型。对于tag网上有各种说法,也有称之为type的,类型有几十种。一般来说tag占一字节,但是也有多字节类型。如果是多字节类型可能也要用tlv格式表示,本文仅列出单字节类型。常用类型如下(这一部分很重要,因为通常在报文中见到的都是这些完整字节,如果要仔细了解最好是看二进制编码),且这里列举的tag Number都为0

/*BER encoding macros*/
#define B_UNIVERSAL_PRIMITIVE         0x00  //00 0 0000
#define B_UNIVERSAL_CONSTRUCTED       0x20  //00 1 0000
#define B_APP_PRIMITIVE               0x40  //01 0 0000
#define B_APP_CONSTRUCTED             0x60  //01 1 0000
#define B_CTX_SPECIFIC_PRIMITIVE      0x80  //10 0 0000
#define B_CTX_SPECIFIC_CONSTRUCTED    0xa0  //10 1 0000
#define B_PRIVATE_PRIMITIVE           0xc0  //11 0 0000
#define B_PRIVATE_CONSTRUCTED         0xe0  //11 0 0000

但是tag的一个字节其实是由三部分构成的,分别是class(类),Primitive or Constructed(结构标志)和Tag Number(tag 号)。

布局

Bits87654321
PurposeclassPrimitive or Constructed?Tag Number
  • class 高两位
  • 结构标志 第6位
  • Tag Number 低5位

ClassBit 8Bit 7说明
Universal00通用类型,常见7个,后面跟tag Number表示数据类型
Application01协议类型
Context-specific10上下文相关
Private11自定义,少用

Universal类型常见的7个是:

  1. BOOLEAN
  2. INTEGER
  3. OCTET STRING
  4. NULL
  5. ENUMERATED
  6. SEQUENCE
  7. SET

结构标志

  • 0: 表示Primitive 原生类型,就是上文的1~5类;其他还有UTC-time,REAL,data等也属于原生类型
  • 1: 表示构造类型,就是上文的6-7类;SEQUENCE OF也是,区别于SEQUENCE的是,前者后续数据均为同一类型,而后者可以跟不同类型。在C语言中SEQUENCE OF类似于列表,SEQUENCE类似于结构体

tag number

常用的universal编码如下,Tag Number均指的是后5位,完整tag是包含了全8位的一个字节

数据类型Tag NumberTypical Use完整tag
BOOLEAN0x01Model logical, two-state variable values0x01
INTEGER0x02Model integer variable values0x02
BIT STRING0x03Model binary data of arbitrary length0x03
OCTET STRING0x04Model binary data whose length is a multiple of eight0x04
NULL0x05Indicate effective absence of a sequence element0x05
OBJECT IDENTIFIER0x06Name information objects0x06
REAL0x09Model real variable values0x09
ENUMERATED0x0AModel values of variables with at least three states0x0A
CHARACTER STRING*Models values that are strings of characters from a specified characterset??
----------------------
SEQUENCE0x10表示序列,包含的元素是有序号的0x30
SET0x11表示序列,但是无顺序0x31

如果是协议自定义或者上下文相关的话tag Number就完全不确定了,可以为任意值,表示的含义也各不相同。下面简单举几个例子

tag二进制表示含义
0x6301 1 00011应用,构造,编号3(编号含义每个应用不同)
0xA310 1 00011上下文,构造,编号3
0x8810 0 1000上下文,原生数据,INSTANCE OF/EXTERNAL(tag number为0x08,可表示一种外部定义的数据结构)

length

不定长表示

此种表示一般为头部两个0x00,尾部两个0x00,中间可以有任意数据。不常用。

定长表示

定长表示有两种,单字节和多字节。单字节表示最多表示127,多字节可以表示任意大小。
单字节第8位固定为0,后续的7位表示长度,如

  • 0x02 表示长度2
  • 0x0A 表示长度10
  • 0x7F 表示长度为127

多字节第一个字节表示的是长度的长度,首字节的第8位固定为1,后7位表示长度的长度的值,后续字节表示真正的长度,如

  • 0x81 0x0A 0x81表示后面跟1个字节,0x0A表示实际长度为10
  • 0x82 0x0A 0x0B 0x81表示后面跟2个字节,0x0A 0X0B表示实际长度为2571

另外,同一个长度可以有多重不同的表示方式,如长度10,可以用如下的表示方法

  • 0a
  • 81 0a
  • 82 00 0a
  • 84 00 00 00 0a
  • 8a 00 00 00 00 00 00 00 00 00 0a

value

可以为任意数据

实际例子

例1(简单)

asn.1定义

simpleExample ::= SEQENCE
	{
	string1   IMPLICIT OCTET STRING {"Hello!"},
	bool2     IMPLICIT BOOLEAN {TRUE},
	int3        IMPLICIT  INTEGER {5}
	}

asn.1编码

30 0e 04 06 48 65 6c 6c 6f 21 01 01 ff 02 01 05

asn.1编码解析

30 0e -- The type and length of the sequence  表示序列,长度为14
   04 06 48 65 6c 6c 6f 21 -- The encoded octet string "Hello!"    04表示字符串,06表示长度为10
   01 01 ff -- The encoded Boolean true    01表示布尔值,01表示长度为1,FF表示TRUE
   02 01 05 -- The encoded integer five    02表示整数,01表示长度为1,05表示实际的value为5

例2(实际报文数据)

下面附上一个mms包的手动解析数据,总共解析了4个包。第一个包是一个完整包,后三个包是分片数据,三个包合成一条mms信息。文末附有该mms包

030000c1    TPKT len = 193
02f080      COTP
0db80506130100160102140200023302000134020001c1a2    Session protocol
    31819f    SET OF 长len len = 159                             (8823 pre protocol)
          a003 800101 context 结构 0 len = 2,context primitive 0 len = 1 v = 1     (normal-mode) 
          a28197    context 结构 2 len = 151 										(normal-mode-parameters)
          		8104    context primitive 1 len = 4  00000001
          		8204    context primitive 2 len = 4  00000001
          		a423    context struct 4 len = 34  300f0201010604520100013004060251013010020103060528ca220201300406025101
          		8802    context primitive 8 len = 2  0600
          		6160    app struct 1 len = 96                                       (8650-1 ACS)
          			305e    seq len = 94 
          			    020101    INT len = 1 
          			    a059    context struct 0 len = 89 
          			        6057    app struct 0 len = 87
          			            8002    context primitive len = 2    0780
          			            a107    context struct 1 len = 7    060528ca220203
          			            a205    context struct 2 len = 5    06032b0000
          			            a303    context struct 3 len = 3    020117
          			            a606    context struct 6 len = 6    06042bce0f21
          			            a703    context struct 7 len = 3    020121
          			            be2f    context struct 14 len = 47  
          			                282d    universal Instance len = 45
          			                    020103    INT len = 1    
          			                    a028    context struct 0 len = 40			(mms)			
          			                        a826    context struct 8 len = 38 
          			                            80030186a0810101820101830105a416800101810305fb00820c03ee0000000402000058fd10


分片数据
03000404    TPKT len = 1028
02f000      COTP
01000100    Session protocol
61820a16    app struct 1 长2 len = 2582                                              (8823 pre protocol)
	30820a12    seq 长2 len = 2578
		020103    INT len = 1
		a0820a0b    context struct 0 长2  len = 2571                                 (mms)
			a0820a07    context stuct 0 长2 len = 2567
				020203d2a58209ffa0820916302aa028a1261a0a50525337373850524f541a18483250564f433324534524456e61626c652473657456616c302da02ba1291a0a50525337373850524f541a1b483250564f433324534524426c6b446972456e612473657456616c302da02ba1291a0a50525337373850524f541a1b483250564f433324534524426c6b566f6c456e612473657456616c302ba029a1271a0a50525337373850524f541a19483250564f4333245345244f55544d4154522473657456616c302ca02aa1281a0a50525337373850524f541a1a483350564f4331245345244f70446c546d6d732473657456616c302fa02da12b1a0a50525337373850524f541a1d483350564f433124534524426c6b56616c567070247365744d61672466302ea02ca12a1a0a50525337373850524f541a1c483350564f433124534524426c6b56616c5632247365744d61672466302ea02ca12a1a0a50525337373850524f541a1c483350564f43312453452453747256616c5347247365744d61672466302ca02aa1281a0a50525337373850524f541a1a483350564f433124534524446972546f4275732473657456616c302aa028a1261a0a50525337373850524f541a18483350564f433124534524456e61626c652473657456616c302da02ba1291a0a50525337373850524f541a1b483350564f433124534524426c6b446972456e612473657456616c302da02ba1291a0a50525337373850524f541a1b483350564f433124534524426c6b566f6c456e612473657456616c302ba029a1271a0a50525337373850524f541a19483350564f4331245345244f55544d4154522473657456616c302ca02aa1281a0a50525337373850524f541a1a483350564f4332245345244f70446c546d6d732473657456616c302fa02da12b1a0a50525337373850524f541a1d483350564f433224534524426c6b56616c567070247365744d61672466302ea02ca12a1a0a50525337373850524f541a1c483350564f433224534524426c6b56616c5632247365744d61672466302ea02ca12a1a0a50525337373850524f541a1c483350564f43322453452453747256616c5347247365744d61672466302ca02aa1281a0a50525337373850524f541a1a483350564f433224534524446972546f4275732473657456616c302aa028a1261a0a50525337373850524f541a18483350564f433224534524456e61626c652473657456616c302da02ba1291a0a50525337373850524f541a1b483350564f433224534524426c6b446972456e612473657456616c302da02ba1291a0a50525337373850524f541a1b483350564f433224534524426c6b566f6c456e612473657456616c302ba029a1271a0a          	(1013B)


03000404    TPKT len = 1028
02f000      COTP
50525337373850524f541a19483350564f4332245345244f55544d4154522473657456616c302ca02aa1281a0a50525337373850524f541a1a484a50544f43312453452453747256616c247365744d61672466302ca02aa1281a0a50525337373850524f541a1a484a50544f4331245345244f70446c546d6d732473657456616c302aa028a1261a0a50525337373850524f541a18484a50544f433124534524446972456e612473657456616c302ca02aa1281a0a50525337373850524f541a1a484a50544f433124534524446972546f4275732473657456616c302aa028a1261a0a50525337373850524f541a18484a50544f433124534524456e61626c652473657456616c302ba029a1271a0a50525337373850524f541a19484a50544f4331245345244f55544d4154522473657456616c3029a027a1251a0a50525337373850524f541a17484a50544f4331245345245472456e612473657456616c302ca02aa1281a0a50525337373850524f541a1a484a50544f4331245345244578334930456e612473657456616c302ca02aa1281a0a50525337373850524f541a1a4850475044495331245345245068537472247365744d61672466302da02ba1291a0a50525337373850524f541a1b485047504449533124534524476e64537472247365744d61672466302da02ba1291a0a50525337373850524f541a1b4850475044495331245345245269734c6f64247365744d61672466302da02ba1291a0a50525337373850524f541a1b4850475044495331245345244f70446c546d6d732473657456616c302da02ba1291a0a50525337373850524f541a1b4850475044495331245345245068446c546d6d732473657456616c302ea02ca12a1a0a50525337373850524f541a1c485047504449533124534524476e64446c546d6d732473657456616c302da02ba1291a0a50525337373850524f541a1b4850475044495331245345244c696e416e67247365744d61672466302da02ba1291a0a50525337373850524f541a1b4850475044495331245345244b3046616374247365744d616724663030a02ea12c1a0a50525337373850524f541a1e4850475044495331245345245a56616c546f54666d247365744d616724663030a02ea12c1a0a50525337373850524f541a1e4850475044495331245345245a56616c546f427573247365744d61672466302ba029a1271a0a50525337373850524f541a19485047504449533124534524456e61626c652473657456616c302ca02aa1281a0a50525337373850524f541a1a4850475044495331245345244f55544d4154522473657456616c302ca02aa1281a0a50525337373850524f541a1a4850475044495332245345245068537472247365744d61672466302da02ba1291a0a505253			                                                                (1021B)


0300022b    TPKT len = 555
02f080      COTP    last data unit 10000000
37373850524f541a1b485047504449533224534524476e64537472247365744d61672466302da02ba1291a0a50525337373850524f541a1b4850475044495332245345245269734c6f64247365744d61672466302da02ba1291a0a50525337373850524f541a1b4850475044495332245345244f70446c546d6d732473657456616c302da02ba1291a0a50525337373850524f541a1b4850475044495332245345245068446c546d6d732473657456616c302ea02ca12a1a0a50525337373850524f541a1c485047504449533224534524476e64446c546d6d732473657456616c302da02ba1291a0a50525337373850524f541a1b4850475044495332245345244c696e416e67247365744d61672466302da02ba1291a0a50525337373850524f541a1b4850475044495332245345244b3046616374247365744d61672466a081e283010083010083010085010085010087050800000000870508000000008705080000000083010083010083010083010085010085010087050800000000870508000000008705080000000083010083010083010083010085010087050800000000850100830100830100830100850100830100830100870508000000008705080000000087050800000000850100850100850100870508000000008705080000000087050800000000870508000000008301008501008705080000000087050800000000870508000000008501008501008501008705080000000087050800000000   (548B)
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
摘 要 I ABSTRACT II 第1章 绪论 1 1.1 ASN.1概述 1 1.2 ASN.1系列标准 1 1.3 ASN.1编解码的应用与发展前景 2 1.4论文章节结构组织 2 第2章 ASN.1词汇及词法约定 3 2.1 字符集 3 2.2 词项 3 2.3 本章小结 4 第3章 ASN.1数据类型定义 5 3.1 简单数据类型 5 3.1.1 布尔类型 5 3.1.2 空类型 5 3.1.3 整数类型 6 3.1.4 枚举类型 6 3.1.5 实数类型 7 3.1.6 位串类型 7 3.1.7 八位位串类型 8 3.2构造类型 8 3.2.1 序列类型 8 3.2.2 单一序列类型 9 3.2.3 集合类型 10 3.2.4 单一集合类型 10 3.3 本章小结 11 第4章 ASN.1BER编码规则 12 4.1 ASN.1BER数据值的编码结构 12 4.1.1标识符八位位组 12 4.1.2长度八位位组 13 4.1.3内容八位位组 14 4.1.4内容结束八位位组 14 4.2简单数据类型的编码 14 4.2.1 布尔值的编码 14 4.2.2 空值的编码 14 4.2.3 整数值的编码 15 4.2.4 枚举值的编码 16 4.2.5 实数值的编码 16 4.2.6 位串值的编码 18 4.2.7 八位位串值的编码 18 4.3 构造类型的编码 18 4.3.1 序列值的编码 18 4.3.2 集合值的编码 19 4.3.3 单一序列值的编码 19 4.3.4 单一集合值的编码 20 4.4本章小结 20 第5章 基于ASN.1BER规则的解码实现 21 5.1 布尔值的解码 21 5.2 空值的解码 23 5.3 整数值的解码 24 5.4 枚举值的解码 27 5.5 位串值的解码 27 5.6 八位位串值的解码 29 5.7 实数值的解码 30 5.8 构造类型解码 32 5.8.1 序列值的解码 32 5.8.2 单一序列值的解码 35 5.8.3 集合值的解码 35 5.8.4 单一集合的解码 35 5.9 解码系统设计流程图 37 5.10本章小结 38 第6章 基于ASN.1 BER规约的可视化编解码系统及通信 39 6.1 ASN.1BER可视化编解码系统 39 6.2编解码系统通信的实现 40 6.3编解码系统的测试 41 6.4本章小结 43 第7章 总结 44 7.1主要内容回顾 44 7.2本次设计的不足和进一步完善 44 致谢 46 参考文献 47 附录A 外文翻译-原文部分 48 附录B 外文翻译-中文译文 56

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值