The FreeRADIUS server $Id: f3670dba8951ca10eb4948feb3dc3db9423a334f $
Loading...
Searching...
No Matches
Data Structures | Macros | Functions | Variables
base.c File Reference

The EAP-PSK (RFC 4764) state machine. More...

#include <freeradius-devel/eap/base.h>
#include <freeradius-devel/eap/types.h>
#include <freeradius-devel/server/process_types.h>
#include <freeradius-devel/server/virtual_servers.h>
#include <freeradius-devel/server/pair.h>
#include <freeradius-devel/unlang/module.h>
#include <freeradius-devel/util/debug.h>
#include <freeradius-devel/protocol/eap/psk/freeradius.h>
#include <openssl/rand.h>
#include "crypto.h"
+ Include dependency graph for base.c:

Go to the source code of this file.

Data Structures

struct  process_eap_psk_sections_t
 
struct  process_eap_psk_t
 

Macros

#define YIELD_OR_RESUME(_section, _resume)
 

Functions

static int eap_psk_compose (eap_round_t *eap_round, uint8_t flags, uint8_t const rand_s[static EAP_PSK_RAND_LEN], uint8_t const *body, size_t body_len)
 
static unlang_action_t eap_psk_discard (unlang_result_t *p_result, request_t *request, eap_psk_session_t *session)
 
static unlang_action_t eap_psk_failure (unlang_result_t *p_result, module_ctx_t const *mctx, request_t *request, process_eap_psk_t const *inst, eap_psk_session_t *session)
 
static void eap_psk_header (uint8_t header[static EAP_PSK_HEADER_LEN], uint8_t code, uint8_t id, size_t type_length, uint8_t flags, uint8_t const rand_s[static EAP_PSK_RAND_LEN])
 
static unlang_action_t mod_process (unlang_result_t *p_result, module_ctx_t const *mctx, request_t *request)
 Dispatch to the state matching the packet type set by rlm_eap_psk.
 
static unlang_action_t resume_recv_identity_response (unlang_result_t *p_result, module_ctx_t const *mctx, request_t *request)
 Verify MAC_P and build the third message once 'recv Identity-Response' has run.
 
static unlang_action_t resume_recv_result_acknowledgement (unlang_result_t *p_result, module_ctx_t const *mctx, request_t *request)
 Verify the protected result once 'recv Result-Acknowledgement' has run.
 
static unlang_action_t resume_send_failure (unlang_result_t *p_result, module_ctx_t const *mctx, request_t *request)
 
static unlang_action_t resume_send_identity_request (unlang_result_t *p_result, module_ctx_t const *mctx, request_t *request)
 Compose the first message once 'send Identity-Request' has run.
 
static unlang_action_t resume_send_result_indication (unlang_result_t *p_result, module_ctx_t const *mctx, request_t *request)
 Compose the third message once 'send Result-Indication' has run.
 
static unlang_action_t resume_send_success (unlang_result_t *p_result, module_ctx_t const *mctx, request_t *request)
 Finish successfully once 'send Success' has run.
 
static unlang_action_t state_identity_request (unlang_result_t *p_result, module_ctx_t const *mctx, request_t *request)
 Start the conversation: generate RAND_S and run 'send Identity-Request'.
 
static unlang_action_t state_identity_response (unlang_result_t *p_result, module_ctx_t const *mctx, request_t *request)
 Parse the second message and run 'recv Identity-Response'.
 
static unlang_action_t state_result_acknowledgement (unlang_result_t *p_result, module_ctx_t const *mctx, request_t *request)
 Parse the fourth message and run 'recv Result-Acknowledgement'.
 

Variables

static fr_dict_attr_t const * attr_identity
 
static fr_dict_attr_t const * attr_packet_type
 
static fr_dict_attr_t const * attr_psk_password
 
static fr_dict_attr_t const * attr_rand_peer
 
static fr_dict_attr_t const * attr_rand_server
 
