mirror of https://gerrit.osmocom.org/pysim
cards: sysmocom SysmoSIM-GR2 support added to cards
Written-by: Kevin Redon Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
This commit is contained in:
parent
9f13897408
commit
2fc205ceb9
|
@ -302,7 +302,6 @@ class GrcardSim(Card):
|
||||||
def erase(self):
|
def erase(self):
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
class SysmoSIMgr1(GrcardSim):
|
class SysmoSIMgr1(GrcardSim):
|
||||||
"""
|
"""
|
||||||
sysmocom sysmoSIM-GR1
|
sysmocom sysmoSIM-GR1
|
||||||
|
@ -341,6 +340,72 @@ class SysmoUSIMgr1(Card):
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
class SysmoSIMgr2(Card):
|
||||||
|
"""
|
||||||
|
sysmocom sysmoSIM-GR2
|
||||||
|
"""
|
||||||
|
|
||||||
|
name = 'sysmoSIM-GR2'
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def autodetect(kls, scc):
|
||||||
|
# TODO: look for ATR 3B 7D 94 00 00 55 55 53 0A 74 86 93 0B 24 7C 4D 54 68
|
||||||
|
return None
|
||||||
|
|
||||||
|
def program(self, p):
|
||||||
|
|
||||||
|
# select MF
|
||||||
|
r = self._scc.select_file(['3f00'])
|
||||||
|
|
||||||
|
# authenticate as SUPER ADM using default key
|
||||||
|
self._scc.verify_chv(0x0b, h2b("3838383838383838"))
|
||||||
|
|
||||||
|
# set ADM pin using proprietary command
|
||||||
|
# INS: D4
|
||||||
|
# P1: 3A for PIN, 3B 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)
|
||||||
|
pdu = 'A0D43A0508' + "4444444444444444"
|
||||||
|
data, sw = self._scc._tp.send_apdu(pdu)
|
||||||
|
|
||||||
|
# authenticate as ADM (enough to write file, and can set PINs)
|
||||||
|
self._scc.verify_chv(0x05, h2b("4444444444444444"))
|
||||||
|
|
||||||
|
# write EF.ICCID
|
||||||
|
data, sw = self._scc.update_binary('2fe2', enc_iccid(p['iccid']))
|
||||||
|
|
||||||
|
# select DF_GSM
|
||||||
|
r = self._scc.select_file(['7f20'])
|
||||||
|
|
||||||
|
# write EF.IMSI
|
||||||
|
data, sw = self._scc.update_binary('6f07', enc_imsi(p['imsi']))
|
||||||
|
|
||||||
|
# write EF.ACC
|
||||||
|
if p.get('acc') is not None:
|
||||||
|
data, sw = self._scc.update_binary('6f78', lpad(p['acc'], 4))
|
||||||
|
|
||||||
|
# get size and write EF.HPLMN
|
||||||
|
r = self._scc.select_file(['6f30'])
|
||||||
|
size = int(r[-1][4:8], 16)
|
||||||
|
hplmn = enc_plmn(p['mcc'], p['mnc'])
|
||||||
|
self._scc.update_binary('6f30', hplmn + 'ff' * (size-3))
|
||||||
|
|
||||||
|
# set COMP128 version 0 in proprietary file
|
||||||
|
data, sw = self._scc.update_binary('0001', '001000')
|
||||||
|
|
||||||
|
# set Ki in proprietary file
|
||||||
|
data, sw = self._scc.update_binary('0001', p['ki'], 3)
|
||||||
|
|
||||||
|
# select DF_TELECOM
|
||||||
|
r = self._scc.select_file(['3f00', '7f10'])
|
||||||
|
|
||||||
|
# write EF.SMSP
|
||||||
|
data, sw = self._scc.update_record('6f42', 1, lpad(p['smsp'], 80))
|
||||||
|
|
||||||
|
def erase(self):
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
# In order for autodetection ...
|
# In order for autodetection ...
|
||||||
_cards_classes = [ FakeMagicSim, SuperSim, MagicSim, GrcardSim,
|
_cards_classes = [ FakeMagicSim, SuperSim, MagicSim, GrcardSim,
|
||||||
SysmoSIMgr1, SysmoUSIMgr1 ]
|
SysmoSIMgr1, SysmoSIMgr2, SysmoUSIMgr1 ]
|
||||||
|
|
Loading…
Reference in New Issue