小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

ANS.1筆記

 king9413 2015-03-17

學(xué)習(xí)資料:ASN.1編碼規(guī)則詳解

一.簡介

ASN.1(Abstract Syntax Notation dotone),抽象語法標(biāo)記1。是定義抽象數(shù)據(jù)類型形式的標(biāo)準(zhǔn),是用于描述數(shù)據(jù)表示、表示、傳輸、編碼的記法。

ASN.1只包含信息結(jié)構(gòu),不處理具體業(yè)務(wù)數(shù)據(jù),它不是一個編程語言。

ASN.1沒有限定編碼方法,各種ASN.1編碼規(guī)則提供了由ASN.1描述其抽象句法的數(shù)據(jù)的值的傳送語法(具體表達(dá)),常見的編碼規(guī)則有:基本編碼規(guī)則(BER),規(guī)范編碼規(guī)則(CER,CanonicalEncoding Rules)、唯一編碼規(guī)則(DER,DistinguishedEncoding Rules)、壓縮編碼規(guī)則(PER,PackedEncoding Rules)XML編碼規(guī)則(XER,XMLEncoding Rules)。這些編碼規(guī)則描述了如何將定義在ASN.1中的值譯成適合傳輸?shù)碾姶a。

ASN.1在OSI的ISO8824/ITU X.208(說明語法)ISO8825/ITU X.209(說明基本編碼規(guī)則)規(guī)范。

幾個概念:

(1)實際語法

指諸如C、ObjectiveCaml等這樣實際編程語言;

(2)抽象語法(AbstractSyntax)

指ASN.1,是協(xié)議采用ASN.1規(guī)范描述的描述文本。描繪了與任何表示數(shù)據(jù)的編碼技術(shù)無關(guān)的通用數(shù)據(jù)結(jié)構(gòu)。抽象語法使得人們能夠定義數(shù)據(jù)類型,并指明這些類型的值。抽象語法只描述數(shù)據(jù)的結(jié)構(gòu)形式,與具體的編碼格式無關(guān),同時也不涉及這些數(shù)據(jù)結(jié)構(gòu)在計算機(jī)內(nèi)如何存放。

(3)傳輸語法(TransferSyntax)

指表示層交換數(shù)據(jù)的表示方法,是實際通訊系統(tǒng)間的碼流。當(dāng)數(shù)據(jù)在兩個表示層實體之間傳輸時,這些數(shù)據(jù)的實際比特模式表示方法就是傳送語法。

(4)編碼

指將抽象語言法轉(zhuǎn)換成實際通訊系統(tǒng)間比特流;

(5)編碼規(guī)則

將抽象語言法轉(zhuǎn)換成實際通訊系統(tǒng)間比特流所遵循的語法規(guī)則;

.相關(guān)背景知識

1.為了順利完成應(yīng)用音的通訊,需使用以下概念:

(1)抽象語法:定義了數(shù)據(jù)的常用結(jié)構(gòu)(包括不同的數(shù)據(jù)類型),并且建立了應(yīng)用層對話所用的構(gòu)架。

(2)實際語法:本地的,并且定義本地系統(tǒng)的數(shù)據(jù)表示方法。

(3)傳輸語法:定義兩個系統(tǒng)間的表示層間交換數(shù)據(jù)的表示方法。

(4)編碼規(guī)則:提供從本地實際語法到傳輸語法其相反操作的方法。(從抽象語法到傳輸語法,由ASN.1編譯器按照編解碼規(guī)則實現(xiàn))

2.應(yīng)用層Application Layer

應(yīng)用層向表示層發(fā)送數(shù)據(jù)時,同時告知表示層自己的ASN.1名字(即對象標(biāo)識符),ASN.1名字標(biāo)記了一個ASN.1語法——用以解釋數(shù)據(jù)中各字段的含義。通過參考ASN.1定義,表示可以得知數(shù)據(jù)單元的類型長度,以及傳輸時應(yīng)當(dāng)采用的編碼方法。

3.表示層Presentation Layer

