]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Add init functions to the eap base library
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Wed, 2 May 2018 00:33:46 +0000 (04:33 +0400)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Wed, 2 May 2018 03:28:28 +0000 (07:28 +0400)
src/modules/rlm_eap/eap.h
src/modules/rlm_eap/lib/base/all.mk
src/modules/rlm_eap/lib/base/eap_base.c [moved from src/modules/rlm_eap/lib/base/eapcommon.c with 89% similarity]
src/modules/rlm_eap/lib/base/eap_base.h [new file with mode: 0644]
src/modules/rlm_eap/lib/base/eap_types.h
src/modules/rlm_eap/lib/base/mppe_keys.c
src/modules/rlm_eap/rlm_eap.c
src/modules/rlm_eap/types/rlm_eap_aka/rlm_eap_aka.c
src/modules/rlm_eap/types/rlm_eap_pwd/rlm_eap_pwd.c
src/modules/rlm_eap/types/rlm_eap_sim/rlm_eap_sim.c

index 7d363b4ee9cd356c195b92a0defdca7b314d543b..88d6a0f014a563e5fa5a5e38e2f6be320883db6c 100644 (file)
@@ -28,6 +28,7 @@ RCSIDH(eap_h, "$Id$")
 #include <freeradius-devel/modules.h>
 #include <freeradius-devel/rad_assert.h>
 
+#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);
index 63fbc1e64ee993b542e1feeaac47bf87b608e897..228b9d22656906b25043d0a4d657a6d39d798385 100644 (file)
@@ -1,7 +1,7 @@
 TARGET := libfreeradius-eap.a
 
 SOURCES        := \
-       eapcommon.c\
+       eap_base.c\
        eap_chbind.c
 
 ifneq (${OPENSSL_LIBS},)
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 53e624ad34dcef82b1f5beec0e96ccf447b5ab4b..76d42f0a7dd63113b0de8736738ca12194fbb20d 100644 (file)
@@ -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 (file)
index 0000000..2e628a9
--- /dev/null
@@ -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);
+
index c87dec7d8f6f31b659e59a76f92c4911c8b213bb..95a353883bb7a447d6d009f5595e2e34239aa054 100644 (file)
@@ -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;
index ad74e76b3e42cb900f18d7dbf6fedbd50ea444cb..a9ab771e1e640900676a4fcd8946476dbbc442ed 100644 (file)
@@ -28,9 +28,11 @@ USES_APPLE_DEPRECATED_API    /* OpenSSL API has been deprecated by Apple */
 #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)
@@ -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);
 }
 
 
index 536782b5760defa5618cbe9cd921ecff9dc99554..9905356ea0e15d095c37862dc4241b4cf2445f54 100644 (file)
@@ -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 = {
index 01039b49ed0b73f78132611a4fe413c654eccdd3..500a20573b8b62de9359649740a11059bbfcf051 100644 (file)
@@ -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;
 }
index 450db0fe16c8d3ad6988940b5b461c55223806db..87b33046b9ebb447ebf40efb8a791661ffc8d8d0 100644 (file)
@@ -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;
index 4ad2c556b33620314e5b455371e3b32feae5ca57..4c5acba600bb6cc3ff7c617b54fe7126a9539910 100644 (file)
@@ -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;
 }