1 /*
2  * eap_types.h  Header file containing the interfaces for all EAP types.
3  *
4  * most contents moved from modules/rlm_eap/eap.h
5  *
6  * Version:     $Id: c6568ffedf26ab895717e9de961ffde82f011224 $
7  *
8  *   This program is free software; you can redistribute it and/or modify
9  *   it under the terms of the GNU General Public License as published by
10  *   the Free Software Foundation; either version 2 of the License, or
11  *   (at your option) any later version.
12  *
13  *   This program is distributed in the hope that it will be useful,
14  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  *   GNU General Public License for more details.
17  *
18  *   You should have received a copy of the GNU General Public License
19  *   along with this program; if not, write to the Free Software
20  *   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21  *
22  * Copyright 2001  hereUare Communications, Inc. <raghud@hereuare.com>
23  * Copyright 2003  Alan DeKok <aland@freeradius.org>
24  * Copyright 2006  The FreeRADIUS server project
25  */
26 #ifndef _EAP_TYPES_H
27 #define _EAP_TYPES_H
28 
29 RCSIDH(eap_methods_h, "$Id: c6568ffedf26ab895717e9de961ffde82f011224 $")
30 
31 #include <freeradius-devel/radiusd.h>
32 #include <freeradius-devel/modules.h>
33 
34 /* Code (1) + Identifier (1) + Length (2) */
35 #define EAP_HEADER_LEN 		4
36 
37 typedef enum eap_code {
38 	PW_EAP_REQUEST = 1,
39 	PW_EAP_RESPONSE,
40 	PW_EAP_SUCCESS,
41 	PW_EAP_FAILURE,
42 	PW_EAP_MAX_CODES
43 } eap_code_t;
44 
45 typedef enum eap_method {
46 	PW_EAP_INVALID = 0,		/* 0 */
47 	PW_EAP_IDENTITY,		/* 1 */
48 	PW_EAP_NOTIFICATION,		/* 2 */
49 	PW_EAP_NAK,			/* 3 */
50 	PW_EAP_MD5,			/* 4 */
51 	PW_EAP_OTP,			/* 5 */
52 	PW_EAP_GTC,			/* 6 */
53 	PW_EAP_7,			/* 7  - unused */
54 	PW_EAP_8,			/* 8  - unused */
55 	PW_EAP_RSA_PUBLIC_KEY,		/* 9 */
56 	PW_EAP_DSS_UNILATERAL,		/* 10 */
57 	PW_EAP_KEA,			/* 11 */
58 	PW_EAP_KEA_VALIDATE,		/* 12 */
59 	PW_EAP_TLS,			/* 13 */
60 	PW_EAP_DEFENDER_TOKEN,		/* 14 */
61 	PW_EAP_RSA_SECURID,		/* 15 */
62 	PW_EAP_ARCOT_SYSTEMS,		/* 16 */
63 	PW_EAP_LEAP,			/* 17 */
64 	PW_EAP_SIM,			/* 18 */
65 	PW_EAP_SRP_SHA1,		/* 19 */
66 	PW_EAP_20,			/* 20 - unassigned */
67 	PW_EAP_TTLS,			/* 21 */
68 	PW_EAP_REMOTE_ACCESS_SERVICE,	/* 22 */
69 	PW_EAP_AKA,			/* 23 */
70 	PW_EAP_3COM,			/* 24 - should this be EAP-HP now? */
71 	PW_EAP_PEAP,			/* 25 */
72 	PW_EAP_MSCHAPV2,		/* 26 */
73 	PW_EAP_MAKE,			/* 27 */
74 	PW_EAP_CRYPTOCARD,		/* 28 */
75 	PW_EAP_CISCO_MSCHAPV2,		/* 29 */
76 	PW_EAP_DYNAMID,			/* 30 */
77 	PW_EAP_ROB,			/* 31 */
78 	PW_EAP_POTP,			/* 32 */
79 	PW_EAP_MS_ATLV,			/* 33 */
80 	PW_EAP_SENTRINET,		/* 34 */
81 	PW_EAP_ACTIONTEC,		/* 35 */
82 	PW_EAP_COGENT_BIOMETRIC,	/* 36 */
83 	PW_EAP_AIRFORTRESS,		/* 37 */
84 	PW_EAP_TNC,			/* 38 - fixme conflicts with HTTP DIGEST */
85 //	PW_EAP_HTTP_DIGEST,		/* 38 */
86 	PW_EAP_SECURISUITE,		/* 39 */
87 	PW_EAP_DEVICECONNECT,		/* 40 */
88 	PW_EAP_SPEKE,			/* 41 */
89 	PW_EAP_MOBAC,			/* 42 */
90 	PW_EAP_FAST,			/* 43 */
91 	PW_EAP_ZONELABS,		/* 44 */
92 	PW_EAP_LINK,			/* 45 */
93 	PW_EAP_PAX,			/* 46 */
94 	PW_EAP_PSK,			/* 47 */
95 	PW_EAP_SAKE,			/* 48 */
96 	PW_EAP_IKEV2,			/* 49 */
97 	PW_EAP_AKA2,			/* 50 */
98 	PW_EAP_GPSK,			/* 51 */
99 	PW_EAP_PWD,			/* 52 */
100 	PW_EAP_EKE,			/* 53 */
101 	PW_EAP_MAX_TYPES		/* 54 - for validation */
102 } eap_type_t;
103 
104 #define PW_EAP_EXPANDED_TYPE	(254)
105 
106 typedef enum eap_rcode {
107 	EAP_NOTFOUND,    	//!< EAP handler data not found.
108 	EAP_FOUND,       	//!< EAP handler data found, continue.
109 	EAP_OK,		 	//!< Ok, continue.
110 	EAP_FAIL,		//!< Failed, don't reply.
111 	EAP_NOOP,		//!< Succeeded without doing anything.
112 	EAP_INVALID,     	//!< Invalid, don't reply.
113 	EAP_VALID,		//!< Valid, continue.
114 	EAP_MAX_RCODES
115 } eap_rcode_t;
116 
117 extern const FR_NAME_NUMBER eap_rcode_table[];
118 
119 /** EAP-Type specific data
120  */
121 typedef struct eap_type_data {
122 	eap_type_t	num;
123 	size_t		length;
124 	uint8_t		*data;
125 } eap_type_data_t;
126 
127 /** Structure to hold EAP data
128  *
129  * length = code + id + length + type + type.data
130  *	=  1   +  1 +   2    +  1   +  X
131  */
132 typedef struct eap_packet {
133 	eap_code_t	code;
134 	uint8_t		id;
135 	size_t		length;
136 	eap_type_data_t	type;
137 
138 	uint8_t		*packet;
139 } eap_packet_t;
140 
141 /** Structure to represent packet format of eap *on wire*
142  */
143 typedef struct eap_packet_raw {
144 	uint8_t		code;
145 	uint8_t		id;
146 	uint8_t		length[2];
147 	uint8_t		data[1];
148 } eap_packet_raw_t;
149 
150 
151 /*
152  * interfaces in eapcommon.c
153  */
154 eap_type_t		eap_name2type(char const *name);
155 char const		*eap_type2name(eap_type_t method);
156 int			eap_wireformat(eap_packet_t *reply);
157 int			eap_basic_compose(RADIUS_PACKET *packet, eap_packet_t *reply);
158 VALUE_PAIR		*eap_packet2vp(RADIUS_PACKET *packet, eap_packet_raw_t const *reply);
159 eap_packet_raw_t	*eap_vp2packet(TALLOC_CTX *ctx, VALUE_PAIR *vps);
160 void			eap_add_reply(REQUEST *request, char const *name, uint8_t const *value, int len);
161 
162 #endif /* _EAP_TYPES_H */
163