兩個系統(tǒng)在傳輸數(shù)據(jù)前需要協(xié)商共用的編碼方式,事實上編碼方式在應(yīng)用層發(fā)出的數(shù)據(jù)中已經(jīng)確定,應(yīng)用數(shù)據(jù)中包含抽象語法/傳輸語法的組合關(guān)系,告訴表示層數(shù)據(jù)的結(jié)構(gòu)、含義以及傳輸語法規(guī)則。表示層參考抽象語法,將應(yīng)用數(shù)據(jù)轉(zhuǎn)換為傳輸語法定義的比特流。

4.邊界對齊

同樣一條消息,在計算機(jī)內(nèi)存中是以Byte為單位存儲的,在鏈路上則是以bit為單位傳送的。

如果一個信元的第一個bit也恰好是Byte流中某Byte的開始bit時,我們稱之為開始于邊界對齊的;

如果信元的最后一個bit也恰好是Byte流中某Byte的最后一個bit時,則可以稱之為結(jié)束于邊界對齊的。

對于不是結(jié)束于邊界對齊的情況,一般要進(jìn)行補(bǔ)位。有兩種方式:

(1)對每個信元的結(jié)束立即進(jìn)行補(bǔ)位,保證下一個信元是開始于邊界對齊的;

(2)從信元結(jié)束的位置開始新的信元,到消息結(jié)束時再進(jìn)行一次補(bǔ)位操作。(用于無線空口中)

5.大小端(BigEndian vs Little Endian)

(1).大端方式,也叫網(wǎng)絡(luò)序,從左往右,第一個8位表示高位,例如0X0102,用比特流表示是0000000100000010。

(2).小端方式,也叫主機(jī)序,與大端方式相反,數(shù)字0X0102用比特流表示則是0000001000000001,低8位在前,高8位在后。

Motorola的PPC系列、IP協(xié)議中使用大端方式;VAX計算機(jī)、Intel的x86系列中使用小端方式。

.ASN.1的基本語法規(guī)則

1.ASN.1使用巴科斯范式(BNF):

在雙引號中的字("word")代表著這些字符本身。而double_quote用來代表雙引號。

在雙引號外的字(有可能有下劃線)代表著語法部分。

尖括號(< > )內(nèi)包含的為必選項。

方括號([ ] )內(nèi)包含的為可選項。

大括號({ } )內(nèi)包含的為可重復(fù)0至無數(shù)次的項。

豎線(| )表示在其左右兩邊任選一項,相當(dāng)于"OR"的意思。

::=是“被定義為”的意思。

這是用BNF來定義的Java語言中的For語句的實例:

  FOR_STATEMENT::=

  "for""(" ( variable_declaration |

  (expression ";" ) | ";" )

  [expression ] ";"

  [expression ]

  ")"statement

2.在ASN.1中,符號的定義沒有先后次序:只要能夠找到該符號的定義即可。

3.所有的標(biāo)識符、參考、關(guān)鍵字都要以一個字母開頭,后接字母(大、小寫都可以)、數(shù)字或者連字符“-”(但不能以連字符“-”結(jié)尾,也不能連續(xù)出現(xiàn)兩個連字符),不能出現(xiàn)下劃線“_”。

4.關(guān)鍵字一般都是全部大寫。

5.在標(biāo)識符中,只有類型模塊名字是以大寫字母開頭的,其它標(biāo)識符都是以小寫字母開頭。

6.ASN.1中實數(shù)實際定義為三個整數(shù):尾數(shù)、基數(shù)指數(shù)。沒有小數(shù)表示方式。

7.ASN.1不對空格、制表符、換行符注釋做翻譯。但是在定義符號(或者分配符號Assignment)“::=”中不能有分隔符。

.ASN.1中的類型

類型是一個非空的值的集合,可以被編碼后傳輸。相比與高級語言中復(fù)雜的數(shù)據(jù)結(jié)構(gòu),ASN.1中的類型主要是為了數(shù)據(jù)的傳輸。

1.ASN.1中的類型分為基本類型(內(nèi)建數(shù)據(jù)類型)組合類型,組合類型由一個或多個基本類型構(gòu)成。

內(nèi)建數(shù)據(jù)類型

類型

含義

NULL

只包含一個值NULL,用于傳送一個報告或者作為CHOICE類型中某些值

INTEGER

全部整數(shù)(包括正數(shù)負(fù)數(shù))

REAL

實數(shù),表示浮點(diǎn)數(shù)

