def test_message_copy() -> None: message = Message( "P.M", [Link(INITIAL, Field("F")), Link(Field("F"), FINAL)], {Field("F"): MODULAR_INTEGER}, ) assert_equal( message.copy(identifier="A.B"), Message( "A.B", [Link(INITIAL, Field("F")), Link(Field("F"), FINAL)], {Field("F"): MODULAR_INTEGER}, ), ) assert_equal( message.copy( structure=[Link(INITIAL, Field("C")), Link(Field("C"), FINAL)], types={Field("C"): RANGE_INTEGER}, ), Message( "P.M", [Link(INITIAL, Field("C")), Link(Field("C"), FINAL)], {Field("C"): RANGE_INTEGER}, ), )
def fixture_icmp_checksum_message_first(icmp_message: model.Message) -> pyrflx.MessageValue: return pyrflx.MessageValue( icmp_message.copy( structure=[ model.Link( l.source, l.target, condition=expr.And(l.condition, expr.ValidChecksum("Checksum")), ) if l.target == model.FINAL else l for l in icmp_message.structure ], checksums={ ID("Checksum"): [ expr.ValueRange( expr.First("Message"), expr.Sub(expr.First("Checksum"), expr.Number(1)) ), expr.Size("Checksum"), expr.ValueRange( expr.Add(expr.Last("Checksum"), expr.Number(1)), expr.Last("Message") ), ] }, ) )
def _expand_message_links(self, message: Message, messages: Dict[ID, Message]) -> Message: """Split disjunctions in link conditions.""" structure = [] for link in message.structure: conditions = self._expand_expression(link.condition.simplified()) if len(conditions) == 1: structure.append(link) continue for condition in conditions: structure.append( Link( link.source, link.target, condition, link.size, link.first, condition.location, )) types = { f: self._replace_messages(t, messages) for f, t in message.types.items() } return message.copy(structure=structure, types=types)
def test_no_verification_icmp_checksum( icmp_checksum_message_value: MessageValue, icmp_message: Message) -> None: test_data = ( b"\x47\xb4\x67\x5e\x00\x00\x00\x00" b"\x4a\xfc\x0d\x00\x00\x00\x00\x00\x10\x11\x12\x13\x14\x15\x16\x17" b"\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27" b"\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37") icmp_checksum_unv = MessageValue( icmp_message.copy( structure=[ Link(l.source, l.target, condition=And(l.condition, ValidChecksum("Checksum"))) if l.target == FINAL else l for l in icmp_message.structure ], checksums={ ID("Checksum"): [ ValueRange(First("Tag"), Sub(First("Checksum"), Number(1))), Size("Checksum"), ValueRange(Add(Last("Checksum"), Number(1)), Last("Message")), ] }, ), skip_verification=True, ) icmp_checksum_message_value.set_checksum_function( {"Checksum": icmp_checksum_function}) icmp_checksum_message_value.set("Tag", "Echo_Request") icmp_checksum_message_value.set("Code_Zero", 0) icmp_checksum_message_value.set("Identifier", 5) icmp_checksum_message_value.set("Sequence_Number", 1) icmp_checksum_message_value.set("Data", test_data) icmp_checksum_unv.set_checksum_function( {"Checksum": icmp_checksum_function}) icmp_checksum_unv.set("Tag", "Echo_Request") icmp_checksum_unv.set("Code_Zero", 0) icmp_checksum_unv.set("Checksum", 0) icmp_checksum_unv.set("Identifier", 5) icmp_checksum_unv.set("Sequence_Number", 1) icmp_checksum_unv.set("Data", test_data) icmp_checksum_unv.update_checksums() assert icmp_checksum_unv.valid_message assert icmp_checksum_unv.get( "Checksum") == icmp_checksum_message_value.get("Checksum") assert icmp_checksum_unv.bytestring == icmp_checksum_message_value.bytestring