Freigeben über


Konstruierte Typen

Ein konstruierter abstrakter Syntaxnotation One (ASN.1)-Typs besteht aus grundlegenden Typen, Zeichenfolgentypen oder anderen konstruierten Typen. Beispielsweise besteht eine X.509-Zertifikaterweiterung aus drei grundlegenden ASN.1-Typen, wie im folgenden Beispiel gezeigt.

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

Eine Erweiterung besteht aus einem Objektbezeichner (OID), einem booleschen Wert, der angibt, ob die Erweiterung kritisch ist, und einem Bytearray, das den Wert enthält. Die Zertifikatregistrierungs-API unterstützt die folgenden erstellten ASN.1-Typen.

SEQUENZ UND SEQUENZ VON

Codierungstag: 0x30

Enthält eine sortierte Reihe von Feldern eines oder mehrerer Typen. Felder könnenOPTIONALen oder DEFAULT-markiert werden. Um mehrdeutige Ambiguität beim Decodieren zu vermeiden, sollten sich die aufeinanderfolgenden optionalen Felder durch Verwendung eines eindeutigen Bezeichners (eine klammerte ganze Zahl wie [1]) und von einem folgenden erforderlichen Feld unterscheiden, wie im folgenden Beispiel gezeigt.

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

Der Unterschied zwischen SEQUENCE und SEQUENCE OF besteht darin, dass die Elemente eines SEQUENCE OF-Konstrukts denselben Typ aufweisen müssen. Sehen Sie sich das folgende Beispiel an. Beide Konstrukte haben denselben Tagwert (0x30), wenn sie codiert sind.

PolicyQualifiers ::=  SEQUENCE OF PolicyQualifierInfo

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

Eine weitere Möglichkeit, den Unterschied zwischen SEQUENCE und SEQUENCE OF zu betrachten, besteht darin, sie mit ihren Gegenstücken in der Programmiersprache C zu vergleichen. Das heißt, SEQUENCE entspricht ungefähr einer Struktur und SEQUENCE OF entspricht ungefähr einem Array.

SET UND SET OF

Codierungstag: 0x31

Enthält eine nicht geordnete Reihe von Feldern eines oder mehrerer Typen. Dies unterscheidet sich von einer SEQUENCE, die eine sortierte Liste enthält. Wenn Sie eine nicht sortierte Liste angeben, kann eine Anwendung die Strukturfelder dem Encoder in der am besten geeigneten Reihenfolge bereitstellen. Wie bei SEQUENCEkönnen die Felder eines SET--Konstrukts mit OPTIONALen oder DEFAULT-gekennzeichnet werden, und eindeutige Bezeichner müssen verwendet werden, um den Decodierungsprozess zu disambiguieren. Der Unterschied zwischen SET und SET OF besteht darin, dass die Elemente eines SET OF-Konstrukts denselben Typ aufweisen müssen.

Name ::= SEQUENCE OF RelativeDistinguishedName

RelativeDistinguishedName ::= SET OF AttributeTypeValue

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

WAHL

Codierungstag: nicht zutreffend

Definiert eine Auswahl zwischen Alternativen. Jede Alternative muss durch eine eckige ganze Zahl eindeutig identifiziert werden, um Mehrdeutigkeit beim Decodieren zu vermeiden. Bei der Codierung hat das CHOICE--Konstrukt den Codierungstagwert der ausgewählten Alternative.

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-Typsystem-

DER-Codierung von ASN.1-Typen

Distinguished Encoding Rules