view utils/fcsim1-program.c @ 93:6041c601304d

fcsim1-mkprov: revert OTA key addition It appears that GrcardSIM2 cards (which is what we got for FCSIM1) do not support OTA after all, contrary to what we were previously led to believe by some tech support emails from Grcard - apparently those support emails and OTA descriptions referred to some other card model(s).
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 21 Apr 2021 05:38:39 +0000
parents 2a24e94400e8
children
line wrap: on
line source

/*
 * This utility takes an ICCID number on the command line (needs to be
 * read from the plastic with human eyeballs and entered by the operator),
 * reads card provisioning data from fcsim1-prov-db, and generates
 * an fc-simtool command script for programming one FCSIM1 card.  The
 * intent is that the output of this program will be piped directly
 * into fc-simtool.
 */

#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "../libutil/dbread.h"

static char prov_db_file[] = "/opt/freecalypso/sim-data/fcsim1-prov-db";

static char *adm_key = "88888888";
static int adm_hex;
static char *common_script;
static char iccid_fullstr[20];
static struct dbread_state dbs;
static char *prov_imsi, *prov_acc, *prov_ki, *prov_msisdn;

static void
preen_iccid(arg)
	char *arg;
{
	u_char nibbles[19];

	if (parse_decimal_shorthand(arg, nibbles, 19) < 0)
		exit(1);	/* error msg already printed */
	if (nibbles[18] != compute_iccid_luhn(nibbles)) {
		fprintf(stderr, "error: Luhn check digit mismatch\n");
		exit(1);
	}
	nibbles_to_ascii(nibbles, 19, iccid_fullstr);
}

static void
parse_cmdline(argc, argv)
	char **argv;
{
	extern int optind;
	extern char *optarg;
	int c;

	while ((c = getopt(argc, argv, "a:A:c:")) != EOF) {
		switch (c) {
		case 'a':
			adm_key = optarg;
			continue;
		case 'A':
			adm_key = optarg;
			adm_hex = 1;
			continue;
		case 'c':
			common_script = optarg;
			continue;
		case '?':
		default:
usage:			fprintf(stderr, "usage: %s [options] iccid\n", argv[0]);
			exit(1);
		}
	}
	if (argc - optind != 1)
		goto usage;
	preen_iccid(argv[optind]);
}

main(argc, argv)
	char **argv;
{
	int rc;

	parse_cmdline(argc, argv);
	rc = dbread_find_record(prov_db_file, &dbs, "ICCID", iccid_fullstr);
	if (rc < 0)
		exit(1);	/* error msg already printed */
	prov_imsi = dbread_find_key_req(&dbs, "IMSI");
	if (!prov_imsi)
		exit(1);	/* error msg already printed */
	prov_acc = dbread_find_key_req(&dbs, "ACC");
	if (!prov_acc)
		exit(1);	/* error msg already printed */
	prov_ki = dbread_find_key_req(&dbs, "Ki");
	if (!prov_ki)
		exit(1);	/* error msg already printed */
	prov_msisdn = dbread_find_key(&dbs, "MSISDN");

	/* emit the script! */
	printf("verify-%s 11 %s\n", adm_hex ? "hex" : "ext", adm_key);
	if (common_script)
		printf("exec %s\n", common_script);
	printf("write-iccid %s\n", iccid_fullstr);
	printf("write-imsi %s\n", prov_imsi);
	printf("write-acc %s\n", prov_acc);
	printf("grcard2-set-ki %s\n", prov_ki);
	if (prov_msisdn)
		printf("pb-update-imm msisdn 1 %s\n", prov_msisdn);
	exit(0);
}