FreeCalypso > hg > fc-sim-tools
diff utils/fcsim1-program.c @ 79:2a24e94400e8
fcsim1-program utility written
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 09 Apr 2021 03:25:40 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/utils/fcsim1-program.c Fri Apr 09 03:25:40 2021 +0000 @@ -0,0 +1,102 @@ +/* + * 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); +}