static fr_dict_attr_t const * attr_server_identity
 
static const virtual_server_compile_t compile_list []
 
static fr_dict_t const * dict_eap_psk
 
static fr_dict_t const * dict_freeradius
 
fr_process_module_t process_eap_psk
 
fr_dict_autoload_t process_eap_psk_dict []
 
fr_dict_attr_autoload_t process_eap_psk_dict_attr []
 
static conf_parser_t submodule_config []
 

Detailed Description

The EAP-PSK (RFC 4764) state machine.

Id
bd2be0bbb223bb43ed266af63f4607f6da588b2a

Runs the four-message EAP-PSK exchange on a request in the eap-psk namespace, yielding to the virtual server's policy sections between protocol steps:

Messages which fail validation are not processed, and the reply Packet-Type is set to Do-Not-Respond. RFC 4764 Section 4.1 calls for such messages to be silently discarded; a true silent discard cannot be expressed through the EAP module, which fails the session for any unhandled round, so an invalid message ends the session with an EAP-Failure, as with every other EAP method. The Do-Not-Respond reply code preserves the distinction from a policy-driven Failure for logging.

Definition in file base.c.


Data Structure Documentation

◆ process_eap_psk_sections_t

struct process_eap_psk_sections_t

Definition at line 87 of file base.c.

+ Collaboration diagram for process_eap_psk_sections_t:
Data Fields
CONF_SECTION * recv_identity_response
CONF_SECTION * recv_result_acknowledgement
CONF_SECTION * send_failure
CONF_SECTION * send_identity_request
CONF_SECTION * send_result_indication
CONF_SECTION * send_success

◆ process_eap_psk_t

struct process_eap_psk_t

Definition at line 96 of file base.c.

+ Collaboration diagram for process_eap_psk_t:
Data Fields
char const * identity Default ID_S sent in the first message.
process_eap_psk_sections_t sections

Macro Definition Documentation

◆ YIELD_OR_RESUME

#define YIELD_OR_RESUME (   _section,
  _resume 
)
Value:
do { \
module_ctx_t our_mctx; \
if (inst->sections._section) { \
return unlang_module_yield_to_section(&session->section_result, request, \
inst->sections._section, RLM_MODULE_NOOP, \
_resume, NULL, 0, session); \
} \
session->section_result.rcode = RLM_MODULE_NOOP; \
our_mctx = *mctx; \
our_mctx.rctx = session; \
return _resume(p_result, &our_mctx, request); \
} while (0)
void * rctx
Resume ctx that a module previously set.
Definition module_ctx.h:45
Temporary structure to hold arguments for module calls.
Definition module_ctx.h:41
@ RLM_MODULE_NOOP
Module succeeded without doing anything.
Definition rcode.h:54
unlang_action_t unlang_module_yield_to_section(unlang_result_t *p_result, request_t *request, CONF_SECTION *subcs, rlm_rcode_t default_rcode, module_method_t resume, unlang_module_signal_t signal, fr_signal_t sigmask, void *rctx)
Definition module.c:236
eap_aka_sim_process_conf_t * inst

Definition at line 112 of file base.c.

Function Documentation

◆ eap_psk_compose()

static int eap_psk_compose ( eap_round_t eap_round,
uint8_t  flags,
uint8_t const  rand_s[static EAP_PSK_RAND_LEN],
uint8_t const *  body,
size_t  body_len 
)
static

Definition at line 129 of file base.c.

+ Here is the caller graph for this function:

◆ eap_psk_discard()

static unlang_action_t eap_psk_discard ( unlang_result_t p_result,
request_t request,
eap_psk_session_t session 
)
static

Definition at line 187 of file base.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ eap_psk_failure()

static unlang_action_t eap_psk_failure ( unlang_result_t p_result,
module_ctx_t const *  mctx,
request_t request,
process_eap_psk_t const *  inst,
eap_psk_session_t session 
)
static

Definition at line 218 of file base.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ eap_psk_header()

