def test_sync_word_finding_varying_message_length(self): hex_messages = [ "aaaa9a7d0f1337471100009a44ebdd13517bf9", "aaaa9a7d4747111337000134a4473c002b909630b11df37e34728c79c60396176aff2b5384e82f31511581d0cbb4822ad1b6734e2372ad5cf4af4c9d6b067e5f7ec359ec443c3b5ddc7a9e", "aaaa9a7d0f13374711000205ee081d26c86b8c", "aaaa9a7d474711133700037cae4cda789885f88f5fb29adc9acf954cb2850b9d94e7f3b009347c466790e89f2bcd728987d4670690861bbaa120f71f14d4ef8dc738a6d7c30e7d2143c267", "aaaa9a7d0f133747110004c2906142300427f3" ] messages = [ Message.from_plain_hex_str(hex_msg) for hex_msg in hex_messages ] for i in range(1, len(messages)): messages[i].message_type = messages[0].message_type ff = FormatFinder(messages) ff.run() self.assertEqual(len(ff.message_types), 1) preamble = ff.message_types[0].get_first_label_with_type( FieldType.Function.PREAMBLE) self.assertEqual(preamble.start, 0) self.assertEqual(preamble.length, 16) sync = ff.message_types[0].get_first_label_with_type( FieldType.Function.SYNC) self.assertEqual(sync.start, 16) self.assertEqual(sync.length, 16)
def test_multiple_sync_words(self): hex_messages = [ "aaS1234", "aaScafe", "aaSdead", "aaSbeef", ] for i in range(1, 256): messages = [] sync = "{0:02x}".format(i) if sync.startswith("a"): continue for msg in hex_messages: messages.append( Message.from_plain_hex_str(msg.replace("S", sync))) for i in range(1, len(messages)): messages[i].message_type = messages[0].message_type ff = FormatFinder(messages) ff.run() self.assertEqual(len(ff.message_types), 1, msg=sync) preamble = ff.message_types[0].get_first_label_with_type( FieldType.Function.PREAMBLE) self.assertEqual(preamble.start, 0, msg=sync) self.assertEqual(preamble.length, 8, msg=sync) sync = ff.message_types[0].get_first_label_with_type( FieldType.Function.SYNC) self.assertEqual(sync.start, 8, msg=sync) self.assertEqual(sync.length, 8, msg=sync)
def test_protocol_with_acks_and_checksum(self): proto_file = get_path_for_data_file("ack_frames_with_crc.proto.xml") protocol = ProtocolAnalyzer(signal=None, filename=proto_file) protocol.from_xml_file(filename=proto_file, read_bits=True) self.clear_message_types(protocol.messages) ff = FormatFinder(protocol.messages) ff.known_participant_addresses.clear() ff.run() self.assertEqual( util.convert_numbers_to_hex_string( ff.known_participant_addresses[0]), "1337") self.assertEqual( util.convert_numbers_to_hex_string( ff.known_participant_addresses[1]), "4711") for mt in ff.message_types: preamble = mt.get_first_label_with_type( FieldType.Function.PREAMBLE) self.assertEqual(preamble.start, 0) self.assertEqual(preamble.length, 16) sync = mt.get_first_label_with_type(FieldType.Function.SYNC) self.assertEqual(sync.start, 16) self.assertEqual(sync.length, 16) length = mt.get_first_label_with_type(FieldType.Function.LENGTH) self.assertEqual(length.start, 32) self.assertEqual(length.length, 8)
def test_find_generated_crc16(self): mb = MessageTypeBuilder("data") mb.add_label(FieldType.Function.PREAMBLE, 8) mb.add_label(FieldType.Function.SYNC, 16) mb.add_label(FieldType.Function.LENGTH, 8) mb.add_label(FieldType.Function.DATA, 32) mb.add_checksum_label(16, GenericCRC.from_standard_checksum("CRC16 CCITT")) mb2 = MessageTypeBuilder("data2") mb2.add_label(FieldType.Function.PREAMBLE, 8) mb2.add_label(FieldType.Function.SYNC, 16) mb2.add_label(FieldType.Function.LENGTH, 8) mb2.add_label(FieldType.Function.DATA, 16) mb2.add_checksum_label(16, GenericCRC.from_standard_checksum("CRC16 CCITT")) pg = ProtocolGenerator([mb.message_type, mb2.message_type], syncs_by_mt={mb.message_type: "0x1234", mb2.message_type: "0x1234"}) num_messages = 5 for i in range(num_messages): pg.generate_message(data="{0:032b}".format(i), message_type=mb.message_type) pg.generate_message(data="{0:016b}".format(i), message_type=mb2.message_type) #self.save_protocol("crc16_test", pg) self.clear_message_types(pg.protocol.messages) ff = FormatFinder(pg.protocol.messages) ff.run() self.assertEqual(len(ff.message_types), 2) for mt in ff.message_types: checksum_label = mt.get_first_label_with_type(FieldType.Function.CHECKSUM) self.assertEqual(checksum_label.length, 16) self.assertEqual(checksum_label.checksum.caption, "CRC16 CCITT")
def run_format_finder_for_protocol(protocol: ProtocolAnalyzer): ff = FormatFinder(protocol.messages) ff.known_participant_addresses.clear() ff.run() for msg_type, indices in ff.existing_message_types.items(): for i in indices: protocol.messages[i].message_type = msg_type
def auto_assign_labels(self): from urh.awre.FormatFinder import FormatFinder format_finder = FormatFinder(self.messages) format_finder.run(max_iterations=10) self.message_types[:] = format_finder.message_types for msg_type, indices in format_finder.existing_message_types.items(): for i in indices: self.messages[i].message_type = msg_type
def test_without_preamble(self): alice = Participant("Alice", address_hex="24") broadcast = Participant("Broadcast", address_hex="ff") mb = MessageTypeBuilder("data") mb.add_label(FieldType.Function.SYNC, 16) mb.add_label(FieldType.Function.LENGTH, 8) mb.add_label(FieldType.Function.SRC_ADDRESS, 8) mb.add_label(FieldType.Function.SEQUENCE_NUMBER, 8) pg = ProtocolGenerator([mb.message_type], syncs_by_mt={mb.message_type: "0x8e88"}, preambles_by_mt={mb.message_type: "10" * 8}, participants=[alice, broadcast]) for i in range(20): data_bits = 16 if i % 2 == 0 else 32 source = pg.participants[i % 2] destination = pg.participants[(i + 1) % 2] pg.generate_message(data="1010" * (data_bits // 4), source=source, destination=destination) #self.save_protocol("without_preamble", pg) self.clear_message_types(pg.messages) ff = FormatFinder(pg.messages) ff.known_participant_addresses.clear() ff.run() self.assertEqual(len(ff.message_types), 1) mt = ff.message_types[0] sync = mt.get_first_label_with_type(FieldType.Function.SYNC) self.assertEqual(sync.start, 0) self.assertEqual(sync.length, 16) length = mt.get_first_label_with_type(FieldType.Function.LENGTH) self.assertEqual(length.start, 16) self.assertEqual(length.length, 8) dst = mt.get_first_label_with_type(FieldType.Function.SRC_ADDRESS) self.assertEqual(dst.start, 24) self.assertEqual(dst.length, 8) seq = mt.get_first_label_with_type(FieldType.Function.SEQUENCE_NUMBER) self.assertEqual(seq.start, 32) self.assertEqual(seq.length, 8)
def test_three_participants_with_ack(self): alice = Participant("Alice", address_hex="1337") bob = Participant("Bob", address_hex="4711") carl = Participant("Carl", address_hex="cafe") mb = MessageTypeBuilder("data") mb.add_label(FieldType.Function.PREAMBLE, 16) mb.add_label(FieldType.Function.SYNC, 16) mb.add_label(FieldType.Function.LENGTH, 8) mb.add_label(FieldType.Function.SRC_ADDRESS, 16) mb.add_label(FieldType.Function.DST_ADDRESS, 16) mb.add_label(FieldType.Function.SEQUENCE_NUMBER, 16) mb_ack = MessageTypeBuilder("ack") mb_ack.add_label(FieldType.Function.PREAMBLE, 16) mb_ack.add_label(FieldType.Function.SYNC, 16) mb_ack.add_label(FieldType.Function.LENGTH, 8) mb_ack.add_label(FieldType.Function.DST_ADDRESS, 16) pg = ProtocolGenerator([mb.message_type, mb_ack.message_type], syncs_by_mt={ mb.message_type: "0x9a7d", mb_ack.message_type: "0x9a7d" }, preambles_by_mt={ mb.message_type: "10" * 8, mb_ack.message_type: "10" * 8 }, participants=[alice, bob, carl]) i = -1 while len(pg.protocol.messages) < 20: i += 1 source = pg.participants[i % len(pg.participants)] destination = pg.participants[(i + 1) % len(pg.participants)] if i % 2 == 0: data_bytes = 8 else: data_bytes = 16 data = "".join( random.choice(["0", "1"]) for _ in range(data_bytes * 8)) pg.generate_message(data=data, source=source, destination=destination) if "ack" in (msg_type.name for msg_type in pg.protocol.message_types): pg.generate_message(message_type=1, data="", source=destination, destination=source) self.clear_message_types(pg.protocol.messages) ff = FormatFinder(pg.protocol.messages) ff.known_participant_addresses.clear() self.assertEqual(len(ff.known_participant_addresses), 0) ff.run() # Since there are ACKS in this protocol, the engine must be able to assign the correct participant addresses # IN CORRECT ORDER! self.assertEqual( util.convert_numbers_to_hex_string( ff.known_participant_addresses[0]), "1337") self.assertEqual( util.convert_numbers_to_hex_string( ff.known_participant_addresses[1]), "4711") self.assertEqual( util.convert_numbers_to_hex_string( ff.known_participant_addresses[2]), "cafe")