共用方式為


建構的類型

建構的 抽象語法表示法一 (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

包含一或多個類型的已排序欄位序列。 欄位可以標示為OPTIONALDEFAULT。 此外,為了避免譯碼時模棱兩可,後續選擇性字段應該使用唯一標識符(如 [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。 指定未排序的清單可讓應用程式以最適當的順序,將結構字段提供給編碼器。 如同 SEQUENCESET 建構的欄位可以 標示為選擇性DEFAULT,而且必須使用唯一標識符來釐清譯碼程式。 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 編碼

辨別編碼規則