static void eap_psk_header ( uint8_t  header[static EAP_PSK_HEADER_LEN],
uint8_t  code,
uint8_t  id,
size_t  type_length,
uint8_t  flags,
uint8_t const  rand_s[static EAP_PSK_RAND_LEN] 
)
static

Definition at line 158 of file base.c.

+ Here is the caller graph for this function:

◆ mod_process()

static unlang_action_t mod_process ( unlang_result_t p_result,
module_ctx_t const *  mctx,
request_t request 
)
static

Dispatch to the state matching the packet type set by rlm_eap_psk.

Definition at line 666 of file base.c.

+ Here is the call graph for this function:

◆ resume_recv_identity_response()

static unlang_action_t resume_recv_identity_response ( unlang_result_t p_result,
module_ctx_t const *  mctx,
request_t request 
)
static

Verify MAC_P and build the third message once 'recv Identity-Response' has run.

The policy section is responsible for populating control.Password.PSK for the asserted Identity (ID_P).

Definition at line 326 of file base.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ resume_recv_result_acknowledgement()

static unlang_action_t resume_recv_result_acknowledgement ( unlang_result_t p_result,
module_ctx_t const *  mctx,
request_t request 
)
static

Verify the protected result once 'recv Result-Acknowledgement' has run.

Definition at line 553 of file base.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ resume_send_failure()

static unlang_action_t resume_send_failure ( unlang_result_t p_result,
module_ctx_t const *  mctx,
request_t request 
)
static

Definition at line 208 of file base.c.

+ Here is the caller graph for this function:

◆ resume_send_identity_request()

static unlang_action_t resume_send_identity_request ( unlang_result_t p_result,
module_ctx_t const *  mctx,
request_t request 
)
static

Compose the first message once 'send Identity-Request' has run.

Policy may override the ID_S sent to the peer by setting reply.Server-Identity.

Definition at line 229 of file base.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ resume_send_result_indication()

static unlang_action_t resume_send_result_indication ( unlang_result_t p_result,
module_ctx_t const *  mctx,
request_t request 
)
static

Compose the third message once 'send Result-Indication' has run.

Definition at line 301 of file base.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ resume_send_success()

static unlang_action_t resume_send_success ( unlang_result_t p_result,
module_ctx_t const *  mctx,
request_t request 
)
static

Finish successfully once 'send Success' has run.

Definition at line 539 of file base.c.

+ Here is the caller graph for this function:

◆ state_identity_request()

static unlang_action_t state_identity_request ( unlang_result_t p_result,
module_ctx_t const *  mctx,
request_t request 
)
static

Start the conversation: generate RAND_S and run 'send Identity-Request'.

Definition at line 272 of file base.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ state_identity_response()

static unlang_action_t state_identity_response ( unlang_result_t p_result,
module_ctx_t const *  mctx,
request_t request 
)
static

Parse the second message and run 'recv Identity-Response'.

Definition at line 466 of file base.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ state_result_acknowledgement()

static unlang_action_t state_result_acknowledgement ( unlang_result_t p_result,
module_ctx_t const *  mctx,
request_t request 
)
static

Parse the fourth message and run 'recv Result-Acknowledgement'.

Definition at line 621 of file base.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Variable Documentation

◆ attr_identity

fr_dict_attr_t const* attr_identity
static

Definition at line 70 of file base.c.

◆ attr_packet_type

fr_dict_attr_t const* attr_packet_type
static

Definition at line 69 of file base.c.

◆ attr_psk_password

fr_dict_attr_t const* attr_psk_password
static

Definition at line 74 of file base.c.

◆ attr_rand_peer

fr_dict_attr_t const* attr_rand_peer
static

Definition at line 73 of file base.c.

◆ attr_rand_server

fr_dict_attr_t const* attr_rand_server
static

Definition at line 72 of file base.c.

◆ attr_server_identity

fr_dict_attr_t const* attr_server_identity
static

