建構的類型
建構的 抽象語法標記法一 (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
}
相關主題