diff options
author | Harald Welte <laforge@osmocom.org> | 2023-05-27 20:08:09 +0200 |
---|---|---|
committer | laforge <laforge@osmocom.org> | 2023-06-03 12:45:35 +0000 |
commit | 954ce95a1648c7d81eac5c693532ea3554e5f489 (patch) | |
tree | 0dcbbaf4b54a96163dd323abbb5f924204b61491 | |
parent | ba6d6ab64f8f7322adc251ec9ed9814f62e6c18d (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.py | 20 | ||||
-rw-r--r-- | pySim/sysmocom_sja2.py | 22 |
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): |