Definition at line 71 of file base.c.

◆ compile_list

const virtual_server_compile_t compile_list[]
static

Definition at line 704 of file base.c.

◆ dict_eap_psk

fr_dict_t const* dict_eap_psk
static

Definition at line 59 of file base.c.

◆ dict_freeradius

fr_dict_t const* dict_freeradius
static

Definition at line 60 of file base.c.

◆ process_eap_psk

fr_process_module_t process_eap_psk
Initial value:
= {
.common = {
.name = "eap_psk",
.inst_size = sizeof(process_eap_psk_t),
.inst_type = "process_eap_psk_t",
},
.process = mod_process,
.compile_list = compile_list,
.dict = &dict_eap_psk,
.packet_type = &attr_packet_type
}
#define MODULE_MAGIC_INIT
Stop people using different module/library/server versions together.
Definition dl_module.h:63
fr_dict_attr_t const * attr_packet_type
Definition base.c:91
static unlang_action_t mod_process(unlang_result_t *p_result, module_ctx_t const *mctx, request_t *request)
Definition base.c:168
static const virtual_server_compile_t compile_list[]
Definition base.c:192
static conf_parser_t submodule_config[]
Definition base.c:37
static fr_dict_t const * dict_eap_psk
Definition base.c:59
static const conf_parser_t config[]
Definition base.c:162

Definition at line 739 of file base.c.

◆ process_eap_psk_dict

fr_dict_autoload_t process_eap_psk_dict
Initial value:
= {
{ .out = &dict_eap_psk, .base_dir = "eap/psk", .proto = "eap-psk" },
{ .out = &dict_freeradius, .proto = "freeradius" },
}
#define DICT_AUTOLOAD_TERMINATOR
Definition dict.h:311
static fr_dict_t const * dict_freeradius
Definition base.c:37

Definition at line 63 of file base.c.

◆ process_eap_psk_dict_attr

fr_dict_attr_autoload_t process_eap_psk_dict_attr
Initial value:
= {
{ .out = &attr_packet_type, .name = "Packet-Type", .type = FR_TYPE_UINT32, .dict = &dict_eap_psk },
{ .out = &attr_identity, .name = "Identity", .type = FR_TYPE_STRING, .dict = &dict_eap_psk },
{ .out = &attr_server_identity, .name = "Server-Identity", .type = FR_TYPE_STRING, .dict = &dict_eap_psk },
{ .out = &attr_rand_server, .name = "RAND-Server", .type = FR_TYPE_OCTETS, .dict = &dict_eap_psk },
{ .out = &attr_rand_peer, .name = "RAND-Peer", .type = FR_TYPE_OCTETS, .dict = &dict_eap_psk },
{ .out = &attr_psk_password, .name = "Password.PSK", .type = FR_TYPE_OCTETS, .dict = &dict_freeradius },
}
@ FR_TYPE_STRING
String of printable characters.
@ FR_TYPE_UINT32
32 Bit unsigned integer.
@ FR_TYPE_OCTETS
Raw octets.
static fr_dict_attr_t const * attr_rand_server
Definition base.c:72
static fr_dict_attr_t const * attr_server_identity
Definition base.c:71
static fr_dict_attr_t const * attr_identity
Definition base.c:70
static fr_dict_attr_t const * attr_rand_peer
Definition base.c:73
static fr_dict_attr_t const * attr_psk_password
Definition base.c:74

Definition at line 77 of file base.c.

◆ submodule_config

conf_parser_t submodule_config[]
static
Initial value:
= {
{ FR_CONF_OFFSET("identity", process_eap_psk_t, identity), .dflt = "FreeRADIUS" },
}
#define CONF_PARSER_TERMINATOR
Definition cf_parse.h:669
#define FR_CONF_OFFSET(_name, _struct, _field)
conf_parser_t which parses a single CONF_PAIR, writing the result to a field in a struct
Definition cf_parse.h:280

Definition at line 101 of file base.c.