WPA Supplicant / PC/SC smartcard interface for USIM, GSM SIM. More...
#include "includes.h"
#include <winscard.h>
#include "common.h"
#include "pcsc_funcs.h"
Go to the source code of this file.
Data Structures | |
struct | scard_data |
Defines | |
#define | SIM_CMD_SELECT 0xa0, 0xa4, 0x00, 0x00, 0x02 |
#define | SIM_CMD_RUN_GSM_ALG 0xa0, 0x88, 0x00, 0x00, 0x10 |
#define | SIM_CMD_GET_RESPONSE 0xa0, 0xc0, 0x00, 0x00 |
#define | SIM_CMD_READ_BIN 0xa0, 0xb0, 0x00, 0x00 |
#define | SIM_CMD_READ_RECORD 0xa0, 0xb2, 0x00, 0x00 |
#define | SIM_CMD_VERIFY_CHV1 0xa0, 0x20, 0x00, 0x01, 0x08 |
#define | USIM_CLA 0x00 |
#define | USIM_CMD_RUN_UMTS_ALG 0x00, 0x88, 0x00, 0x81, 0x22 |
#define | USIM_CMD_GET_RESPONSE 0x00, 0xc0, 0x00, 0x00 |
#define | SIM_RECORD_MODE_ABSOLUTE 0x04 |
#define | USIM_FSP_TEMPL_TAG 0x62 |
#define | USIM_TLV_FILE_DESC 0x82 |
#define | USIM_TLV_FILE_ID 0x83 |
#define | USIM_TLV_DF_NAME 0x84 |
#define | USIM_TLV_PROPR_INFO 0xA5 |
#define | USIM_TLV_LIFE_CYCLE_STATUS 0x8A |
#define | USIM_TLV_FILE_SIZE 0x80 |
#define | USIM_TLV_TOTAL_FILE_SIZE 0x81 |
#define | USIM_TLV_PIN_STATUS_TEMPLATE 0xC6 |
#define | USIM_TLV_SHORT_FILE_ID 0x88 |
#define | USIM_PS_DO_TAG 0x90 |
#define | AKA_RAND_LEN 16 |
#define | AKA_AUTN_LEN 16 |
#define | AKA_AUTS_LEN 14 |
#define | RES_MAX_LEN 16 |
#define | IK_LEN 16 |
#define | CK_LEN 16 |
#define | mingw_load_symbols() 0 |
#define | mingw_unload_symbols() do { } while (0) |
Enumerations | |
enum | sim_types { SCARD_GSM_SIM, SCARD_USIM } |
Functions | |
struct scard_data * | scard_init (scard_sim_type sim_type) |
Initialize SIM/USIM connection using PC/SC. | |
int | scard_set_pin (struct scard_data *scard, const char *pin) |
Set PIN (CHV1/PIN1) code for accessing SIM/USIM commands. | |
void | scard_deinit (struct scard_data *scard) |
Deinitialize SIM/USIM connection. | |
int | scard_get_imsi (struct scard_data *scard, char *imsi, size_t *len) |
Read IMSI from SIM/USIM card. | |
int | scard_gsm_auth (struct scard_data *scard, const unsigned char *_rand, unsigned char *sres, unsigned char *kc) |
Run GSM authentication command on SIM card. | |
int | scard_umts_auth (struct scard_data *scard, const unsigned char *_rand, const unsigned char *autn, unsigned char *res, size_t *res_len, unsigned char *ik, unsigned char *ck, unsigned char *auts) |
Run UMTS authentication command on USIM card. |
WPA Supplicant / PC/SC smartcard interface for USIM, GSM SIM.
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation.
Alternatively, this software may be distributed under the terms of BSD license.
See README and COPYING for more details.
This file implements wrapper functions for accessing GSM SIM and 3GPP USIM cards through PC/SC smartcard library. These functions are used to implement authentication routines for EAP-SIM and EAP-AKA.
Definition in file pcsc_funcs.c.
void scard_deinit | ( | struct scard_data * | scard | ) |
Deinitialize SIM/USIM connection.
scard | Pointer to private data from scard_init() |
This function closes the SIM/USIM connect opened with scard_init().
Definition at line 650 of file pcsc_funcs.c.
int scard_get_imsi | ( | struct scard_data * | scard, | |
char * | imsi, | |||
size_t * | len | |||
) |
Read IMSI from SIM/USIM card.
scard | Pointer to private data from scard_init() | |
imsi | Buffer for IMSI | |
len | Length of imsi buffer; set to IMSI length on success |
This function can be used to read IMSI from the SIM/USIM card. If the IMSI file is PIN protected, scard_set_pin() must have been used to set the correct PIN code before calling scard_get_imsi().
Definition at line 967 of file pcsc_funcs.c.
int scard_gsm_auth | ( | struct scard_data * | scard, | |
const unsigned char * | _rand, | |||
unsigned char * | sres, | |||
unsigned char * | kc | |||
) |
Run GSM authentication command on SIM card.
scard | Pointer to private data from scard_init() | |
_rand | 16-byte RAND value from HLR/AuC | |
sres | 4-byte buffer for SRES | |
kc | 8-byte buffer for Kc |
This function performs GSM authentication using SIM/USIM card and the provided RAND value from HLR/AuC. If authentication command can be completed successfully, SRES and Kc values will be written into sres and kc buffers.
Definition at line 1047 of file pcsc_funcs.c.
struct scard_data* scard_init | ( | scard_sim_type | sim_type | ) | [read] |
Initialize SIM/USIM connection using PC/SC.
sim_type | Allowed SIM types (SIM, USIM, or both) |
This function is used to initialize SIM/USIM connection. PC/SC is used to open connection to the SIM/USIM card and the card is verified to support the selected sim_type. In addition, local flag is set if a PIN is needed to access some of the card functions. Once the connection is not needed anymore, scard_deinit() can be used to close it.
Definition at line 436 of file pcsc_funcs.c.
int scard_set_pin | ( | struct scard_data * | scard, | |
const char * | pin | |||
) |
Set PIN (CHV1/PIN1) code for accessing SIM/USIM commands.
scard | Pointer to private data from scard_init() | |
pin | PIN code as an ASCII string (e.g., "1234") |
Definition at line 620 of file pcsc_funcs.c.
int scard_umts_auth | ( | struct scard_data * | scard, | |
const unsigned char * | _rand, | |||
const unsigned char * | autn, | |||
unsigned char * | res, | |||
size_t * | res_len, | |||
unsigned char * | ik, | |||
unsigned char * | ck, | |||
unsigned char * | auts | |||
) |
Run UMTS authentication command on USIM card.
scard | Pointer to private data from scard_init() | |
_rand | 16-byte RAND value from HLR/AuC | |
autn | 16-byte AUTN value from HLR/AuC | |
res | 16-byte buffer for RES | |
res_len | Variable that will be set to RES length | |
ik | 16-byte buffer for IK | |
ck | 16-byte buffer for CK | |
auts | 14-byte buffer for AUTS |
This function performs AKA authentication using USIM card and the provided RAND and AUTN values from HLR/AuC. If authentication command can be completed successfully, RES, IK, and CK values will be written into provided buffers and res_len is set to length of received RES value. If USIM reports synchronization failure, the received AUTS value will be written into auts buffer. In this case, RES, IK, and CK are not valid.
Definition at line 1146 of file pcsc_funcs.c.