ENUMERATED

標(biāo)識符的枚舉(實例狀態(tài)機(jī)的狀態(tài)

BITSTRING

比特串

OCTETSTRING

字節(jié)串

OBJECT IDENTIFIER,

RELATIVE-OID

一個實體的標(biāo)識符,它在一個全世界范圍樹狀結(jié)構(gòu)中注冊

EXTERNAL,EMBEDDED PDV

表示層上下文交換類型

String(除了BITSTRING、OCTETSTRING)

各種字符串,有NumericStringPrintableString、VisibleStirngISO64String、IA5String、TeletexStirng、T61StringVideotexString、GraphicStringGeneralString、UniversalString、BMPStringUTF8String

CHARACTERSTRING

允許為字符串協(xié)商一個明確的字符表

UTCTime,GeneralizedTime

日期

組合類型

類型

含義

CHOICE

在類型中選擇(相當(dāng)于C中的聯(lián)合)

SEQUENCE

由不同類型的值組成一個有序的結(jié)構(gòu)(相當(dāng)于C中的結(jié)構(gòu)體)

SET

由不同類型的值組成一個無序的結(jié)構(gòu)

SEQUENCEOF

由相同類型的值組成一個有序的結(jié)構(gòu)(相當(dāng)于C中的數(shù)組)

SETOF

由相同類型的值組成一個無序的結(jié)構(gòu)

2.類型定義

<新類型的名字>::= <類型描述>

例:

Married ::= BOOLEAN

Age ::= INTEGER

Picture ::= BIT STRING

Form ::= SEQUENCE

{

name PrintableString,

age Age,

married Married,

marriage-certificate PictureOPTIONAL

}

Married類型是一個基本類型BOOLEANForm類型是一組基本類型的有序序列

注意:在SEQUENCESET(好像應(yīng)該是所有組合類型的)定義中,最后一個成員結(jié)尾沒有逗號“,

為了接收方能正確解碼,發(fā)送方為每個值的類型加一個數(shù),稱為tag,在描述中以“[]標(biāo)識。缺省情況下,編碼器使用universaltag。在給合類型中,為了明確各個成員,有必要指明每個成員的Tag

Coordinates ::= SET

{

x [1] INTEGER, //這證明好像也可以用類來直接聲明變量

y [2]INTEGER,

z [3]INTEGER OPTIONAL

}

Tag會在傳輸規(guī)則使用到,用于在比特流中指明數(shù)據(jù)的具體類型。

為了準(zhǔn)確描述一個類型,我們需要對值的集合進(jìn)行一定的限制。這用到子類型約束,在類型之后用圓括號進(jìn)行標(biāo)識。

如:

Lottery-number::= INTERGER(1..49)表示1-49任一一個值

Lottery-draw ::=SEQUENCESIZE(6) OF Lottery-number指定了該SEQUENCE類型由6Lottery-number類型有序組成。

Upper-case-words::= IA5String (FROM(“A”..”Z”))表示按ASCIIA-Z中任一一個,IA5StringASCII字符串類型

為了方便在新的版本中往現(xiàn)有類型中添加新成員,可用“…”來標(biāo)記可能以后是其它類型的地方:

Type ::= SEQUENCE

{

component1 INTERGER,

component2 BOOLEAN,

}

以后新的版本中,描述可能為:

Type ::= SEQUENCE

{

component1 INTERGER,

component2 BOOLEAN,

,

[[component3REAL]], -- version 2

}

注意:新加入的類型成員要嵌套在“[[]]”,--version 2指定新版本號

3.值定義

<新的值的名字><該值的類型> ::=<值描述>

其中:

<新的值的名字>是以小寫字母開頭的標(biāo)識符;

<該值的類型>可以是一個類型的名字,可以是類型描述;

<值描述>是基于整數(shù)、字符串、標(biāo)識符的組合

如:

counter Lottery-number ::= 45

sextuple Lottery-draw ::= { 7, 12, 23, 31, 33, 41 }

4.信息對象類信息對象

<信息對象類>::= CLASS <類描述>

WITHSYNTAX <信息描述>

用于表達(dá)比注釋更為正式的一些信息

5.模塊定義

<模塊名字> DEFINITIONS <缺省Tag>::=

BEGIN

EXPORTS <導(dǎo)出描述>

IMPORTS <導(dǎo)入描述>

<模塊體描述>

END

一般協(xié)議由一個或者多個模塊組成,模塊用來收集數(shù)據(jù)結(jié)構(gòu)定義。

模塊名字必須以大寫字母開頭。模塊能以一種“全局指針”(UniversalPointer)的方式來引用,稱為對象標(biāo)識符(ObjectIdentifier),用花括號標(biāo)識在名字之后。

如:

Module2 { isomember-body(2) f(250) type-org(1) ft(16)

asn1-book(9)chapter5(0) module2(1) }

DEFINITIONS AUTOMATICTAGS ::=

BEGIN

EXPORTS Type2;

IMPORTS Type1, valueFROM Module1 {iso member-body(2)

f(250) type-org(1)ft(16) asn1-book(9) chapter5(0) module1(0)};

Type2 ::= SEQUENCE OFChoice

Choice ::= CHOICE

{

a INTEGER (0..value),

b Type1

}

END

(1).AUTOMATICTAGS是指缺省Tag,說明不關(guān)注模塊的Tag。

(2).IMPORTS聲明在其它模塊定義但在本模塊會用到的類型或者值。

EXPORT聲明在本模塊之外可以訪問的類型或者值。

IMPORTS的語法為:

IMPORTS <名字>,value FROM <其它模塊的ObjectIdentifier >;

EXPORTS的語法為:

EXPORTS<名字>;

(3).對象標(biāo)識符(OBJECTIDENTIFIER,OID)類型用層次的形式來表示標(biāo)準(zhǔn)規(guī)范。標(biāo)識符樹通過一個點(diǎn)分的十進(jìn)制符號來定義,這個符號以組織,子部分然后是標(biāo)準(zhǔn)的類型各自的子標(biāo)識符開始.

例如:MD5OID1.2.840.113549.2.5表示為"iso(1)member-body (2) US (840) rsadsi(113549) digestAlgorithm (2) md5 (5)",所以當(dāng)解碼程序看到這個OID,就知道是MD5散列。

OID在公鑰算法標(biāo)準(zhǔn)中很流行,它指出證書綁定了哪種散列算法。

OID在傳輸時編碼規(guī)則:

  • 前兩部分如果定義為x.y,那么它們將合成一個字40*x+ y,其余部分單獨(dú)作為一個字節(jié)進(jìn)行編碼。

  • 每個字首先被分割為最少數(shù)量的沒有頭零數(shù)字的7位數(shù)字.這些數(shù)字以big-endian格式進(jìn)行組織,并且一個接一個地組合成字節(jié).除了編碼的最后一個字節(jié)外,其他所有字節(jié)的最高位(8)都為1

MD5OID的編碼:

<1>.1.2.840.113549.2.5轉(zhuǎn)換成字?jǐn)?shù)組{42,840, 113549, 2, 5}。

