SIM card interface takes IMSI as parameter (same as in USIM)
This commit is contained in:
@@ -576,30 +576,22 @@ static bool get_card_triplet(private_eap_sim_t *this,
|
||||
char *rand, char *sres, char *kc)
|
||||
{
|
||||
enumerator_t *enumerator;
|
||||
sim_card_t *card = NULL, *current;
|
||||
id_match_t match, best = ID_MATCH_NONE;
|
||||
sim_card_t *card;
|
||||
bool success = FALSE;
|
||||
|
||||
/* find the best matching SIM */
|
||||
enumerator = charon->sim->create_card_enumerator(charon->sim);
|
||||
while (enumerator->enumerate(enumerator, ¤t))
|
||||
while (enumerator->enumerate(enumerator, &card))
|
||||
{
|
||||
match = this->peer->matches(this->peer, current->get_imsi(current));
|
||||
if (match > best)
|
||||
if (card->get_triplet(card, this->peer, rand, sres, kc))
|
||||
{
|
||||
card = current;
|
||||
best = match;
|
||||
success = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (card)
|
||||
{
|
||||
success = card->get_triplet(card, rand, sres, kc);
|
||||
}
|
||||
enumerator->destroy(enumerator);
|
||||
if (!card)
|
||||
if (!success)
|
||||
{
|
||||
DBG1(DBG_IKE, "no SIM card found matching '%Y'", this->peer);
|
||||
DBG1(DBG_IKE, "no SIM card found with triplets for '%Y'", this->peer);
|
||||
}
|
||||
return success;
|
||||
}
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
|
||||
#include "eap_sim_file_card.h"
|
||||
|
||||
#include <daemon.h>
|
||||
|
||||
typedef struct private_eap_sim_file_card_t private_eap_sim_file_card_t;
|
||||
|
||||
/**
|
||||
@@ -27,62 +29,49 @@ struct private_eap_sim_file_card_t {
|
||||
*/
|
||||
eap_sim_file_card_t public;
|
||||
|
||||
/**
|
||||
* IMSI, is ID_ANY for file implementation
|
||||
*/
|
||||
identification_t *imsi;
|
||||
|
||||
/**
|
||||
* source of triplets
|
||||
*/
|
||||
eap_sim_file_triplets_t *triplets;
|
||||
};
|
||||
|
||||
#include <daemon.h>
|
||||
|
||||
/**
|
||||
* Implementation of sim_card_t.get_triplet
|
||||
*/
|
||||
static bool get_triplet(private_eap_sim_file_card_t *this,
|
||||
char *rand, char *sres, char *kc)
|
||||
identification_t *imsi, char *rand, char *sres, char *kc)
|
||||
{
|
||||
enumerator_t *enumerator;
|
||||
identification_t *id;
|
||||
char *c_rand, *c_sres, *c_kc;
|
||||
|
||||
DBG2(DBG_CFG, "looking for rand: %b", rand, RAND_LEN);
|
||||
DBG2(DBG_CFG, "looking for rand: %b from %Y", rand, SIM_RAND_LEN, imsi);
|
||||
|
||||
enumerator = this->triplets->create_enumerator(this->triplets);
|
||||
while (enumerator->enumerate(enumerator, &id, &c_rand, &c_sres, &c_kc))
|
||||
{
|
||||
DBG2(DBG_CFG, "found triplet: rand %b\nsres %b\n kc %b",
|
||||
c_rand, RAND_LEN, c_sres, SRES_LEN, c_kc, KC_LEN);
|
||||
if (memeq(c_rand, rand, RAND_LEN))
|
||||
if (imsi->matches(imsi, id))
|
||||
{
|
||||
memcpy(sres, c_sres, SRES_LEN);
|
||||
memcpy(kc, c_kc, KC_LEN);
|
||||
enumerator->destroy(enumerator);
|
||||
return TRUE;
|
||||
DBG2(DBG_CFG, "found triplet: rand %b\nsres %b\n kc %b",
|
||||
c_rand, SIM_RAND_LEN, c_sres, SIM_SRES_LEN, c_kc, SIM_KC_LEN);
|
||||
if (memeq(c_rand, rand, SIM_RAND_LEN))
|
||||
{
|
||||
memcpy(sres, c_sres, SIM_SRES_LEN);
|
||||
memcpy(kc, c_kc, SIM_KC_LEN);
|
||||
enumerator->destroy(enumerator);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
enumerator->destroy(enumerator);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of sim_card_t.get_imsi
|
||||
*/
|
||||
static identification_t* get_imsi(private_eap_sim_file_card_t *this)
|
||||
{
|
||||
return this->imsi;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of eap_sim_file_card_t.destroy.
|
||||
*/
|
||||
static void destroy(private_eap_sim_file_card_t *this)
|
||||
{
|
||||
this->imsi->destroy(this->imsi);
|
||||
free(this);
|
||||
}
|
||||
|
||||
@@ -93,12 +82,9 @@ eap_sim_file_card_t *eap_sim_file_card_create(eap_sim_file_triplets_t *triplets)
|
||||
{
|
||||
private_eap_sim_file_card_t *this = malloc_thing(private_eap_sim_file_card_t);
|
||||
|
||||
this->public.card.get_triplet = (bool(*)(sim_card_t*, char *rand, char *sres, char *kc))get_triplet;
|
||||
this->public.card.get_imsi = (identification_t*(*)(sim_card_t*))get_imsi;
|
||||
this->public.card.get_triplet = (bool(*)(sim_card_t*, identification_t *imsi, char *rand, char *sres, char *kc))get_triplet;
|
||||
this->public.destroy = (void(*)(eap_sim_file_card_t*))destroy;
|
||||
|
||||
/* this SIM card implementation does not have an ID, serve ID_ANY */
|
||||
this->imsi = identification_create_from_encoding(ID_ANY, chunk_empty);
|
||||
this->triplets = triplets;
|
||||
|
||||
return &this->public;
|
||||
|
||||
@@ -49,9 +49,9 @@ static bool get_triplet(private_eap_sim_file_provider_t *this,
|
||||
{
|
||||
if (imsi->matches(imsi, id))
|
||||
{
|
||||
memcpy(rand, c_rand, RAND_LEN);
|
||||
memcpy(sres, c_sres, SRES_LEN);
|
||||
memcpy(kc, c_kc, KC_LEN);
|
||||
memcpy(rand, c_rand, SIM_RAND_LEN);
|
||||
memcpy(sres, c_sres, SIM_SRES_LEN);
|
||||
memcpy(kc, c_kc, SIM_KC_LEN);
|
||||
enumerator->destroy(enumerator);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -23,8 +23,6 @@
|
||||
|
||||
#include "eap_sim_file_triplets.h"
|
||||
|
||||
#include <sa/authenticators/eap/sim_manager.h>
|
||||
|
||||
typedef struct eap_sim_file_provider_t eap_sim_file_provider_t;
|
||||
|
||||
/**
|
||||
|
||||
@@ -50,9 +50,9 @@ struct private_eap_sim_file_triplets_t {
|
||||
*/
|
||||
typedef struct {
|
||||
identification_t *imsi;
|
||||
char rand[RAND_LEN];
|
||||
char sres[SRES_LEN];
|
||||
char kc[KC_LEN];
|
||||
char rand[SIM_RAND_LEN];
|
||||
char sres[SIM_SRES_LEN];
|
||||
char kc[SIM_KC_LEN];
|
||||
} triplet_t;
|
||||
|
||||
/**
|
||||
@@ -197,13 +197,13 @@ static void read_triplets(private_eap_sim_file_triplets_t *this, char *path)
|
||||
triplet->imsi = identification_create_from_string(token);
|
||||
continue;
|
||||
case 1: /* rand */
|
||||
parse_token(triplet->rand, token, RAND_LEN);
|
||||
parse_token(triplet->rand, token, SIM_RAND_LEN);
|
||||
continue;
|
||||
case 2: /* sres */
|
||||
parse_token(triplet->sres, token, SRES_LEN);
|
||||
parse_token(triplet->sres, token, SIM_SRES_LEN);
|
||||
continue;
|
||||
case 3: /* kc */
|
||||
parse_token(triplet->kc, token, KC_LEN);
|
||||
parse_token(triplet->kc, token, SIM_KC_LEN);
|
||||
continue;
|
||||
default:
|
||||
break;;
|
||||
@@ -219,8 +219,8 @@ static void read_triplets(private_eap_sim_file_triplets_t *this, char *path)
|
||||
}
|
||||
|
||||
DBG2(DBG_CFG, "triplet: imsi %Y\nrand %b\nsres %b\nkc %b",
|
||||
triplet->imsi, triplet->rand, RAND_LEN,
|
||||
triplet->sres, SRES_LEN, triplet->kc, KC_LEN);
|
||||
triplet->imsi, triplet->rand, SIM_RAND_LEN,
|
||||
triplet->sres, SIM_SRES_LEN, triplet->kc, SIM_KC_LEN);
|
||||
|
||||
this->triplets->insert_last(this->triplets, triplet);
|
||||
}
|
||||
|
||||
@@ -21,23 +21,7 @@
|
||||
#ifndef EAP_SIM_FILE_TRIPLETS_H_
|
||||
#define EAP_SIM_FILE_TRIPLETS_H_
|
||||
|
||||
#include <utils/enumerator.h>
|
||||
#include <utils/identification.h>
|
||||
|
||||
/**
|
||||
* size of RAND value
|
||||
*/
|
||||
#define RAND_LEN 16
|
||||
|
||||
/**
|
||||
* size of SRES value
|
||||
*/
|
||||
#define SRES_LEN 4
|
||||
|
||||
/**
|
||||
* size of KC value
|
||||
*/
|
||||
#define KC_LEN 8
|
||||
#include <sa/authenticators/eap/sim_manager.h>
|
||||
|
||||
typedef struct eap_sim_file_triplets_t eap_sim_file_triplets_t;
|
||||
|
||||
|
||||
@@ -28,31 +28,27 @@ typedef struct sim_manager_t sim_manager_t;
|
||||
typedef struct sim_card_t sim_card_t;
|
||||
typedef struct sim_provider_t sim_provider_t;
|
||||
|
||||
#define SIM_RAND_LEN 16
|
||||
#define SIM_SRES_LEN 4
|
||||
#define SIM_KC_LEN 8
|
||||
|
||||
/**
|
||||
* Interface for a SIM card (used as EAP client).
|
||||
*/
|
||||
struct sim_card_t {
|
||||
|
||||
/**
|
||||
* Get the identity of a SIM card.
|
||||
*
|
||||
* The returned identity owned by the sim_card and not destroyed outside.
|
||||
* The SIM card may return ID_ANY if it does not support/use an IMSI.
|
||||
*
|
||||
* @return identity
|
||||
*/
|
||||
identification_t* (*get_imsi)(sim_card_t *this);
|
||||
|
||||
/**
|
||||
* Calculate SRES/KC from a RAND.
|
||||
*
|
||||
* @param imsi identity to get a triplet for
|
||||
* @param rand RAND input buffer, fixed size 16 bytes
|
||||
* @param sres SRES output buffer, fixed size 4 byte
|
||||
* @param kc KC output buffer, fixed size 8 bytes
|
||||
* @return TRUE if SRES/KC calculated, FALSE on error
|
||||
* @return TRUE if SRES/KC calculated, FALSE on error/wrong identity
|
||||
*/
|
||||
bool (*get_triplet)(sim_card_t *this,
|
||||
char rand[16], char sres[4], char kc[8]);
|
||||
bool (*get_triplet)(sim_card_t *this, identification_t *imsi,
|
||||
char rand[SIM_RAND_LEN], char sres[SIM_SRES_LEN],
|
||||
char kc[SIM_KC_LEN]);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -70,7 +66,8 @@ struct sim_provider_t {
|
||||
* @return TRUE if triplet received, FALSE otherwise
|
||||
*/
|
||||
bool (*get_triplet)(sim_provider_t *this, identification_t *imsi,
|
||||
char rand[16], char sres[4], char kc[8]);
|
||||
char rand[SIM_RAND_LEN], char sres[SIM_SRES_LEN],
|
||||
char kc[SIM_KC_LEN]);
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user