view simtool/dispatch.c @ 74:8562d8508cf2

grcard2-set-{adm,super}-hex commands implemented It appears that GrcardSIM2 cards allow arbitrary 64-bit keys for ADM and SUPER ADM, not necessarily consisting of ASCII digits like the specs require for standard PIN and PUK, and pySim-prog.py in fact sets the ADM key to 4444444444444444 in hex by default, which is not an ASCII digit string. If the cards allow such keys, we need to support them too.
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 16 Feb 2021 04:10:36 +0000
parents 105aa3d1a494
children 0b29c0d19db4
line wrap: on
line source

/*
 * This module implements the command dispatch for fc-simtool
 */

#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>

extern int cmd_a38();
extern int cmd_change_chv();
extern int cmd_disable_chv();
extern int cmd_dump_lnd();
extern int cmd_enable_chv();
extern int cmd_exec();
extern int cmd_fix_sysmo_msisdn();
extern int cmd_grcard1_set_adm();
extern int cmd_grcard1_set_ki();
extern int cmd_grcard1_set_pin();
extern int cmd_grcard2_set_adm();
extern int cmd_grcard2_set_adm_hex();
extern int cmd_grcard2_set_pin();
extern int cmd_grcard2_set_puk();
extern int cmd_grcard2_set_super();
extern int cmd_grcard2_set_super_hex();
extern int cmd_iccid();
extern int cmd_imsi();
extern int cmd_opl_dump();
extern int cmd_pb_dump();
extern int cmd_pb_dump_rec();
extern int cmd_pb_erase();
extern int cmd_pb_erase_one();
extern int cmd_pb_erase_range();
extern int cmd_pb_update();
extern int cmd_pb_update_imm();
extern int cmd_pb_update_imm_hex();
extern int cmd_plmnsel_dump();
extern int cmd_pnn_dump();
extern int cmd_readbin();
extern int cmd_readef();
extern int cmd_readrec();
extern int cmd_restore_file();
extern int cmd_savebin();
extern int cmd_save_sms_bin();
extern int cmd_select();
extern int cmd_sms_erase_all();
extern int cmd_sms_erase_one();
extern int cmd_sms_erase_range();
extern int cmd_smsp_dump();
extern int cmd_smsp_erase_all();
extern int cmd_smsp_erase_one();
extern int cmd_smsp_erase_range();
extern int cmd_smsp_restore();
extern int cmd_smsp_set();
extern int cmd_smsp_set_tag();
extern int cmd_spn();
extern int cmd_sst();
extern int cmd_telecom_sum();
extern int cmd_uicc_dir();
extern int cmd_unblock_chv();
extern int cmd_update_bin();
extern int cmd_update_bin_imm();
extern int cmd_update_rec();
extern int cmd_user_sum();
extern int cmd_verify_chv();
extern int cmd_verify_ext();
extern int cmd_verify_hex();
extern int cmd_write_iccid();
extern int cmd_write_imsi();

extern int display_sim_resp_in_hex();
extern int good_exit();
extern int retrieve_atr();

