aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xpySim-shell.py197
1 files changed, 101 insertions, 96 deletions
diff --git a/pySim-shell.py b/pySim-shell.py
index ef76cb2..ae8a5a2 100755
--- a/pySim-shell.py
+++ b/pySim-shell.py
@@ -55,7 +55,7 @@ from pySim.card_key_provider import CardKeyProviderCsv, card_key_provider_regist
class PysimApp(cmd2.Cmd):
CUSTOM_CATEGORY = 'pySim Commands'
def __init__(self, card, rs, script = None):
- basic_commands = [Iso7816Commands()]
+ basic_commands = [Iso7816Commands(), PySimCommands()]
super().__init__(persistent_history_file='~/.pysim_shell_history', allow_cli_args=False,
use_ipython=True, auto_load_commands=False, command_sets=basic_commands, startup_script=script)
self.intro = style('Welcome to pySim-shell!', fg=fg.red)
@@ -118,104 +118,11 @@ class PysimApp(cmd2.Cmd):
else:
self.poutput("no description available")
-
-@with_default_category('ISO7816 Commands')
-class Iso7816Commands(CommandSet):
+@with_default_category('pySim Commands')
+class PySimCommands(CommandSet):
def __init__(self):
super().__init__()
- def do_select(self, opts):
- """SELECT a File (ADF/DF/EF)"""
- if len(opts.arg_list) == 0:
- path_list = self._cmd.rs.selected_file.fully_qualified_path(True)
- path_list_fid = self._cmd.rs.selected_file.fully_qualified_path(False)
- self._cmd.poutput("currently selected file: " + '/'.join(path_list) + " (" + '/'.join(path_list_fid) + ")")
- return
-
- path = opts.arg_list[0]
- fcp_dec = self._cmd.rs.select(path, self._cmd)
- self._cmd.update_prompt()
- self._cmd.poutput(json.dumps(fcp_dec, indent=4))
-
- def complete_select(self, text, line, begidx, endidx) -> List[str]:
- """Command Line tab completion for SELECT"""
- index_dict = { 1: self._cmd.rs.selected_file.get_selectable_names() }
- return self._cmd.index_based_complete(text, line, begidx, endidx, index_dict=index_dict)
-
- def get_code(self, code):
- """Use code either directly or try to get it from external data source"""
- auto = ('PIN1', 'PIN2', 'PUK1', 'PUK2')
-
- if str(code).upper() not in auto:
- return sanitize_pin_adm(code)
-
- result = card_key_provider_get_field(str(code), key='ICCID', value=self._cmd.iccid)
- result = sanitize_pin_adm(result)
- if result:
- self._cmd.poutput("found %s '%s' for ICCID '%s'" % (code.upper(), result, self._cmd.iccid))
- else:
- self._cmd.poutput("cannot find %s for ICCID '%s'" % (code.upper(), self._cmd.iccid))
- return result
-
- verify_chv_parser = argparse.ArgumentParser()
- verify_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PIN Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
- verify_chv_parser.add_argument('pin_code', type=str, help='PIN code digits, \"PIN1\" or \"PIN2\" to get PIN code from external data source')
-
- @cmd2.with_argparser(verify_chv_parser)
- def do_verify_chv(self, opts):
- """Verify (authenticate) using specified PIN code"""
- pin = self.get_code(opts.pin_code)
- (data, sw) = self._cmd.card._scc.verify_chv(opts.pin_nr, h2b(pin))
- self._cmd.poutput("CHV verfication successful")
-
- unblock_chv_parser = argparse.ArgumentParser()
- unblock_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PUK Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
- unblock_chv_parser.add_argument('puk_code', type=str, help='PUK code digits \"PUK1\" or \"PUK2\" to get PUK code from external data source')
- unblock_chv_parser.add_argument('new_pin_code', type=str, help='PIN code digits \"PIN1\" or \"PIN2\" to get PIN code from external data source')
-
- @cmd2.with_argparser(unblock_chv_parser)
- def do_unblock_chv(self, opts):
- """Unblock PIN code using specified PUK code"""
- new_pin = self.get_code(opts.new_pin_code)
- puk = self.get_code(opts.puk_code)
- (data, sw) = self._cmd.card._scc.unblock_chv(opts.pin_nr, h2b(puk), h2b(new_pin))
- self._cmd.poutput("CHV unblock successful")
-
- change_chv_parser = argparse.ArgumentParser()
- change_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PUK Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
- change_chv_parser.add_argument('pin_code', type=str, help='PIN code digits \"PIN1\" or \"PIN2\" to get PIN code from external data source')
- change_chv_parser.add_argument('new_pin_code', type=str, help='PIN code digits \"PIN1\" or \"PIN2\" to get PIN code from external data source')
-
- @cmd2.with_argparser(change_chv_parser)
- def do_change_chv(self, opts):
- """Change PIN code to a new PIN code"""
- new_pin = self.get_code(opts.new_pin_code)
- pin = self.get_code(opts.pin_code)
- (data, sw) = self._cmd.card._scc.change_chv(opts.pin_nr, h2b(pin), h2b(new_pin))
- self._cmd.poutput("CHV change successful")
-
- disable_chv_parser = argparse.ArgumentParser()
- disable_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PIN Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
- disable_chv_parser.add_argument('pin_code', type=str, help='PIN code digits, \"PIN1\" or \"PIN2\" to get PIN code from external data source')
-
- @cmd2.with_argparser(disable_chv_parser)
- def do_disable_chv(self, opts):
- """Disable PIN code using specified PIN code"""
- pin = self.get_code(opts.pin_code)
- (data, sw) = self._cmd.card._scc.disable_chv(opts.pin_nr, h2b(pin))
- self._cmd.poutput("CHV disable successful")
-
- enable_chv_parser = argparse.ArgumentParser()
- enable_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PIN Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
- enable_chv_parser.add_argument('pin_code', type=str, help='PIN code digits, \"PIN1\" or \"PIN2\" to get PIN code from external data source')
-
- @cmd2.with_argparser(enable_chv_parser)
- def do_enable_chv(self, opts):
- """Enable PIN code using specified PIN code"""
- pin = self.get_code(opts.pin_code)
- (data, sw) = self._cmd.card._scc.enable_chv(opts.pin_nr, h2b(pin))
- self._cmd.poutput("CHV enable successful")
-
dir_parser = argparse.ArgumentParser()
dir_parser.add_argument('--fids', help='Show file identifiers', action='store_true')
dir_parser.add_argument('--names', help='Show file names', action='store_true')
@@ -347,6 +254,104 @@ class Iso7816Commands(CommandSet):
raise RuntimeError("unable to export %i file(s)" % context['ERR'])
+@with_default_category('ISO7816 Commands')
+class Iso7816Commands(CommandSet):
+ def __init__(self):
+ super().__init__()
+
+ def do_select(self, opts):
+ """SELECT a File (ADF/DF/EF)"""
+ if len(opts.arg_list) == 0:
+ path_list = self._cmd.rs.selected_file.fully_qualified_path(True)
+ path_list_fid = self._cmd.rs.selected_file.fully_qualified_path(False)
+ self._cmd.poutput("currently selected file: " + '/'.join(path_list) + " (" + '/'.join(path_list_fid) + ")")
+ return
+
+ path = opts.arg_list[0]
+ fcp_dec = self._cmd.rs.select(path, self._cmd)
+ self._cmd.update_prompt()
+ self._cmd.poutput(json.dumps(fcp_dec, indent=4))
+
+ def complete_select(self, text, line, begidx, endidx) -> List[str]:
+ """Command Line tab completion for SELECT"""
+ index_dict = { 1: self._cmd.rs.selected_file.get_selectable_names() }
+ return self._cmd.index_based_complete(text, line, begidx, endidx, index_dict=index_dict)
+
+ def get_code(self, code):
+ """Use code either directly or try to get it from external data source"""
+ auto = ('PIN1', 'PIN2', 'PUK1', 'PUK2')
+
+ if str(code).upper() not in auto:
+ return sanitize_pin_adm(code)
+
+ result = card_key_provider_get_field(str(code), key='ICCID', value=self._cmd.iccid)
+ result = sanitize_pin_adm(result)
+ if result:
+ self._cmd.poutput("found %s '%s' for ICCID '%s'" % (code.upper(), result, self._cmd.iccid))
+ else:
+ self._cmd.poutput("cannot find %s for ICCID '%s'" % (code.upper(), self._cmd.iccid))
+ return result
+
+ verify_chv_parser = argparse.ArgumentParser()
+ verify_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PIN Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
+ verify_chv_parser.add_argument('pin_code', type=str, help='PIN code digits, \"PIN1\" or \"PIN2\" to get PIN code from external data source')
+
+ @cmd2.with_argparser(verify_chv_parser)
+ def do_verify_chv(self, opts):
+ """Verify (authenticate) using specified PIN code"""
+ pin = self.get_code(opts.pin_code)
+ (data, sw) = self._cmd.card._scc.verify_chv(opts.pin_nr, h2b(pin))
+ self._cmd.poutput("CHV verfication successful")
+
+ unblock_chv_parser = argparse.ArgumentParser()
+ unblock_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PUK Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
+ unblock_chv_parser.add_argument('puk_code', type=str, help='PUK code digits \"PUK1\" or \"PUK2\" to get PUK code from external data source')
+ unblock_chv_parser.add_argument('new_pin_code', type=str, help='PIN code digits \"PIN1\" or \"PIN2\" to get PIN code from external data source')
+
+ @cmd2.with_argparser(unblock_chv_parser)
+ def do_unblock_chv(self, opts):
+ """Unblock PIN code using specified PUK code"""
+ new_pin = self.get_code(opts.new_pin_code)
+ puk = self.get_code(opts.puk_code)
+ (data, sw) = self._cmd.card._scc.unblock_chv(opts.pin_nr, h2b(puk), h2b(new_pin))
+ self._cmd.poutput("CHV unblock successful")
+
+ change_chv_parser = argparse.ArgumentParser()
+ change_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PUK Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
+ change_chv_parser.add_argument('pin_code', type=str, help='PIN code digits \"PIN1\" or \"PIN2\" to get PIN code from external data source')
+ change_chv_parser.add_argument('new_pin_code', type=str, help='PIN code digits \"PIN1\" or \"PIN2\" to get PIN code from external data source')
+
+ @cmd2.with_argparser(change_chv_parser)
+ def do_change_chv(self, opts):
+ """Change PIN code to a new PIN code"""
+ new_pin = self.get_code(opts.new_pin_code)
+ pin = self.get_code(opts.pin_code)
+ (data, sw) = self._cmd.card._scc.change_chv(opts.pin_nr, h2b(pin), h2b(new_pin))
+ self._cmd.poutput("CHV change successful")
+
+ disable_chv_parser = argparse.ArgumentParser()
+ disable_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PIN Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
+ disable_chv_parser.add_argument('pin_code', type=str, help='PIN code digits, \"PIN1\" or \"PIN2\" to get PIN code from external data source')
+
+ @cmd2.with_argparser(disable_chv_parser)
+ def do_disable_chv(self, opts):
+ """Disable PIN code using specified PIN code"""
+ pin = self.get_code(opts.pin_code)
+ (data, sw) = self._cmd.card._scc.disable_chv(opts.pin_nr, h2b(pin))
+ self._cmd.poutput("CHV disable successful")
+
+ enable_chv_parser = argparse.ArgumentParser()
+ enable_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PIN Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
+ enable_chv_parser.add_argument('pin_code', type=str, help='PIN code digits, \"PIN1\" or \"PIN2\" to get PIN code from external data source')
+
+ @cmd2.with_argparser(enable_chv_parser)
+ def do_enable_chv(self, opts):
+ """Enable PIN code using specified PIN code"""
+ pin = self.get_code(opts.pin_code)
+ (data, sw) = self._cmd.card._scc.enable_chv(opts.pin_nr, h2b(pin))
+ self._cmd.poutput("CHV enable successful")
+
+
def parse_options():
parser = OptionParser(usage="usage: %prog [options]")