Skip to content

Commit

Permalink
Enable checksum setting without verification
Browse files Browse the repository at this point in the history
ref #240
  • Loading branch information
jklmnn committed Aug 27, 2020
1 parent dc93516 commit fdc2793
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 2 deletions.
15 changes: 13 additions & 2 deletions rflx/pyrflx/typevalue.py
Original file line number Diff line number Diff line change
Expand Up @@ -555,6 +555,7 @@ def __init__(
self._last_field = INITIAL.name
else:
self._preset_fields(INITIAL.name)
self.message_last_name = state.last_name if state else Last("Message")

def clone(self) -> "MessageValue":
return MessageValue(
Expand Down Expand Up @@ -949,6 +950,14 @@ def valid_path(value_range: ValueRange) -> bool:
return False
return True

def update_checksums(self) -> None:
# ISSUE: Componolit/RecordFlux#240
self._simplified_mapping.update({ValidChecksum(f): TRUE for f in self._checksums})
for checksum in self._checksums.values():
self._is_checksum_settable(checksum)
checksum_value = self._calculate_checksum(checksum)
self._fields[checksum.field_name].typeval.assign(checksum_value)

def _set_checksum(self, checksum: "MessageValue.Checksum") -> None:
self._fields[checksum.field_name].typeval.assign(0)
checksum.calculated = True
Expand Down Expand Up @@ -1077,7 +1086,7 @@ def valid_message(self) -> bool:
bool(self.valid_fields)
and self._next_field(self.valid_fields[-1]) == FINAL.name
and all(
self._is_checksum_settable(checksum)
(self._is_checksum_settable(checksum) or self._skip_verification)
and self._calculate_checksum(checksum) == self.get(checksum.field_name)
for checksum in self._checksums.values()
)
Expand All @@ -1090,6 +1099,7 @@ def __update_simplified_mapping(self, field: Optional[Field] = None) -> None:
self._simplified_mapping[field.name_length] = field.typeval.size
self._simplified_mapping[field.name_first] = field.first
self._simplified_mapping[field.name_last] = field.last
self._simplified_mapping[self.message_last_name] = field.last
return

self._simplified_mapping = {}
Expand All @@ -1108,7 +1118,7 @@ def __update_simplified_mapping(self, field: Optional[Field] = None) -> None:

pre_final = self._prev_field("Final")
if pre_final and self._fields[pre_final].set:
self._simplified_mapping[Last("Message")] = self._fields[pre_final].last
self._simplified_mapping[self.message_last_name] = self._fields[pre_final].last

def __simplified(self, expr: Expr) -> Expr:
if expr in {TRUE, FALSE}:
Expand Down Expand Up @@ -1216,3 +1226,4 @@ class State:
fields: Optional[Mapping[str, "MessageValue.Field"]] = None
checksums: Optional[Mapping[str, "MessageValue.Checksum"]] = None
type_literals: Optional[Mapping[Name, Expr]] = None
last_name: Last = Last("Message")
47 changes: 47 additions & 0 deletions tests/test_pyrflx.py
Original file line number Diff line number Diff line change
Expand Up @@ -1663,6 +1663,7 @@ def test_no_verification_icmp(icmp: MessageValue) -> None:
icmp_unv.set("Sequence_Number", 1)
icmp_unv.set("Data", b"\x00")
assert icmp_unv.bytestring == icmp.bytestring
assert icmp_unv.valid_message


def test_no_verification_ethernet(frame: MessageValue) -> None:
Expand Down Expand Up @@ -1713,3 +1714,49 @@ def test_no_verification_array_nested_messages(
array_message_unv.set("Bar", foos_unv)
assert array_message_unv.valid_message
assert array_message_unv.bytestring == array_message.bytestring


def test_no_verification_icmp_checksum(icmp_checksum: MessageValue, icmp_type: 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_type.copy(
structure=[
Link(l.source, l.target, condition=And(l.condition, ValidChecksum("Checksum")))
if l.target == FINAL
else l
for l in icmp_type.structure
],
aspects={
ID("Checksum"): {
ID("Checksum"): [
ValueRange(First("Tag"), Sub(First("Checksum"), Number(1))),
Length("Checksum"),
ValueRange(Add(Last("Checksum"), Number(1)), Last("Message")),
]
}
},
),
skip_verification=True,
)
icmp_checksum.set_checksum_function({"Checksum": icmp_checksum_function})
icmp_checksum.set("Tag", "Echo_Request")
icmp_checksum.set("Code_Zero", 0)
icmp_checksum.set("Identifier", 5)
icmp_checksum.set("Sequence_Number", 1)
icmp_checksum.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.get("Checksum")
assert icmp_checksum_unv.bytestring == icmp_checksum.bytestring

0 comments on commit fdc2793

Please sign in to comment.