构造类型
构造的 抽象语法表示法 1 (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
包含一个或多个类型的有序字段系列。 字段可以标记为OPTIONAL 或 DEFAULT。 此外,为了避免解码时出现歧义,连续的可选字段应通过使用唯一标识符 (括号整数(如 [1]) )和以下必填字段(如以下示例所示)彼此不同。
SomeValue ::= SEQUENCE
{
a INTEGER,
b [0] INTEGER OPTIONAL,
c [1] INTEGER DEFAULT 1,
d INTEGER
}
SEQUENCE 和 SEQUENCE OF 的区别在于 SEQUENCE OF 构造的元素必须属于同一类型。 请参阅以下示例。 两个构造在编码时 (0x30) 具有相同的标记值。
PolicyQualifiers ::= SEQUENCE OF PolicyQualifierInfo
PolicyQualifierInfo ::= SEQUENCE
{
policyQualifierId OBJECT IDENTIFIER,
qualifier ANY OPTIONAL
}
了解 SEQUENCE 和 SEQUENCE OF 之间的差异的另一种方法是将它们与 C 编程语言中的对应项进行比较。 也就是说, SEQUENCE 大致等效于结构, SEQUENCE OF 大致等效于数组。
SET 和 SET OF
编码标记:0x31
包含一个或多个类型的无序字段系列。 这与包含有序列表的 SEQUENCE 不同。 通过指定无序列表,应用程序可以按最合适的顺序向编码器提供结构字段。 与 SEQUENCE 一样, SET 构造的字段可以标记为 OPTIONAL 或 DEFAULT,并且必须使用唯一标识符来消除解码过程的歧义。 SET 和 SET 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
}
相关主题