Криптографическая библиотека 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. :-(

0
user2690527 14 Июн 2020 в 17:35

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.

2
YaFred 14 Июн 2020 в 19:01