laforge has submitted this change. ( https://gerrit.osmocom.org/c/pysim/+/35427?usp=email )
Change subject: ts_31_102: Start to use construct for EF.SUCI_Calc_Info ...................................................................... ts_31_102: Start to use construct for EF.SUCI_Calc_Info We cannot fully switch to construct for all of it easily due to the priority value and the ordering/sorting by priority implemented in the hand-coded version. But we can at least migrate the encode/decode of the hnet_pubkey_list via construct. Change-Id: I4ad5ea57bab37c2dc218e7752d538aa4cdc36ee3 --- M pySim/ts_31_102.py M tests/test_utils.py 2 files changed, 44 insertions(+), 62 deletions(-) Approvals: laforge: Looks good to me, approved Jenkins Builder: Verified diff --git a/pySim/ts_31_102.py b/pySim/ts_31_102.py index fdd8acf..4134650 100644 --- a/pySim/ts_31_102.py +++ b/pySim/ts_31_102.py @@ -286,17 +286,14 @@ _construct = GreedyRange( Struct('identifier'/Enum(Byte, null=0, A=1, B=2), 'key_index'/Int8ub)) - class HnetPubkeyIdentifier(BER_TLV_IE, tag=0x80): # 3GPP TS 24.501 / 3GPP TS 23.003 _construct = Int8ub - class HnetPubkey(BER_TLV_IE, tag=0x81): - # FIXME: RFC 5480 + # contents according to RFC 7748 / RFC 5480 _construct = HexAdapter(GreedyBytes) - class HnetPubkeyList(BER_TLV_IE, tag=0xa1, nested=[HnetPubkeyIdentifier, HnetPubkey]): pass @@ -319,30 +316,35 @@ return out_bytes - def _encode_hnet_pubkey_list(self, hnet_pubkey_list): - out_bytes = [0xa1] # pubkey list tag - out_bytes.append(0x00) # length filled later - length = 0 + @staticmethod + def _compact_pubkey_list(l: List[dict]) -> List[dict]: + """conversion method to generate list of {hnet_pubkey_identifier, hnet_pubkey} dicts + from flat [{hnet_pubkey_identifier: }, {net_pubkey: }, ...] list""" + out = [] + while len(l): + a = l.pop(0) + b = l.pop(0) + z = {**a, **b} + out.append(z) + return out - for key in hnet_pubkey_list: - out_bytes.append(0x80) # identifier tag - out_bytes.append(0x01) # TODO size, fixed to 1 byte - out_bytes.append(key["hnet_pubkey_identifier"]) - out_bytes.append(0x81) # key tag - out_bytes.append(len(key["hnet_pubkey"])//2) - length += 5+len(key["hnet_pubkey"])//2 - - pubkey_bytes = h2b(key["hnet_pubkey"]) - out_bytes += pubkey_bytes - - # fill length - out_bytes[1] = length - return out_bytes + @staticmethod + def _expand_pubkey_list(l: List[dict]) -> List[dict]: + """conversion method to generate flat [{hnet_pubkey_identifier: }, {net_pubkey: }, ...] list + from compacted list of {hnet_pubkey_identifier, hnet_pubkey} dicts""" + out = [] + for d in l: + for k, v in d.items(): + out.append({k: v}) + return out def _encode_hex(self, in_json): out_bytes = self._encode_prot_scheme_id_list( in_json['prot_scheme_id_list']) - out_bytes += self._encode_hnet_pubkey_list(in_json['hnet_pubkey_list']) + d = self._expand_pubkey_list(in_json['hnet_pubkey_list']) + hpkl = EF_SUCI_Calc_Info.HnetPubkeyList() + hpkl.from_dict({'hnet_pubkey_list': d}) + out_bytes += hpkl.to_tlv() return "".join(["%02X" % i for i in out_bytes]) def _decode_prot_scheme_id_list(self, in_bytes): @@ -359,42 +361,6 @@ prot_scheme_id_list.append(prot_scheme) return prot_scheme_id_list - def _decode_hnet_pubkey_list(self, in_bytes): - hnet_pubkey_list = [] - pos = 0 - if in_bytes[pos] != 0xa1: - print("missing Home Network Public Key List data object") - return {} - pos += 1 - hnet_pubkey_list_len = in_bytes[pos] - pos += 1 - - while pos < hnet_pubkey_list_len: - if in_bytes[pos] != 0x80: - print("missing Home Network Public Key Identifier tag") - return {} - pos += 1 - # TODO might be more than 1 byte? - hnet_pubkey_id_len = in_bytes[pos] - pos += 1 - hnet_pubkey_id = in_bytes[pos:pos+hnet_pubkey_id_len][0] - pos += hnet_pubkey_id_len - if in_bytes[pos] != 0x81: - print("missing Home Network Public Key tag") - return {} - pos += 1 - hnet_pubkey_len = in_bytes[pos] - pos += 1 - hnet_pubkey = in_bytes[pos:pos+hnet_pubkey_len] - pos += hnet_pubkey_len - - hnet_pubkey_list.append({ - 'hnet_pubkey_identifier': hnet_pubkey_id, - 'hnet_pubkey': b2h(hnet_pubkey) - }) - - return hnet_pubkey_list - def _decode_bin(self, in_bin): return self._decode_hex(b2h(in_bin)) @@ -415,7 +381,9 @@ pos += prot_scheme_id_list_len # remaining data holds Home Network Public Key Data Object - hnet_pubkey_list = self._decode_hnet_pubkey_list(in_bytes[pos:]) + hpkl = EF_SUCI_Calc_Info.HnetPubkeyList() + hpkl.from_tlv(in_bytes[pos:]) + hnet_pubkey_list = self._compact_pubkey_list(hpkl.to_dict()['hnet_pubkey_list']) return { 'prot_scheme_id_list': prot_scheme_id_list, diff --git a/tests/test_utils.py b/tests/test_utils.py index 062b614..ea1964b 100755 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -136,12 +136,12 @@ def testDecodeSuciCalcInfo(self): suci_calc_info = EF_SUCI_Calc_Info() - decoded = suci_calc_info._decode_hex(self.testfile_suci_calc_info) + decoded = suci_calc_info.decode_hex(self.testfile_suci_calc_info) self.assertDictEqual(self.decoded_testfile_suci, decoded) def testEncodeSuciCalcInfo(self): suci_calc_info = EF_SUCI_Calc_Info() - encoded = suci_calc_info._encode_hex(self.decoded_testfile_suci) + encoded = suci_calc_info.encode_hex(self.decoded_testfile_suci) self.assertEqual(encoded.lower(), self.testfile_suci_calc_info.lower()) def testEnc_msisdn(self): -- To view, visit https://gerrit.osmocom.org/c/pysim/+/35427?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: pysim Gerrit-Branch: master Gerrit-Change-Id: I4ad5ea57bab37c2dc218e7752d538aa4cdc36ee3 Gerrit-Change-Number: 35427 Gerrit-PatchSet: 6 Gerrit-Owner: laforge <lafo...@osmocom.org> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: dexter <pma...@sysmocom.de> Gerrit-Reviewer: fixeria <vyanits...@sysmocom.de> Gerrit-Reviewer: laforge <lafo...@osmocom.org> Gerrit-Reviewer: merlinchlosta <merlin.chlo...@rub.de> Gerrit-MessageType: merged