pcsc_funcs.c File Reference

WPA Supplicant / PC/SC smartcard interface for USIM, GSM SIM. More...

#include "includes.h"
#include <winscard.h>
#include "common.h"
#include "pcsc_funcs.h"
Include dependency graph for pcsc_funcs.c:

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_datascard_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.

Detailed Description

WPA Supplicant / PC/SC smartcard interface for USIM, GSM SIM.

Copyright
Copyright (c) 2004-2007, Jouni Malinen <j@w1.fi>

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.


Function Documentation

void scard_deinit ( struct scard_data scard  ) 

Deinitialize SIM/USIM connection.

Parameters:
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.

Here is the call graph for this function:

int scard_get_imsi ( struct scard_data scard,
char *  imsi,
size_t *  len 
)

Read IMSI from SIM/USIM card.

Parameters:
scard Pointer to private data from scard_init()
imsi Buffer for IMSI
len Length of imsi buffer; set to IMSI length on success
Returns:
0 on success, -1 if IMSI file cannot be selected, -2 if IMSI file selection returns invalid result code, -3 if parsing FSP template file fails (USIM only), -4 if IMSI does not fit in the provided imsi buffer (len is set to needed length), -5 if reading IMSI file fails.

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.

Here is the call graph for this function:

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.

Parameters:
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
Returns:
0 on success, -1 if SIM/USIM connection has not been initialized, -2 if authentication command execution fails, -3 if unknown response code for authentication command is received, -4 if reading of response fails, -5 if if response data is of unexpected length

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.

Here is the call graph for this function:

struct scard_data* scard_init ( scard_sim_type  sim_type  )  [read]

Initialize SIM/USIM connection using PC/SC.

Parameters:
sim_type Allowed SIM types (SIM, USIM, or both)
Returns:
Pointer to private data structure, or NULL on failure

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.

Here is the call graph for this function:

int scard_set_pin ( struct scard_data scard,
const char *  pin 
)

Set PIN (CHV1/PIN1) code for accessing SIM/USIM commands.

Parameters:
scard Pointer to private data from scard_init()
pin PIN code as an ASCII string (e.g., "1234")
Returns:
0 on success, -1 on failure

Definition at line 620 of file pcsc_funcs.c.

Here is the call graph for this function:

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.

Parameters:
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
Returns:
0 on success, -1 on failure, or -2 if USIM reports synchronization failure

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.

Here is the call graph for this function:

 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines

Generated on Sat Nov 21 23:23:51 2009 for hostapd by  doxygen 1.6.1