def __init__(self, tag=None, byte_string=None): self.tag = tag if not self.tag: if byte_string: self.tag = ber_decoder.Tag() self.tag.decode(byte_string) self.data_tags = ( ) # This must be a tuple of the data tags for this Module
def decode(self): if self.tag: if self.tag.header.type == 1 and self.tag.header.data_length > 0: index_from = 0 data_tags_octets_counter = self.tag.header.data_length # number of header_octets for data tags cdr_last_octet = index_from + self.tag.header.data_length # pointer to the end of the CDR while data_tags_octets_counter > 0: # as long I have bytes to read tag_content = self.tag.value[index_from:cdr_last_octet] header = ber_decoder.Header(tag_content) data_tag = self.get_data_tag(header) data_tag.decode(tag_content) self.add_data_tag(data_tag) if data_tag.header.type == 1 and data_tag.header.data_length > 0: # Here I load any nested Tag in this Constructed Tag nested_index = 0 while nested_index < data_tag.header.data_length: nested_tag = ber_decoder.Tag() nested_tag.decode(data_tag.value[nested_index:]) nested_index += nested_tag.header.total_octets data_tag.add_nested_tag(nested_tag) index_from += data_tag.header.total_octets data_tags_octets_counter -= data_tag.header.total_octets else: raise ValueError("Can't decode without Tag")
def test_constructed_indefinite_length(self): data = '\xa1\x80\xa0\x82\x01]\xa1\x82\x01Y\x9f!\x01\x03\x8c\x03\x00\x00\'\x89\x03\r\x05\x07\x94\x06MSRSR1\x8d\x03\x00\x00\x00\x82\x03l\xe8\r\x92\x02\x00\x01\x93\x01\x00\x8a\x03\x0f\x05\x10\x8b\x03\x0f\x056\x9ff\x01\x04\x95\x07\x11Ep\tp\x01\xf3\x86\x08S\x12rP\x82DT\xf0\x9f\x81\x0f\x08S\x12rP\x82DTr\x85\x08\'\x02\x07#psQ\xf5\x9d\x01\x11\x9f/\x01\x05\x9b\x07\'\xf2p\t\x7f\xda9\x87\x07\x11E\x11UH\x89U\x9fU\x05\x81\xbc\xe5\x00\x00\x9fV\x07\x11Ep\tp\x01\xf3\x99\x07\x11Ep\tp\x01\xf3\x9a\x03\x0f\x05\x01\x9fe\x01\x00\x9fd\x01\x08\x9fi\x01\x08\x9fh\x01\x08\x9fj\x02\x00P\x9fk\x01\x00\x9fl\x01\x02\x9fm\x01\x02\x9fq\x02\x07\x03\x9fr\x02\x01\x00\x9fs\x02\x01\x00\x9fn\x02\x01\x06\x9fo\x02\x01\x03\x9fp\x02\x05\x03\x9f\x81\x19\x01\x03\x84\x06A\x11\x94\x94\x80\x06\xbfK\x0f\x80\x04\x00\x00\x00\x0f\x81\x07\x11Ep\t\x00\x05\xf2\x97\x07URRSR1I\x9fB\x01\x01\x81\x03\x1aV\xf0\x9fD\x05\x81\xbc\xe5\x00\x00\x83\x01\x01\x80\x03\x0b\x02\r\x9f?\x01\x13\x90\x01\x00\x91\x02\x00\x01\x8f\x01\x00\x8e\x03\x00\x00\x12\x9f#\x02\x00\x03\x9c\x07\'\xf2p\t\x7f\xda9\x9f[\x07URRSR1I\x9fJ\x06!\x11UH\x89U\x96\x05DJAMO\x9f"\x01\x00\x88\x01\x00\xa0g\xaeT\x95\x06MSRSR1\x8d\x03l\xe8\x0e\x9ff\x01\x04\x81\x02\x00\x00\x83\x02\x00\x01\x80\x03\x1aV\xf1\x82\x05\x81\xbc\xe5\x00\x00\x84\x02\x00\x08\x98\x05\x81\xbc\xe5\x00\x00\x99\x07\x11Ep\tp\x01\xf3\xa5\x15\x80\x01\x02\x81\x04\x00\x00\x00\x0f\x85\n\x92\x00\x11\x04Ep\t\x00\x05\x02\x9c\x02\x05\x800\x80\xb0\x0b\x86\x03\x0f\x04:\x88\x011\x89\x01\x01\x00\x00\xa0?\xaf=\x95\x06MSRSR1\x8d\x03l\xe8\x0f\x9ff\x01\x04\x81\x02\x00\x00\x83\x02\x00\x01\x80\x03\x1aW$\x82\x05\x81\xbc\xe5\x00\x00\x98\x05\x81\xbc\xe5\x00\x00\x99\x07\x11Ep\tp\x01\xf3\x84\x02\x00\x01\x9c\x02\x05\x80\xa0\x81\xab\xa0\x81\xa8\x9a\x01\x03\x8b\x03\x00\x00\'\x88\x03\r\x05\x07\x93\x06MSRSR1\x8c\x03\x00\x00\x00\x82\x03l\xe8\x10\x90\x02\x00\x01\x91\x01\x00\x89\x03\x0f\x05\x10\x8a\x03\x0f\x056\x9ff\x01\x04\x9f(\x03\x1aV\xf0\x83\x01\x01\x9f2\x07\x11E\x11UH\x89U\x80\x03\x0b\x02\x01\x8d\x03\x00\x00\x11\x9f*\x01\x13\x9f\x1f\x01\x00\x9f\\\x01\x00\x98\x01\x01\x8f\x01\x00\x9f.\x05\x81\xbc\xe5\x00\x00\x95\x06HGUESP\x96\x07URRSR1I\x8e\x01\x00\x9f[\x061\x11\x94\x94\x80\x06\x84\x06A\x11\x94\x94\x80\x06\x85\x07\x11E\x11UH\x89U\x9b\x01\x00\x81\x03\x1aW&\x9c\x02\x00\x03\x87\x01\x00\x00\x00' tag = ber_decoder.Tag(byte_string=data) self.assertEqual(0, tag.header.data_length)
def test_constructed_definite_length(self): data = '\xbfK\x0f\x80\x04\x00\x00\x00\x0f\x81\x07\x11Ep\t\x00\x05\xf2' tag = ber_decoder.Tag(byte_string=data) self.assertEqual(15, tag.header.data_length)
def test_primitive_length(self): data = '\x86\x03\r\x05\x07' tag = ber_decoder.Tag(byte_string=data) self.assertEqual(3, tag.header.data_length)
def test_primitive(self): data = '\x86\x03\r\x05\x07' tag = ber_decoder.Tag(byte_string=data) self.assertEqual(0, tag.type)