pySim-prog: Use CSV format with headers

This way we can have optional fields like adm1 in the file
Also require iccid as identifier for the SIM card

Change-Id: I0d317ea51d0cf582b82157eec6cdec074001a236
This commit is contained in:
Daniel Willmann 2018-06-15 07:31:50 +02:00 committed by Harald Welte
parent 23888dab85
commit 1d00c19d14
2 changed files with 22 additions and 14 deletions

View File

@ -399,7 +399,7 @@ def gen_parameters(opts):
'ki' : ki, 'ki' : ki,
'opc' : opc, 'opc' : opc,
'acc' : acc, 'acc' : acc,
'pin_adm' : pin_adm, 'adm1' : pin_adm,
} }
@ -414,6 +414,7 @@ def print_parameters(params):
> Ki : %(ki)s > Ki : %(ki)s
> OPC : %(opc)s > OPC : %(opc)s
> ACC : %(acc)s > ACC : %(acc)s
> ADM1 : %(adm1)s
""" % params """ % params
@ -427,18 +428,23 @@ def write_params_csv(opts, params):
cw.writerow([params[x] for x in row]) cw.writerow([params[x] for x in row])
f.close() f.close()
def _read_params_csv(opts, imsi): def _read_params_csv(opts, iccid=None, imsi=None):
import csv import csv
row = ['name', 'iccid', 'mcc', 'mnc', 'imsi', 'smsp', 'ki', 'opc']
f = open(opts.read_csv, 'r') f = open(opts.read_csv, 'r')
cr = csv.DictReader(f, row) cr = csv.DictReader(f)
i = 0 i = 0
if not 'iccid' in cr.fieldnames:
raise Exception("CSV file in wrong format!")
for row in cr: for row in cr:
if opts.num is not None and opts.read_imsi is False: if opts.num is not None and opts.read_imsi is False:
if opts.num == i: if opts.num == i:
f.close() f.close()
return row; return row;
i += 1 i += 1
if row['iccid'] == iccid:
f.close()
return row;
if row['imsi'] == imsi: if row['imsi'] == imsi:
f.close() f.close()
return row; return row;
@ -446,8 +452,8 @@ def _read_params_csv(opts, imsi):
f.close() f.close()
return None return None
def read_params_csv(opts, imsi): def read_params_csv(opts, imsi=None, iccid=None):
row = _read_params_csv(opts, imsi) row = _read_params_csv(opts, iccid=iccid, imsi=imsi)
if row is not None: if row is not None:
row['mcc'] = int(row['mcc']) row['mcc'] = int(row['mcc'])
row['mnc'] = int(row['mnc']) row['mnc'] = int(row['mnc'])
@ -628,6 +634,8 @@ if __name__ == '__main__':
if opts.source == 'cmdline': if opts.source == 'cmdline':
cp = gen_parameters(opts) cp = gen_parameters(opts)
elif opts.source == 'csv': elif opts.source == 'csv':
imsi = None
iccid = None
if opts.read_imsi: if opts.read_imsi:
if opts.dry_run: if opts.dry_run:
# Connect transport # Connect transport
@ -637,7 +645,7 @@ if __name__ == '__main__':
imsi = swap_nibbles(res)[3:] imsi = swap_nibbles(res)[3:]
else: else:
imsi = opts.imsi imsi = opts.imsi
cp = read_params_csv(opts, imsi) cp = read_params_csv(opts, imsi=imsi, iccid=iccid)
if cp is None: if cp is None:
print "Error reading parameters\n" print "Error reading parameters\n"
sys.exit(2) sys.exit(2)

View File

@ -375,8 +375,8 @@ class GrcardSim(Card):
#self._scc.verify_chv(4, h2b("4444444444444444")) #self._scc.verify_chv(4, h2b("4444444444444444"))
# Authenticate using ADM PIN 5 # Authenticate using ADM PIN 5
if p['pin_adm']: if p['adm1']:
pin = h2b(p['pin_adm']) pin = h2b(p['adm1'])
else: else:
pin = h2b("4444444444444444") pin = h2b("4444444444444444")
self._scc.verify_chv(5, pin) self._scc.verify_chv(5, pin)
@ -495,8 +495,8 @@ class SysmoSIMgr2(Card):
# P1: 3A for PIN, 3B for PUK # P1: 3A for PIN, 3B for PUK
# P2: CHV number, as in VERIFY CHV for PIN, and as in UNBLOCK CHV for PUK # P2: CHV number, as in VERIFY CHV for PIN, and as in UNBLOCK CHV for PUK
# P3: 08, CHV length (curiously the PUK is also 08 length, instead of 10) # P3: 08, CHV length (curiously the PUK is also 08 length, instead of 10)
if p['pin_adm']: if p['adm1']:
pin = p['pin_adm'] pin = p['adm1']
else: else:
pin = h2b("4444444444444444") pin = h2b("4444444444444444")
@ -567,9 +567,9 @@ class SysmoUSIMSJS1(Card):
def program(self, p): def program(self, p):
# authenticate as ADM using default key (written on the card..) # authenticate as ADM using default key (written on the card..)
if not p['pin_adm']: if not p['adm1']:
raise ValueError("Please provide a PIN-ADM as there is no default one") raise ValueError("Please provide a PIN-ADM as there is no default one")
self._scc.verify_chv(0x0A, h2b(p['pin_adm'])) self._scc.verify_chv(0x0A, p['adm1'])
# select MF # select MF
r = self._scc.select_file(['3f00']) r = self._scc.select_file(['3f00'])