构造类型

构造的 抽象语法表示法一(ASN.1)类型由基本类型、字符串类型或其他构造类型组成。 例如,X.509 证书扩展由三种基本 ASN.1 类型组成,如以下示例所示。

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

扩展由 对象标识符(OID)、一个布尔值(用于标识扩展是否关键)和包含值的字节数组组成。 证书注册 API 支持以下构造的 ASN.1 类型。

SEQUENCE 和 SEQUENCE OF

编码标记:0x30

包含一个或多个类型的有序字段系列。 字段可以标记为可选DEFAULT。 此外,为了避免解码时出现歧义,连续可选字段应通过使用唯一标识符(括号整数(如 [1])和以下必需字段而彼此不同,如以下示例所示。

SomeValue ::= SEQUENCE 
{
   a     INTEGER,
   b     [0] INTEGER OPTIONAL,
   c     [1] INTEGER DEFAULT 1,
   d     INTEGER
}

SEQUENCESEQUENCE OF 的区别在于,SEQUENCE OF 构造的元素的类型必须相同。 请参阅以下示例。 编码时,这两个构造具有相同的标记值(0x30)。

PolicyQualifiers ::=  SEQUENCE OF PolicyQualifierInfo

PolicyQualifierInfo ::= SEQUENCE 
{
   policyQualifierId   OBJECT IDENTIFIER,
   qualifier           ANY OPTIONAL
}

另一种观察 SEQUENCESEQUENCE OF 之间的差异的另一种方法是将它们与 C 编程语言中的对应项进行比较。 也就是说,SEQUENCE 大致等效于结构,SEQUENCE OF 大致等效于数组。

SET 和 SET OF

编码标记:0x31

包含一个或多个类型的无序字段系列。 这不同于包含有序列表的 SEQUENCE。 指定无序列表使应用程序能够以最合适的顺序向编码器提供结构字段。 与 SEQUENCE一样,SET 构造的字段可以使用 OPTIONALDEFAULT进行标记,并且必须使用唯一标识符来消除解码过程。 SETSET OF 的区别在于,SET OF 构造的元素的类型必须相同。

Name ::= SEQUENCE OF RelativeDistinguishedName

RelativeDistinguishedName ::= SET OF AttributeTypeValue

AttributeTypeValue ::= SEQUENCE 
{
   type       OBJECT IDENTIFIER,
   value      ANY 
}

选择

编码标记:不适用

定义替代项之间的选择。 每个替代项必须由括号整数唯一标识,以避免解码时出现歧义。 编码后,CHOICE 构造将具有所选替代项的编码标记值。

AltNames ::= SEQUENCE OF GeneralName

GeneralNames ::= AltNames

GeneralName ::= CHOICE 
{
   otherName               [0] IMPLICIT OtherName,
   rfc822Name              [1] IMPLICIT IA5String,
   dNSName                 [2] IMPLICIT IA5String,
   x400Address             [3] IMPLICIT SeqOfAny,
   directoryName           [4] EXPLICIT Name,
   ediPartyName            [5] IMPLICIT SEQUENCE OF ANY,
   uniformResourceLocator  [6] IMPLICIT IA5String,
   iPAddress               [7] IMPLICIT OCTET STRING,
   registeredID            [8] IMPLICIT OBJECT IDENTIFIER
}

ASN.1 类型系统

ASN.1 类型的 DER 编码

可分辨编码规则