ASN.1八位字符串

时间:2013-03-08 16:52:10

标签: decoding asn.1

我正在以ASN.1格式解码X.509证书。我正在成功地解码它,遍历结构,但有一件事我不明白。

在某些情况下,我得到一个八位字符串,我正在玩的这个网站(http://lapo.it/asn1js/)表明这些八位字节字符串实际上包含更多的ASN.1树。该网站用(封装)

注释这样的八位字符串

我的问题是:我在解析过程中如何知道八位字符串实际上是否封装了更多内容?我是否只是尝试解析它,看看我是否有标签和有效长度?如果不是那么它是纯字节数据?如果是,那么它是一个有效的子树?

或者这是否意味着以字节形式输出,然后消费者只应该尝试解析它,如果他知道它是某些键的编码数据?

以网站上已加载的示例为例,点击“解码”。我是指例如偏移332,它是一个封装位串的八位字节串。

2 个答案:

答案 0 :(得分:7)

这就是“扩展”在ASN.1中的样子(RFC 2459 §B.2 - 我知道RFC是“过时的”,但在后面的版本中没有这个有用的附录。)

Extensions ::= SEQUENCE OF Extension

Extension ::= SEQUENCE {
extnId     OBJECT IDENTIFIER,
critical   BOOLEAN DEFAULT FALSE,
extnValue  OCTET STRING }

每个扩展有效负载都封装在OCTET STRING中。扩展的OID告诉您在该八位字符串中期望什么。 如果是 keyUsage ,则为BIT STRING§4.2.1.3)。

现在我对 subjectAltName 的问题有一个答案,它位于§4.2.1.7

对内容使用OCTET STRING的一个好处是,根据规范,未知(非关键)扩展可以被识别,并且可以轻易地被忽略(尽管我认为DER也使其变得微不足道)。

答案 1 :(得分:1)

告诉ASN.1工具处理封装的方法是使用关键字" CONTAINING"。例如(这不是实际/正确的证书规范,但它应该给你一个想法):

TstCert DEFINITIONS IMPLICIT TAGS ::=
BEGIN
   Sun ::= SEQUENCE {
       subjAltType OBJECT IDENTIFIER,
       name GenNames
   }

   GenNames ::= SEQUENCE SIZE (1..5) OF GenName

   GenName ::= CHOICE {
       otherName   [0] OtherName,
       rfc822Name  [1] UTF8String
   }

   OtherName ::= OCTET STRING (CONTAINING SEQUENCE {
       type-id OBJECT IDENTIFIER,
       value [0] EXPLICIT UTF8String
   } )
END