• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/router/wpa_supplicant/src/eap_server/
1/*
2 * hostapd / EAP method registration
3 * Copyright (c) 2004-2006, Jouni Malinen <j@w1.fi>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
8 *
9 * Alternatively, this software may be distributed under the terms of BSD
10 * license.
11 *
12 * See README and COPYING for more details.
13 */
14
15#include "includes.h"
16
17#include "common.h"
18#include "eap_i.h"
19#include "eap_methods.h"
20
21
22static struct eap_method *eap_methods;
23
24
25/**
26 * eap_server_get_eap_method - Get EAP method based on type number
27 * @vendor: EAP Vendor-Id (0 = IETF)
28 * @method: EAP type number
29 * Returns: Pointer to EAP method or %NULL if not found
30 */
31const struct eap_method * eap_server_get_eap_method(int vendor, EapType method)
32{
33	struct eap_method *m;
34	for (m = eap_methods; m; m = m->next) {
35		if (m->vendor == vendor && m->method == method)
36			return m;
37	}
38	return NULL;
39}
40
41
42/**
43 * eap_server_get_type - Get EAP type for the given EAP method name
44 * @name: EAP method name, e.g., TLS
45 * @vendor: Buffer for returning EAP Vendor-Id
46 * Returns: EAP method type or %EAP_TYPE_NONE if not found
47 *
48 * This function maps EAP type names into EAP type numbers based on the list of
49 * EAP methods included in the build.
50 */
51EapType eap_server_get_type(const char *name, int *vendor)
52{
53	struct eap_method *m;
54	for (m = eap_methods; m; m = m->next) {
55		if (os_strcmp(m->name, name) == 0) {
56			*vendor = m->vendor;
57			return m->method;
58		}
59	}
60	*vendor = EAP_VENDOR_IETF;
61	return EAP_TYPE_NONE;
62}
63
64
65/**
66 * eap_server_method_alloc - Allocate EAP server method structure
67 * @version: Version of the EAP server method interface (set to
68 * EAP_SERVER_METHOD_INTERFACE_VERSION)
69 * @vendor: EAP Vendor-ID (EAP_VENDOR_*) (0 = IETF)
70 * @method: EAP type number (EAP_TYPE_*)
71 * @name: Name of the method (e.g., "TLS")
72 * Returns: Allocated EAP method structure or %NULL on failure
73 *
74 * The returned structure should be freed with eap_server_method_free() when it
75 * is not needed anymore.
76 */
77struct eap_method * eap_server_method_alloc(int version, int vendor,
78					    EapType method, const char *name)
79{
80	struct eap_method *eap;
81	eap = os_zalloc(sizeof(*eap));
82	if (eap == NULL)
83		return NULL;
84	eap->version = version;
85	eap->vendor = vendor;
86	eap->method = method;
87	eap->name = name;
88	return eap;
89}
90
91
92/**
93 * eap_server_method_free - Free EAP server method structure
94 * @method: Method structure allocated with eap_server_method_alloc()
95 */
96void eap_server_method_free(struct eap_method *method)
97{
98	os_free(method);
99}
100
101
102/**
103 * eap_server_method_register - Register an EAP server method
104 * @method: EAP method to register
105 * Returns: 0 on success, -1 on invalid method, or -2 if a matching EAP method
106 * has already been registered
107 *
108 * Each EAP server method needs to call this function to register itself as a
109 * supported EAP method.
110 */
111int eap_server_method_register(struct eap_method *method)
112{
113	struct eap_method *m, *last = NULL;
114
115	if (method == NULL || method->name == NULL ||
116	    method->version != EAP_SERVER_METHOD_INTERFACE_VERSION)
117		return -1;
118
119	for (m = eap_methods; m; m = m->next) {
120		if ((m->vendor == method->vendor &&
121		     m->method == method->method) ||
122		    os_strcmp(m->name, method->name) == 0)
123			return -2;
124		last = m;
125	}
126
127	if (last)
128		last->next = method;
129	else
130		eap_methods = method;
131
132	return 0;
133}
134
135
136/**
137 * eap_server_register_methods - Register statically linked EAP server methods
138 * Returns: 0 on success, -1 on failure
139 *
140 * This function is called at program initialization to register all EAP server
141 * methods that were linked in statically.
142 */
143int eap_server_register_methods(void)
144{
145	int ret = 0;
146
147	if (ret == 0) {
148		int eap_server_identity_register(void);
149		ret = eap_server_identity_register();
150	}
151
152#ifdef EAP_MD5
153	if (ret == 0) {
154		int eap_server_md5_register(void);
155		ret = eap_server_md5_register();
156	}
157#endif /* EAP_MD5 */
158
159#ifdef EAP_TLS
160	if (ret == 0) {
161		int eap_server_tls_register(void);
162		ret = eap_server_tls_register();
163	}
164#endif /* EAP_TLS */
165
166#ifdef EAP_MSCHAPv2
167	if (ret == 0) {
168		int eap_server_mschapv2_register(void);
169		ret = eap_server_mschapv2_register();
170	}
171#endif /* EAP_MSCHAPv2 */
172
173#ifdef EAP_PEAP
174	if (ret == 0) {
175		int eap_server_peap_register(void);
176		ret = eap_server_peap_register();
177	}
178#endif /* EAP_PEAP */
179
180#ifdef EAP_TLV
181	if (ret == 0) {
182		int eap_server_tlv_register(void);
183		ret = eap_server_tlv_register();
184	}
185#endif /* EAP_TLV */
186
187#ifdef EAP_GTC
188	if (ret == 0) {
189		int eap_server_gtc_register(void);
190		ret = eap_server_gtc_register();
191	}
192#endif /* EAP_GTC */
193
194#ifdef EAP_TTLS
195	if (ret == 0) {
196		int eap_server_ttls_register(void);
197		ret = eap_server_ttls_register();
198	}
199#endif /* EAP_TTLS */
200
201#ifdef EAP_SIM
202	if (ret == 0) {
203		int eap_server_sim_register(void);
204		ret = eap_server_sim_register();
205	}
206#endif /* EAP_SIM */
207
208#ifdef EAP_AKA
209	if (ret == 0) {
210		int eap_server_aka_register(void);
211		ret = eap_server_aka_register();
212	}
213#endif /* EAP_AKA */
214
215#ifdef EAP_AKA_PRIME
216	if (ret == 0) {
217		int eap_server_aka_prime_register(void);
218		ret = eap_server_aka_prime_register();
219	}
220#endif /* EAP_AKA_PRIME */
221
222#ifdef EAP_PAX
223	if (ret == 0) {
224		int eap_server_pax_register(void);
225		ret = eap_server_pax_register();
226	}
227#endif /* EAP_PAX */
228
229#ifdef EAP_PSK
230	if (ret == 0) {
231		int eap_server_psk_register(void);
232		ret = eap_server_psk_register();
233	}
234#endif /* EAP_PSK */
235
236#ifdef EAP_SAKE
237	if (ret == 0) {
238		int eap_server_sake_register(void);
239		ret = eap_server_sake_register();
240	}
241#endif /* EAP_SAKE */
242
243#ifdef EAP_GPSK
244	if (ret == 0) {
245		int eap_server_gpsk_register(void);
246		ret = eap_server_gpsk_register();
247	}
248#endif /* EAP_GPSK */
249
250#ifdef EAP_VENDOR_TEST
251	if (ret == 0) {
252		int eap_server_vendor_test_register(void);
253		ret = eap_server_vendor_test_register();
254	}
255#endif /* EAP_VENDOR_TEST */
256
257#ifdef EAP_FAST
258	if (ret == 0) {
259		int eap_server_fast_register(void);
260		ret = eap_server_fast_register();
261	}
262#endif /* EAP_FAST */
263
264#ifdef EAP_WSC
265	if (ret == 0) {
266		int eap_server_wsc_register(void);
267		ret = eap_server_wsc_register();
268	}
269#endif /* EAP_WSC */
270
271#ifdef EAP_IKEV2
272	if (ret == 0) {
273		int eap_server_ikev2_register(void);
274		ret = eap_server_ikev2_register();
275	}
276#endif /* EAP_IKEV2 */
277
278#ifdef EAP_TNC
279	if (ret == 0) {
280		int eap_server_tnc_register(void);
281		ret = eap_server_tnc_register();
282	}
283#endif /* EAP_TNC */
284
285	return ret;
286}
287
288
289/**
290 * eap_server_unregister_methods - Unregister EAP server methods
291 *
292 * This function is called at program termination to unregister all EAP server
293 * methods.
294 */
295void eap_server_unregister_methods(void)
296{
297	struct eap_method *m;
298
299	while (eap_methods) {
300		m = eap_methods;
301		eap_methods = eap_methods->next;
302
303		if (m->free)
304			m->free(m);
305		else
306			eap_server_method_free(m);
307	}
308}
309