Обработка вложенных DER, упакованных в OCTET STRINGs, в pyasn1 - PullRequest
0 голосов
/ 30 мая 2018

Вот как RFC 5280 определяет поле расширения X.509:

Extension  ::=  SEQUENCE  {
     extnID      OBJECT IDENTIFIER,
     critical    BOOLEAN DEFAULT FALSE,
     extnValue   OCTET STRING
                 -- contains the DER encoding of an ASN.1 value
                 -- corresponding to the extension type identified
                 -- by extnID
     }

Когда я использую декодер pyasn1, я получу объект foo, чей foo['extnValue'].asOctets() может быть дополнительно декодирован с помощьюЕще один вызов декодеру с использованием схемы, соответствующей foo['extnID'].

Вопрос: Предполагая, что в моем приложении есть один специальный extnID, возможно ли в pyasn1 определить схемучто (а) не принимает никакого ИДЕНТИФИКАТОРА ОБЪЕКТА, только специальный;и (b) проходит мимо оболочки OCTET STRING для декодирования полезной нагрузки в соответствии с соответствующей специальной «подсхемой»?

Я могу сделать это с помощью логики специального случая в коде, но я бы предпочелопределить схему специального случая, если это поддерживается.

1 Ответ

0 голосов
/ 31 мая 2018

Вы должны использовать OpenType для определения типа extnValue.Когда вы передаете декодеру карту extnID -> ASN.1 type, декодер затем проходит мимо самой внешней оболочки extnValue, пытаясь декодировать ее содержимое.

Вот краткий пример:

openType = opentype.OpenType(
        'id',
        {1: univ.Integer(),
         2: univ.OctetString()}
    )
    self.s = univ.Sequence(
        componentType=namedtype.NamedTypes(
            namedtype.NamedType('id', univ.Integer()),
            namedtype.NamedType('blob', univ.Any(), openType=openType)
        )
    )

Обязательно передайте аргумент decodeOpenTypes=True в функцию decode(), если хотите, чтобы декодер развернул эти открытые типы.

Кстати, если вы посмотрите на pyasn1-modules эта карта уже есть.Если вы используете эти определения и просто передаете decodeOpenTypes=True аргумент ключевого слова в декодер, вы должны развернуть ваши расширения.

Не существует готового способа отказать декодеру в неизвестном extnID.Вы, вероятно, можете смоделировать, что я предоставил вам свою собственную карту (возможно, основанную на dict), которая потерпит неудачу при неудачной операции key in my_map.

...