view uicc/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 d368051576d0
children 16481db543e8
line wrap: on
line source

/*
 * This module implements the command dispatch for fc-uicc-tool
 */

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

extern int cmd_dir();
extern int cmd_exec();
extern int cmd_iccid();
extern int cmd_readbin();
extern int cmd_readef();
extern int cmd_readrec();
extern int cmd_select();
extern int cmd_select_aid();
extern int cmd_select_isim();
extern int cmd_select_usim();
extern int cmd_update_bin();
extern int cmd_update_bin_imm();
extern int cmd_update_rec();

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[] = {
	{"atr", 0, 0, retrieve_atr},
	{"dir", 0, 0, cmd_dir},
	{"exec", 1, 1, cmd_exec},
	{"exit", 0, 0, good_exit},
	{"iccid", 0, 0, cmd_iccid},
	{"quit", 0, 0, good_exit},
	{"readbin", 2, 2, cmd_readbin},
	{"readef", 1, 1, cmd_readef},
	{"readrec", 1, 2, cmd_readrec},
	{"select", 1, 1, cmd_select},
	{"select-aid", 1, 1, cmd_select_aid},
	{"select-isim", 0, 0, cmd_select_isim},
	{"select-usim", 0, 0, cmd_select_usim},
	{"sim-resp", 0, 0, display_sim_resp_in_hex},
	{"update-bin", 2, 2, cmd_update_bin},
	{"update-bin-imm", 2, 2, cmd_update_bin_imm},
	{"update-rec", 2, 2, cmd_update_rec},
	{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);
}