eap_full_auth_fsm.c
Go to the documentation of this file.
1 /**
2  * @file eap_full_auth_fsm.c
3  * @brief EAP full authenticator state machine
4  *
5  * @section License
6  *
7  * SPDX-License-Identifier: GPL-2.0-or-later
8  *
9  * Copyright (C) 2022-2024 Oryx Embedded SARL. All rights reserved.
10  *
11  * This file is part of CycloneEAP Open.
12  *
13  * This program is free software; you can redistribute it and/or
14  * modify it under the terms of the GNU General Public License
15  * as published by the Free Software Foundation; either version 2
16  * of the License, or (at your option) any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software Foundation,
25  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
26  *
27  * @author Oryx Embedded SARL (www.oryx-embedded.com)
28  * @version 2.4.4
29  **/
30 
31 //Switch to the appropriate trace level
32 #define TRACE_LEVEL AUTHENTICATOR_TRACE_LEVEL
33 
34 //Dependencies
38 #include "eap/eap_full_auth_fsm.h"
40 #include "eap/eap_debug.h"
41 #include "debug.h"
42 
43 //Check TCP/IP stack configuration
44 #if (AUTHENTICATOR_SUPPORT == ENABLED)
45 
46 //EAP full authenticator states
48 {
49  {EAP_FULL_AUTH_STATE_DISABLED, "DISABLED"},
50  {EAP_FULL_AUTH_STATE_INITIALIZE, "INITIALIZE"},
51  {EAP_FULL_AUTH_STATE_IDLE, "IDLE"},
52  {EAP_FULL_AUTH_STATE_RETRANSMIT, "RETRANSMIT"},
53  {EAP_FULL_AUTH_STATE_RECEIVED, "RECEIVED"},
54  {EAP_FULL_AUTH_STATE_NAK, "NAK"},
55  {EAP_FULL_AUTH_STATE_SELECT_ACTION, "SELECT_ACTION"},
56  {EAP_FULL_AUTH_STATE_INTEGRITY_CHECK, "INTEGRITY_CHECK"},
57  {EAP_FULL_AUTH_STATE_METHOD_RESPONSE, "METHOD_RESPONSE"},
58  {EAP_FULL_AUTH_STATE_PROPOSE_METHOD, "PROPOSE_METHOD"},
59  {EAP_FULL_AUTH_STATE_METHOD_REQUEST, "METHOD_REQUEST"},
60  {EAP_FULL_AUTH_STATE_DISCARD, "DISCARD"},
61  {EAP_FULL_AUTH_STATE_SEND_REQUEST, "SEND_REQUEST"},
62  {EAP_FULL_AUTH_STATE_TIMEOUT_FAILURE, "TIMEOUT_FAILURE"},
63  {EAP_FULL_AUTH_STATE_FAILURE, "FAILURE"},
64  {EAP_FULL_AUTH_STATE_SUCCESS, "SUCCESS"},
65  {EAP_FULL_AUTH_STATE_INITIALIZE_PASSTHROUGH, "INITIALIZE_PASSTHROUGH"},
66  {EAP_FULL_AUTH_STATE_IDLE2, "IDLE2"},
67  {EAP_FULL_AUTH_STATE_RETRANSMIT2, "RETRANSMIT2"},
68  {EAP_FULL_AUTH_STATE_RECEIVED2, "RECEIVED2"},
69  {EAP_FULL_AUTH_STATE_AAA_REQUEST, "AAA_REQUEST"},
70  {EAP_FULL_AUTH_STATE_AAA_IDLE, "AAA_IDLE"},
71  {EAP_FULL_AUTH_STATE_AAA_RESPONSE, "AAA_RESPONSE"},
72  {EAP_FULL_AUTH_STATE_DISCARD2, "DISCARD2"},
73  {EAP_FULL_AUTH_STATE_SEND_REQUEST2, "SEND_REQUEST2"},
74  {EAP_FULL_AUTH_STATE_TIMEOUT_FAILURE2, "TIMEOUT_FAILURE2"},
75  {EAP_FULL_AUTH_STATE_FAILURE2, "FAILURE2"},
76  {EAP_FULL_AUTH_STATE_SUCCESS2, "SUCCESS2"}
77 };
78 
79 
80 /**
81  * @brief EAP full authenticator state machine initialization
82  * @param[in] port Pointer to the port context
83  **/
84 
86 {
87  //Enter initial state
89 }
90 
91 
92 /**
93  * @brief EAP full authenticator state machine implementation
94  * @param[in] port Pointer to the port context
95  **/
96 
98 {
99  //A global transition can occur from any of the possible states. When the
100  //condition associated with a global transition is met, it supersedes all
101  //other exit conditions
102  if(!port->portEnabled)
103  {
104  //Switch to the DISABLED state
106  }
107  else if(port->eapRestart && port->portEnabled)
108  {
109  //Switch to the INITIALIZE state
111  }
112  //Errata
113  else if(port->portControl != AUTHENTICATOR_PORT_MODE_AUTO)
114  {
115  //Switch to the INITIALIZE state
117  }
118  else
119  {
120  //All exit conditions for the state are evaluated continuously until one
121  //of the conditions is met (refer to RFC 4137, section 3.1)
122  switch(port->eapFullAuthState)
123  {
124  //DISABLED state?
126  //Evaluate conditions for the current state
127  if(port->portEnabled)
128  {
129  //Switch to the INITIALIZE state
131  }
132 
133  break;
134 
135  //INITIALIZE state?
137  //Unconditional transition (UCT) to SELECT_ACTION state
139  break;
140 
141  //IDLE state?
143  //The state machine spends most of its time here, waiting for
144  //something to happen
145  if(port->retransWhile == 0)
146  {
147  //Switch to the RETRANSMIT state
149  }
150  else if(port->eapResp)
151  {
152  //Switch to the RECEIVED state
154  }
155  else
156  {
157  //Just for sanity
158  }
159 
160  break;
161 
162  //RETRANSMIT state?
164  //Evaluate conditions for the current state
165  if(port->retransCount > port->maxRetrans)
166  {
167  //Switch to the TIMEOUT_FAILURE state
169  }
170  else
171  {
172  //Switch to the IDLE state
174  }
175 
176  break;
177 
178  //RECEIVED state?
180  //Evaluate conditions for the current state
181  if(port->rxResp && port->respId == port->currentId &&
182  (port->respMethod == EAP_METHOD_TYPE_NAK ||
183  port->respMethod == EAP_METHOD_TYPE_EXPANDED_NAK) &&
184  port->methodState == EAP_METHOD_STATE_PROPOSED)
185  {
186  //Switch to the NAK state
188  }
189  else if(port->rxResp && port->respId == port->currentId &&
190  port->respMethod == port->currentMethod)
191  {
192  //Switch to the INTEGRITY_CHECK state
194  }
195  else
196  {
197  //Switch to the DISCARD state
199  }
200 
201  break;
202 
203  //NAK state?
205  //Unconditional transition (UCT) to SELECT_ACTION state
207  break;
208 
209  //SELECT_ACTION state?
211  //Evaluate conditions for the current state
212  if(port->decision == EAP_DECISION_FAILURE)
213  {
214  //Switch to the FAILURE state
216  }
217  else if(port->decision == EAP_DECISION_SUCCESS)
218  {
219  //Switch to the SUCCESS state
221  }
222  else if(port->decision == EAP_DECISION_PASSTHROUGH)
223  {
224  //Switch to the INITIALIZE_PASSTHROUGH state
226  }
227  else
228  {
229  //Switch to the PROPOSE_METHOD state
231  }
232 
233  break;
234 
235  //INTEGRITY_CHECK state?
237  //Evaluate conditions for the current state
238  if(port->ignore)
239  {
240  //Switch to the DISCARD state
242  }
243  else
244  {
245  //Switch to the METHOD_RESPONSE state
247  }
248 
249  break;
250 
251  //METHOD_RESPONSE state?
253  //Evaluate conditions for the current state
254  if(port->methodState == EAP_METHOD_STATE_END)
255  {
256  //Switch to the SELECT_ACTION state
258  }
259  else
260  {
261  //Switch to the METHOD_REQUEST state
263  }
264 
265  break;
266 
267  //PROPOSE_METHOD state?
269  //Unconditional transition (UCT) to METHOD_REQUEST state
271  break;
272 
273  //METHOD_REQUEST state?
275  //Unconditional transition (UCT) to SEND_REQUEST state
277  break;
278 
279  //DISCARD state?
281  //Unconditional transition (UCT) to IDLE state
283  break;
284 
285  //SEND_REQUEST state?
287  //Unconditional transition (UCT) to IDLE state
289  break;
290 
291  //TIMEOUT_FAILURE state?
293  //Final state indicating failure because no response has been received
294  break;
295 
296  //FAILURE state?
298  //Final state indicating failure
299  break;
300 
301  //SUCCESS state?
303  //Final state indicating success
304  break;
305 
306  //INITIALIZE_PASSTHROUGH state?
308  //Evaluate conditions for the current state
309  if(port->currentId != EAP_CURRENT_ID_NONE)
310  {
311  //Switch to the AAA_REQUEST state
313  }
314  else
315  {
316  //Switch to the AAA_IDLE state
318  }
319 
320  break;
321 
322  //IDLE2 state?
324  //The state machine waits for a response from the primary lower layer,
325  //which transports EAP traffic from the peer
326  if(port->retransWhile == 0)
327  {
328  //Switch to the RETRANSMIT2 state
330  }
331  else if(port->eapResp)
332  {
333  //Switch to the RECEIVED2 state
335  }
336  else
337  {
338  //Just for sanity
339  }
340 
341  break;
342 
343  //RETRANSMIT2 state?
345  //Evaluate conditions for the current state
346  if(port->retransCount > port->maxRetrans)
347  {
348  //Switch to the TIMEOUT_FAILURE2 state
350  }
351  else
352  {
353  //Switch to the IDLE2 state
355  }
356 
357  break;
358 
359  //RECEIVED2 state?
361  //Evaluate conditions for the current state
362  if(port->rxResp && port->respId == port->currentId)
363  {
364  //Switch to the AAA_REQUEST state
366  }
367  else
368  {
369  //Switch to the DISCARD2 state
371  }
372 
373  break;
374 
375  //AAA_REQUEST state?
377  //Unconditional transition (UCT) to AAA_IDLE state
379  break;
380 
381  //AAA_IDLE state?
383  //Evaluate conditions for the current state
384  if(port->aaaEapNoReq)
385  {
386  //Switch to the DISCARD2 state
388  }
389  else if(port->aaaEapReq)
390  {
391  //Switch to the AAA_RESPONSE state
393  }
394  else if(port->aaaTimeout)
395  {
396  //Switch to the TIMEOUT_FAILURE2 state
398  }
399  else if(port->aaaFail)
400  {
401  //Switch to the FAILURE2 state
403  }
404  else if(port->aaaSuccess)
405  {
406  //Switch to the SUCCESS2 state
408  }
409  else
410  {
411  //Just for sanity
412  }
413 
414  break;
415 
416  //AAA_RESPONSE state?
418  //Unconditional transition (UCT) to SEND_REQUEST2 state
420  break;
421 
422  //DISCARD2 state?
424  //Unconditional transition (UCT) to IDLE2 state
426  break;
427 
428  //SEND_REQUEST2 state?
430  //Unconditional transition (UCT) to IDLE2 state
432  break;
433 
434  //TIMEOUT_FAILURE2 state?
436  //Final state indicating failure because no response has been received
437  break;
438 
439  //FAILURE2 state?
441  //Final state indicating failure
442  break;
443 
444  //SUCCESS2 state?
446  //Final state indicating success
447  break;
448 
449  //Invalid state?
450  default:
451  //Just for sanity
452  authenticatorFsmError(port->context);
453  break;
454  }
455  }
456 }
457 
458 
459 /**
460  * @brief Update EAP full authenticator state
461  * @param[in] port Pointer to the port context
462  * @param[in] newState New state to switch to
463  **/
464 
466  EapFullAuthState newState)
467 {
468  size_t n;
469  EapFullAuthState oldState;
470 
471  //Retrieve current state
472  oldState = port->eapFullAuthState;
473 
474  //Any state change?
475  if(newState != oldState)
476  {
477  //Dump the state transition
478  TRACE_DEBUG("Port %" PRIu8 ": EAP full authenticator state machine %s -> %s\r\n",
479  port->portIndex,
484  }
485 
486  //Switch to the new state
487  port->eapFullAuthState = newState;
488 
489  //On entry to a state, the procedures defined for the state are executed
490  //exactly once (refer to RFC 4137, section 3.1)
491  switch(newState)
492  {
493  //DISABLED state?
495  //No action
496  break;
497 
498  //INITIALIZE state?
500  //Initialize variables
501  port->currentId = EAP_CURRENT_ID_NONE;
502  port->eapSuccess = FALSE;
503  port->eapFail = FALSE;
504  port->eapTimeout = FALSE;
505  port->eapKeyData = NULL;
506  port->eapKeyAvailable = FALSE;
507  port->eapRestart = FALSE;
508 
509  //Errata
510  port->currentMethod = EAP_METHOD_TYPE_NONE;
511  port->serverStateLen = 0;
512  break;
513 
514  //IDLE state?
516  //Calculate the retransmission timeout, taking into account the
517  //retransmission count, round-trip time measurements, and method-specific
518  //timeout hint
519  port->retransWhile = eapCalculateTimeout(port);
520  break;
521 
522  //RETRANSMIT state?
524  //Increment retransmission counter
525  port->retransCount++;
526 
527  //Check retransmission counter
528  if(port->retransCount <= port->maxRetrans)
529  {
530  //Retransmitted requests must be sent with the same identifier value
531  port->eapReqData = port->lastReqData;
532  port->eapReqDataLen = port->lastReqDataLen;
533  port->eapReq = TRUE;
534  }
535 
536  break;
537 
538  //RECEIVED state?
540  //This state is entered when an EAP packet is received. The packet
541  //header is parsed here
543  break;
544 
545  //NAK state?
547  //This state processes Nak responses from the peer
548  eapReset(port);
550  break;
551 
552  //SELECT_ACTION state?
554  //Between methods, the state machine re-evaluates whether its policy is
555  //satisfied and succeeds, fails, or remains undecided
556  port->decision = eapPolicyGetDecision(port);
557  break;
558 
559  //INTEGRITY_CHECK state?
561  //The integrity of the incoming packet from the peer is verified by
562  //the method
563  port->ignore = eapCheckResp(port);
564  break;
565 
566  //METHOD_RESPONSE state?
568  //Incoming packet is processed
570 
571  //Check for method completion
572  if(eapIsDone(port))
573  {
575  port->eapKeyData = eapAuthGetKey(port);
576  port->methodState = EAP_METHOD_STATE_END;
577  }
578  else
579  {
580  port->methodState = EAP_METHOD_STATE_CONTINUE;
581  }
582 
583  break;
584 
585  //PROPOSE_METHOD state?
587  //The authenticator decides which method to try next in the authentication
588  port->currentMethod = eapPolicyGetNextMethod(port);
589  //Initialize state
590  eapInit(port);
591 
592  //Identity or Notification method?
593  if(port->currentMethod == EAP_METHOD_TYPE_IDENTITY ||
594  port->currentMethod == EAP_METHOD_TYPE_NOTIFICATION)
595  {
596  port->methodState = EAP_METHOD_STATE_CONTINUE;
597  }
598  else
599  {
600  port->methodState = EAP_METHOD_STATE_PROPOSED;
601  }
602 
603  break;
604 
605  //METHOD_REQUEST state?
607  //A new request is formulated if necessary
608  port->currentId = eapNextId(port->currentId);
609  eapBuildReq(port);
610  port->methodTimeout = eapGetTimeout(port);
611  break;
612 
613  //DISCARD state?
615  //This state signals the lower layer that the response was discarded,
616  //and no new request packet will be sent at this time
617  port->eapResp = FALSE;
618  port->eapNoReq = TRUE;
619  break;
620 
621  //SEND_REQUEST state?
623  //This state signals the lower layer that a request packet is ready
624  //to be sent
625  port->retransCount = 0;
626  port->lastReqData = port->eapReqData;
627  port->lastReqDataLen = port->eapReqDataLen;
628  port->eapResp = FALSE;
629  port->eapReq = TRUE;
630  break;
631 
632  //TIMEOUT_FAILURE state?
634  //Final state indicating failure because no response has been received
635  port->eapTimeout = TRUE;
636  break;
637 
638  //FAILURE state?
640  //Create an EAP failure packet
642  //The state machine has reached the FAILURE state
643  port->eapFail = TRUE;
644  break;
645 
646  //SUCCESS state?
648  //Create an EAP success packet
650 
651  //Valid EAP key?
652  if(port->eapKeyData != NULL)
653  {
654  port->eapKeyAvailable = TRUE;
655  }
656 
657  //The state machine has reached the SUCCESS state
658  port->eapSuccess = TRUE;
659  break;
660 
661  //INITIALIZE_PASSTHROUGH state?
663  //Initialize variables when the pass-through portion of the state machine
664  //is activated
665  port->aaaEapRespData = NULL;
666  port->aaaEapRespDataLen = 0;
667  break;
668 
669  //IDLE2 state?
671  //Calculate the retransmission timeout, taking into account the
672  //retransmission count, round-trip time measurements, and method-specific
673  //timeout hint
674  port->retransWhile = eapCalculateTimeout(port);
675  break;
676 
677  //RETRANSMIT2 state?
679  //Increment retransmission counter
680  port->retransCount++;
681 
682  //Check retransmission counter
683  if(port->retransCount <= port->maxRetrans)
684  {
685  //Retransmitted requests must be sent with the same identifier value
686  port->eapReqData = port->lastReqData;
687  port->eapReqDataLen = port->lastReqDataLen;
688  port->eapReq = TRUE;
689  }
690 
691  break;
692 
693  //RECEIVED2 state?
695  //This state is entered when an EAP packet is received and the
696  //authenticator is in PASSTHROUGH mode. The packet header is parsed
697  //here
699  break;
700 
701  //AAA_REQUEST state?
703  //Identity response received?
704  if(port->respMethod == EAP_METHOD_TYPE_IDENTITY)
705  {
706  //Determine the length of the identity
707  n = port->eapRespDataLen - sizeof(EapResponse);
708  //Limit the length of the string
710 
711  //The NAS must copy the contents of the Type-Data field of the
712  //EAP-Response/Identity received from the peer (refer to RFC 3579,
713  //section 2.1)
714  osMemcpy(port->aaaIdentity, port->eapRespData + sizeof(EapResponse), n);
715  port->aaaIdentity[n] = '\0';
716  }
717 
718  //The incoming EAP packet is parsed for sending to the AAA server
719  port->aaaEapRespData = port->eapRespData;
720  port->aaaEapRespDataLen = port->eapRespDataLen;
721  break;
722 
723  //AAA_IDLE state?
725  //Idle state that tells the AAA layer that it has a response and then
726  //waits for a new request, a no-request signal, or success/failure
727  port->aaaFail = FALSE;
728  port->aaaSuccess = FALSE;
729  port->aaaEapReq = FALSE;
730  port->aaaEapNoReq = FALSE;
731  port->aaaEapResp = TRUE;
732  break;
733 
734  //AAA_RESPONSE state?
736  //The request from the AAA interface is processed into an EAP request
737  port->eapReqData = port->aaaEapReqData;
738  port->eapReqDataLen = port->aaaEapReqDataLen;
739  port->currentId = eapGetId(port->eapReqData, port->eapReqDataLen);
740  port->methodTimeout = port->aaaMethodTimeout;
741  break;
742 
743  //DISCARD2 state?
745  //This state signals the lower layer that the response was discarded,
746  //and that no new request packet will be sent at this time
747  port->eapResp = FALSE;
748  port->eapNoReq = TRUE;
749  break;
750 
751  //SEND_REQUEST2 state?
753  //This state signals the lower layer that a request packet is ready
754  //to be sent
755  port->retransCount = 0;
756  port->lastReqData = port->eapReqData;
757  port->lastReqDataLen = port->eapReqDataLen;
758  port->eapResp = FALSE;
759  port->eapReq = TRUE;
760  break;
761 
762  //TIMEOUT_FAILURE2 state?
764  //The authenticator has reached its maximum number of retransmissions
765  //without receiving a response
766  port->eapTimeout = TRUE;
767  //Errata
768  port->eapNoReq = TRUE;
769  break;
770 
771  //FAILURE2 state?
773  //Final state indicating failure
774  port->eapReqData = port->aaaEapReqData;
775  port->eapReqDataLen = port->aaaEapReqDataLen;
776  port->eapFail = TRUE;
777  break;
778 
779  //SUCCESS2 state?
781  //Final state indicating success
782  port->eapReqData = port->aaaEapReqData;
783  port->eapReqDataLen = port->aaaEapReqDataLen;
784  port->eapKeyData = port->aaaEapKeyData;
785  port->eapKeyAvailable = port->aaaEapKeyAvailable;
786  port->eapSuccess = TRUE;
787  break;
788 
789  //Invalid state?
790  default:
791  //Just for sanity
792  break;
793  }
794 
795  //Any state change?
796  if(newState != oldState)
797  {
798  //Any registered callback?
799  if(port->context->eapFullAuthStateChangeCallback != NULL)
800  {
801  //Invoke user callback function
802  port->context->eapFullAuthStateChangeCallback(port, newState);
803  }
804  }
805 
806  //Check whether the port is enabled
807  if(port->portControl == AUTHENTICATOR_PORT_MODE_AUTO &&
808  !port->initialize && port->portEnabled)
809  {
810  //The EAP full authenticator state machine is busy
811  port->context->busy = TRUE;
812  }
813 }
814 
815 #endif
@ EAP_FULL_AUTH_STATE_SUCCESS
@ EAP_METHOD_STATE_END
@ EAP_METHOD_TYPE_NONE
None.
Definition: eap.h:165
const char_t * eapGetParamName(uint_t value, const EapParamName *paramList, size_t paramListLen)
Convert a parameter to string representation.
Definition: eap_debug.c:219
@ EAP_FULL_AUTH_STATE_SUCCESS2
@ EAP_FULL_AUTH_STATE_FAILURE
void eapFullAuthChangeState(AuthenticatorPort *port, EapFullAuthState newState)
Update EAP full authenticator state.
#define TRUE
Definition: os_port.h:50
void eapFullAuthInitFsm(AuthenticatorPort *port)
EAP full authenticator state machine initialization.
void eapFullAuthFsm(AuthenticatorPort *port)
EAP full authenticator state machine implementation.
@ EAP_METHOD_TYPE_NAK
Legacy Nak.
Definition: eap.h:168
@ EAP_DECISION_PASSTHROUGH
@ EAP_METHOD_STATE_PROPOSED
@ EAP_FULL_AUTH_STATE_IDLE
@ EAP_FULL_AUTH_STATE_INITIALIZE
@ EAP_FULL_AUTH_STATE_RECEIVED
void eapProcessResp(AuthenticatorPort *port)
Parse and process a response.
bool_t eapIsDone(AuthenticatorPort *port)
Check for method completion.
EapFullAuthState
EAP full authenticator states.
uint_t eapNextId(uint_t id)
Determine the next identifier value to use.
Helper functions for 802.1X authenticator.
void eapReset(AuthenticatorPort *port)
The method is ending in the middle of or before completion.
#define FALSE
Definition: os_port.h:46
void eapParseResp(AuthenticatorPort *port)
Determine the code, identifier value, and type of the current response.
@ EAP_FULL_AUTH_STATE_SELECT_ACTION
#define osMemcpy(dest, src, length)
Definition: os_port.h:141
802.1X authenticator
@ EAP_METHOD_TYPE_IDENTITY
Identity.
Definition: eap.h:166
@ EAP_FULL_AUTH_STATE_AAA_REQUEST
uint_t eapGetId(const uint8_t *eapReqData, size_t eapReqDataLen)
Determine the identifier value for the current EAP request.
void eapBuildFailure(AuthenticatorPort *port)
Create an EAP failure packet.
@ EAP_FULL_AUTH_STATE_NAK
@ EAP_FULL_AUTH_STATE_INITIALIZE_PASSTHROUGH
@ EAP_FULL_AUTH_STATE_SEND_REQUEST
@ EAP_FULL_AUTH_STATE_AAA_RESPONSE
@ EAP_DECISION_SUCCESS
void authenticatorFsmError(AuthenticatorContext *context)
Authenticator state machine error handler.
bool_t eapCheckResp(AuthenticatorPort *port)
Test for the validity of a message.
#define MIN(a, b)
Definition: os_port.h:63
Authenticator state machine.
const EapParamName eapFullAuthStates[]
EapResponse
Definition: eap.h:252
void eapBuildSuccess(AuthenticatorPort *port)
Create an EAP success packet.
uint16_t port
Definition: dns_common.h:267
void eapPolicyUpdate(AuthenticatorPort *port)
Update all variables related to internal policy state.
#define TRACE_DEBUG(...)
Definition: debug.h:107
void eapInit(AuthenticatorPort *port)
Method procedure to initialize state just before use.
@ EAP_FULL_AUTH_STATE_DISCARD
@ EAP_METHOD_TYPE_EXPANDED_NAK
Expanded NAK.
Definition: eap.h:176
@ EAP_METHOD_TYPE_NOTIFICATION
Notification.
Definition: eap.h:167
Data logging functions for debugging purpose (EAP)
#define AUTHENTICATOR_MAX_ID_LEN
@ EAP_FULL_AUTH_STATE_AAA_IDLE
EAP full authenticator state machine.
@ EAP_FULL_AUTH_STATE_RETRANSMIT
void eapBuildReq(AuthenticatorPort *port)
Produce the next request.
uint8_t n
@ EAP_FULL_AUTH_STATE_PROPOSE_METHOD
@ EAP_FULL_AUTH_STATE_TIMEOUT_FAILURE
EapMethodType eapPolicyGetNextMethod(AuthenticatorPort *port)
Determine the method that should be used at this point in the conversation.
@ EAP_FULL_AUTH_STATE_FAILURE2
@ AUTHENTICATOR_PORT_MODE_AUTO
@ EAP_FULL_AUTH_STATE_RETRANSMIT2
@ EAP_FULL_AUTH_STATE_TIMEOUT_FAILURE2
@ EAP_FULL_AUTH_STATE_METHOD_RESPONSE
@ EAP_FULL_AUTH_STATE_METHOD_REQUEST
#define EAP_CURRENT_ID_NONE
uint_t eapGetTimeout(AuthenticatorPort *port)
Determine an appropriate timeout hint for the method.
@ EAP_FULL_AUTH_STATE_RECEIVED2
@ EAP_FULL_AUTH_STATE_SEND_REQUEST2
#define AuthenticatorPort
Definition: authenticator.h:40
@ EAP_FULL_AUTH_STATE_INTEGRITY_CHECK
@ EAP_FULL_AUTH_STATE_DISCARD2
Parameter value/name binding.
Definition: eap_debug.h:50
@ EAP_METHOD_STATE_CONTINUE
@ EAP_DECISION_FAILURE
Debugging facilities.
@ EAP_FULL_AUTH_STATE_IDLE2
EapDecision eapPolicyGetDecision(AuthenticatorPort *port)
Determine if the policy will allow SUCCESS, FAIL, or is yet to determine.
uint8_t * eapAuthGetKey(AuthenticatorPort *port)
Obtain key material for use by EAP or lower layers.
EAP authenticator state machine procedures.
#define arraysize(a)
Definition: os_port.h:71
@ EAP_FULL_AUTH_STATE_DISABLED
uint_t eapCalculateTimeout(AuthenticatorPort *port)
Calculate retransmission timeout.