Annotation of embedaddon/strongswan/src/libstrongswan/eap/eap.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 2012 Tobias Brunner
        !             3:  * Copyright (C) 2006 Martin Willi
        !             4:  * HSR Hochschule fuer Technik Rapperswil
        !             5:  *
        !             6:  * This program is free software; you can redistribute it and/or modify it
        !             7:  * under the terms of the GNU General Public License as published by the
        !             8:  * Free Software Foundation; either version 2 of the License, or (at your
        !             9:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
        !            10:  *
        !            11:  * This program is distributed in the hope that it will be useful, but
        !            12:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        !            13:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
        !            14:  * for more details.
        !            15:  */
        !            16: 
        !            17: #include <stdlib.h>
        !            18: #include <errno.h>
        !            19: 
        !            20: #include "eap.h"
        !            21: 
        !            22: #include <utils/debug.h>
        !            23: 
        !            24: ENUM(eap_code_names, EAP_REQUEST, EAP_FAILURE,
        !            25:        "EAP_REQUEST",
        !            26:        "EAP_RESPONSE",
        !            27:        "EAP_SUCCESS",
        !            28:        "EAP_FAILURE",
        !            29: );
        !            30: 
        !            31: ENUM(eap_code_short_names, EAP_REQUEST, EAP_FAILURE,
        !            32:        "REQ",
        !            33:        "RES",
        !            34:        "SUCC",
        !            35:        "FAIL",
        !            36: );
        !            37: 
        !            38: ENUM_BEGIN(eap_type_names, EAP_IDENTITY, EAP_GTC,
        !            39:        "EAP_IDENTITY",
        !            40:        "EAP_NOTIFICATION",
        !            41:        "EAP_NAK",
        !            42:        "EAP_MD5",
        !            43:        "EAP_OTP",
        !            44:        "EAP_GTC");
        !            45: ENUM_NEXT(eap_type_names, EAP_TLS, EAP_TLS, EAP_GTC,
        !            46:        "EAP_TLS");
        !            47: ENUM_NEXT(eap_type_names, EAP_SIM, EAP_SIM, EAP_TLS,
        !            48:        "EAP_SIM");
        !            49: ENUM_NEXT(eap_type_names, EAP_TTLS, EAP_TTLS, EAP_SIM,
        !            50:        "EAP_TTLS");
        !            51: ENUM_NEXT(eap_type_names, EAP_AKA, EAP_AKA, EAP_TTLS,
        !            52:        "EAP_AKA");
        !            53: ENUM_NEXT(eap_type_names, EAP_PEAP, EAP_MSCHAPV2, EAP_AKA,
        !            54:        "EAP_PEAP",
        !            55:        "EAP_MSCHAPV2");
        !            56: ENUM_NEXT(eap_type_names, EAP_MSTLV, EAP_MSTLV, EAP_MSCHAPV2,
        !            57:        "EAP_MSTLV");
        !            58: ENUM_NEXT(eap_type_names, EAP_TNC, EAP_TNC, EAP_MSTLV,
        !            59:        "EAP_TNC");
        !            60: ENUM_NEXT(eap_type_names, EAP_PT_EAP, EAP_PT_EAP, EAP_TNC,
        !            61:        "EAP_PT_EAP");
        !            62: ENUM_NEXT(eap_type_names, EAP_EXPANDED, EAP_DYNAMIC, EAP_PT_EAP,
        !            63:        "EAP_EXPANDED",
        !            64:        "EAP_EXPERIMENTAL",
        !            65:        "EAP_RADIUS",
        !            66:        "EAP_DYNAMIC");
        !            67: ENUM_END(eap_type_names, EAP_DYNAMIC);
        !            68: 
        !            69: ENUM_BEGIN(eap_type_short_names, EAP_IDENTITY, EAP_GTC,
        !            70:        "ID",
        !            71:        "NTF",
        !            72:        "NAK",
        !            73:        "MD5",
        !            74:        "OTP",
        !            75:        "GTC");
        !            76: ENUM_NEXT(eap_type_short_names, EAP_TLS, EAP_TLS, EAP_GTC,
        !            77:        "TLS");
        !            78: ENUM_NEXT(eap_type_short_names, EAP_SIM, EAP_SIM, EAP_TLS,
        !            79:        "SIM");
        !            80: ENUM_NEXT(eap_type_short_names, EAP_TTLS, EAP_TTLS, EAP_SIM,
        !            81:        "TTLS");
        !            82: ENUM_NEXT(eap_type_short_names, EAP_AKA, EAP_AKA, EAP_TTLS,
        !            83:        "AKA");
        !            84: ENUM_NEXT(eap_type_short_names, EAP_PEAP, EAP_MSCHAPV2, EAP_AKA,
        !            85:        "PEAP",
        !            86:        "MSCHAPV2");
        !            87: ENUM_NEXT(eap_type_short_names, EAP_MSTLV, EAP_MSTLV, EAP_MSCHAPV2,
        !            88:        "MSTLV");
        !            89: ENUM_NEXT(eap_type_short_names, EAP_TNC, EAP_TNC, EAP_MSTLV,
        !            90:        "TNC");
        !            91: ENUM_NEXT(eap_type_short_names, EAP_PT_EAP, EAP_PT_EAP, EAP_TNC,
        !            92:        "PT");
        !            93: ENUM_NEXT(eap_type_short_names, EAP_EXPANDED, EAP_DYNAMIC, EAP_PT_EAP,
        !            94:        "EXP",
        !            95:        "XP",
        !            96:        "RAD",
        !            97:        "DYN");
        !            98: ENUM_END(eap_type_short_names, EAP_DYNAMIC);
        !            99: 
        !           100: /*
        !           101:  * See header
        !           102:  */
        !           103: eap_type_t eap_type_from_string(char *name)
        !           104: {
        !           105:        int i;
        !           106:        static struct {
        !           107:                char *name;
        !           108:                eap_type_t type;
        !           109:        } types[] = {
        !           110:                {"identity",    EAP_IDENTITY},
        !           111:                {"md5",                 EAP_MD5},
        !           112:                {"otp",                 EAP_OTP},
        !           113:                {"gtc",                 EAP_GTC},
        !           114:                {"tls",                 EAP_TLS},
        !           115:                {"ttls",                EAP_TTLS},
        !           116:                {"sim",                 EAP_SIM},
        !           117:                {"aka",                 EAP_AKA},
        !           118:                {"peap",                EAP_PEAP},
        !           119:                {"mschapv2",    EAP_MSCHAPV2},
        !           120:                {"tnc",                 EAP_TNC},
        !           121:                {"pt",                  EAP_PT_EAP},
        !           122:                {"dynamic",             EAP_DYNAMIC},
        !           123:                {"radius",              EAP_RADIUS},
        !           124:        };
        !           125: 
        !           126:        for (i = 0; i < countof(types); i++)
        !           127:        {
        !           128:                if (strcaseeq(name, types[i].name))
        !           129:                {
        !           130:                        return types[i].type;
        !           131:                }
        !           132:        }
        !           133:        return 0;
        !           134: }
        !           135: 
        !           136: /*
        !           137:  * See header
        !           138:  */
        !           139: eap_vendor_type_t *eap_vendor_type_from_string(char *str)
        !           140: {
        !           141:        enumerator_t *enumerator;
        !           142:        eap_vendor_type_t *result = NULL;
        !           143:        eap_type_t type = 0;
        !           144:        uint32_t vendor = 0;
        !           145:        char *part, *end;
        !           146: 
        !           147:        /* parse EAP method string of the form: [eap-]type[-vendor] */
        !           148:        enumerator = enumerator_create_token(str, "-", " ");
        !           149:        while (enumerator->enumerate(enumerator, &part))
        !           150:        {
        !           151:                if (!type)
        !           152:                {
        !           153:                        if (streq(part, "eap"))
        !           154:                        {       /* skip 'eap' at the beginning */
        !           155:                                continue;
        !           156:                        }
        !           157:                        type = eap_type_from_string(part);
        !           158:                        if (!type)
        !           159:                        {
        !           160:                                errno = 0;
        !           161:                                type = strtoul(part, &end, 0);
        !           162:                                if (*end != '\0' || errno)
        !           163:                                {
        !           164:                                        DBG1(DBG_LIB, "unknown or invalid EAP method: %s", part);
        !           165:                                        break;
        !           166:                                }
        !           167:                        }
        !           168:                        continue;
        !           169:                }
        !           170:                errno = 0;
        !           171:                vendor = strtoul(part, &end, 0);
        !           172:                if (*end != '\0' || errno)
        !           173:                {
        !           174:                        DBG1(DBG_LIB, "invalid EAP vendor: %s", part);
        !           175:                        type = 0;
        !           176:                }
        !           177:                break;
        !           178:        }
        !           179:        enumerator->destroy(enumerator);
        !           180: 
        !           181:        if (type)
        !           182:        {
        !           183:                INIT(result,
        !           184:                        .type = type,
        !           185:                        .vendor = vendor,
        !           186:                );
        !           187:        }
        !           188:        return result;
        !           189: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>