Как восстановить подложку из объекта pyasn1? - PullRequest
0 голосов
/ 11 мая 2018

У меня сложная вложенная структура ASN.1 в виде байтов.Я хочу найти все T61Strings (скажем) в этой структуре, в исходной кодировке байтов .Возможно ли это в pyasn1?

Пока что я знаю только, как найти строки T61Strings (или что-то еще) в BER-декодированном объекте Python.Я мог бы перекодировать каждый из них, но нет никакой гарантии, что перекодированные значения будут соответствовать оригиналам.Здесь есть какая-то криптография, отсюда и суета по поводу этих байтовых значений.

Если бы я мог просто сделать decoded_object.get_substrate() или подобное, я бы отсортировался.

Мысли?Спасибо.


Обновление: ответ Ильи Этингофа, кажется, работает хорошо.

In [61]: class X(pyasn1.codec.ber.decoder.Decoder):
    ...:     def __call__(self,*v,**kw):
    ...:         parsed,remainder = pyasn1.codec.ber.decoder.Decoder.__call__(self,*v,**kw)
    ...:         parsed._substrate = v[0][:len(v[0])-len(remainder)]
    ...:         return parsed,remainder
    ...:     

In [62]: decode = X(pyasn1.codec.ber.decoder.tagMap,pyasn1.codec.ber.decoder.typeMap)

In [63]: tmp = decode(b'\x30\x05\x02\x01\x7f\x05\x00')[0]

In [64]: tmp._substrate.encode('hex')
Out[64]: '300502017f0500'

In [65]: tmp[0]._substrate.encode('hex')
Out[65]: '02017f'

In [66]: tmp[1]._substrate.encode('hex')
Out[66]: '0500'

In [67]: 

1 Ответ

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

Это BER, а не DER?Крипто-приложения, как правило, используют DER, потому что он стабилен.Если это DER, вы должны быть в состоянии безопасно перекодировать один раз декодированные элементы и получить тот же результат.

В pyasn1 нет встроенной функции, позволяющей сопоставлять фрагменты субстрата с декодированными объектами.Но вы, вероятно, можете смоделировать это, переопределив Decoder. call () метод и отметив его параметры substrate + length, чтобы увидеть, что декодируется, и возвращаемое значениепереопределенный __call__() метод, который является объектом, полученным из подложки, которую вы наблюдаете.

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

...