aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp Maier <pmaier@sysmocom.de>2019-09-12 13:03:23 +0200
committerPhilipp Maier <pmaier@sysmocom.de>2019-09-13 11:04:13 +0200
commit7592eeea5943cff129514beb376d8269a999aa5e (patch)
tree8d2e652e0e9b7397101c7250cd3c3d09ae97c597
parentbe069e26ae6e6d0e6aaa50498f274bddebe8e99e (diff)
pySim-prog: use functions to derive MCC/MNC from IMSI
In case the MCC/MNC are not supplied with a CSV file we cut out the missing values from the IMSI string. Lets use a function to do this and also check the input parameters. Change-Id: I98e5bf8f9ff2a852efb190cc789edf42c5075bf8
-rwxr-xr-xpySim-prog.py6
-rw-r--r--pySim/utils.py27
2 files changed, 31 insertions, 2 deletions
diff --git a/pySim-prog.py b/pySim-prog.py
index 9149709..990fe15 100755
--- a/pySim-prog.py
+++ b/pySim-prog.py
@@ -43,6 +43,7 @@ from pySim.cards import _cards_classes
from pySim.utils import h2b, swap_nibbles, rpad, derive_milenage_opc, calculate_luhn, dec_iccid
from pySim.ts_51_011 import EF
from pySim.card_handler import *
+from pySim.utils import *
def parse_options():
@@ -483,8 +484,9 @@ def _read_params_csv(opts, iccid=None, imsi=None):
def read_params_csv(opts, imsi=None, iccid=None):
row = _read_params_csv(opts, iccid=iccid, imsi=imsi)
if row is not None:
- row['mcc'] = row.get('mcc', row['imsi'][0:3])
- row['mnc'] = row.get('mnc', row['imsi'][3:5])
+ row['mcc'] = row.get('mcc', mcc_from_imsi(row.get('imsi')))
+ row['mnc'] = row.get('mnc', mnc_from_imsi(row.get('imsi')))
+
pin_adm = None
# We need to escape the pin_adm we get from the csv
if 'pin_adm' in row:
diff --git a/pySim/utils.py b/pySim/utils.py
index a68af0a..e8dd531 100644
--- a/pySim/utils.py
+++ b/pySim/utils.py
@@ -206,3 +206,30 @@ def calculate_luhn(cc):
num = map(int, str(cc))
check_digit = 10 - sum(num[-2::-2] + [sum(divmod(d * 2, 10)) for d in num[::-2]]) % 10
return 0 if check_digit == 10 else check_digit
+
+def mcc_from_imsi(imsi):
+ """
+ Derive the MCC (Mobile Country Code) from the first three digits of an IMSI
+ """
+ if imsi == None:
+ return None
+
+ if len(imsi) > 3:
+ return imsi[:3]
+ else:
+ return None
+
+def mnc_from_imsi(imsi, long=False):
+ """
+ Derive the MNC (Mobile Country Code) from the 4th to 6th digit of an IMSI
+ """
+ if imsi == None:
+ return None
+
+ if len(imsi) > 3:
+ if long:
+ return imsi[3:6]
+ else:
+ return imsi[3:5]
+ else:
+ return None