This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
laforge gerrit-no-reply at lists.osmocom.orglaforge has uploaded this change for review. ( https://gerrit.osmocom.org/c/pysim/+/18649 )
Change subject: Add support for ADF_USIM/EF_EHPLMN
......................................................................
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
---
M pySim-read.py
M pySim/cards.py
M pySim/utils.py
3 files changed, 51 insertions(+), 1 deletion(-)
git pull ssh://gerrit.osmocom.org:29418/pysim refs/changes/49/18649/1
diff --git a/pySim-read.py b/pySim-read.py
index b23e6ee..92fbd7b 100755
--- a/pySim-read.py
+++ b/pySim-read.py
@@ -241,6 +241,15 @@
# Check whether we have th AID of USIM, if so select it by its AID
# EF.UST - File Id in ADF USIM : 6f38
if '9000' == card.select_adf_by_aid():
+ # EF.EHPLMN
+ try:
+ (res, sw) = card.read_ehplmn()
+ if sw == '9000':
+ print("EHPLMN:\n%s" % (res))
+ else:
+ print("EHPLMN: Can't read, response code = %s" % (sw,))
+ except Exception as e:
+ print("EHPLMN: Can't read file -- " + str(e))
# EF.UST
(res, sw) = card.read_binary(EF_USIM_ADF_map['UST'])
if sw == '9000':
diff --git a/pySim/cards.py b/pySim/cards.py
index 808fde1..302c886 100644
--- a/pySim/cards.py
+++ b/pySim/cards.py
@@ -24,6 +24,7 @@
#
from pySim.ts_51_011 import EF, DF
+from pySim.ts_31_102 import EF_USIM_ADF_map
from pySim.utils import *
from smartcard.util import toBytes
@@ -77,6 +78,20 @@
else:
return (None, sw)
+ def read_ehplmn(self):
+ (res, sw) = self._scc.read_binary(EF_USIM_ADF_map['EHPLMN'])
+ if sw == '9000':
+ return (format_xplmn(res), sw)
+ else:
+ return (None, sw)
+
+ def update_ehplmn(self, mcc, mnc):
+ data = self._scc.read_binary(EF_USIM_ADF_map['EHPLMN'], length=None, offset=0)
+ size = len(data[0]) // 2
+ ehplmn = enc_plmn(mcc, mnc)
+ data, sw = self._scc.update_binary(EF_USIM_ADF_map['EHPLMN'], ehplmn)
+ return sw
+
def update_hplmn_act(self, mcc, mnc, access_tech='FFFF'):
"""
Update Home PLMN with access technology bit-field
@@ -1144,16 +1159,20 @@
if p.get('opc'):
self._scc.update_binary('af20', p['opc'], 17)
- # update EF-USIM_AUTH_KEY in ADF.USIM
self._scc.select_file(['3f00'])
aid = self.read_aid()
if (aid):
+ # update EF-USIM_AUTH_KEY in ADF.USIM
self._scc.select_adf(aid)
if p.get('ki'):
self._scc.update_binary('af20', p['ki'], 1)
if p.get('opc'):
self._scc.update_binary('af20', p['opc'], 17)
+ # update EF.EHPLMN in ADF.USIM
+ if p.get('mcc') and p.get('mnc'):
+ sw = self.update_ehplmn(p['mcc'], p['mnc'])
+ # igoring any error as the file may not be present depending on the profile.
return
diff --git a/pySim/utils.py b/pySim/utils.py
index 496b918..d7ff617 100644
--- a/pySim/utils.py
+++ b/pySim/utils.py
@@ -125,6 +125,9 @@
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)
@@ -183,6 +186,25 @@
s += "\t%s # %s\n" % (rec_data, rec_str)
return s
+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
--
To view, visit https://gerrit.osmocom.org/c/pysim/+/18649
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: pysim
Gerrit-Branch: master
Gerrit-Change-Id: I22d96ab4a424ec5bc1fb02f5e80165c646a748d3
Gerrit-Change-Number: 18649
Gerrit-PatchSet: 1
Gerrit-Owner: laforge <laforge at osmocom.org>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200603/f3ed1e69/attachment.htm>