summaryrefslogtreecommitdiffstats
path: root/contrib/wpa_supplicant/pcsc_funcs.c
diff options
context:
space:
mode:
authorsam <sam@FreeBSD.org>2006-03-07 05:26:33 +0000
committersam <sam@FreeBSD.org>2006-03-07 05:26:33 +0000
commit840099f34d8de1ca769f02fae379c4d8e5d6688a (patch)
tree0c0ff34569d807e7bceb062a6210ce68490a8764 /contrib/wpa_supplicant/pcsc_funcs.c
parent34dbcde8dfa5b3d152d250b6d69965e001238e49 (diff)
downloadFreeBSD-src-840099f34d8de1ca769f02fae379c4d8e5d6688a.zip
FreeBSD-src-840099f34d8de1ca769f02fae379c4d8e5d6688a.tar.gz
Import of WPA supplicant 0.4.8
Diffstat (limited to 'contrib/wpa_supplicant/pcsc_funcs.c')
-rw-r--r--contrib/wpa_supplicant/pcsc_funcs.c47
1 files changed, 29 insertions, 18 deletions
diff --git a/contrib/wpa_supplicant/pcsc_funcs.c b/contrib/wpa_supplicant/pcsc_funcs.c
index 541661f..2ccfd00 100644
--- a/contrib/wpa_supplicant/pcsc_funcs.c
+++ b/contrib/wpa_supplicant/pcsc_funcs.c
@@ -86,8 +86,8 @@ struct scard_data {
long ctx;
long card;
unsigned long protocol;
- SCARD_IO_REQUEST recv_pci;
sim_types sim_type;
+ int pin1_required;
};
@@ -96,7 +96,7 @@ static int _scard_select_file(struct scard_data *scard, unsigned short file_id,
sim_types sim_type, unsigned char *aid);
static int scard_select_file(struct scard_data *scard, unsigned short file_id,
unsigned char *buf, size_t *buf_len);
-static int scard_verify_pin(struct scard_data *scard, char *pin);
+static int scard_verify_pin(struct scard_data *scard, const char *pin);
static int scard_parse_fsp_templ(unsigned char *buf, size_t buf_len,
@@ -183,7 +183,7 @@ static int scard_pin_needed(struct scard_data *scard,
}
-struct scard_data * scard_init(scard_sim_type sim_type, char *pin)
+struct scard_data * scard_init(scard_sim_type sim_type)
{
long ret, len;
struct scard_data *scard;
@@ -294,28 +294,39 @@ struct scard_data * scard_init(scard_sim_type sim_type, char *pin)
/* Verify whether CHV1 (PIN1) is needed to access the card. */
if (scard_pin_needed(scard, buf, blen)) {
+ scard->pin1_required = 1;
wpa_printf(MSG_DEBUG, "PIN1 needed for SIM access");
+ }
+
+ return scard;
+
+failed:
+ free(readers);
+ scard_deinit(scard);
+ return NULL;
+}
+
+
+int scard_set_pin(struct scard_data *scard, const char *pin)
+{
+ if (scard == NULL)
+ return -1;
+
+ /* Verify whether CHV1 (PIN1) is needed to access the card. */
+ if (scard->pin1_required) {
if (pin == NULL) {
- wpa_printf(MSG_INFO, "No PIN configured for SIM "
+ wpa_printf(MSG_DEBUG, "No PIN configured for SIM "
"access");
- /* TODO: ask PIN from user through a frontend (e.g.,
- * wpa_cli) */
- goto failed;
+ return -1;
}
if (scard_verify_pin(scard, pin)) {
wpa_printf(MSG_INFO, "PIN verification failed for "
"SIM access");
- /* TODO: what to do? */
- goto failed;
+ return -1;
}
}
- return scard;
-
-failed:
- free(readers);
- scard_deinit(scard);
- return NULL;
+ return 0;
}
@@ -360,7 +371,7 @@ static long scard_transmit(struct scard_data *scard,
scard->protocol == SCARD_PROTOCOL_T1 ?
SCARD_PCI_T1 : SCARD_PCI_T0,
send, (unsigned long) send_len,
- &scard->recv_pci, recv, &rlen);
+ NULL, recv, &rlen);
*recv_len = rlen;
if (ret == SCARD_S_SUCCESS) {
wpa_hexdump(MSG_DEBUG, "SCARD: scard_transmit: recv",
@@ -498,7 +509,7 @@ static int scard_read_file(struct scard_data *scard,
}
-static int scard_verify_pin(struct scard_data *scard, char *pin)
+static int scard_verify_pin(struct scard_data *scard, const char *pin)
{
long ret;
unsigned char resp[3];
@@ -621,7 +632,7 @@ int scard_gsm_auth(struct scard_data *scard, unsigned char *rand,
memcpy(cmd + 6, rand, 16);
}
len = sizeof(resp);
- ret = scard_transmit(scard, cmd, sizeof(cmd), resp, &len);
+ ret = scard_transmit(scard, cmd, cmdlen, resp, &len);
if (ret != SCARD_S_SUCCESS)
return -2;
OpenPOWER on IntegriCloud