laforge has uploaded this change for review. ( https://gerrit.osmocom.org/c/pysim/+/33249 )
Change subject: 31.102: Fix EF.Routing_Indicator for odd number of digits ...................................................................... 31.102: Fix EF.Routing_Indicator for odd number of digits The routing indicator is BCD-encoded but has an arbitrary length of 1, 2, 3 or 4 digits. In order to support the odd lengths of 1 or 3, we must not pad on the byte level, but on the nibble level. This requires a slight extension of the Rpad() Adapter. Change-Id: I6c26dccdd570de7b7a4cd48338068e230340ec7c Fixes: OS#6054 --- M pySim/construct.py M pySim/ts_31_102.py 2 files changed, 28 insertions(+), 7 deletions(-) git pull ssh://gerrit.osmocom.org:29418/pysim refs/changes/49/33249/1 diff --git a/pySim/construct.py b/pySim/construct.py index 20a6946..ab44a63 100644 --- a/pySim/construct.py +++ b/pySim/construct.py @@ -66,26 +66,29 @@ class Rpad(Adapter): """ - Encoder appends padding bytes (b'\\xff') up to target size. - Decoder removes trailing padding bytes. + Encoder appends padding bytes (b'\\xff') or characters up to target size. + Decoder removes trailing padding bytes/characters. Parameters: subcon: Subconstruct as defined by construct library pattern: set padding pattern (default: b'\\xff') + num_per_byte: number of 'elements' per byte. E.g. for hex nibbles: 2 """ - def __init__(self, subcon, pattern=b'\xff'): + def __init__(self, subcon, pattern=b'\xff', num_per_byte=1): super().__init__(subcon) self.pattern = pattern + self.num_per_byte = num_per_byte def _decode(self, obj, context, path): return obj.rstrip(self.pattern) def _encode(self, obj, context, path): - if len(obj) > self.sizeof(): + target_size = self.sizeof() * self.num_per_byte + if len(obj) > target_size: raise SizeofError("Input ({}) exceeds target size ({})".format( - len(obj), self.sizeof())) - return obj + self.pattern * (self.sizeof() - len(obj)) + len(obj), target_size)) + return obj + self.pattern * (target_size - len(obj)) class MultiplyAdapter(Adapter): """ diff --git a/pySim/ts_31_102.py b/pySim/ts_31_102.py index 81b671e..e7ae8f0 100644 --- a/pySim/ts_31_102.py +++ b/pySim/ts_31_102.py @@ -1089,7 +1089,8 @@ # responsibility of home network operator but BCD coding shall be used. If a network # operator decides to assign less than 4 digits to Routing Indicator, the remaining digits # shall be coded as "1111" to fill the 4 digits coding of Routing Indicator - self._construct = Struct('routing_indicator'/BcdAdapter(Rpad(Bytes(2))), 'rfu'/HexAdapter(Bytes(2))) + self._construct = Struct('routing_indicator'/Rpad(BcdAdapter(Bytes(2)), 'f', 2), + 'rfu'/HexAdapter(Bytes(2))) # TS 31.102 Section 4.4.11.13 class EF_TN3GPPSNN(TransparentEF): -- To view, visit https://gerrit.osmocom.org/c/pysim/+/33249 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: pysim Gerrit-Branch: master Gerrit-Change-Id: I6c26dccdd570de7b7a4cd48338068e230340ec7c Gerrit-Change-Number: 33249 Gerrit-PatchSet: 1 Gerrit-Owner: laforge <lafo...@osmocom.org> Gerrit-MessageType: newchange