static struct cmdtab {
	char *cmd;
	int minargs;
	int maxargs;
	int (*func)();
} cmdtab[] = {
	{"a38", 1, 1, cmd_a38},
	{"atr", 0, 0, retrieve_atr},
	{"change-chv1", 2, 2, cmd_change_chv},
	{"change-chv2", 2, 2, cmd_change_chv},
	{"change-pin1", 2, 2, cmd_change_chv},
	{"change-pin2", 2, 2, cmd_change_chv},
	{"disable-chv", 1, 1, cmd_disable_chv},
	{"disable-chv1", 1, 1, cmd_disable_chv},
	{"disable-pin", 1, 1, cmd_disable_chv},
	{"disable-pin1", 1, 1, cmd_disable_chv},
	{"dump-lnd", 0, 0, cmd_dump_lnd},
	{"enable-chv", 1, 1, cmd_enable_chv},
	{"enable-chv1", 1, 1, cmd_enable_chv},
	{"enable-pin", 1, 1, cmd_enable_chv},
	{"enable-pin1", 1, 1, cmd_enable_chv},
	{"exec", 1, 1, cmd_exec},
	{"exit", 0, 0, good_exit},
	{"fix-sysmo-msisdn", 0, 0, cmd_fix_sysmo_msisdn},
	{"grcard1-set-adm1", 2, 2, cmd_grcard1_set_adm},
	{"grcard1-set-adm2", 2, 2, cmd_grcard1_set_adm},
	{"grcard1-set-ki", 1, 1, cmd_grcard1_set_ki},
	{"grcard1-set-pin1", 2, 2, cmd_grcard1_set_pin},
	{"grcard1-set-pin2", 2, 2, cmd_grcard1_set_pin},
	{"grcard2-set-adm", 1, 1, cmd_grcard2_set_adm},
	{"grcard2-set-adm-hex", 1, 1, cmd_grcard2_set_adm_hex},
	{"grcard2-set-pin1", 1, 1, cmd_grcard2_set_pin},
	{"grcard2-set-pin2", 1, 1, cmd_grcard2_set_pin},
	{"grcard2-set-puk1", 1, 1, cmd_grcard2_set_puk},
	{"grcard2-set-puk2", 1, 1, cmd_grcard2_set_puk},
	{"grcard2-set-super", 1, 1, cmd_grcard2_set_super},
	{"grcard2-set-super-hex", 1, 1, cmd_grcard2_set_super_hex},
	{"iccid", 0, 0, cmd_iccid},
	{"imsi", 0, 0, cmd_imsi},
	{"opl-dump", 0, 0, cmd_opl_dump},
	{"pb-dump", 1, 2, cmd_pb_dump},
	{"pb-dump-rec", 2, 3, cmd_pb_dump_rec},
	{"pb-erase", 1, 1, cmd_pb_erase},
	{"pb-erase-one", 2, 2, cmd_pb_erase_one},
	{"pb-erase-range", 3, 3, cmd_pb_erase_range},
	{"pb-update", 2, 2, cmd_pb_update},
	{"pb-update-imm", 3, 4, cmd_pb_update_imm},
	{"pb-update-imm-hex", 4, 4, cmd_pb_update_imm_hex},
	{"plmnsel-dump", 0, 0, cmd_plmnsel_dump},
	{"pnn-dump", 0, 0, cmd_pnn_dump},
	{"quit", 0, 0, good_exit},
	{"readbin", 2, 2, cmd_readbin},
	{"readef", 1, 1, cmd_readef},
	{"readrec", 1, 2, cmd_readrec},
	{"restore-file", 2, 2, cmd_restore_file},
	{"savebin", 2, 2, cmd_savebin},
	{"save-sms-bin", 1, 1, cmd_save_sms_bin},
	{"select", 1, 1, cmd_select},
	{"sim-resp", 0, 0, display_sim_resp_in_hex},
	{"sms-erase-all", 0, 0, cmd_sms_erase_all},
	{"sms-erase-one", 1, 1, cmd_sms_erase_one},
	{"sms-erase-range", 2, 2, cmd_sms_erase_range},
	{"smsp-dump", 0, 1, cmd_smsp_dump},
	{"smsp-erase-all", 0, 0, cmd_smsp_erase_all},
	{"smsp-erase-one", 1, 1, cmd_smsp_erase_one},
	{"smsp-erase-range", 2, 2, cmd_smsp_erase_range},
	{"smsp-restore", 1, 1, cmd_smsp_restore},
	{"smsp-set", 2, 6, cmd_smsp_set},
	{"smsp-set-tag", 3, 7, cmd_smsp_set_tag},
	{"spn", 0, 0, cmd_spn},
	{"sst", 0, 0, cmd_sst},
	{"telecom-sum", 0, 0, cmd_telecom_sum},
	{"uicc-dir", 0, 0, cmd_uicc_dir},
	{"unblock-chv1", 2, 2, cmd_unblock_chv},
	{"unblock-chv2", 2, 2, cmd_unblock_chv},
	{"unblock-pin1", 2, 2, cmd_unblock_chv},
	{"unblock-pin2", 2, 2, cmd_unblock_chv},
	{"update-bin", 2, 2, cmd_update_bin},
	{"update-bin-imm", 2, 2, cmd_update_bin_imm},
	{"update-rec", 2, 2, cmd_update_rec},
	{"user-sum", 0, 0, cmd_user_sum},
	{"verify-chv1", 1, 1, cmd_verify_chv},
	{"verify-chv2", 1, 1, cmd_verify_chv},
	{"verify-ext", 2, 2, cmd_verify_ext},
	{"verify-hex", 2, 2, cmd_verify_hex},
	{"verify-pin1", 1, 1, cmd_verify_chv},
	{"verify-pin2", 1, 1, cmd_verify_chv},
	{"write-iccid", 1, 1, cmd_write_iccid},
	{"write-imsi", 1, 1, cmd_write_imsi},
	{0, 0, 0, 0}
};

simtool_dispatch_cmd(cmd, is_script)
	char *cmd;
{
	char *argv[10];
	char *cp, **ap;
	struct cmdtab *tp;

	for (cp = cmd; isspace(*cp); cp++)
		;
	if (!*cp || *cp == '#')
		return(0);
	if (is_script)
		printf("Script command: %s\n", cp);
	argv[0] = cp;
	while (*cp && !isspace(*cp))
		cp++;
	if (*cp)
		*cp++ = '\0';
	for (tp = cmdtab; tp->cmd; tp++)
		if (!strcmp(tp->cmd, argv[0]))
			break;
	if (!tp->func) {
		fprintf(stderr, "error: no such command\n");
		return(-1);
	}
	for (ap = argv + 1; ; ) {
		while (isspace(*cp))
			cp++;
		if (!*cp || *cp == '#')
			break;
		if (ap - argv - 1 >= tp->maxargs) {
			fprintf(stderr, "error: too many arguments\n");
			return(-1);
		}
		if (*cp == '"') {
			*ap++ = ++cp;
			for (;;) {
				if (!*cp) {
unterm_qstring:				fprintf(stderr,
					"error: unterminated quoted string\n");
					return(-1);
				}
				if (*cp == '"')
					break;
				if (*cp++ == '\\') {
					if (!*cp)
						goto unterm_qstring;
					cp++;
				}
			}
			*cp++ = '\0';
		} else {
			*ap++ = cp;
			while (*cp && !isspace(*cp))
				cp++;
			if (*cp)
				*cp++ = '\0';
		}
	}
	if (ap - argv - 1 < tp->minargs) {
		fprintf(stderr, "error: too few arguments\n");
		return(-1);
	}
	*ap = 0;
	return tp->func(ap - argv, argv);
}

dispatch_ready_argv(argc, argv)
	char **argv;
{
	struct cmdtab *tp;

	for (tp = cmdtab; tp->cmd; tp++)
		if (!strcmp(tp->cmd, argv[0]))
			break;
	if (!tp->func) {
		fprintf(stderr, "error: no such command\n");
		return(-1);
	}
	if (argc - 1 > tp->maxargs) {
		fprintf(stderr, "error: too many arguments\n");
		return(-1);
	}
	if (argc - 1 < tp->minargs) {
		fprintf(stderr, "error: too few arguments\n");
		return(-1);
	}
	return tp->func(argc, argv);
}