Compartilhar via


Tipos construídos

Um tipo ASN.1 ( Abstract Syntax Notation One ) construído é composto por tipos básicos, tipos de cadeia de caracteres ou outros tipos construídos. Por exemplo, uma extensão de certificado X.509 é composta de três tipos básicos do ASN.1, conforme mostrado pelo exemplo a seguir.

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

Uma extensão consiste em um OID (identificador de objeto ), um valor booliano que identifica se a extensão é crítica e uma matriz de bytes que contém o valor. A API de Registro de Certificado dá suporte aos seguintes tipos ASN.1 construídos.

SEQUENCE e SEQUENCE OF

Marca de codificação: 0x30

Contém uma série ordenada de campos de um ou mais tipos. Os campos podem ser marcados comoOPCIONAL ou PADRÃO. Além disso, para evitar ambiguidade ao decodificar, campos opcionais sucessivos devem ser diferentes uns dos outros pelo uso de um identificador exclusivo (um inteiro entre colchetes, como [1]) e de um campo obrigatório a seguir, conforme mostrado pelo exemplo a seguir.

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

A diferença entre SEQUENCE e SEQUENCE OF é que os elementos de um constructo SEQUENCE OF devem ser do mesmo tipo. Veja o exemplo a seguir. Ambos os constructos têm o mesmo valor de marca (0x30) quando codificados.

PolicyQualifiers ::=  SEQUENCE OF PolicyQualifierInfo

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

Outra maneira de examinar a diferença entre SEQUENCE e SEQUENCE OF é compará-los com seus equivalentes na linguagem de programação C. Ou seja, SEQUENCE é aproximadamente equivalente a uma estrutura e SEQUENCE OF é aproximadamente equivalente a uma matriz.

SET e SET OF

Marca de codificação: 0x31

Contém uma série não ordenada de campos de um ou mais tipos. Isso difere de uma SEQUENCE que contém uma lista ordenada. Especificar uma lista não ordenada permite que um aplicativo forneça os campos de estrutura para o codificador na ordem mais apropriada. Assim como ocorre com SEQUENCE, os campos de um constructo SET podem ser marcados com OPTIONAL ou DEFAULT, e identificadores exclusivos devem ser usados para desambiguar o processo de decodificação. A diferença entre SET e SET OF é que os elementos de um constructo SET OF devem ser do mesmo tipo.

Name ::= SEQUENCE OF RelativeDistinguishedName

RelativeDistinguishedName ::= SET OF AttributeTypeValue

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

ESCOLHA

Marca de codificação: não aplicável

Define uma escolha entre alternativas. Cada alternativa deve ser identificada exclusivamente por um inteiro entre colchetes para evitar ambiguidade ao decodificar. Quando codificado, o constructo CHOICE terá o valor da marca de codificação da alternativa escolhida.

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
}

Sistema de tipos ASN.1

Codificação DER de tipos ASN.1

Distinguished Encoding Rules