pythonasn.1pyasn1

How to recover the substrate from a pyasn1 object


I have a complicated nested ASN.1 structure as bytes. I want to find all T61Strings or similar in that structure, in the original byte encoding. Is this possible in pyasn1?

So far, I only know how to locate the the T61Strings (or whatever) in the BER-decoded Python object. I could re-encode each one, but there's no guarantee that the re-encoded values would match the originals. There's some cryptography in play here, hence the fussiness about those byte values.

If I could just do decoded_object.get_substrate(), or similar, I'd be sorted.

Thoughts?


Solution

  • Migrating the asker's solution from the question to an answer:

    Ilya Etingof's answer seems to work nicely.

    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]: