X-Git-Url: http://www.git.cypherpunks.ru/?p=pyderasn.git;a=blobdiff_plain;f=pyderasn.py;h=8d88a3b352a0fa9238718d54578cb5d742bb6043;hp=fe1d4ab800624dfcb03307fe06b649f9ae259b3b;hb=e83a585f513b694f5f953fab15e5419e837dda7b;hpb=e9ab3a6d6679d825d0e48523cec13ff710f0220d diff --git a/pyderasn.py b/pyderasn.py index fe1d4ab..8d88a3b 100755 --- a/pyderasn.py +++ b/pyderasn.py @@ -816,6 +816,7 @@ except ImportError: # pragma: no cover __version__ = "7.0" __all__ = ( + "agg_octet_string", "Any", "BitString", "BMPString", @@ -3554,6 +3555,29 @@ class OctetString(Obj): yield pp +def agg_octet_string(evgens, decode_path, raw, writer): + """Aggregate constructed string (OctetString and its derivatives) + + :param evgens: iterator of generated events + :param decode_path: points to the string we want to decode + :param raw: slicebable (memoryview, bytearray, etc) with + the data evgens are generated one + :param writer: buffer.write where string is going to be saved + """ + decode_path_len = len(decode_path) + for dp, obj, _ in evgens: + if dp[:decode_path_len] != decode_path: + continue + if not obj.ber_encoded: + write_full(writer, raw[ + obj.offset + obj.tlen + obj.llen: + obj.offset + obj.tlen + obj.llen + obj.vlen - + (EOC_LEN if obj.expl_lenindef else 0) + ]) + if len(dp) == decode_path_len: + break + + NullState = namedtuple("NullState", BasicState._fields, **NAMEDTUPLE_KWARGS)