diff --git a/pySim-shell.py b/pySim-shell.py index bd7d0c05..aba1a6a7 100755 --- a/pySim-shell.py +++ b/pySim-shell.py @@ -69,8 +69,8 @@ from pySim.ts_102_222 import Ts102222Commands from pySim.gsm_r import DF_EIRENE from pySim.cat import ProactiveCommand -from pySim.card_key_provider import CardKeyProviderCsv, CardKeyProviderPgsql -from pySim.card_key_provider import card_key_provider_register, card_key_provider_get_field, card_key_provider_get +from pySim.card_key_provider import argparse_add_card_key_provider_args, init_card_key_provider +from pySim.card_key_provider import card_key_provider_get_field, card_key_provider_get from pySim.app import init_card @@ -1143,18 +1143,6 @@ global_group.add_argument("--skip-card-init", help="Skip all card/profile initia global_group.add_argument("--verbose", help="Enable verbose logging", action='store_true', default=False) -card_key_group = option_parser.add_argument_group('Card Key Provider Options') -card_key_group.add_argument('--csv', metavar='FILE', - default="~/.osmocom/pysim/card_data.csv", - help='Read card data from CSV file') -card_key_group.add_argument('--pgsql', metavar='FILE', - default="~/.osmocom/pysim/card_data_pgsql.cfg", - help='Read card data from PostgreSQL database (config file)') -card_key_group.add_argument('--csv-column-key', metavar='FIELD:AES_KEY_HEX', default=[], action='append', - help=argparse.SUPPRESS, dest='column_key') -card_key_group.add_argument('--column-key', metavar='FIELD:AES_KEY_HEX', default=[], action='append', - help='per-column AES transport key', dest='column_key') - adm_group = global_group.add_mutually_exclusive_group() adm_group.add_argument('-a', '--pin-adm', metavar='PIN_ADM1', dest='pin_adm', default=None, help='ADM PIN used for provisioning (overwrites default)') @@ -1167,6 +1155,7 @@ option_parser.add_argument("command", nargs='?', help="A pySim-shell command that would optionally be executed at startup") option_parser.add_argument('command_args', nargs=argparse.REMAINDER, help="Optional Arguments for command") +argparse_add_card_key_provider_args(option_parser) if __name__ == '__main__': startup_errors = False @@ -1175,16 +1164,8 @@ if __name__ == '__main__': # Ensure that we are able to print formatted warnings from the beginning. PySimLogger.setup(print, {logging.WARN: YELLOW}, opts.verbose) - # Register csv-file as card data provider, either from specified CSV - # or from CSV file in home directory - column_keys = {} - for par in opts.column_key: - name, key = par.split(':') - column_keys[name] = key - if os.path.isfile(os.path.expanduser(opts.csv)): - card_key_provider_register(CardKeyProviderCsv(os.path.expanduser(opts.csv), column_keys)) - if os.path.isfile(os.path.expanduser(opts.pgsql)): - card_key_provider_register(CardKeyProviderPgsql(os.path.expanduser(opts.pgsql), column_keys)) + # Init card key provider for automatic card key retrieval + init_card_key_provider(opts) # Init card reader driver sl = init_reader(opts, proactive_handler = Proact()) diff --git a/pySim/card_key_provider.py b/pySim/card_key_provider.py index 24036942..4dd297d1 100644 --- a/pySim/card_key_provider.py +++ b/pySim/card_key_provider.py @@ -33,10 +33,12 @@ from Cryptodome.Cipher import AES from osmocom.utils import h2b, b2h from pySim.log import PySimLogger +import os import abc import csv import logging import yaml +import argparse log = PySimLogger.get(__name__) @@ -148,6 +150,15 @@ class CardKeyProvider(abc.ABC): fond None shall be returned. """ + @staticmethod + def argparse_add_args(arg_parser: argparse.ArgumentParser): + """ + Add the commandline arguments relevant for this card key provider. + + Args: + arg_parser : argument parser group + """ + def __str__(self): return type(self).__name__ @@ -188,6 +199,12 @@ class CardKeyProviderCsv(CardKeyProvider): return None return return_dict + @staticmethod + def argparse_add_args(arg_parser: argparse.ArgumentParser): + arg_parser.add_argument('--csv', metavar='FILE', + default="~/.osmocom/pysim/card_data.csv", + help='Read card data from CSV file') + class CardKeyProviderPgsql(CardKeyProvider): """Card key provider implementation that allows to query against a specified PostgreSQL database table.""" @@ -252,6 +269,11 @@ class CardKeyProviderPgsql(CardKeyProvider): result[k] = self.crypt.decrypt_field(k, result.get(k)) return result + @staticmethod + def argparse_add_args(arg_parser: argparse.ArgumentParser): + arg_parser.add_argument('--pgsql', metavar='FILE', + default="~/.osmocom/pysim/card_data_pgsql.cfg", + help='Read card data from PostgreSQL database (config file)') def card_key_provider_register(provider: CardKeyProvider, provider_list=card_key_providers): """Register a new card key provider. @@ -303,3 +325,25 @@ def card_key_provider_get_field(field: str, key: str, value: str, provider_list= fields = [field] result = card_key_provider_get(fields, key, value, card_key_providers) return result.get(field.upper()) + +def argparse_add_card_key_provider_args(arg_parser: argparse.ArgumentParser): + """Add card key provider commandline options to the given argument parser""" + card_key_group = arg_parser.add_argument_group('Card Key Provider Options') + CardKeyProviderCsv.argparse_add_args(card_key_group) + CardKeyProviderPgsql.argparse_add_args(card_key_group) + card_key_group.add_argument('--column-key', metavar='FIELD:AES_KEY_HEX', default=[], action='append', + help='per-column AES transport key', dest='column_key') + # Depprecated argument, replaced by --column-key (see above) + card_key_group.add_argument('--csv-column-key', metavar='FIELD:AES_KEY_HEX', default=[], action='append', + help=argparse.SUPPRESS, dest='column_key') + +def init_card_key_provider(opts: argparse.Namespace): + """Initialize card key provider depending on the user provided commandline options""" + column_keys = {} + for par in opts.column_key: + name, key = par.split(':') + column_keys[name] = key + if os.path.isfile(os.path.expanduser(opts.csv)): + card_key_provider_register(CardKeyProviderCsv(os.path.expanduser(opts.csv), column_keys)) + if os.path.isfile(os.path.expanduser(opts.pgsql)): + card_key_provider_register(CardKeyProviderPgsql(os.path.expanduser(opts.pgsql), column_keys))