From: Arran Cudbard-Bell Date: Wed, 2 May 2018 00:33:46 +0000 (+0400) Subject: Add init functions to the eap base library X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4660a14ffcef4489fb30bf6b3bc10cf16643c238;p=thirdparty%2Ffreeradius-server.git Add init functions to the eap base library --- diff --git a/src/modules/rlm_eap/eap.h b/src/modules/rlm_eap/eap.h index 7d363b4ee9c..88d6a0f014a 100644 --- a/src/modules/rlm_eap/eap.h +++ b/src/modules/rlm_eap/eap.h @@ -28,6 +28,7 @@ RCSIDH(eap_h, "$Id$") #include #include +#include "lib/base/eap_base.h" #include "eap_types.h" /* TLS configuration name */ @@ -45,8 +46,6 @@ typedef struct eap_round { bool set_request_id; //!< Whether the EAP-Method already set the next request ID. } eap_round_t; -typedef struct _eap_session eap_session_t; - /* * Function to process EAP packets. */ @@ -120,6 +119,3 @@ typedef struct eap_tunnel_data_t { void *tls_session; eap_tunnel_callback_t callback; } eap_tunnel_data_t; - -rlm_rcode_t eap_virtual_server(REQUEST *request, REQUEST *fake, - eap_session_t *eap_session, char const *virtual_server); diff --git a/src/modules/rlm_eap/lib/base/all.mk b/src/modules/rlm_eap/lib/base/all.mk index 63fbc1e64ee..228b9d22656 100644 --- a/src/modules/rlm_eap/lib/base/all.mk +++ b/src/modules/rlm_eap/lib/base/all.mk @@ -1,7 +1,7 @@ TARGET := libfreeradius-eap.a SOURCES := \ - eapcommon.c\ + eap_base.c\ eap_chbind.c ifneq (${OPENSSL_LIBS},) diff --git a/src/modules/rlm_eap/lib/base/eapcommon.c b/src/modules/rlm_eap/lib/base/eap_base.c similarity index 89% rename from src/modules/rlm_eap/lib/base/eapcommon.c rename to src/modules/rlm_eap/lib/base/eap_base.c index 53e624ad34d..76d42f0a7dd 100644 --- a/src/modules/rlm_eap/lib/base/eapcommon.c +++ b/src/modules/rlm_eap/lib/base/eap_base.c @@ -66,6 +66,31 @@ RCSID("$Id$") #include "eap_types.h" #include "eap.h" +static fr_dict_t const *dict_radius; + +extern fr_dict_autoload_t eap_base_dict[]; +fr_dict_autoload_t eap_base_dict[] = { + { .out = &dict_radius, .proto = "radius" }, + + { NULL } +}; + +fr_dict_attr_t const *attr_eap_msk; +fr_dict_attr_t const *attr_eap_emsk; + +fr_dict_attr_t const *attr_ms_mppe_send_key; +fr_dict_attr_t const *attr_ms_mppe_recv_key; + +extern fr_dict_attr_autoload_t eap_base_dict_attr[]; +fr_dict_attr_autoload_t eap_base_dict_attr[] = { + { .out = &attr_eap_msk, .name = "EAP-MSK", .type = FR_TYPE_OCTETS, .dict = &dict_radius }, + { .out = &attr_eap_emsk, .name = "EAP-EMSK", .type = FR_TYPE_OCTETS, .dict = &dict_radius }, + { .out = &attr_ms_mppe_send_key, .name = "MS-MPPE-Send-Key", .type = FR_TYPE_OCTETS, .dict = &dict_radius }, + { .out = &attr_ms_mppe_recv_key, .name = "MS-MPPE-Recv-Key", .type = FR_TYPE_OCTETS, .dict = &dict_radius }, + + { NULL } +}; + /** Return an EAP-Type for a particular name * * Converts a name into an IANA EAP type. @@ -308,17 +333,11 @@ eap_packet_raw_t *eap_vp2packet(TALLOC_CTX *ctx, VALUE_PAIR *vps) /* * Add raw hex data to the reply. */ -void eap_add_reply(REQUEST *request, - char const *name, uint8_t const *value, int len) +void eap_add_reply(REQUEST *request, fr_dict_attr_t const *da, uint8_t const *value, int len) { VALUE_PAIR *vp; - vp = pair_make_reply(name, NULL, T_OP_EQ); - if (!vp) { - RPEDEBUG("Did not create attribute %s", name); - return; - } - + MEM(vp = pair_update_reply(da, 0)); fr_pair_value_memcpy(vp, value, len); RINDENT(); @@ -399,3 +418,21 @@ rlm_rcode_t eap_virtual_server(REQUEST *request, REQUEST *fake, return rcode; } +/** Initialise the lib eap base library + * + */ +int eap_base_init(void) +{ + if (fr_dict_autoload(eap_base_dict) < 0) return -1; + if (fr_dict_attr_autoload(eap_base_dict_attr) < 0) return -1; + + return 0; +} + +/** De-init the lib eap base library + * + */ +void eap_base_free(void) +{ + fr_dict_autofree(eap_base_dict); +} diff --git a/src/modules/rlm_eap/lib/base/eap_base.h b/src/modules/rlm_eap/lib/base/eap_base.h new file mode 100644 index 00000000000..2e628a98f44 --- /dev/null +++ b/src/modules/rlm_eap/lib/base/eap_base.h @@ -0,0 +1,52 @@ +#pragma once +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/** + * $Id$ + * @file eap_base.h + * @brief Interface into the base EAP library + * + * @copyright 2018 Arran Cudbard-Bell (a.cudbardb@freeradius.org) + */ +RCSIDH(eap_base_h, "$Id$") + +#include "eap_types.h" + +extern fr_dict_attr_t const *attr_eap_msk; +extern fr_dict_attr_t const *attr_eap_emsk; + +extern fr_dict_attr_t const *attr_ms_mppe_send_key; +extern fr_dict_attr_t const *attr_ms_mppe_recv_key; + +/* + * interfaces in eapcommon.c + */ +eap_type_t eap_name2type(char const *name); +char const *eap_type2name(eap_type_t method); +int eap_wireformat(eap_packet_t *reply); + +VALUE_PAIR *eap_packet2vp(RADIUS_PACKET *packet, eap_packet_raw_t const *reply); +eap_packet_raw_t *eap_vp2packet(TALLOC_CTX *ctx, VALUE_PAIR *vps); +void eap_add_reply(REQUEST *request, fr_dict_attr_t const *da, uint8_t const *value, int len); + +rlm_rcode_t eap_virtual_server(REQUEST *request, REQUEST *fake, + eap_session_t *eap_session, char const *virtual_server); + +int eap_base_init(void); + +void eap_base_free(void); + diff --git a/src/modules/rlm_eap/lib/base/eap_types.h b/src/modules/rlm_eap/lib/base/eap_types.h index c87dec7d8f6..95a353883bb 100644 --- a/src/modules/rlm_eap/lib/base/eap_types.h +++ b/src/modules/rlm_eap/lib/base/eap_types.h @@ -134,14 +134,4 @@ typedef struct CC_HINT(__packed__) eap_packet_raw { uint8_t data[1]; } eap_packet_raw_t; - -/* - * interfaces in eapcommon.c - */ -eap_type_t eap_name2type(char const *name); -char const *eap_type2name(eap_type_t method); -int eap_wireformat(eap_packet_t *reply); - -VALUE_PAIR *eap_packet2vp(RADIUS_PACKET *packet, eap_packet_raw_t const *reply); -eap_packet_raw_t *eap_vp2packet(TALLOC_CTX *ctx, VALUE_PAIR *vps); -void eap_add_reply(REQUEST *request, char const *name, uint8_t const *value, int len); +typedef struct _eap_session eap_session_t; diff --git a/src/modules/rlm_eap/lib/base/mppe_keys.c b/src/modules/rlm_eap/lib/base/mppe_keys.c index ad74e76b3e4..a9ab771e1e6 100644 --- a/src/modules/rlm_eap/lib/base/mppe_keys.c +++ b/src/modules/rlm_eap/lib/base/mppe_keys.c @@ -28,9 +28,11 @@ USES_APPLE_DEPRECATED_API /* OpenSSL API has been deprecated by Apple */ #define __STDC_WANT_LIB_EXT1__ 1 #include -#include "eap_tls.h" + #include #include +#include "eap_tls.h" +#include "eap_base.h" #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) @@ -227,12 +229,12 @@ void eap_tls_gen_mppe_keys(REQUEST *request, SSL *s, char const *prf_label) RDEBUG2("Adding session keys"); p = out; - eap_add_reply(request, "MS-MPPE-Recv-Key", p, EAP_TLS_MPPE_KEY_LEN); + eap_add_reply(request, attr_ms_mppe_recv_key, p, EAP_TLS_MPPE_KEY_LEN); p += EAP_TLS_MPPE_KEY_LEN; - eap_add_reply(request, "MS-MPPE-Send-Key", p, EAP_TLS_MPPE_KEY_LEN); + eap_add_reply(request, attr_ms_mppe_send_key, p, EAP_TLS_MPPE_KEY_LEN); - eap_add_reply(request, "EAP-MSK", out, 64); - eap_add_reply(request, "EAP-EMSK", out + 64, 64); + eap_add_reply(request, attr_eap_msk, out, 64); + eap_add_reply(request, attr_eap_emsk, out + 64, 64); } diff --git a/src/modules/rlm_eap/rlm_eap.c b/src/modules/rlm_eap/rlm_eap.c index 536782b5760..9905356ea0e 100644 --- a/src/modules/rlm_eap/rlm_eap.c +++ b/src/modules/rlm_eap/rlm_eap.c @@ -1043,6 +1043,23 @@ static int mod_bootstrap(void *instance, CONF_SECTION *cs) return 0; } +static int mod_load(void) +{ + rlm_eap_t instance = { .name = "global" }; + rlm_eap_t *inst = &instance; + + if (eap_base_init() < 0) { + PERROR("Failed initialising EAP base library"); + return -1; + } + return 0; +} + +static void mod_unload(void) +{ + eap_base_free(); +} + /* * The module name should be the only globally exported symbol. * That is, everything else should be 'static'. @@ -1052,6 +1069,8 @@ rad_module_t rlm_eap = { .name = "eap", .inst_size = sizeof(rlm_eap_t), .config = module_config, + .load = mod_load, + .unload = mod_unload, .bootstrap = mod_bootstrap, .instantiate = mod_instantiate, .methods = { diff --git a/src/modules/rlm_eap/types/rlm_eap_aka/rlm_eap_aka.c b/src/modules/rlm_eap/types/rlm_eap_aka/rlm_eap_aka.c index 01039b49ed0..500a20573b8 100644 --- a/src/modules/rlm_eap/types/rlm_eap_aka/rlm_eap_aka.c +++ b/src/modules/rlm_eap/types/rlm_eap_aka/rlm_eap_aka.c @@ -522,9 +522,9 @@ static int eap_aka_send_eap_success(eap_session_t *eap_session) eap_aka_session = talloc_get_type_abort(eap_session->opaque, eap_aka_session_t); p = eap_aka_session->keys.msk; - eap_add_reply(eap_session->request, "MS-MPPE-Recv-Key", p, EAP_TLS_MPPE_KEY_LEN); + eap_add_reply(eap_session->request, attr_ms_mppe_recv_key, p, EAP_TLS_MPPE_KEY_LEN); p += EAP_TLS_MPPE_KEY_LEN; - eap_add_reply(eap_session->request, "MS-MPPE-Send-Key", p, EAP_TLS_MPPE_KEY_LEN); + eap_add_reply(eap_session->request, attr_ms_mppe_send_key, p, EAP_TLS_MPPE_KEY_LEN); return 0; } diff --git a/src/modules/rlm_eap/types/rlm_eap_pwd/rlm_eap_pwd.c b/src/modules/rlm_eap/types/rlm_eap_pwd/rlm_eap_pwd.c index 450db0fe16c..87b33046b9e 100644 --- a/src/modules/rlm_eap/types/rlm_eap_pwd/rlm_eap_pwd.c +++ b/src/modules/rlm_eap/types/rlm_eap_pwd/rlm_eap_pwd.c @@ -400,8 +400,8 @@ static rlm_rcode_t mod_process(void *instance, eap_session_t *eap_session) /* * Return the MSK (in halves). */ - eap_add_reply(eap_session->request, "MS-MPPE-Recv-Key", msk, MPPE_KEY_LEN); - eap_add_reply(eap_session->request, "MS-MPPE-Send-Key", msk + MPPE_KEY_LEN, MPPE_KEY_LEN); + eap_add_reply(eap_session->request, attr_ms_mppe_recv_key, msk, MPPE_KEY_LEN); + eap_add_reply(eap_session->request, attr_ms_mppe_send_key, msk + MPPE_KEY_LEN, MPPE_KEY_LEN); rcode = RLM_MODULE_FAIL; break; diff --git a/src/modules/rlm_eap/types/rlm_eap_sim/rlm_eap_sim.c b/src/modules/rlm_eap/types/rlm_eap_sim/rlm_eap_sim.c index 4ad2c556b33..4c5acba600b 100644 --- a/src/modules/rlm_eap/types/rlm_eap_sim/rlm_eap_sim.c +++ b/src/modules/rlm_eap/types/rlm_eap_sim/rlm_eap_sim.c @@ -519,9 +519,9 @@ static int eap_sim_send_eap_success(eap_session_t *eap_session) eap_session->finished = true; p = eap_sim_session->keys.msk; - eap_add_reply(eap_session->request, "MS-MPPE-Recv-Key", p, EAP_TLS_MPPE_KEY_LEN); + eap_add_reply(eap_session->request, attr_ms_mppe_recv_key, p, EAP_TLS_MPPE_KEY_LEN); p += EAP_TLS_MPPE_KEY_LEN; - eap_add_reply(eap_session->request, "MS-MPPE-Send-Key", p, EAP_TLS_MPPE_KEY_LEN); + eap_add_reply(eap_session->request, attr_ms_mppe_send_key, p, EAP_TLS_MPPE_KEY_LEN); return 0; }