mirror of
https://gitea.osmocom.org/sim-card/pysim.git
synced 2026-04-01 22:16:39 +03:00
commands.py: rename select_file() to select_path()
In reality, the function is not a simple avstraction around the SELECT command, but it iterates over a list/path and selects at each element. Change-Id: I63e01155de4ae47aeed8500708c0eb6580c7b8d1
This commit is contained in:
@@ -44,7 +44,7 @@ class Card(object):
|
|||||||
return
|
return
|
||||||
|
|
||||||
def file_exists(self, fid):
|
def file_exists(self, fid):
|
||||||
res_arr = self._scc.try_select_file(fid)
|
res_arr = self._scc.try_select_path(fid)
|
||||||
for res in res_arr:
|
for res in res_arr:
|
||||||
if res[1] != '9000':
|
if res[1] != '9000':
|
||||||
return False
|
return False
|
||||||
@@ -477,7 +477,7 @@ class _MagicSimBase(Card):
|
|||||||
"""
|
"""
|
||||||
f = self._files['name']
|
f = self._files['name']
|
||||||
|
|
||||||
r = self._scc.select_file(['3f00', '7f4d', f[0]])
|
r = self._scc.select_path(['3f00', '7f4d', f[0]])
|
||||||
rec_len = int(r[-1][28:30], 16)
|
rec_len = int(r[-1][28:30], 16)
|
||||||
tlen = int(r[-1][4:8],16)
|
tlen = int(r[-1][4:8],16)
|
||||||
rec_cnt = (tlen / rec_len) - 1
|
rec_cnt = (tlen / rec_len) - 1
|
||||||
@@ -489,7 +489,7 @@ class _MagicSimBase(Card):
|
|||||||
|
|
||||||
def program(self, p):
|
def program(self, p):
|
||||||
# Go to dir
|
# Go to dir
|
||||||
self._scc.select_file(['3f00', '7f4d'])
|
self._scc.select_path(['3f00', '7f4d'])
|
||||||
|
|
||||||
# Home PLMN in PLMN_Sel format
|
# Home PLMN in PLMN_Sel format
|
||||||
hplmn = enc_plmn(p['mcc'], p['mnc'])
|
hplmn = enc_plmn(p['mcc'], p['mnc'])
|
||||||
@@ -533,7 +533,7 @@ class _MagicSimBase(Card):
|
|||||||
# FIXME
|
# FIXME
|
||||||
|
|
||||||
# Write PLMN_Sel forcefully as well
|
# Write PLMN_Sel forcefully as well
|
||||||
r = self._scc.select_file(['3f00', '7f20', '6f30'])
|
r = self._scc.select_path(['3f00', '7f20', '6f30'])
|
||||||
tl = int(r[-1][4:8], 16)
|
tl = int(r[-1][4:8], 16)
|
||||||
|
|
||||||
hplmn = enc_plmn(p['mcc'], p['mnc'])
|
hplmn = enc_plmn(p['mcc'], p['mnc'])
|
||||||
@@ -607,7 +607,7 @@ class FakeMagicSim(Card):
|
|||||||
and entry size
|
and entry size
|
||||||
"""
|
"""
|
||||||
|
|
||||||
r = self._scc.select_file(['3f00', '000c'])
|
r = self._scc.select_path(['3f00', '000c'])
|
||||||
rec_len = int(r[-1][28:30], 16)
|
rec_len = int(r[-1][28:30], 16)
|
||||||
tlen = int(r[-1][4:8],16)
|
tlen = int(r[-1][4:8],16)
|
||||||
rec_cnt = (tlen / rec_len) - 1
|
rec_cnt = (tlen / rec_len) - 1
|
||||||
@@ -619,7 +619,7 @@ class FakeMagicSim(Card):
|
|||||||
|
|
||||||
def program(self, p):
|
def program(self, p):
|
||||||
# Home PLMN
|
# Home PLMN
|
||||||
r = self._scc.select_file(['3f00', '7f20', '6f30'])
|
r = self._scc.select_path(['3f00', '7f20', '6f30'])
|
||||||
tl = int(r[-1][4:8], 16)
|
tl = int(r[-1][4:8], 16)
|
||||||
|
|
||||||
hplmn = enc_plmn(p['mcc'], p['mnc'])
|
hplmn = enc_plmn(p['mcc'], p['mnc'])
|
||||||
@@ -674,11 +674,11 @@ class GrcardSim(Card):
|
|||||||
self._scc.verify_chv(5, pin)
|
self._scc.verify_chv(5, pin)
|
||||||
|
|
||||||
# EF.ICCID
|
# EF.ICCID
|
||||||
r = self._scc.select_file(['3f00', '2fe2'])
|
r = self._scc.select_path(['3f00', '2fe2'])
|
||||||
data, sw = self._scc.update_binary('2fe2', enc_iccid(p['iccid']))
|
data, sw = self._scc.update_binary('2fe2', enc_iccid(p['iccid']))
|
||||||
|
|
||||||
# EF.IMSI
|
# EF.IMSI
|
||||||
r = self._scc.select_file(['3f00', '7f20', '6f07'])
|
r = self._scc.select_path(['3f00', '7f20', '6f07'])
|
||||||
data, sw = self._scc.update_binary('6f07', enc_imsi(p['imsi']))
|
data, sw = self._scc.update_binary('6f07', enc_imsi(p['imsi']))
|
||||||
|
|
||||||
# EF.ACC
|
# EF.ACC
|
||||||
@@ -687,7 +687,7 @@ class GrcardSim(Card):
|
|||||||
|
|
||||||
# EF.SMSP
|
# EF.SMSP
|
||||||
if p.get('smsp'):
|
if p.get('smsp'):
|
||||||
r = self._scc.select_file(['3f00', '7f10', '6f42'])
|
r = self._scc.select_path(['3f00', '7f10', '6f42'])
|
||||||
data, sw = self._scc.update_record('6f42', 1, lpad(p['smsp'], 80))
|
data, sw = self._scc.update_record('6f42', 1, lpad(p['smsp'], 80))
|
||||||
|
|
||||||
# Set the Ki using proprietary command
|
# Set the Ki using proprietary command
|
||||||
@@ -695,13 +695,13 @@ class GrcardSim(Card):
|
|||||||
data, sw = self._scc._tp.send_apdu(pdu)
|
data, sw = self._scc._tp.send_apdu(pdu)
|
||||||
|
|
||||||
# EF.HPLMN
|
# EF.HPLMN
|
||||||
r = self._scc.select_file(['3f00', '7f20', '6f30'])
|
r = self._scc.select_path(['3f00', '7f20', '6f30'])
|
||||||
size = int(r[-1][4:8], 16)
|
size = int(r[-1][4:8], 16)
|
||||||
hplmn = enc_plmn(p['mcc'], p['mnc'])
|
hplmn = enc_plmn(p['mcc'], p['mnc'])
|
||||||
self._scc.update_binary('6f30', hplmn + 'ff' * (size-3))
|
self._scc.update_binary('6f30', hplmn + 'ff' * (size-3))
|
||||||
|
|
||||||
# EF.SPN (Service Provider Name)
|
# EF.SPN (Service Provider Name)
|
||||||
r = self._scc.select_file(['3f00', '7f20', '6f30'])
|
r = self._scc.select_path(['3f00', '7f20', '6f30'])
|
||||||
size = int(r[-1][4:8], 16)
|
size = int(r[-1][4:8], 16)
|
||||||
# FIXME
|
# FIXME
|
||||||
|
|
||||||
@@ -772,7 +772,7 @@ class SysmoSIMgr2(Card):
|
|||||||
def program(self, p):
|
def program(self, p):
|
||||||
|
|
||||||
# select MF
|
# select MF
|
||||||
r = self._scc.select_file(['3f00'])
|
r = self._scc.select_path(['3f00'])
|
||||||
|
|
||||||
# authenticate as SUPER ADM using default key
|
# authenticate as SUPER ADM using default key
|
||||||
self._scc.verify_chv(0x0b, h2b("3838383838383838"))
|
self._scc.verify_chv(0x0b, h2b("3838383838383838"))
|
||||||
@@ -798,7 +798,7 @@ class SysmoSIMgr2(Card):
|
|||||||
data, sw = self._scc.update_binary('2fe2', enc_iccid(p['iccid']))
|
data, sw = self._scc.update_binary('2fe2', enc_iccid(p['iccid']))
|
||||||
|
|
||||||
# select DF_GSM
|
# select DF_GSM
|
||||||
r = self._scc.select_file(['7f20'])
|
r = self._scc.select_path(['7f20'])
|
||||||
|
|
||||||
# write EF.IMSI
|
# write EF.IMSI
|
||||||
data, sw = self._scc.update_binary('6f07', enc_imsi(p['imsi']))
|
data, sw = self._scc.update_binary('6f07', enc_imsi(p['imsi']))
|
||||||
@@ -808,7 +808,7 @@ class SysmoSIMgr2(Card):
|
|||||||
data, sw = self._scc.update_binary('6f78', lpad(p['acc'], 4))
|
data, sw = self._scc.update_binary('6f78', lpad(p['acc'], 4))
|
||||||
|
|
||||||
# get size and write EF.HPLMN
|
# get size and write EF.HPLMN
|
||||||
r = self._scc.select_file(['6f30'])
|
r = self._scc.select_path(['6f30'])
|
||||||
size = int(r[-1][4:8], 16)
|
size = int(r[-1][4:8], 16)
|
||||||
hplmn = enc_plmn(p['mcc'], p['mnc'])
|
hplmn = enc_plmn(p['mcc'], p['mnc'])
|
||||||
self._scc.update_binary('6f30', hplmn + 'ff' * (size-3))
|
self._scc.update_binary('6f30', hplmn + 'ff' * (size-3))
|
||||||
@@ -820,7 +820,7 @@ class SysmoSIMgr2(Card):
|
|||||||
data, sw = self._scc.update_binary('0001', p['ki'], 3)
|
data, sw = self._scc.update_binary('0001', p['ki'], 3)
|
||||||
|
|
||||||
# select DF_TELECOM
|
# select DF_TELECOM
|
||||||
r = self._scc.select_file(['3f00', '7f10'])
|
r = self._scc.select_path(['3f00', '7f10'])
|
||||||
|
|
||||||
# write EF.SMSP
|
# write EF.SMSP
|
||||||
if p.get('smsp'):
|
if p.get('smsp'):
|
||||||
@@ -862,13 +862,13 @@ class SysmoUSIMSJS1(UsimCard):
|
|||||||
self.verify_adm(h2b(p['pin_adm']))
|
self.verify_adm(h2b(p['pin_adm']))
|
||||||
|
|
||||||
# select MF
|
# select MF
|
||||||
r = self._scc.select_file(['3f00'])
|
r = self._scc.select_path(['3f00'])
|
||||||
|
|
||||||
# write EF.ICCID
|
# write EF.ICCID
|
||||||
data, sw = self._scc.update_binary('2fe2', enc_iccid(p['iccid']))
|
data, sw = self._scc.update_binary('2fe2', enc_iccid(p['iccid']))
|
||||||
|
|
||||||
# select DF_GSM
|
# select DF_GSM
|
||||||
r = self._scc.select_file(['7f20'])
|
r = self._scc.select_path(['7f20'])
|
||||||
|
|
||||||
# set Ki in proprietary file
|
# set Ki in proprietary file
|
||||||
data, sw = self._scc.update_binary('00FF', p['ki'])
|
data, sw = self._scc.update_binary('00FF', p['ki'])
|
||||||
@@ -921,7 +921,7 @@ class SysmoUSIMSJS1(UsimCard):
|
|||||||
|
|
||||||
# EF.SMSP
|
# EF.SMSP
|
||||||
if p.get('smsp'):
|
if p.get('smsp'):
|
||||||
r = self._scc.select_file(['3f00', '7f10'])
|
r = self._scc.select_path(['3f00', '7f10'])
|
||||||
data, sw = self._scc.update_record('6f42', 1, lpad(p['smsp'], 104), force_len=True)
|
data, sw = self._scc.update_record('6f42', 1, lpad(p['smsp'], 104), force_len=True)
|
||||||
|
|
||||||
# EF.MSISDN
|
# EF.MSISDN
|
||||||
@@ -932,7 +932,7 @@ class SysmoUSIMSJS1(UsimCard):
|
|||||||
msisdn = enc_msisdn(p['msisdn'])
|
msisdn = enc_msisdn(p['msisdn'])
|
||||||
data = 'ff' * 20 + msisdn + 'ff' * 2
|
data = 'ff' * 20 + msisdn + 'ff' * 2
|
||||||
|
|
||||||
r = self._scc.select_file(['3f00', '7f10'])
|
r = self._scc.select_path(['3f00', '7f10'])
|
||||||
data, sw = self._scc.update_record('6F40', 1, data, force_len=True)
|
data, sw = self._scc.update_record('6F40', 1, data, force_len=True)
|
||||||
|
|
||||||
|
|
||||||
@@ -1106,12 +1106,12 @@ class OpenCellsSim(Card):
|
|||||||
self._scc.verify_chv(0x0A, h2b(p['pin_adm']))
|
self._scc.verify_chv(0x0A, h2b(p['pin_adm']))
|
||||||
|
|
||||||
# select MF
|
# select MF
|
||||||
r = self._scc.select_file(['3f00'])
|
r = self._scc.select_path(['3f00'])
|
||||||
|
|
||||||
# write EF.ICCID
|
# write EF.ICCID
|
||||||
data, sw = self._scc.update_binary('2fe2', enc_iccid(p['iccid']))
|
data, sw = self._scc.update_binary('2fe2', enc_iccid(p['iccid']))
|
||||||
|
|
||||||
r = self._scc.select_file(['7ff0'])
|
r = self._scc.select_path(['7ff0'])
|
||||||
|
|
||||||
# set Ki in proprietary file
|
# set Ki in proprietary file
|
||||||
data, sw = self._scc.update_binary('FF02', p['ki'])
|
data, sw = self._scc.update_binary('FF02', p['ki'])
|
||||||
@@ -1120,7 +1120,7 @@ class OpenCellsSim(Card):
|
|||||||
data, sw = self._scc.update_binary('FF01', p['opc'])
|
data, sw = self._scc.update_binary('FF01', p['opc'])
|
||||||
|
|
||||||
# select DF_GSM
|
# select DF_GSM
|
||||||
r = self._scc.select_file(['7f20'])
|
r = self._scc.select_path(['7f20'])
|
||||||
|
|
||||||
# write EF.IMSI
|
# write EF.IMSI
|
||||||
data, sw = self._scc.update_binary('6f07', enc_imsi(p['imsi']))
|
data, sw = self._scc.update_binary('6f07', enc_imsi(p['imsi']))
|
||||||
@@ -1269,7 +1269,7 @@ class SysmoISIMSJA2(UsimCard, IsimCard):
|
|||||||
print("Warning: Programming of the ICCID is not implemented for this type of card.")
|
print("Warning: Programming of the ICCID is not implemented for this type of card.")
|
||||||
|
|
||||||
# select DF_GSM
|
# select DF_GSM
|
||||||
self._scc.select_file(['7f20'])
|
self._scc.select_path(['7f20'])
|
||||||
|
|
||||||
# write EF.IMSI
|
# write EF.IMSI
|
||||||
if p.get('imsi'):
|
if p.get('imsi'):
|
||||||
@@ -1307,7 +1307,7 @@ class SysmoISIMSJA2(UsimCard, IsimCard):
|
|||||||
|
|
||||||
# EF.SMSP
|
# EF.SMSP
|
||||||
if p.get('smsp'):
|
if p.get('smsp'):
|
||||||
r = self._scc.select_file(['3f00', '7f10'])
|
r = self._scc.select_path(['3f00', '7f10'])
|
||||||
data, sw = self._scc.update_record('6f42', 1, lpad(p['smsp'], 104), force_len=True)
|
data, sw = self._scc.update_record('6f42', 1, lpad(p['smsp'], 104), force_len=True)
|
||||||
|
|
||||||
# EF.MSISDN
|
# EF.MSISDN
|
||||||
@@ -1318,7 +1318,7 @@ class SysmoISIMSJA2(UsimCard, IsimCard):
|
|||||||
msisdn = enc_msisdn(p['msisdn'])
|
msisdn = enc_msisdn(p['msisdn'])
|
||||||
content = 'ff' * 20 + msisdn + 'ff' * 2
|
content = 'ff' * 20 + msisdn + 'ff' * 2
|
||||||
|
|
||||||
r = self._scc.select_file(['3f00', '7f10'])
|
r = self._scc.select_path(['3f00', '7f10'])
|
||||||
data, sw = self._scc.update_record('6F40', 1, content, force_len=True)
|
data, sw = self._scc.update_record('6F40', 1, content, force_len=True)
|
||||||
|
|
||||||
# EF.ACC
|
# EF.ACC
|
||||||
@@ -1332,8 +1332,8 @@ class SysmoISIMSJA2(UsimCard, IsimCard):
|
|||||||
|
|
||||||
# update EF-SIM_AUTH_KEY (and EF-USIM_AUTH_KEY_2G, which is
|
# update EF-SIM_AUTH_KEY (and EF-USIM_AUTH_KEY_2G, which is
|
||||||
# hard linked to EF-USIM_AUTH_KEY)
|
# hard linked to EF-USIM_AUTH_KEY)
|
||||||
self._scc.select_file(['3f00'])
|
self._scc.select_path(['3f00'])
|
||||||
self._scc.select_file(['a515'])
|
self._scc.select_path(['a515'])
|
||||||
if p.get('ki'):
|
if p.get('ki'):
|
||||||
self._scc.update_binary('6f20', p['ki'], 1)
|
self._scc.update_binary('6f20', p['ki'], 1)
|
||||||
if p.get('opc'):
|
if p.get('opc'):
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ class SimCardCommands(object):
|
|||||||
def sel_ctrl(self, value):
|
def sel_ctrl(self, value):
|
||||||
self._sel_ctrl = value
|
self._sel_ctrl = value
|
||||||
|
|
||||||
def try_select_file(self, dir_list):
|
def try_select_path(self, dir_list):
|
||||||
rv = []
|
rv = []
|
||||||
if type(dir_list) is not list:
|
if type(dir_list) is not list:
|
||||||
dir_list = [dir_list]
|
dir_list = [dir_list]
|
||||||
@@ -110,7 +110,7 @@ class SimCardCommands(object):
|
|||||||
return rv
|
return rv
|
||||||
return rv
|
return rv
|
||||||
|
|
||||||
def select_file(self, dir_list):
|
def select_path(self, dir_list):
|
||||||
rv = []
|
rv = []
|
||||||
if type(dir_list) is not list:
|
if type(dir_list) is not list:
|
||||||
dir_list = [dir_list]
|
dir_list = [dir_list]
|
||||||
@@ -124,7 +124,7 @@ class SimCardCommands(object):
|
|||||||
return self._tp.send_apdu_checksw(self.cla_byte + "a4" + "0404" + aidlen + aid)
|
return self._tp.send_apdu_checksw(self.cla_byte + "a4" + "0404" + aidlen + aid)
|
||||||
|
|
||||||
def read_binary(self, ef, length=None, offset=0):
|
def read_binary(self, ef, length=None, offset=0):
|
||||||
r = self.select_file(ef)
|
r = self.select_path(ef)
|
||||||
if len(r[-1]) == 0:
|
if len(r[-1]) == 0:
|
||||||
return (None, None)
|
return (None, None)
|
||||||
if length is None:
|
if length is None:
|
||||||
@@ -142,7 +142,7 @@ class SimCardCommands(object):
|
|||||||
return total_data, sw
|
return total_data, sw
|
||||||
|
|
||||||
def update_binary(self, ef, data, offset=0, verify=False):
|
def update_binary(self, ef, data, offset=0, verify=False):
|
||||||
self.select_file(ef)
|
self.select_path(ef)
|
||||||
pdu = self.cla_byte + 'd6%04x%02x' % (offset, len(data) // 2) + data
|
pdu = self.cla_byte + 'd6%04x%02x' % (offset, len(data) // 2) + data
|
||||||
res = self._tp.send_apdu_checksw(pdu)
|
res = self._tp.send_apdu_checksw(pdu)
|
||||||
if verify:
|
if verify:
|
||||||
@@ -155,13 +155,13 @@ class SimCardCommands(object):
|
|||||||
raise ValueError('Binary verification failed (expected %s, got %s)' % (data.lower(), res[0].lower()))
|
raise ValueError('Binary verification failed (expected %s, got %s)' % (data.lower(), res[0].lower()))
|
||||||
|
|
||||||
def read_record(self, ef, rec_no):
|
def read_record(self, ef, rec_no):
|
||||||
r = self.select_file(ef)
|
r = self.select_path(ef)
|
||||||
rec_length = self.__record_len(r)
|
rec_length = self.__record_len(r)
|
||||||
pdu = self.cla_byte + 'b2%02x04%02x' % (rec_no, rec_length)
|
pdu = self.cla_byte + 'b2%02x04%02x' % (rec_no, rec_length)
|
||||||
return self._tp.send_apdu(pdu)
|
return self._tp.send_apdu(pdu)
|
||||||
|
|
||||||
def update_record(self, ef, rec_no, data, force_len=False, verify=False):
|
def update_record(self, ef, rec_no, data, force_len=False, verify=False):
|
||||||
r = self.select_file(ef)
|
r = self.select_path(ef)
|
||||||
if not force_len:
|
if not force_len:
|
||||||
rec_length = self.__record_len(r)
|
rec_length = self.__record_len(r)
|
||||||
if (len(data) // 2 != rec_length):
|
if (len(data) // 2 != rec_length):
|
||||||
@@ -180,21 +180,21 @@ class SimCardCommands(object):
|
|||||||
raise ValueError('Record verification failed (expected %s, got %s)' % (data.lower(), res[0].lower()))
|
raise ValueError('Record verification failed (expected %s, got %s)' % (data.lower(), res[0].lower()))
|
||||||
|
|
||||||
def record_size(self, ef):
|
def record_size(self, ef):
|
||||||
r = self.select_file(ef)
|
r = self.select_path(ef)
|
||||||
return self.__record_len(r)
|
return self.__record_len(r)
|
||||||
|
|
||||||
def record_count(self, ef):
|
def record_count(self, ef):
|
||||||
r = self.select_file(ef)
|
r = self.select_path(ef)
|
||||||
return self.__len(r) // self.__record_len(r)
|
return self.__len(r) // self.__record_len(r)
|
||||||
|
|
||||||
def binary_size(self, ef):
|
def binary_size(self, ef):
|
||||||
r = self.select_file(ef)
|
r = self.select_path(ef)
|
||||||
return self.__len(r)
|
return self.__len(r)
|
||||||
|
|
||||||
def run_gsm(self, rand):
|
def run_gsm(self, rand):
|
||||||
if len(rand) != 32:
|
if len(rand) != 32:
|
||||||
raise ValueError('Invalid rand')
|
raise ValueError('Invalid rand')
|
||||||
self.select_file(['3f00', '7f20'])
|
self.select_path(['3f00', '7f20'])
|
||||||
return self._tp.send_apdu(self.cla_byte + '88000010' + rand)
|
return self._tp.send_apdu(self.cla_byte + '88000010' + rand)
|
||||||
|
|
||||||
def reset_card(self):
|
def reset_card(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user