laforge has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/pysim/+/33066 )


Change subject: SJA2: Implement DF.SYSTEM/EF.0348_KEY using construct
......................................................................

SJA2: Implement DF.SYSTEM/EF.0348_KEY using construct

This implicitly adds support for JSON->binary encoding, not just
decoding (previous code predating construct support).

Change-Id: I0994d9f66a504dd3c60b43ed5cf6645515dcbc6a
---
M pySim/construct.py
M pySim/sysmocom_sja2.py
2 files changed, 41 insertions(+), 13 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/pysim refs/changes/66/33066/1

diff --git a/pySim/construct.py b/pySim/construct.py
index 97af235..20a6946 100644
--- a/pySim/construct.py
+++ b/pySim/construct.py
@@ -87,6 +87,26 @@
                 len(obj), self.sizeof()))
         return obj + self.pattern * (self.sizeof() - len(obj))

+class MultiplyAdapter(Adapter):
+    """
+    Decoder multiplies by multiplicator
+    Encoder divides by multiplicator
+
+    Parameters:
+        subcon: Subconstruct as defined by construct library
+        multiplier: Multiplier to apply to raw encoded value
+    """
+
+    def __init__(self, subcon, multiplicator):
+        super().__init__(subcon)
+        self.multiplicator = multiplicator
+
+    def _decode(self, obj, context, path):
+        return obj * 8
+
+    def _encode(self, obj, context, path):
+        return obj // 8
+

 class GsmStringAdapter(Adapter):
     """Convert GSM 03.38 encoded bytes to a string."""
diff --git a/pySim/sysmocom_sja2.py b/pySim/sysmocom_sja2.py
index e32943f..20504a7 100644
--- a/pySim/sysmocom_sja2.py
+++ b/pySim/sysmocom_sja2.py
@@ -86,19 +86,15 @@
 class EF_0348_KEY(LinFixedEF):
     def __init__(self, fid='6f22', name='EF.0348_KEY', desc='TS 03.48 OTA 
Keys'):
         super().__init__(fid, name=name, desc=desc, rec_len=(27, 35))
-
-    def _decode_record_bin(self, raw_bin_data, **kwargs):
-        u = unpack('!BBB', raw_bin_data[0:3])
-        key_algo = (u[2] >> 6) & 1
-        key_length = ((u[2] >> 3) & 3) * 8
-        return {'sec_domain': u[0],
-                'key_set_version': u[1],
-                'key_type': key_type2str[u[2] & 3],
-                'key_length': key_length,
-                'algorithm': key_algo2str[key_algo],
-                'mac_length': mac_length[(u[2] >> 7)],
-                'key': raw_bin_data[3:key_length].hex()
-                }
+        KeyLenAndType = BitStruct('mac_length'/Mapping(Bit, {8:0, 4:1}),
+                                  'algorithm'/Enum(Bit, des=0, aes=1),
+                                  'key_length'/MultiplyAdapter(BitsInteger(3), 
8),
+                                  '_rfu'/BitsRFU(1),
+                                  'key_type'/Enum(BitsInteger(2), kic=0, 
kid=1, kik=2, any=3))
+        self._construct = Struct('security_domain'/Int8ub,
+                                 'key_set_version'/Int8ub,
+                                 'key_len_and_type'/KeyLenAndType,
+                                 
'key'/HexAdapter(Bytes(this.key_len_and_type.key_length)))


 class EF_0348_COUNT(LinFixedEF):

--
To view, visit https://gerrit.osmocom.org/c/pysim/+/33066
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: pysim
Gerrit-Branch: master
Gerrit-Change-Id: I0994d9f66a504dd3c60b43ed5cf6645515dcbc6a
Gerrit-Change-Number: 33066
Gerrit-PatchSet: 1
Gerrit-Owner: laforge <[email protected]>
Gerrit-MessageType: newchange

Reply via email to