view uicc/sws.c @ 64:dba24129027e

doc/ADM-PIN-numbering article written
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 23 Mar 2021 23:30:00 +0000
parents 97646b363eaa
children
line wrap: on
line source

/*
 * This module implements a few high-level commands for working with
 * Sysmocom webshop SIM cards, using sws-card-db to look up per-card data.
 */

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

static char sws_card_db_file[] = "/opt/freecalypso/sim-data/sws-card-db";

static
lookup_sws_card(dbs)
	struct dbread_state *dbs;
{
	int rc;
	char iccid[21];

	rc = retrieve_iccid(iccid);
	if (rc < 0)
		return(rc);
	return dbread_find_record(sws_card_db_file, dbs, "ICCID", iccid);
}

cmd_sws_lookup(argc, argv, outf)
	char **argv;
	FILE *outf;
{
	int rc;
	struct dbread_state dbs;
	char **kp, *val;

	rc = lookup_sws_card(&dbs);
	if (rc < 0)
		return(rc);
	if (argc == 2) {
		val = dbread_find_key_req(&dbs, argv[1]);
		if (!val)
			return(-1);
		fprintf(outf, "%s\n", val);
		return(0);
	}
	for (kp = argv + 1; *kp; kp++) {
		val = dbread_find_key(&dbs, *kp);
		if (val)
			fprintf(outf, "%s=%s\n", *kp, val);
	}
	return(0);
}

cmd_sws_auth_adm1()
{
	int rc;
	struct dbread_state dbs;
	char *pin;

	rc = lookup_sws_card(&dbs);
	if (rc < 0)
		return(rc);
	pin = dbread_find_key_req(&dbs, "ADM1");
	if (!pin)
		return(-1);
	return verify_pin_func(0x0A, pin);
}

cmd_sws_auth_pin1()
{
	int rc;
	struct dbread_state dbs;
	char *pin;

	rc = lookup_sws_card(&dbs);
	if (rc < 0)
		return(rc);
	pin = dbread_find_key_req(&dbs, "PIN1");
	if (!pin)
		return(-1);
	return verify_pin_func(0x01, pin);
}

cmd_sws_auth_pin2()
{
	int rc;
	struct dbread_state dbs;
	char *pin;

	rc = lookup_sws_card(&dbs);
	if (rc < 0)
		return(rc);
	pin = dbread_find_key_req(&dbs, "PIN2");
	if (!pin)
		return(-1);
	return verify_pin_func(0x81, pin);
}