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
}
Tópicos relacionados