asn.1学习笔记

合集下载

ASN.1笔记——语法规则与类型概述

ASN.1笔记——语法规则与类型概述

ASN.1笔记——语法规则与类型概述⼀.简介ASN.1(Abstract Syntax Notation dotone),抽象语法标记1。

是定义抽象数据类型形式的标准,是⽤于描述数据表⽰、表⽰、传输、编码的记法。

ASN.1只包含信息结构,不处理具体业务数据,它不是⼀个编程语⾔。

ASN.1没有限定编码⽅法,各种ASN.1编码规则提供了由ASN.1描述其抽象句法的数据的值的传送语法(具体表达),常见的编码规则有:基本编码规则(BER),规范编码规则(CER,CanonicalEncoding Rules)、唯⼀编码规则(DER,DistinguishedEncoding Rules)、压缩编码规则(PER,PackedEncoding Rules)和XML编码规则(XER,XMLEncoding Rules)。

这些编码规则描述了如何将定义在ASN.1中的值译成适合传输的电码。

ASN.1在OSI的ISO8824/ITU X.208(说明语法)和ISO8825/ITU X.209(说明基本编码规则)规范。

⼏个概念:(1)实际语法指诸如C、ObjectiveCaml等这样实际编程语⾔;(2)抽象语法(AbstractSyntax)指ASN.1,是协议采⽤ASN.1规范描述的描述⽂本。

描绘了与任何表⽰数据的编码技术⽆关的通⽤数据结构。

抽象语法使得⼈们能够定义数据类型,并指明这些类型的值。

抽象语法只描述数据的结构形式,与具体的编码格式⽆关,同时也不涉及这些数据结构在计算机内如何存放。

(3)传输语法(TransferSyntax)指表⽰层交换数据的表⽰⽅法,是实际通讯系统间的码流。

当数据在两个表⽰层实体之间传输时,这些数据的实际⽐特模式表⽰⽅法就是传送语法。

(4)编码指将抽象语⾔法转换成实际通讯系统间⽐特流;(5)编码规则将抽象语⾔法转换成实际通讯系统间⽐特流所遵循的语法规则;⼆.相关背景知识1.为了顺利完成应⽤⾳的通讯,需使⽤以下概念:(1)抽象语法:定义了数据的常⽤结构(包括不同的数据类型),并且建⽴了和应⽤层对话所⽤的构架。

ASN1编码

ASN1编码

位8 0 0 1 1
位7 0 1 0 1
类别 通用(Universal) 应用(Application) 上下文特定(Context Specific) 专用(Private)
所有的类型中,通用类别最常用。 <2>. 结构化位。 结构化位(constructed bit)表示一个给定的编码是否是相同类型的多种编码的结 构化。结构化元素是容器类型必需的,因为在逻辑上,它们只是其他元素的集合。 结构化元素有自己的头字节和长度字节,之后是元素各个要素组件的单独编码。 也就是说,这些要素组件是独立地可解码 ASN.1 数据类型。 严格的说,容器类是唯一允许使用结构化位的数据类型。这是因为对于其他数据 类型,给定内容,只允许一种编码。所以其他所有数据类型的结构化位都为 0。 <3>. 原始类型。 ASN.1 头字节的低 5 位定义了 32 种 ASN.1 的原始类型(primitive type)
值 0 1 2 127 128 -1 -128 -32768 1234567890 编码 0x02 01 00 0x02 01 01 0x02 01 02 0x02 01 7F 0x02 02 00 80 0x02 01 FF 0x02 01 80 0x02 02 80 00 0x02 04 49 96 02 D2
ASN.1 编码
1.什么是 ASN.1(抽象语法记法一)? ASN.1 是 ITU-T 的一个标准集,它用来编码及表示通用数据类型,这些数据类型有可 打印串值, 八位位组串值, 位串值, 整数值以及用可移值方式组合而成的其他类型序列值. 简 单的说,ASN.1 指定了以何种方式对非平凡的数据类型进行编码,以便其他任何平台及第 三方工具都能够解释其内容.比如,字母 a 在一些平台以 ASCII 编码为十进制数值 97,而在 其他非 ASCII 平台上,可能会是另外的编码.而 ASN.1 指定了一种编码方式,在任何平台 上,字母 a 的编码都是统一的.

ASN.1简介及OpenSSL中ASN.1接口使用举例

ASN.1简介及OpenSSL中ASN.1接口使用举例

ASN.1简介及OpenSSL中ASN.1接⼝使⽤举例ASN.1(Abstract Syntax Notation One)是⼀套标准,是描述数据的表⽰、编码传输、解码的灵活的记法。

它提供了⼀套正式、⽆歧义和精确的规则以描述独⽴于特定计算机硬件的对象结构。

OpenSSL的编码⽅法就是基于该标准。

