资源描述
ASN.1和基本编码规则
作者:亢朝峰 业务四室
摘 要:该文阐明了ASN.1和基本编码规则(BER)原理和应用。文中,一方面描述了 ASN.1,并给出了几种常用类型相应例子,来阐明ASN.1应用;接着对基本编码规则(BER), 通过对MAP中LocationRequest祈求操作消息参数进行编码详细实现,来阐明基本编码规则工作原理。总之,ASN.1和基本编码规则实际中有非常广泛应用。
核心词:ASN.1 基本编码规则 MAP消息 LocationRequest
ASN.1作为一种数据表达原则产生于20世纪80年代初期开放系统互联Internet网络模型,但OSI模型并没有得到广泛应用,而ASN.1原则继续使之发展,今天在实际中已有大量应用,这些应用涉及:
Ø 3G移动系统:
使用ASN.1原则 数据互换第三代移动通信网络。这一系统基于UMTS(通用移动通信系统)原则,其使用了ASN.1和分组编码原则(PER)。
Ø IP语音:
在通信领域中另一种重要应用是通过包转换网络(如因特网)传递语音数据。多媒体数据信号编解码器(CODEC)原则(H.323等等)基于ASN.1并且使用于分组编码原则来获取抱负数据传播速率。
Ø 安全应用:
因特网安全授权同样也使用了ASN.1。高档编码原则在数据表达方面形成了 一种以便、平台无关原则,比加密要优越。PKIX、PKCS和X.509也是咱们所熟悉原则,它们也是基于ASN.1。
Ø 老式通信网络:
ASN.1和基本编码规则(BER)已经在重要通信领域流行了很长一段时间,所有ss7到ISDN一切都使用了ASN.1 BER信息在各种类型设备和计算机之间传递信号。
Ø 军事和空间应用:
美国国家宇航局(NASA)在其航空通信网规范中,也正在使用ASN.1和分组编码规则作为空对地或地对空合同。
一、概述
众所周知,抽象是解决软件开发问题有效手段。运用抽象,设计人员可以定义系统一种某些而不用关注这个部门事实上是如何实现或者表达。这一办法使得实现open,它简化了定义过程,使得在实现部件之前可以声明某些“公理”、并且在设计高层部件时假定下层部件是可以实现。抽象是当代多数软件规范特点。
作为当今最复杂系统之一,开放系统互联(OSI)是一种包括了大量抽象例子。OSI是一种国际通用原则体系,从物理层始终到顾客层,规划了计算机之间互联。高层次对象被抽象定义,并将由底层对象来实现。例如,某层一种服务也许需要在计算机之间传递某个抽象对象;某一底层则也许提供关于0、1字符串实现,运用某些编码规则把高层抽象对象转换成这些字符串。
OSI阐明抽象对象办法叫做抽象语法标记(ASN.1,在X.208中定义),而用0、1字符来表达这样对象规则集合叫做基本编码规则(BER)。ASN.1是一种很灵活标记法,它容许定义众多数据类型——从整数和位串等简朴类型到如集合、序列等构造,还可以是其他复杂定义类型。BER描述了如何将ASN.1类型表达和编码成八位字节串。普通不止一种编码给定数据办法,另一种叫做DER(Distinguished Encoding Rules)编码集合,它是BER子集,其特点是给每一种ASN.1值一种唯一编码。
图1.1 阐明了抽象语法、编码规则之间关系。从图中可以看出,抽象语法运用某些正式规则来描述各种顾客数据;而编码规则采用恰当办法将用抽象语法描述顾客对象定义为适合物理传播信道传播格式。
图1.1 抽象语法、编码规则之间关系
二、抽象语法标记(ASN.1)
ASN.1(Abstract Syntax Notation One)是一种用于描述构造化客体构造和内容语言。它定义在ISO 8824或ITU-T X.208中。ASN.1类似于高档程序设计语言数据描述某些。它提供若干语言构件用以定义类型和值,类型相应构造,值相应内容。但和其她程序设计语言不同是,ASN.1类型不需要机器实现。
一种ASN.1值可以用不同办法表达:打印值是用打印形式表达ASN.1值,对人而言,它是一种严格表达法,由于它不必依赖任何机器体系构造;本地值是由程序设计语言或系统用来表达ASN.1值;传送值表达传送中ASN.1值,它是ASN.1值比特流形式,是依照一组称之为传送文法(Transfer Syntax)规则而得到。ASN.1值表达法决定了它开发性和互操作性,并成为一种通用信息互换表达法。
ASN.1可以定义各种各样简朴类型数据,也可以定义十分复杂数据构造类型。
2.1 ASN.1模块
ASN.1基本单位是模块(module)。ASN.1模块事实上是由一组类型定义和值定义构成。类型定义就是阐明类型名称和类型格式,值定义则是规定将什么样详细值赋给某一类型变量。
ASN.1模块普通格式如下:
ModuleDefinition ::=
ModuleIdentifier
DEFINITIONS
TagDefault
“::=”
BEGIN
EXPORTS
IMPORTS
AssignmentList
END
其中,
ModuleIdentifier是模块标记符,也就是模块名称( 模块名第一种字母必要大写);
IMPORTS构造规定了模块中某些定义是从其她模块中移植过来;
EXPORTS构造用于定义其她模块可以移植类型或值。
类型定义和值定义是通过类型分派(type assignment)和值分派(value assignment)来完毕。类型分派和值分派包括于模块AssignmentList中。类型分派和值分派格式如下:
类型定义
语法:<type name> := type
类型赋值:
<value name> <type> ::= <value>
2.2 简朴类型
1.INTEGER
整数类型。与普通程序设计语言不同是,ASN.1中没有限制整型位数。也就是说,INTEGER可以是任意大小整数。
定义一种整型类型Counter
Couter := INTEGER
IpAddress := Octetstring
变量赋值:
例子:
ipInReceives Counter ::= 2450
2.BOOLEAN
布尔型。取值为TURE或FALSE.
3.REAL
实数类型。和整型同样,ASN.1中对实数精度没有限制。每个实数都可以表达为M*BE,即三元组{M,B,E}形式,其中M是尾数,B是级数,E是指数。
4.ENUMERATED
枚举类型。枚举类型事实上是一组个数有限整型值。可一种每个整型值赋以不批准义。
5.BIT STRING
位串类型,由零个或各种比特构成有序位串。位串值可以由相应二进制或者十六进制串表达。其中左边位由较高权重。
6.OCTET STRING
八位位组串。由零个或各种八位位组构成有序串。八位位串可以用十进制、二进制或者十六进制表达。
7.OBJECT IDENTIFIER
对象标记符。从对象树派生出一系列点分数字串形式,用来标记对象。
8.NULL
空值类型。这是最简朴一种类型,它仅包括一种值――NULL。重要由于位置填充。如果某时刻无法得知数据精确值,那么最简朴办法就是将这一数据定义为NULL类型。
9.CHARACTER STRING
字符串类型。ASN.1中定义了某些字符集不完全相似CHARACTER STRING类型。不同类型包括字符集不同。字符串由双引号扩起。
字符串类型涉及:
Ø NumericString:包括数字0到9以及空格;
Ø PrintableSting:包括所有大小写字母、数字、标点和空格;
Ø IA5String:由取自IA5(5号国际字符表)字符构成,它和ASCII码基本相似;
Ø VisibleString:由取自IA5图形字符构成;
Ø GeneralString:包括所有原则字符。
2.2 构造类型
1. SEQUENCE
序列类型,是包括零个或者各种构成元素有序列表。列表不同元素可以属于不同数据类型。
构造类型定义
SequenceType ::=
SEQUENCE{ElementTypeList} |
SEQUENCE{ }
ElementTypeList ::=
ElementType |
ElementTypeList,ElementType
ElementType ::=
NamedType |
NamedType OPTIONAL |
NamedType DEFAULT Value |
COMPONENTS OF Type
有序列表每个元素是由元素名称和元素类型构成。元素类型可以是简朴类型,也可以是定义其她构造类型。元素类型标记符后可以跟OPTIONAL或DEFAULT核心字。OPTIONAL核心字表达在序列类型实例中该元素可以浮现,也可以不浮现。DEFAULT核心字表达序列类型实例中该元素具备事先指定缺省值。COMPONENTS OF 核心字表达它包括了给定序列中所有构成元素。
例子:
UserAccount ::= SEQUENCE {
username VisibleString,
password VisibleString,
accountNr INTEGER
}
构造赋值:
SequenceValue ::=
{ElementValueList} |
{ }
ElementValueList ::=
NamedValue |
ElementValueList,NamedValue
例子:
myAccount UserAccount ::= {
username "steffen",
password "jane51",
accountNr 4711
}
2. SEQUENCE OF
单纯序列(数组)类型。即序列中各项属于同一类型ASN.1类型。
SequenceOfType ::= SEQUENCE OF Type |
SEQUENCE
例子:
MemberCountries ::= SEQUENCE OF VisibleString
赋值:
SequenceOfValue ::= {ValueList} | { }
ValueList ::=
Value |
ValueList,Value
euMembers MemberCountries ::= {
"Austria","Belgium","Denmark",
"Finland","France","Germany",
"Greece","Ireland","Italy",
"Luxembourg","The Netherlands",
"Portugal","Spain","Sweden",
"United Kingdom"
}
3. SET
集合类型,是包括零个或者各种构成元素无序集合。这些元素顺序无任何意义,但是她们之间必要是不相似,构成元素类型可觉得不同ASN.1类型。
SetType ::=
SET{ElementTypeList} |
SET{ }
例子:
UserAccount ::= SET {
username VisibleString,
password VisibleString,
accountNr INTEGER
}
赋值:
SetValue ::= {ElementValueList} | { }
例子:
myAccount UserAccount ::= {
username "steffen",
password "jane51",
accountNr 4711
}
4. SET OF
单纯集合类型,是包括零个或者各种构成元素无序集合。这些构成元素必要为相似ASN.1类型。
SetOfType ::= SET OF Type |
SET
例子:
Keywords ::= SET OF VisibleString
赋值:
SetOfValue ::= {ValueList} | { }
例子:
someASN1Keywords Keywords ::=
{"INTEGER","BOOLEAN","REAL"}
5. CHOINCE
选取类型,包括一种可供选取数据类型列表。CHOICE类型每一种值都是其中某一数据类型值。数据可以在不同状况下取不同值。
6. ANY
如果在定义数据时还不能拟定数据类型,可以使用ANY型。ANY型可以被任何ASN.1类型置换。
7. Tagged
标签类型。标签时一种标签类(class)和一种标签号(class number)构成。标签号是十进制非负整数。共有四种不同标签类型。
Ø 通用类标签是ASN.1原则定义,除了CHOICE和ANY类型之外,所有简朴类型和构造类型都具备统一分派唯一标签。
Ø 应用类是为详细应用合同原则定义,在ASN.1模块中必要是唯一。
Ø 私有类仅对某个公司有效,它必要在该公司内是唯一。
Ø 上下文关于类重要由于消除歧义性,它在构造上下文必要是唯一。
2.3 子类型
通过对某些类型加以限制,可以定义她们子类型(subtype)。子类型值集合是其父类型值集合子集。定义子类型过程可以嵌套。
2.4其她类型
1. GeneralizedTime
表达时间类型,它有三种不同表达办法:
Ø 表达本地时间
Ø 通用时间原则(UTC)
Ø 通过计算本地时间和UTC时间差值来表达时间
2. UTCTime
UTCTime也是表达时间,只是精度不同,它只能精准到分或者秒。
3. External
外部类型,其可区别值不能从其外部特性导出,但可以从一种值编码中导出,这些值可以,但不必用ASN.1描述,因而其编码也可以不必使用ASN.1编码规则。
4. Object descriptor
对象描述符,点分数字串形式对象标记符不具备可读性,为了更好描述对象,可以使用对象描述符。对象描述符以可读文本形式简朴地简介对象。但是对象描述符不具备唯一标记性,因而不能取代对象标记符作为对象标记。
三、基本编码规则
ASN.1数据值编码由按下列顺序排列四某些构成:标记符八比特组、
图3.1 ASN.1编码构造
长度八比特组、内容八比特组以及内容结束八比特组。如图3.1所示。其中
内容八比特组只有当长度八位组值规定内容八比特组浮现时才浮现。
3.1 标记符八比特组
标记符八比特组对数据值类型ASN.1标记进行编码。ASN.1标记由标记类和序号构成。标记类占据高三位比特位。第8、7比特内容由表3.1所决定。第6比特置“1”表达编码方式为构造编码方式,置“0”表达编码方式为元编码方式,别的第5至第1比特表达序号(二进制整数,第5比特为最高比特),如图3.2所示。若序号不不大于或等于31,则此5比特置“1”,表达后随一种或各种后继八比特组,后继八比特组除最后一种八比特组之外每个八比特组第8比特置“1”,最后一种八比特组第8比特置“0”,以第一种后继八比特组第7比特为最高比特,最后一种八比特组第1比特为最后一种比特,表达标记序号无符号二进制整数编码,如图3.3所示。
3.2 长度八比特组
用长度八比特组表达内容八比特组中八比特组数。长度八比特组分为拟定形和非拟定形两种。其划分根据是:若编码为元编码则用拟定形;若编码是构造且都是及时可用,则可用拟定形或非拟定形,由发送端选取;若编码是构造且不都是及时可用,则用非拟定形。
对于拟定型,长度八比特组又分为长形式和短形式两种。只有当内容八比特组组数不大于或等于127时,才使用短形式。在短形式中,长度八比特组由单个比特组构成,其中第8比特为“0”,第七比特至第1比特是内容八比特组中八比特组组数编码。在长形式中,长度八比特组由一种初始八比特组和一种或几种后继八比特组构成。初始八比特组第8比特置“1”,第七至1比特为长度八比特组为后继八比特组组数编码;后继八比特组编码等于内容八比特组中八比特组数无符号二进制整数编码。拟定形编码如图3.4所示。
对于非拟定型,长度八比特组由单个八比特组80h构成,表达由内容结束八比特组结束内容八比特组。非拟定形编码如图3.5所示。
3.3内容八比特组
由零、一种或各种八比特组构成数据值编码。内容八比特组编码依赖于数据值类型。
3.4 内容结束八比特
在非拟定型编码时浮现,由两个零八比特组构成,如图3.5所示。
四、MAP中基本编码规则应用
由合同ANSI TIA/EIA—41D第六章,所有MAP消息(涉及操作祈求和操作响应)都是SET类型。消息也许为空(普通是操作响应),如InterSystemAnswer操作响应为空。若消息不为空,则带有一种或各种参数,这些参数或为必选项,或为可选项。
4.1 参数构造定义
以LocationRequest祈求操作为例,其在合同IA/EIA/IS-771 中数据构造描述如下:
由上表可知:该消息共有13个参数,其中4个必选参数,9个可选参数,因而在编码时它参数个数为:4-13。
相应依照合同ANSI TIA/EIA—41D和ASN.1规则,在程序中数据构造定义如下:
/* 6.4.2.27 Locationrequest */
typedef struct {
cmBillID_T tBillID;
cmBCDDigitsL_T tDigits;
cmMSCID_T tMscid;
BYTE bSysTypeCode;
BITS btCPNFlag :1;
BITS btCPN1Flag:1;
BITS btCPN2Flag:1;
BITS btCPSFlag :1;
BITS btMscinFlag :1;
BITS btPcssnFlag :1;
BITS btRNDFlag :1;
BITS btRPNFlag :1;/*added in 771 */
BITS btRSFlag :1;
BITS btTATFlag :1;
BITS btTCFlag :1;
BITS btTTFlag :1; /*added in 771 */
BITS btWCFlag :1; /*added in 771 */
BITS btRsv:3;
cmCallPartName_T tCallPartName;
cmCPNumDig1_T tCPNumDig1;
cmCPNumDig2_T tCPNumDig2;
cmCPSubaddr_T tCPSubaddr;
cmMSCIN_T tMscin;
cmPCSSN_T tPcssn;
cmRedirNumDig_T tRedirNumDig;
cmRedirPartName_T tRedirPartName; /*added in 771 */
cmRedirSubaddr_T tRedirSubaddr;
BYTE bTermAccType;
cmTranCapa_T tTranCapa;
cmTrigType_T tTrigType; /*added in 771 */
cmWINCapa_T tWINCapa; /*added in 771 */
} cmLocReqReq_T;
4.2 参数构造编码
运用基本编码规则将这个构造进行编码,成果如下(改数据来自实验局真实码流):
81 07 00 0D 01 00 04 24 00 84 0A 01 00 21
0B 31 33 39 09 00 03 95 03 00 0D 01 96 01 27
9F 50 0A 02 30 21 0B 31 33 39 09 00 F1 9F 5E
0C 00 01 61 0F 64 00 03 39 39 19 00 F0 9F 20
05 09 27 27 27 08 9F 77 01 FC 9F 7B 02 FF 3E
9F 82 17 01 20 BF 82 18 0C 9F 82 15 03 FF FF
1F 9F 82 19 01 03
下面对各个参数编码(长生码流)过程进行详细阐明:
1.参数tBillID
第一某些:
在合同TIA/EIA-41表Table 112 TIA/EIA-41 MAP Parameter Identifiers 中可以查到Parameter Identifier Code为1 0 0 0 0 0 0 1B(二进制),也就是0x81(十六进制),可以得到
81:计费ID
第二某些
由基本编码规则可知,第二某些是长度八比特组,同样在合同TIA/EIA-416.5.2.16
节Figure 23 BillingID parameter可知,其长度为7,可以得到长度八比特组为0X07
07:参数长度
第三某些
由基本编码规则可知,第三某些是内容八比特组,其长度为7:
00 0D 01 00 04 24 00
同理,可以对其她参数进行编码。
2.参数tDigits
84:数字(拨号)
0A:参数长度
01 00 21 0B 31 33 39 09 00 03
3.参数tMscid
95:MSCID(始发系统)
03:参数长度
00 0D 01
4.参数bSysTypeCode
96:系统类型码
01:参数长度
27
5.参数tCPNumDig1
9F 50:主叫号码数字1
0A:参数长度
02 30 21 0B 31 33 39 09 00 F1
6.参数tMscin
9F 5E:MSC辨认数字
0C:参数长度
00 01 61 0F 64 00 03 39 39 19 00 F0
7.参数tPcssn
9F 20:PC-SSN(始发)
05:参数长度
09 27 27 27 08
8.参数bTermAccType
9F 77:终端接入类型
01:参数长度
FC:
9.参数tTranCapa
9F 7B:解决能力
02:参数长度
FF 3E
10.参数tTrigType
9F 82 17:Trige Type
01:参数长度
20
11.参数tWINCapa
BF 82 18:WINCapa
0C:参数长度
12.参数TrigCapa
9F 82 15:TrigCapa
03:参数长度
FF FF 1F:
13.参数tWINCapa
9F 82 19:WINOperCapa
01:参数长度
03:内容
五、总结
在文中,简介了ASN.1和基本编码规则在合同中基本规定,重要是对合同X.208和X.208一种简朴总结概括。然后以MAP合同中LocationRequest祈求操作参数为例给出了依照ASN.1定义出相应数据构造,然后用基本编码规则进行了编码。通过这个例子给出了ASN.1和基本编码规则应用思路,但愿对正在进行有关工作同事有点小小协助。
附注
1. ASN.1正式原则文献及其编码规则由国际电信联盟电信分部(ITU-T)和国际原则化组织(ISO)/国际电气技术委员会(IEC)联合颁布。
Ø 简介X.680(12/97)-信息技术-抽象语法符号1(ASN.1):基本语法规范
Ø 简介X.681(12/97)-信息技术-抽象语法符号1(ASN.1):信息对象规范
Ø 简介X.682(12/97)-信息技术-抽象语法符号1(ASN.1):约束规范
Ø 简介X.683(12/97)-信息技术-抽象语法符号1(ASN.1):ASN.1规范参数化
Ø 简介X.690(12/97)-信息技术-ASN.1编码规范:关于基本编码规则(PER),规范编码规则(CER)和高效编码规则(DER)阐明
Ø 简介X.690(12/97)-信息技术-ASN.1编码规范:分组编码规则(PER)阐明
这些原则初期版本:
Ø 简介X.208(11/88)-抽象语法符号1(ASN.1)阐明
Ø 简介X.209(11/88)-抽象语法符号1(ASN.1)基本编码规则阐明
2.表达法
在合同X.208中,经惯用到符号阐明:
Ø [i]n1[/i] 宽体斜体表达一种变量
Ø [ ] 方括号表达一种条款是可选
Ø { } 大括号表达有关条款
Ø | 竖条表达可以在一组值中任选
Ø ... 省略号表达多次重复
Ø = 等号表达条目由某些子条目来表达。
3.CDMA所用合同
Ø ANSI TIA/EIA—41D:北美CDMA数字蜂窝移动通信网合同
Ø IA/EIA/IS-771:关于无线智能网(WIRELESS INTELLIGENT NETWORK)合同
展开阅读全文