Add support for ADF_USIM/EF_EHPLMN
If the EF.EHPLMN exists, it contains the "Equivalent Home PLMN List". The odd part of that list is that it is not just a list of additional PLMN identities, but if the first digits of the IMSI are *not* listed in EF.EHPLMN, then the MCC/MNC of the IMSI prefix is suddently no longer considered the home network, but the subscriber is roaming. See TS 23.122: "If the HPLMN code derived from the IMSI is not present in the EHPLMN list, then it shall be treated as a Visited PLMN for PLMN selection purposes." Change-Id: I22d96ab4a424ec5bc1fb02f5e80165c646a748d3
This commit is contained in:
@@ -125,6 +125,9 @@ def enc_spn(name, hplmn_disp=False, oplmn_disp=False):
|
||||
def hexstr_to_fivebytearr(s):
|
||||
return [s[i:i+10] for i in range(0, len(s), 10) ]
|
||||
|
||||
def hexstr_to_threebytearr(s):
|
||||
return [s[i:i+6] for i in range(0, len(s), 6) ]
|
||||
|
||||
# Accepts hex string representing three bytes
|
||||
def dec_mcc_from_plmn(plmn):
|
||||
ia = h2i(plmn)
|
||||
@@ -213,6 +216,25 @@ def dec_epsloci(hexstr):
|
||||
res['status'] = h2i(hexstr[34:36])
|
||||
return res
|
||||
|
||||
def dec_xplmn(threehexbytes):
|
||||
res = {'mcc': 0, 'mnc': 0, 'act': []}
|
||||
plmn_chars = 6
|
||||
plmn_str = threehexbytes[:plmn_chars] # first three bytes (six ascii hex chars)
|
||||
res['mcc'] = dec_mcc_from_plmn(plmn_str)
|
||||
res['mnc'] = dec_mnc_from_plmn(plmn_str)
|
||||
return res
|
||||
|
||||
def format_xplmn(hexstr):
|
||||
s = ""
|
||||
for rec_data in hexstr_to_threebytearr(hexstr):
|
||||
rec_info = dec_xplmn(rec_data)
|
||||
if rec_info['mcc'] == 0xFFF and rec_info['mnc'] == 0xFFF:
|
||||
rec_str = "unused"
|
||||
else:
|
||||
rec_str = "MCC: %03d MNC: %03d" % (rec_info['mcc'], rec_info['mnc'])
|
||||
s += "\t%s # %s\n" % (rec_data, rec_str)
|
||||
return s
|
||||
|
||||
def derive_milenage_opc(ki_hex, op_hex):
|
||||
"""
|
||||
Run the milenage algorithm to calculate OPC from Ki and OP
|
||||
|
||||
Reference in New Issue
Block a user