<2>.然后將每個字分割為帶有最高位的7位數(shù)字,{{0x},{0x86,0x48},{0x86,0xF7,0x0D},{0x02},{0x05}}。

<3>.最后完整的編碼為0x0608 86 48 7 0D 02 05?!?/span>

6.模塊分配(Assignment)

(1).定義一個新類型

TypeReference ::=CHOICE

{

integer INTEGER,

boolean BOOLEAN

}

(2).給類型賦值

ASN.1中給類型賦的值不會被編碼(ASN.1語法只是一種語法規(guī)則用來描述業(yè)務(wù)數(shù)據(jù),而不會被當(dāng)成業(yè)務(wù)數(shù)據(jù)),這種值常用DEFAULT,上下界或者信息對象中。

value-referenceTypeReference ::= integer:12

如果兩個類型語法上完全一樣的,則這兩種類型的值可以相互賦值。如:

Pair::= SEQUENCE

{

x INTEGER,

y INTEGER

}

Couple::= SEQUENCE

{

x INTEGER,

y INTEGER

}

pairPair ::= {x 5, y 13}

coupleCouple ::= pair

(3).值集合

在語義上,一個值集合相當(dāng)于一個添加約束后的類型。如:

PrimeNumbers INTEGER ::= {2 | 3 | 5 | 7 | 11 | 13}

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多