pyasn1 против структур неопределенной длины - PullRequest
2 голосов
/ 22 июня 2019

Является ли ошибкой то, что pyasn1 не может проанализировать без посторонней помощи (без определения нового типа) построенные данные неопределенной длины, описанные в фрагменте кода ниже, или мой пример не является допустимым в кодировке BER ASN.1

Если pyasn1 не может справиться с этим без помощи, есть ли другая библиотека Python, к которой я мог бы обратиться?


# e7 80       : private, constructed, tag 7, indefinite length
#    02 01 44 : integer 0x44
#    02 01 55 : integer 0x55
#    00 00    : end of contents (terminating the 0xe7 object)
data = 'e7 80 02 01 44 02 01 55 00 00'

data = binascii.unhexlify( ''.join(data.split()) )

# throws pyasn1.error.PyAsn1Error: Missing end-of-octets terminator
pyasn1.codec.ber.decoder.decode(data)

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Ваш пример совершенно действителен (кодировка BER)

Вы даже можете использовать https://asn1.io/asn1playground/, чтобы доказать, что

Скомпилируйте следующую схему:

Schema DEFINITIONS EXPLICIT TAGS ::= 
BEGIN
  ASequence::= [PRIVATE 7] IMPLICIT SEQUENCE       
  {                                                     
    num1 INTEGER,
    num2 INTEGER
  }                                                     
END

И расшифровать e7 80 02 01 44 02 01 55 00 00

Результат будет:

> OSS ASN-1Step Version 9.0.1 Copyright (C) 2019 OSS Nokalva, Inc.  All
> rights reserved. This product is licensed for use by "OSS Nokalva,
> Inc."
> 
> C0043I: 0 error messages, 0 warning messages and 0 informatory
> messages issued.
> 
> 
> ASN1STEP: Decoding PDU #1 :
> 
> ASequence SEQUENCE: tag = [PRIVATE 7] constructed; length = indef  
> num1 INTEGER: tag = [UNIVERSAL 2] primitive; length = 1
>     68   
> num2 INTEGER: tag = [UNIVERSAL 2] primitive; length = 1
>     85 
> EOC 
> Successfully decoded 10 bytes. rec1value ASequence ::=  {   num1 68,   num2 85 }

Обратите внимание, что вам не нужна схема для декодирования этого (вы просто потеряете семантику)

Вам понадобится понимание от pyasn1. Попробуйте открыть номер здесь: https://github.com/etingof/pyasn1/issues

0 голосов
/ 22 июня 2019

Данные вашего примера выглядят некорректно. Я не знаю деталей, но похоже, что это первый байт ваших данных 'e7'. Я понимаю, что это «тип» сообщения. Похоже, этот тип должен ожидать больше данных, чем вы его даете.

Я вижу примеры, которые используют «30» в качестве первого байта, представляющего «последовательность». Эти примеры очень похожи на ваши. Поэтому я попытался заменить 'e7' на '30' в данных вашего примера, и с этим изменением ваш код работает без ошибок.

Чтобы было ясно, что я говорю, этот код работает для меня без ошибок:

# 30 80       : sequence, indefinite length
#    02 01 44 : integer 0x44
#    02 01 55 : integer 0x55
#    00 00    : end of contents (terminating the 0x30 object)
data = '30 80 02 01 44 02 01 55 00 00'

data = binascii.unhexlify( ''.join(data.split()) )

# throws pyasn1.error.PyAsn1Error: Missing end-of-octets terminator
pyasn1.codec.ber.decoder.decode(data)

Я считаю, что это показывает, что ваш код "правильный". Хотелось бы, чтобы я знал больше об этом, чтобы я мог больше помочь, например, объяснить вам, что такое тип "e7". Без этого я надеюсь, что это все еще полезно.

...