Криптографическая библиотека Botan имеет очень ограниченную поддержку расширения X.509 CRLDistributionPoint
и фактически выдает исключение, если установлен какой-либо из «расширенных» атрибутов расширения, которые не ожидаются Botan.
Следовательно, я пытаюсь исправить декодирование этого расширения, но у меня проблема с правильным определением типа закодированных объектов на основе тегов. Либо это упущение в спецификации для этого расширения (я сомневаюсь), либо я подвержен фундаментальному непониманию правил кодирования / декодирования.
Вот соответствующие части спецификации
CertificateExtensions {joint-iso-itu-t ds(5) module(1)
certificateExtensions(26) 5} DEFINITIONS IMPLICIT TAGS
CRLDistPointsSyntax ::= SEQUENCE SIZE (1..MAX) OF DistributionPoint
DistributionPoint ::= SEQUENCE {
distributionPoint [0] DistributionPointName OPTIONAL,
reasons [1] ReasonFlags OPTIONAL,
cRLIssuer [2] GeneralNames OPTIONAL
}
DistributionPointName ::= CHOICE {
fullName [0] GeneralNames,
nameRelativeToCRLIssuer [1] RelativeDistinguishedName
}
По умолчанию модули используют неявную пометку. В дальнейшем это будет важно. DistributionPoint
- это ПОСЛЕДОВАТЕЛЬНОСТЬ, в которой все атрибуты являются необязательными. Первый необязательный атрибут distributionPoint
имеет тег типа 0 и имеет тип DistributionPointName
. В свою очередь, DistributionPointName
- это ВЫБОР с возможными вариантами: либо тег 0 (если выбран GeneralNames
), либо тег 1 (если выбран RelativeDistinguishedName
).
Насколько я понимаю, в случае неявного тегирования тип CHOICE кодируется с использованием тега выбранного типа. Другими словами, тип CHOICE не является каким-то образом «вложенным», а кодируется на том же уровне, на котором используется тип CHOICE. Но DistributionPointName
уже получил тег 0.
Конкретный вопрос: как кодируется DistributionPoint
, если nameRelativeToCRLIssuer
(тег 1) выбран в качестве варианта для DistributionPointName
, не вызывая конфликта с тегом 1 reasons
атрибут?
Вот иллюстрация моей проблемы:
30 // Type tag for outer SEQUENCE, DistributionPoint starts here
ll // Length of SEQUENCE, omitted here for editorial purposes
+--> 00 vs 01 // Type tag for distributionPoint
| // At first glance, 00 according to SEQUENCE definition for OPTIONAL DistributionPointName,
| // but maybe 01 if RelativeDistinguishedName is the selected CHOICE
| kk // Length of RelativeDistinguishedName, omitted here for editorial purposes
| vv // Encoding of RelativeDistinguishedName begins
| vv
| vv // Encoding of RelativeDistinguishedName ends, accordingly to length kk
+--> 01 // Type tag for OPTIONAL ReasonsFlags
jj // Length of ReasonsFlags
ww // Encoding of ReasonsFlags begins
ww
ww // Encoding of ReasonsFlags ends, accordingly to length jj
// Encoding of DistributionPoint ends, too, accordingly to length ll
В третьей строке тег типа должен иметь значение 00, чтобы указать, что ДОПОЛНИТЕЛЬНОЕ имя точки распространения существует. Это также позволяет избежать конфликта с тегом типа 01 в строке 8 для ДОПОЛНИТЕЛЬНЫХ ReasonFlags. Однако в третьей строке тег типа также должен указывать, какой тип был выбран для DistributionPointName. :-(
1 ответ
Насколько я понимаю, в случае неявного тегирования тип CHOICE кодируется с использованием тега выбранного типа. Другими словами, тип CHOICE не является каким-то образом «вложенным», а кодируется на том же уровне, на котором используется тип CHOICE. Но DistributionPointName уже получил тег 0.
Боюсь, что все наоборот: теги CHOICE всегда явные, независимо от тегов по умолчанию ...
В документе X.680 есть следующее примечание
Конструкция тегирования определяет явное тегирование, если выполняется одно из следующих условий:
c) используется альтернатива «Тип тега» и значение «TagDefault» для модуля - IMPLICIT TAGS или AUTOMATIC TAGS, но тип, определенный параметром «Type», является немаркированным типом выбора, немаркированным открытым типом или немаркированным » DummyReference »(см. Рек. МСЭ-T X.683 | ISO / IEC 8824-4, 8.3).
Итак, если выбрано RelativeDistinguishedName, маркировка компонента distributionPoint будет равна 0 (distributionPoint), а затем 1 (RelativeDistinguishedName).
Причина в том, что CHOICE не имеет тега UNIVERSAL.
Похожие вопросы
Связанные вопросы
Новые вопросы
x509
В криптографии X.509 является стандартом для инфраструктуры открытых ключей (PKI) для единого входа (SSO) и инфраструктуры управления привилегиями (PMI).