Сконструированные типы
Сконструированный абстрактный синтаксический нотация 1 (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
Содержит упорядоченный ряд полей одного или нескольких типов. Поля могут быть помеченыкак НЕОБЯЗАТЕЛЬНЫЕ или ПО УМОЛЧАНИЮ. Кроме того, чтобы избежать неоднозначности при декодировании, последовательные необязательные поля должны отличаться друг от друга уникальным идентификатором (целое число в скобках, например [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, поля конструкции 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
}
Связанные темы