From 2797211645d452446cb7b329ee9d3d3a923f8520 Mon Sep 17 00:00:00 2001 From: laforge Date: Sat, 10 Mar 2007 02:22:04 +0000 Subject: * properly implement PIN/PUK handling throughout gsmd/libgsmd/util git-svn-id: http://svn.openmoko.org/trunk/src/target/gsm@1314 99fdad57-331a-0410-800a-d7fa5415bdb3 --- src/libgsmd/libgsmd_pin.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 src/libgsmd/libgsmd_pin.c (limited to 'src/libgsmd/libgsmd_pin.c') diff --git a/src/libgsmd/libgsmd_pin.c b/src/libgsmd/libgsmd_pin.c new file mode 100644 index 0000000..e645dd5 --- /dev/null +++ b/src/libgsmd/libgsmd_pin.c @@ -0,0 +1,78 @@ +#include +#include +#include + +#include +#include +#include + +static const char *pin_type_names[__NUM_GSMD_PIN] = { + [GSMD_PIN_NONE] = "NONE", + [GSMD_PIN_SIM_PIN] = "SIM PIN", + [GSMD_PIN_SIM_PUK] = "SIM PUK", + [GSMD_PIN_PH_SIM_PIN] = "Phone-to-SIM PIN", + [GSMD_PIN_PH_FSIM_PIN] = "Phone-to-very-first SIM PIN", + [GSMD_PIN_PH_FSIM_PUK] = "Phone-to-very-first SIM PUK", + [GSMD_PIN_SIM_PIN2] = "SIM PIN2", + [GSMD_PIN_SIM_PUK2] = "SIM PUK2", + [GSMD_PIN_PH_NET_PIN] = "Network personalization PIN", + [GSMD_PIN_PH_NET_PUK] = "Network personalizaiton PUK", + [GSMD_PIN_PH_NETSUB_PIN]= "Network subset personalisation PIN", + [GSMD_PIN_PH_NETSUB_PUK]= "Network subset personalisation PUK", + [GSMD_PIN_PH_SP_PIN] = "Service provider personalisation PIN", + [GSMD_PIN_PH_SP_PUK] = "Service provider personalisation PUK", + [GSMD_PIN_PH_CORP_PIN] = "Corporate personalisation PIN", + [GSMD_PIN_PH_CORP_PUK] = "Corporate personalisation PUK", +}; + +const char *lgsm_pin_name(enum gsmd_pin_type ptype) +{ + if (ptype >= __NUM_GSMD_PIN) + return "unknown"; + + return pin_type_names[ptype]; +} + +int lgsm_pin(struct lgsm_handle *lh, unsigned int type, char *pin, char *newpin) +{ + int rc; + struct { + struct gsmd_msg_hdr gmh; + struct gsmd_pin gp; + } __attribute__ ((packed)) *gm; + + if (strlen(pin) > GSMD_PIN_MAXLEN || + (newpin && strlen(newpin) > GSMD_PIN_MAXLEN) || + type >= __NUM_GSMD_PIN) + return -EINVAL; + + gm = (void *) lgsm_gmh_fill(GSMD_MSG_PIN, GSMD_PIN_INPUT, + sizeof(struct gsmd_pin)); + if (!gm) + return -ENOMEM; + + gm->gp.type = type; + + gm->gp.pin[0] = '\0'; + strcat(gm->gp.pin, pin); + + switch (type) { + case GSMD_PIN_SIM_PUK: + case GSMD_PIN_SIM_PUK2: + /* GSM 07.07 explicitly states that only those two PUK types + * require a new pin to be specified! Don't know if this is a + * bug or a feature. */ + if (!newpin) + return -EINVAL; + gm->gp.newpin[0] = '\0'; + strcat(gm->gp.newpin, newpin); + break; + default: + break; + } + printf("sending pin='%s', newpin='%s'\n", gm->gp.pin, gm->gp.newpin); + rc = lgsm_send(lh, &gm->gmh); + free(gm); + + return rc; +} -- cgit v1.2.3