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)