建構的類型
建構的 抽象語法表示法一 (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 建構的欄位可以 標示為選擇性 或 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
}
相關主題
-
ASN.1 類型的 DER 編碼