eap_server_methods.c revision 8d520ff1dc2da35cdca849e982051b86468016d8
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * EAP server method registration
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 2004-2009, Jouni Malinen <j@w1.fi>
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This program is free software; you can redistribute it and/or modify
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * it under the terms of the GNU General Public License version 2 as
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * published by the Free Software Foundation.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Alternatively, this software may be distributed under the terms of BSD
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * license.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See README and COPYING for more details.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "includes.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "common.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "eap_i.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "eap_methods.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static struct eap_method *eap_methods;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * eap_server_get_eap_method - Get EAP method based on type number
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @vendor: EAP Vendor-Id (0 = IETF)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @method: EAP type number
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns: Pointer to EAP method or %NULL if not found
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const struct eap_method * eap_server_get_eap_method(int vendor, EapType method)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct eap_method *m;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (m = eap_methods; m; m = m->next) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (m->vendor == vendor && m->method == method)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return m;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return NULL;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * eap_server_get_type - Get EAP type for the given EAP method name
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: EAP method name, e.g., TLS
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @vendor: Buffer for returning EAP Vendor-Id
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns: EAP method type or %EAP_TYPE_NONE if not found
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This function maps EAP type names into EAP type numbers based on the list of
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * EAP methods included in the build.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EapType eap_server_get_type(const char *name, int *vendor)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct eap_method *m;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (m = eap_methods; m; m = m->next) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (os_strcmp(m->name, name) == 0) {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*vendor = m->vendor;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return m->method;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*vendor = EAP_VENDOR_IETF;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return EAP_TYPE_NONE;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * eap_server_method_alloc - Allocate EAP server method structure
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @version: Version of the EAP server method interface (set to
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * EAP_SERVER_METHOD_INTERFACE_VERSION)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @vendor: EAP Vendor-ID (EAP_VENDOR_*) (0 = IETF)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @method: EAP type number (EAP_TYPE_*)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: Name of the method (e.g., "TLS")
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns: Allocated EAP method structure or %NULL on failure
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The returned structure should be freed with eap_server_method_free() when it
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is not needed anymore.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct eap_method * eap_server_method_alloc(int version, int vendor,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					    EapType method, const char *name)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct eap_method *eap;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	eap = os_zalloc(sizeof(*eap));
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (eap == NULL)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return NULL;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	eap->version = version;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	eap->vendor = vendor;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	eap->method = method;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	eap->name = name;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return eap;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * eap_server_method_free - Free EAP server method structure
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @method: Method structure allocated with eap_server_method_alloc()
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void eap_server_method_free(struct eap_method *method)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	os_free(method);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * eap_server_method_register - Register an EAP server method
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @method: EAP method to register
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns: 0 on success, -1 on invalid method, or -2 if a matching EAP method
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * has already been registered
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Each EAP server method needs to call this function to register itself as a
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * supported EAP method.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int eap_server_method_register(struct eap_method *method)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct eap_method *m, *last = NULL;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (method == NULL || method->name == NULL ||
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    method->version != EAP_SERVER_METHOD_INTERFACE_VERSION)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return -1;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (m = eap_methods; m; m = m->next) {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((m->vendor == method->vendor &&
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     m->method == method->method) ||
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    os_strcmp(m->name, method->name) == 0)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return -2;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		last = m;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (last)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		last->next = method;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		eap_methods = method;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return 0;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * eap_server_unregister_methods - Unregister EAP server methods
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This function is called at program termination to unregister all EAP server
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * methods.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void eap_server_unregister_methods(void)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct eap_method *m;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (eap_methods) {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		m = eap_methods;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		eap_methods = eap_methods->next;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (m->free)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			m->free(m);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			eap_server_method_free(m);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * eap_server_get_name - Get EAP method name for the given EAP type
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @vendor: EAP Vendor-Id (0 = IETF)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: EAP method type
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns: EAP method name, e.g., TLS, or %NULL if not found
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This function maps EAP type numbers into EAP type names based on the list of
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * EAP methods included in the build.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char * eap_server_get_name(int vendor, EapType type)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct eap_method *m;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (m = eap_methods; m; m = m->next) {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (m->vendor == vendor && m->method == type)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return m->name;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return NULL;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)