aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@osmocom.org>2023-05-27 20:08:09 +0200
committerlaforge <laforge@osmocom.org>2023-06-03 12:45:35 +0000
commit954ce95a1648c7d81eac5c693532ea3554e5f489 (patch)
tree0dcbbaf4b54a96163dd323abbb5f924204b61491
parentba6d6ab64f8f7322adc251ec9ed9814f62e6c18d (diff)
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
-rw-r--r--pySim/construct.py20
-rw-r--r--pySim/sysmocom_sja2.py22
2 files changed, 29 insertions, 13 deletions
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 @@ class Rpad(Adapter):
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_MILENAGE_CFG(TransparentEF):
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):