mirror of
https://gitea.osmocom.org/sim-card/pysim.git
synced 2026-03-17 02:48:34 +03:00
pySim-shell: complete CHV/PIN management tools
At the moment we only have a basic version of a verify_chv commnad, but in order to handle any CHV/PIN related situation we also need commands to enable, disable, change and unblock CHV. - fix verify_chv commnad: more distinct parameter names, better help strings, correct pin code encoding and add external source lookup - Add unblock_chv, change_chv, enable_chv and disable_chv commands - add/fix related functions in commands.py Change-Id: Ic89446e6bd2021095e579fb6b20458df48ba6413 Related: OS#4963
This commit is contained in:
committed by
Harald Welte
parent
b63766b96b
commit
46f09af11d
@@ -21,7 +21,8 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
from pySim.utils import rpad, b2h
|
||||
from pySim.utils import rpad, b2h, sw_match
|
||||
from pySim.exceptions import SwMatchError
|
||||
|
||||
class SimCardCommands(object):
|
||||
def __init__(self, transport):
|
||||
@@ -219,9 +220,39 @@ class SimCardCommands(object):
|
||||
def reset_card(self):
|
||||
return self._tp.reset_card()
|
||||
|
||||
def verify_chv(self, chv_no, code):
|
||||
fc = rpad(b2h(code), 16)
|
||||
def _chv_process_sw(self, op_name, chv_no, pin_code, sw):
|
||||
if sw_match(sw, '63cx'):
|
||||
raise RuntimeError('Failed to %s chv_no 0x%02X with code 0x%s, %i tries left.' %
|
||||
(op_name, chv_no, b2h(pin_code).upper(), int(sw[3])))
|
||||
elif (sw != '9000'):
|
||||
raise SwMatchError(sw, '9000')
|
||||
|
||||
def verify_chv(self, chv_no, pin_code):
|
||||
fc = rpad(b2h(pin_code), 16)
|
||||
data, sw = self._tp.send_apdu(self.cla_byte + '2000' + ('%02X' % chv_no) + '08' + fc)
|
||||
if (sw != '9000'):
|
||||
raise RuntimeError('Failed to authenticate with ADM key %s, %i tries left.' % (code, int(sw[3])))
|
||||
return (data,sw)
|
||||
self._chv_process_sw('verify', chv_no, pin_code, sw)
|
||||
return (data, sw)
|
||||
|
||||
def unblock_chv(self, chv_no, puk_code, pin_code):
|
||||
fc = rpad(b2h(puk_code), 16) + rpad(b2h(pin_code), 16)
|
||||
data, sw = self._tp.send_apdu(self.cla_byte + '2C00' + ('%02X' % chv_no) + '10' + fc)
|
||||
self._chv_process_sw('unblock', chv_no, pin_code, sw)
|
||||
return (data, sw)
|
||||
|
||||
def change_chv(self, chv_no, pin_code, new_pin_code):
|
||||
fc = rpad(b2h(pin_code), 16) + rpad(b2h(new_pin_code), 16)
|
||||
data, sw = self._tp.send_apdu(self.cla_byte + '2400' + ('%02X' % chv_no) + '10' + fc)
|
||||
self._chv_process_sw('change', chv_no, pin_code, sw)
|
||||
return (data, sw)
|
||||
|
||||
def disable_chv(self, chv_no, pin_code):
|
||||
fc = rpad(b2h(pin_code), 16)
|
||||
data, sw = self._tp.send_apdu(self.cla_byte + '2600' + ('%02X' % chv_no) + '08' + fc)
|
||||
self._chv_process_sw('disable', chv_no, pin_code, sw)
|
||||
return (data, sw)
|
||||
|
||||
def enable_chv(self, chv_no, pin_code):
|
||||
fc = rpad(b2h(pin_code), 16)
|
||||
data, sw = self._tp.send_apdu(self.cla_byte + '2800' + ('%02X' % chv_no) + '08' + fc)
|
||||
self._chv_process_sw('enable', chv_no, pin_code, sw)
|
||||
return (data, sw)
|
||||
|
||||
Reference in New Issue
Block a user