[0]和[3]如何在ASN1中工作?

Coc*_*ics 9 asn.1 ssl-certificate

我正在解码ASN1(在X.509中用于HTTPS证书).我做得很好,但有一件事,我找不到和可以理解的文件.

在JS ASN1解析器(例如http://lapo.it/asn1js/)中,您在SEQUENCE元素下看到[0]和[3],第一个在数据中看起来像这样:A0 03 02 01 02.我想要知道这意味着什么以及如何解码它.

另一个例子是http://www.jensign.com/JavaScience/GetTBSCert/index.html,在前两个SEQUENCE元素之后有一个[0].

我不明白的是A0如何适应标签字节的前2位是一类的方案,下一个原语/构造位,其余5个应该是标签类型.A0是10100000,这意味着标签类型值将为零.

Kev*_*vin 15

听起来你需要ASN.1标记的介绍.有两个角度可以解决这个问题.X.690定义了BER/CER/DER编码规则.因此,它回答了如何编码标签的问题.X.680定义了ASN.1本身.因此,它定义了标记的语法和规则.这两个规范都可以在ITU-T网站上找到.我会给你一个快速概述.

标签在BER/DER/CER中用于识别类型.它们对于区分SEQUENCE的组成部分和CHOICE的替代方案特别有用.

标签组合了标签类和标签号.标签类是UNIVERSAL,APPLICATION,PRIVATE和CONTEXT-SPECIFIC.UNIVERSAL类基本上用于内置类型.APPLICATION通常用于用户定义的类型.CONTEXT-SPECIFIC通常用于构造类型内的组件(SEQUENCE,CHOICE,SEQUENCE OF).从语法上讲,当在ASN.1模块中指定标记时,它们被写在括号内:[tag_class tag_number]; 对于CONTEXT-SPECIFIC,省略tag_class.因此,[APPLICATION 10]或[0].

虽然每个ASN.1类型都有一个关联的标记,但在语法上还有"TaggedType",ASN.1作者使用它来指定用于编码类型的标记.基本上,TaggedType将标记前缀放在类型之前.例如:

MyType ::= SEQUENCE {
  field_with_tagged_type [0] UTF8String
}
Run Code Online (Sandbox Code Playgroud)

TaggedType中的标记是显式的或隐式的.如果是显式的,这意味着我希望显式编码原始标记.如果隐含,这意味着我很高兴只有我指定的标签被编码.在显式情况下,BER编码产生嵌套的TLV(标签长度值):外部标签(上例中的[0]),长度,然后另一个TLV作为值.在该示例中,该内部TLV对于UTF8String将具有[UNIVERSAL 12]的标签.

标记是显式还是隐式取决于您如何编写标记和标记环境.例如:

MyType2 ::= SEQUENCE {
  field_with_explicit_tag [0] EXPLICIT UTF8String OPTIONAL,
  field_with_implicit_tag [1] IMPLICIT UTF8String OPTIONAL,
  field_with_tag [2] UTF8String OPTIONAL
}
Run Code Online (Sandbox Code Playgroud)

如果既未指定IMPLICIT也未指定EXPLICIT,则有一些规则可定义标记是显式还是隐式(参见X.680 31).这些规则考虑了为ASN.1模块定义的标记环境.ASN.1模块可以将标记环境指定为IMPLICIT TAGS,EXPLICIT TAGS或AUTOMATIC TAGS. 粗略地说,如果没有为标记指定IMPLICIT或EXPLICIT,如果标记环境是EXPLICIT,则标记将是显式的,如果标记环境是IMPLICIT或AUTOMATIC,则标记将是隐式标记.自动标记环境与IMPLICIT标记环境基本相同,只是为SEQUENCE和CHOICE类型的成员自动分配唯一标记.

请注意,在上面的示例中,MyType2的三个组件都是可选的.在BER/CER/DER中,解码器将根据编码标签知道存在哪个组件(显然最好是唯一的).


小智 13

ASN.1 BER和DER使用ASN.1 TAGS来明确识别编码流中的某些组件.有4类ASN.1标记:UNIVERSAL,APPICATION,PRIVATE和特定于上下文.[0]是特定于上下文的标记,因为它前面没有标记类keword.UNIVERSAL保留给ASN.1中的内置类型.大多数情况下,您会看到特定于上下文的标记,以消除包含OPTIONAL元素的SEQUENCE中的潜在歧义.如果你知道你收到两个不可选的项目,一个接一个,你就知道即使它们的标签是相同的也是哪个.但是,如果第一个是可选的,那么两者必须具有不同的标签,否则如果编码中只有一个标签,您将无法分辨您收到的标签.

最常见的今天,ASN.1规范使用"自动标签",让您不必因为顺序,设置和选择自动获取上下文特定的标签开始的组件担心这种歧义的讯息[0],[每个组件的1],[2]等.

您可以在http://www.oss.com/asn1/resources/books-whitepapers-pubs/asn1-books.html找到有关ASN.1标签的更多信息,其中有两本免费下载书籍.

另一个优秀的资源是http://asn1-playground.oss.com,您可以在其中使用在线编译器和编码器/解码器中的不同标签尝试ASN.1规范的变体.在那里,您可以看到标签更改对编码的影响.