Large changes & re-arrangements, in preparation (hopefully) for
[freeradius.git] / src / modules / rlm_eap / eap.h
1 /*
2  * eap.h    Header file containing the interfaces for all EAP types.
3  *
4  * Version:     $Id$
5  *
6  *   This program is free software; you can redistribute it and/or modify
7  *   it under the terms of the GNU General Public License as published by
8  *   the Free Software Foundation; either version 2 of the License, or
9  *   (at your option) any later version.
10  *
11  *   This program is distributed in the hope that it will be useful,
12  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *   GNU General Public License for more details.
15  *
16  *   You should have received a copy of the GNU General Public License
17  *   along with this program; if not, write to the Free Software
18  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  * Copyright 2001  hereUare Communications, Inc. <raghud@hereuare.com>
21  * Copyright 2003  Alan DeKok <aland@freeradius.org>
22  */
23 #ifndef _EAP_H
24 #define _EAP_H
25
26 #include "autoconf.h"
27
28 #if HAVE_SYS_TYPES_H
29 #include <sys/types.h>
30 #endif
31
32 #if HAVE_NETINET_IN_H
33 #include <netinet/in.h>
34 #endif
35
36 #include <string.h>
37 #include <stdlib.h>
38
39 #include "radiusd.h"
40 #include "modules.h"
41
42 #include "rad_assert.h"
43
44 #define PW_EAP_REQUEST          1
45 #define PW_EAP_RESPONSE         2
46 #define PW_EAP_SUCCESS          3
47 #define PW_EAP_FAILURE          4
48 #define PW_EAP_MAX_CODES        4
49
50 #define PW_EAP_IDENTITY         1
51 #define PW_EAP_NOTIFICATION     2
52 #define PW_EAP_NAK              3
53 #define PW_EAP_MD5              4
54 #define PW_EAP_OTP              5
55 #define PW_EAP_GTC              6
56 #define PW_EAP_TLS              13
57 #define PW_EAP_LEAP             17
58 #define PW_EAP_TTLS             21
59 #define PW_EAP_PEAP             25
60 #define PW_EAP_MAX_TYPES        25
61
62 #define EAP_HEADER_LEN          4
63
64 /*
65  * EAP-Type specific data.
66  */
67 typedef struct eaptype_t {
68         unsigned char   type;
69         unsigned int    length;
70         unsigned char   *data;
71 } eaptype_t;
72
73 /*
74  * Structure to hold EAP data.
75  *
76  * length = code + id + length + type + type.data
77  *        =  1   +  1 +   2    +  1   +  X
78  */
79 typedef struct eap_packet {
80         unsigned char   code;
81         unsigned char   id;
82         unsigned int    length;
83         eaptype_t       type;
84
85         unsigned char   *packet;
86 } EAP_PACKET;
87
88 /*
89  * EAP_DS contains all the received/sending information
90  * response = Received EAP packet
91  * request = Sending EAP packet
92  *
93  * Note: We are authentication server, 
94  *  we get ONLY EAP-Responses and 
95  *  we send EAP-Request/EAP-success/EAP-failure
96  */
97 typedef struct eap_ds {
98         EAP_PACKET      *response;
99         EAP_PACKET      *request;
100         int             set_request_id;
101 } EAP_DS;
102
103 /*
104  * Currently there are only 2 types
105  * of operations defined, 
106  * apart from attach & detach for each EAP-Type.
107  */
108 typedef enum operation_t {
109         INITIATE = 0,
110         AUTHORIZE,
111         AUTHENTICATE
112 } operation_t;
113
114
115 /*
116  * EAP_HANDLER is the interface for any EAP-Type.
117  * Each handler contains information for one specific EAP-Type.
118  * This way we don't need to change any interfaces in future.
119  * It is also a list of EAP-request handlers waiting for EAP-response
120  * eap_id = copy of the eap packet we sent to the 
121  *
122  * next = pointer to next
123  * state = state attribute from the reply we sent
124  * state_len = length of data in the state attribute.
125  * src_ipaddr = client which sent us the RADIUS request containing
126  *              this EAP conversation.
127  * eap_id = copy of EAP id we sent to the client.
128  * timestamp  = timestamp when this handler was last used.
129  * identity = Identity, as obtained, from EAP-Identity response.
130  * request = RADIUS request data structure
131  * prev_eapds = Previous EAP request, for which eap_ds contains the response.
132  * eap_ds   = Current EAP response.
133  * opaque   = EAP-Type holds some data that corresponds to the current
134  *              EAP-request/response
135  * free_opaque = To release memory held by opaque, 
136  *              when this handler is timedout & needs to be deleted.
137  *              It is the responsibility of the specific EAP-TYPE 
138  *              to avoid any memory leaks in opaque
139  *              Hence this pointer should be provided by the EAP-Type
140  *              if opaque is not NULL
141  * status   = finished/onhold/..
142  */
143 #define EAP_STATE_LEN (AUTH_VECTOR_LEN)
144 typedef struct _eap_handler {
145         struct _eap_handler *next;
146
147         uint8_t         state[EAP_STATE_LEN];
148         uint32_t        src_ipaddr;
149         unsigned int    eap_id;
150         unsigned int    eap_type;
151
152         time_t          timestamp;
153
154         REQUEST         *request;
155
156         char            *identity; /* User name from EAP-Identity */
157
158         EAP_DS          *prev_eapds;
159         EAP_DS          *eap_ds;
160
161         void            *opaque;
162         void            (*free_opaque)(void *opaque);
163
164         int             status;
165
166         int             stage;
167 } EAP_HANDLER;
168
169 /* 
170  * Interface to call EAP sub mdoules
171  */
172 typedef struct eap_type_t {
173         const   char *name;
174         int     (*attach)(CONF_SECTION *conf, void **type_data);
175         int     (*initiate)(void *type_data, EAP_HANDLER *handler);
176         int     (*authorize)(void *type_data, EAP_HANDLER *handler);
177         int     (*authenticate)(void *type_data, EAP_HANDLER *handler);
178         int     (*detach)(void *type_data);
179 } EAP_TYPE;
180
181 #endif /*_EAP_H*/