blob: 8043e20b8c879c1a33670d77118b1bbd31ba0ddc [file] [log] [blame]
/*
*
* Wireless daemon for Linux
*
* Copyright (C) 2017-2019 Intel Corporation. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#include <stdint.h>
#include <stdbool.h>
#define EAP_AKA_KI_LEN 16
#define EAP_AKA_OPC_LEN 16
#define EAP_AKA_AMF_LEN 2
#define EAP_AKA_SQN_LEN 6
#define EAP_SIM_KC_LEN 8
#define EAP_SIM_SRES_LEN 4
#define NUM_RANDS_MAX 3
struct iwd_sim_auth;
typedef void (*sim_auth_unregistered_cb_t)(void *data);
/*
* Callback containing Milenage keys.
*
* @param res RES value
* @param ck CK key
* @param ik IK key
* @param auts AUTS key, if sync failure this will be non NULL. With a
* normal success, this should be NULL.
* @param data User data
*
* Note: If there was an error (invalid AUTN or some other error), all the keys
* (res/ck/ik/auts) will be NULL. A sync error will result in res, ck, and ik
* being NULL but auts should point to a valid AUTS key.
*/
typedef void (*sim_auth_check_milenage_cb_t)(const uint8_t *res,
const uint8_t *ck, const uint8_t *ik, const uint8_t *auts,
void *data);
/*
* Callback with GSM data
*
* @param sres SRES value
* @param kc Kc value
* @param user_data User data
*
* Note: If GSM authentication was unsuccessful sres and kc will both be NULL
*/
typedef void (*sim_auth_run_gsm_cb_t)(const uint8_t *sres,
const uint8_t *kc, void *user_data);
struct iwd_sim_auth_driver {
const char *name;
int (*check_milenage)(struct iwd_sim_auth *auth, const uint8_t *rand,
const uint8_t *autn,
sim_auth_check_milenage_cb_t cb, void *data);
int (*run_gsm)(struct iwd_sim_auth *auth, const uint8_t *rands,
int num_rands, sim_auth_run_gsm_cb_t cb,
void *data);
void (*cancel_request)(struct iwd_sim_auth *auth, int id);
void (*remove)(struct iwd_sim_auth *auth);
};
/*
* Create a new authentication provider. This new provider will be added to
* the list of available providers. It is expected that the auth provider
* should be immediately available for auth requests.
*/
struct iwd_sim_auth *iwd_sim_auth_create(
const struct iwd_sim_auth_driver *driver);
void iwd_sim_auth_set_nai(struct iwd_sim_auth *auth, const char *nai);
void iwd_sim_auth_set_capabilities(struct iwd_sim_auth *auth,
bool sim_supported, bool aka_supported);
void iwd_sim_auth_set_data(struct iwd_sim_auth *auth, void *driver_data);
bool iwd_sim_auth_register(struct iwd_sim_auth *auth);
void *iwd_sim_auth_get_data(struct iwd_sim_auth *auth);
void iwd_sim_auth_remove(struct iwd_sim_auth *auth);
const char *iwd_sim_auth_get_nai(struct iwd_sim_auth *auth);
unsigned int sim_auth_unregistered_watch_add(struct iwd_sim_auth *auth,
sim_auth_unregistered_cb_t cb, void *data);
void sim_auth_unregistered_watch_remove(struct iwd_sim_auth *auth,
unsigned int id);
/*
* Find an appropriate driver for running SIM/AKA algorithms
*
* @param sim True if the driver should support SIM authentication
* @param aka True if the driver should support AKA authentication
*
* @returns Driver handle found, NULL if none available
*/
struct iwd_sim_auth *iwd_sim_auth_find(bool sim, bool aka);
/*
* Check that 'rand' and 'autn' are valid from the server.
*
* @param auth Auth handle found with iwd_sim_auth_find()
* @param rand List of RAND's from the server
* @param autn AUTN from server
* @param cb Callback with milenage values
* @param data User data
*
* @return Transaction ID, used to cancel the request if needed
* < 0 in case of an error
*/
int sim_auth_check_milenage(struct iwd_sim_auth *auth,
const uint8_t *rand, const uint8_t *autn,
sim_auth_check_milenage_cb_t cb, void *data);
/*
* Retrieve EAP-SIM Kc and SRES values
*
* @param Auth Auth handle found with iwd_sim_auth_find()
* @param rands Buffer containing N 16 byte RANDs (n == 2 || n == 3)
* @param num_rands Number of 16 byte RANDs in 'rand'
* @param cb Callback with GSM key values
* @param data User data
*
* @return Transaction ID, used to cancel the request if needed
* < 0 in case of an error
*/
int sim_auth_run_gsm(struct iwd_sim_auth *auth, const uint8_t *rands,
int num_rands, sim_auth_run_gsm_cb_t cb, void *data);
void sim_auth_cancel_request(struct iwd_sim_auth *auth, int id);