#include <freeradius-devel/modules.h>
#include <freeradius-devel/rad_assert.h>
+#include "lib/base/eap_base.h"
#include "eap_types.h"
/* TLS configuration name */
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.
*/
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);
TARGET := libfreeradius-eap.a
SOURCES := \
- eapcommon.c\
+ eap_base.c\
eap_chbind.c
ifneq (${OPENSSL_LIBS},)
#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.
/*
* 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();
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);
+}
--- /dev/null
+#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);
+
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;
#define __STDC_WANT_LIB_EXT1__ 1
#include <string.h>
-#include "eap_tls.h"
+
#include <openssl/hmac.h>
#include <freeradius-devel/sha1.h>
+#include "eap_tls.h"
+#include "eap_base.h"
#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
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);
}
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'.
.name = "eap",
.inst_size = sizeof(rlm_eap_t),
.config = module_config,
+ .load = mod_load,
+ .unload = mod_unload,
.bootstrap = mod_bootstrap,
.instantiate = mod_instantiate,
.methods = {
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;
}
/*
* 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;
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;
}