laforge submitted this change.

View Change

Approvals: laforge: Looks good to me, approved Jenkins Builder: Verified
pySim-shell: fix CardKeyProvider for chv management commands

The CardKeyProvider support for the commands enable_chv, disable_chv,
verify_chv, change_chv and unblock_chv is broken. The reason for this
is the annotation "type=is_decimal" in the argument parser. This annotation
prevents the usage of string placeholders ("PIN1", "PUK1", etc).

Let's fix this by finding a better solution. We can also replace any
missing PIN/PUK code by checking if it is supplied or not. If not,
we query the CardKeyProvider. This also makes the usage of the *_chv
commands more uniform with the verify_adm command.

Related: OS#6531
Change-Id: I565b56ac608e801c67ca53d337bdec9efa3f3817
---
M pySim-shell.py
1 file changed, 27 insertions(+), 30 deletions(-)

diff --git a/pySim-shell.py b/pySim-shell.py
index 3a89f2d..78d20e6 100755
--- a/pySim-shell.py
+++ b/pySim-shell.py
@@ -851,67 +851,64 @@
index_dict = {1: self._cmd.lchan.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:
+ def get_code(self, code, field):
+ """Use code either directly or try to get it from external data source using the provided field name"""
+ if code is not None:
return sanitize_pin_adm(code)
-
iccid = self._cmd.rs.identity['ICCID']
- result = card_key_provider_get_field(str(code), key='ICCID', value=iccid)
+ result = card_key_provider_get_field(field, key='ICCID', value=iccid)
result = sanitize_pin_adm(result)
if result:
- self._cmd.poutput("found %s '%s' for ICCID '%s'" % (code.upper(), result, iccid))
+ self._cmd.poutput("found %s '%s' for ICCID '%s'" % (field, result, iccid))
else:
- self._cmd.poutput("cannot find %s for ICCID '%s'" % (code.upper(), iccid))
+ raise RuntimeError("cannot find %s for ICCID '%s'" % (field, 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=is_decimal, help='PIN code digits, \"PIN1\" or \"PIN2\" to get PIN code from external data source')
+ verify_chv_parser.add_argument('PIN', nargs='?', type=is_decimal,
+ help='PIN code value. If none given, CSV file will be queried')

@cmd2.with_argparser(verify_chv_parser)
def do_verify_chv(self, opts):
"""Verify (authenticate) using specified CHV (PIN) code, which is how the specifications
call it if you authenticate yourself using the specified PIN. There usually is at least PIN1 and
PIN2."""
- pin = self.get_code(opts.pin_code)
+ pin = self.get_code(opts.PIN, "PIN" + str(opts.pin_nr))
(data, sw) = self._cmd.lchan.scc.verify_chv(opts.pin_nr, h2b(pin))
self._cmd.poutput("CHV verification 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=is_decimal, help='PUK code digits \"PUK1\" or \"PUK2\" to get PUK code from external data source')
- unblock_chv_parser.add_argument(
- 'new_pin_code', type=is_decimal, help='PIN code digits \"PIN1\" or \"PIN2\" to get PIN code from external data source')
+ unblock_chv_parser.add_argument('PUK', nargs='?', type=is_decimal,
+ help='PUK code value. If none given, CSV file will be queried')
+ unblock_chv_parser.add_argument('NEWPIN', nargs='?', type=is_decimal,
+ help='PIN code value. If none given, CSV file will be queried')

@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)
+ new_pin = self.get_code(opts.NEWPIN, "PIN" + str(opts.pin_nr))
+ puk = self.get_code(opts.PUK, "PUK" + str(opts.pin_nr))
(data, sw) = self._cmd.lchan.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('NEWPIN', nargs='?', type=is_decimal,
+ help='PIN code value. If none given, CSV file will be queried')
+ change_chv_parser.add_argument('PIN', nargs='?', type=is_decimal,
+ help='PIN code value. If none given, CSV file will be queried')
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=is_decimal, help='PIN code digits \"PIN1\" or \"PIN2\" to get PIN code from external data source')
- change_chv_parser.add_argument(
- 'new_pin_code', type=is_decimal, 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)
+ new_pin = self.get_code(opts.NEWPIN, "PIN" + str(opts.pin_nr))
+ pin = self.get_code(opts.PIN, "PIN" + str(opts.pin_nr))
(data, sw) = self._cmd.lchan.scc.change_chv(
opts.pin_nr, h2b(pin), h2b(new_pin))
self._cmd.poutput("CHV change successful")
@@ -919,26 +916,26 @@
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=is_decimal, help='PIN code digits, \"PIN1\" or \"PIN2\" to get PIN code from external data source')
+ disable_chv_parser.add_argument('PIN', nargs='?', type=is_decimal,
+ help='PIN code value. If none given, CSV file will be queried')

@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)
+ pin = self.get_code(opts.PIN, "PIN" + str(opts.pin_nr))
(data, sw) = self._cmd.lchan.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=is_decimal, help='PIN code digits, \"PIN1\" or \"PIN2\" to get PIN code from external data source')
+ enable_chv_parser.add_argument('PIN', nargs='?', type=is_decimal,
+ help='PIN code value. If none given, CSV file will be queried')

@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)
+ pin = self.get_code(opts.PIN, "PIN" + str(opts.pin_nr))
(data, sw) = self._cmd.lchan.scc.enable_chv(opts.pin_nr, h2b(pin))
self._cmd.poutput("CHV enable successful")


To view, visit change 37838. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-MessageType: merged
Gerrit-Project: pysim
Gerrit-Branch: master
Gerrit-Change-Id: I565b56ac608e801c67ca53d337bdec9efa3f3817
Gerrit-Change-Number: 37838
Gerrit-PatchSet: 5
Gerrit-Owner: dexter <pmaier@sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de>
Gerrit-Reviewer: laforge <laforge@osmocom.org>