ASN.1是⼀种结构化的数字对象描述语⾔,它包括两部分:数据描述语⾔和数据编码规则。

ASN.1的数据描述语⾔允许⽤户⾃定义基本的数据类型,并可以通过简单的数据类型组成更复杂的数据类型。

ASN.1是ISO和ITU-T的联合标准,它本⾝只定义了表⽰信息的抽象句法,但是没有限定其编码的⽅法。

各种ASN.1编码规则提供了由ASN.1描述其抽象句法的数据的值的传送语法(具体表达)。

标准的ASN.1编码规则有基本编码规则(BER,Basic Encoding Rules)、规范编码规则(CER,Canonical Encoding Rules)、唯⼀编码规则(DER,Distinguished Encoding Rules)、压缩编码规则(PER,Packed Encoding Rules)和XML编码规则(XER,XML Encoding Rules)。

这些编码⽅法规定了将数字对象转换成应⽤程序能够处理、保存和⽹络传输的⼆进制编码形式的⼀组规则。

PEM编码全称是Privacy Enhanced Mail,是⼀种保密邮件的编码标准。

ASN.1与特定的ASN.1编码规则⼀起通过使⽤独⽴于计算机架构和编程语⾔的⽅法来描述数据结构,为结构化数据的交互提供了⼿段,特别是在⽹络环境的应⽤程序。

OpenSSL的PEM编码就是在DER编码基础上进⾏BASE64编码,然后添加⼀些头尾信息组成的,如在⽣成的rsa private.pem中头信息为-----BEGIN RSA PRIVATE KEY-----,尾信息为-----END RSA PRIVATE KEY-----,中间的数据部分即是对DER进⾏base64编码后的结果。

asn1语法

asn1语法

asn1语法
ASN.1(Abstract Syntax Notation One)是一种规范语法,用
于描述和表示结构化数据。

它被广泛用于网络通信、存储以及安全领
域中的各种协议。

ASN.1定义了数据类型、数据结构、数据表示和编解码规则。

ASN.1语法中包含以下主要元素:
1. 标识符:每个定义都有一个唯一的标识符。

2. 类型:ASN.1定义了许多数据类型,包括基本类型(例如INTEGER和BOOLEAN)和结构类型(例如SEQUENCE和CHOICE)。

3. 值:ASN.1数据对象具有一个明确的类型和一个对应的值。

值可以是一个标量(例如整数或真/假值),也可以是一个结构化的对象,包含其他ASN.1类型和值。

4. 编码规则:ASN.1定义了一组可移植的规则,以将ASN.1值编码为二进制格式,并将其解码回原始ASN.1表示形式。

ASN.1编码通常用于在网络中传输数据。

ASN.1还包含一些其他元素,例如注释、导入和导出声明。

ASN.1编译器可以使用这些元素来生成代码来处理ASN.1数据对象。

asn1c用法 -回复

asn1c用法 -回复

asn1c用法-回复asn1c是一个用于编译ASN.1(Abstract Syntax Notation One)规范的C语言编码器和解码器。

ASN.1是一种用于定义数据结构和传输数据的描述语言,广泛应用于通信和网络领域。

asn1c的使用可以帮助开发人员更方便地处理ASN.1规范的数据,并快速开发高效的通信协议。

首先,我们需要了解ASN.1规范的基本知识。

ASN.1是一种独立于语言的描述数据结构和数据传输的语言。

它可以定义复杂的数据结构,并定义数据编码和解码的规则。

ASN.1规范使用模块化的方式组织,每个模块可以包含类型定义、值定义和约束定义等。

在ASN.1规范中,数据类型被定义为抽象的,而编码和解码规则则使用ASN.1 BER(Basic Encoding Rules)或DER(Distinguished Encoding Rules)进行描述。

接下来,我们可以开始使用asn1c进行编码和解码的工作了。

首先,我们需要安装asn1c工具。

asn1c是一个开源软件,可以从其官方网站下载并安装。

安装完成后,我们可以在终端窗口中输入asn1c命令来检查是否安装成功。

如果成功安装,终端会显示出asn1c的版本信息。

在开始使用asn1c之前,我们需要先创建一个ASN.1规范文件。

ASN.1规范文件以“*.asn”为后缀名,可以用文本编辑器打开进行编辑。

在ASN.1规范文件中,我们可以定义数据类型、值以及编码和解码规则等。

在定义数据类型时,我们可以使用ASN.1提供的基本数据类型,也可以使用已定义的其他数据类型。

在完成ASN.1规范文件的编辑后,我们可以使用asn1c命令来生成编码器和解码器的源代码。

在终端中导航到ASN.1规范文件所在的目录,然后执行以下命令:shellasn1c <ASN.1规范文件名>asn1c会根据ASN.1规范文件的内容生成相应的C语言源代码文件。

