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

Reply via email to