生成的源代码文件包括编码器和解码器的函数,以及用于表示ASN.1数据结构的结构体和相关的辅助函数。

2备用抽象语法表示ASN.1

2备用抽象语法表示ASN.1

2024年7月2日4时45分
8
第二章 抽象语法表示ASN.1
ASN.1数据类型-简单类型
▪ 基本类型包括BOOL、INTEGER、REAL、BIT STRING、OCTET STRING、ENUMERATED、 OBJECT IDENTIFIER、NULL等。
➢ BIT STRING 是以比特为单位的二进制字符串; ➢ OCTET STRING是以字节为单位的字符串。 ➢ ENUMERATED是一个定义变量值的集合,变量的值
age
INTEGER
} 赋值:
johnny Description ::=
{
surname
"Smith",
first-name
"John",
age
40
}
2024年7月2日4时45分
17
第二章 抽象语法表示ASN.1
SEQUENCE OF
▪ SEQUENCE OF所有成员都是一个类型, 数目不定。相当于C语言中的数组。
➢ 应用标签:用关键字APPLICATION表示,是应用程序 组织自定义由某个具体应用定义的类型其;
➢ 如:
Name ::= [APPLICATION 0] SEQUENCE
{
initialname IA5String;
familyName IA5String;
} ➢ 上下文专用标签:这种标签在文本的一定范围(例如一
▪ CHOICE是可选类型的一个表,仅其中一个类型 可以被采用,产生一个值。CHOICE类型定义为
➢ ChoiceType::= CHOICE{AlternativeTypeList}
➢ AlternativeTypeList::= NamedType | AlternativeTypeList, NamedType

网络管理-3-ASN.1简介

网络管理-3-ASN.1简介

mib-2 …… END
19

ASN.1宏定义

可以构造ASN.1类型,或者规定这些类型的值 宏定义的模板:
<macro name> MACRO ::= BEGIN TYPE NOTATION ::= <user-defined type notation> VALUE NOTATION ::= <user-defined value notation> <supporting syntax> END -- TYPE NOTATION defines the syntax of new types -- VALUE NOTATION defines the syntax of new values


位于表示层 将ASN.1编码的文本内容转换为bit流 编码结构:
Tag Length Value
7
6
5
P/C
4
3
2
1
0
标签类别
标签号
24

标签类别
类别
Universal Application Context-Specific Private

00 01 10 11

BOOLEAN和OCTET STRING编码举例
网络管理
刘炯 2008-3-7 西安电子科技大学 – 通信工程学院
第三章 ASN.1简介


3.1 ASN.1简介 3.2 ASN.1编码规则
2
3.1 ASN.1简介

抽象句法描述(Abstract Syntax Notation number One)


由ITU-T和ISO联合开发的标准 独立与表示层编码技术,对应用层的数据进行描述的句 法

ASN.1笔记——基本类型详述

ASN.1笔记——基本类型详述

ASN.1笔记——基本类型详述一.ASN.1基本类型基本类型汇总表1.BOLLEAN类型BOLLEAN类型只有两个值:TRUE和FALSE2.NULL类型空类型,只有一个值NULL。

作为一种结果,空类型是传输报告和响应的典型情况。

Ack ::= NULL它经常在时间信息中使用,表示传送时间没有赋值,如:Clock ::= CHOICE{time UTCTime,out-of-order NULL}当时钟电池没有电时,值为:battery-down Clock ::= out-of-order:NULLNULL也可以用在表示链表结束的空接点,如:LinkedList::= SEQUENCE{data Data,next CHOICE{linked-list LinkedList,endNULL}}3.INTEGER类型(1).ASN.1没有定义整数的范围,因此必要时需要工确定:Interval::= INTEGER(0..32767)(2).ASN.1描述中不能出现“-0”(3).一些情况下,比如为了定义错误码,需要给一些数值特定的名字,可以使协议更易于理解,也改善了应用层和编解码器之间的接口。

ASN.1为INTEGER类型提供了一种特殊语法来解决这个问题。

以软盘驱动器的错误码为例:ErrorCode::= INTEGER{disk-full(1),no-disk(-1),disk-not-formatted(2)}stupid-error ErrorCode ::= disk-full这些名字只能被用于定义ErrorCode类型的值,不能用于其它类型值的定义。

命名的整数不需要排序。

对于没有命名的整数,还是可以使用的;已经命名的整数,也可以直接使用数字。

4.ENUMERATED类型即枚举类型例:ABRT-diagnostic ::=ENUMERATED{no-reason-given(1),protocol-error(2),authentication-mechanism-name-not-recognized(3),authentication-mechanism-name-required(4),authentication-failure(5),authentication-required(6),...}(1).不能直接使用()中的数字(2).注意事项:<1>按照ASN.1的语义模型,任意两个ENUMERATED类型都是不兼容的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
file:///C|/Documents and Settingux
2010.08.25
1.什么是ASN.1(抽象语法记法一)? ASN.1是ITU-T的一个标准集,它用来编码及表示通用数据类型,这些数据类型有可打印串值, 八位位组串值,位串值,整数值以及用可移值方式组合而成的其他类型序列值.简单的说,ASN.1指定了 以何种方式对非平凡的数据类型进行编码,以便其他任何平台及第三方工具都能够解释其内容.比如, 字母a在一些平台以ASCII编码为十进制数值97,而在其他非ASCII平台上,可能会是另外的编码. 而ASN.1指定了一种编码方式,在任何平台上,字母a的编码都是统一的.
vxworks
2.ASN.1语法. ASN.1语法遵循传统的巴科斯范式BNF风格.最基本的表达式如: Name ::= type . 表示 为定义某个名称为Name的元素,它的类型为type. 例如: MyName ::= IA5String . 表示为定义 了一个名为MyName的元素或变量,其类型为ASN.1类型IA5String (类似于ASCII字符串). 2.1 ASN.1显式值(Explict Value). 有些时候,我们需要定义一种ASN.1类型,它的子集元素包含预定义值. Name ::= type (Explict Value) . 显式值(Explict Value).必须是ASN.1类型允许选择的值,而且也必须是元素所允许的值. 例: MyName ::= IA5String (Tom) 表示MyName是字符串Tom的IA5String编码. 又例如: MyName ::= IA5String(Tom|Joe) 表示字符串的值既可以是Tom, 也可以是Joe. 这种语法的使用是为了扩展确定的解码器.例: PublicKey ::= SEQUENCE { KeyType Modulus BOOLEAN(0), INTEGER,
file:///C|/Documents and Settings/Administrator/桌面/asn.1学习笔记.txt
2.2 ASN.1容器(container) 容器是值一个包含了其他相同或者不同类型元素的数据类型(例如序列值SEQUENCE或集合值SET类型). 目的是为了组合一些复杂的数据类型集.ASN.1规范定义了4种容器类型:序列,单一序列(SEQUENCE OF),集合和单一集合(SET OF). 虽然它们意义不同,但是语法是一样的. Name ::= Container {Name Type [ Name Type...]} 方括号中的内容和容器的元素个数都是可选项.还可以进行嵌套定义. 例: UserRecord ::= SEQUENCE { Name SEQUENCE { First IA5String, Last IA5String }, DoB } 将其粗略的翻译成C语言中的结构如下: struct UserRecord { struct Name { char *First, char *Last }; time_t DoB; } 将其粗略的翻译成Object Pascal语言中的记录如下(Object Pascal不支持嵌套记录): Type Name = record
file:///C|/Documents and Settings/Administrator/桌面/asn.1学习笔记.txt(第 2/10 页)2010-8-25 10:12:22
UTCTIME
file:///C|/Documents and Settings/Administrator/桌面/asn.1学习笔记.txt
PubExponent INTEGER } PrivateKey ::= SEQUENCE { KeyType Modulus BOOLEAN(1) INTEGER,
PubExponent INTEGER, PrivateExponent INTEGER }
file:///C|/Documents and Settings/Administrator/桌面/asn.1学习笔记.txt(第 1/10 页)2010-8-25 10:12:22
First : String; Last : String; end; UserRecord = record aName : Name; DoB : DateTime; end; 2.3ASN.1修改器 ASN.1定义了各种修改器,如可选(OPTIONAL),默认(DEFAULT),和选择(CHOICE). 他们可以改变表达式的声明 典型地用于定义一种要求编码灵活,而定义又不繁琐的类型. <1>.可选(OPTIONAL)。顾名思义,其表示改变一个元素以便在编码时它的类型是可选择的. 即编码器可以忽略这个元素,解码器不能假设它将出现.但当邻接的两个元素具有相同的类型时,会给解码器带来一些问题. 定义: Name ::= Type OPTIONAL 例如: Float ::= SEQUENCE { Exponent Mantissa Sign } 当解码器读取这个结构时,在它看来第一个整数(INTEGER)可能是Exponent,也有可能认为是Mantissa. 一般建议不使用这种方式定义结构. <2>.默认(DEFAULT).默认修改器允许容器包含默认值.如果待编码的数据值等同于它的默认值, 那么它将在发送的数据流中被忽略.例如: Command ::= SEQUENCE { Token IA5String(NOP) DEFAULT, INTEGER OPTIONAL, INTEGER, BOOLEAN
Parameter INTEGER
file:///C|/Documents and Settings/Administrator/桌面/asn.1学习笔记.txt(第 3/10 页)2010-8-25 10:12:22
相关文档
最新文档