Annotation of embedaddon/strongswan/src/libcharon/plugins/eap_identity/eap_identity.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2007-2008 Martin Willi
                      3:  * HSR Hochschule fuer Technik Rapperswil
                      4:  *
                      5:  * This program is free software; you can redistribute it and/or modify it
                      6:  * under the terms of the GNU General Public License as published by the
                      7:  * Free Software Foundation; either version 2 of the License, or (at your
                      8:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                      9:  *
                     10:  * This program is distributed in the hope that it will be useful, but
                     11:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     12:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     13:  * for more details.
                     14:  */
                     15: 
                     16: #include "eap_identity.h"
                     17: 
                     18: #include <daemon.h>
                     19: #include <library.h>
                     20: 
                     21: typedef struct private_eap_identity_t private_eap_identity_t;
                     22: 
                     23: /**
                     24:  * Private data of an eap_identity_t object.
                     25:  */
                     26: struct private_eap_identity_t {
                     27: 
                     28:        /**
                     29:         * Public authenticator_t interface.
                     30:         */
                     31:        eap_identity_t public;
                     32: 
                     33:        /**
                     34:         * ID of the peer
                     35:         */
                     36:        identification_t *peer;
                     37: 
                     38:        /**
                     39:         * received identity chunk
                     40:         */
                     41:        chunk_t identity;
                     42: 
                     43:        /**
                     44:         * EAP identifier
                     45:         */
                     46:        uint8_t identifier;
                     47: };
                     48: 
                     49: typedef struct eap_identity_header_t eap_identity_header_t;
                     50: 
                     51: /**
                     52:  * packed EAP Identity header struct
                     53:  */
                     54: struct eap_identity_header_t {
                     55:        /** EAP code (REQUEST/RESPONSE) */
                     56:        uint8_t code;
                     57:        /** unique message identifier */
                     58:        uint8_t identifier;
                     59:        /** length of whole message */
                     60:        uint16_t length;
                     61:        /** EAP type */
                     62:        uint8_t type;
                     63:        /** identity data */
                     64:        uint8_t data[];
                     65: } __attribute__((__packed__));
                     66: 
                     67: METHOD(eap_method_t, process_peer, status_t,
                     68:        private_eap_identity_t *this, eap_payload_t *in, eap_payload_t **out)
                     69: {
                     70:        chunk_t id;
                     71:        eap_identity_header_t *hdr;
                     72:        size_t len;
                     73: 
                     74:        id = this->peer->get_encoding(this->peer);
                     75:        len = sizeof(eap_identity_header_t) + id.len;
                     76:        if (in)
                     77:        {
                     78:                this->identifier = in->get_identifier(in);
                     79:        }
                     80:        hdr = alloca(len);
                     81:        hdr->code = EAP_RESPONSE;
                     82:        hdr->identifier = this->identifier;
                     83:        hdr->length = htons(len);
                     84:        hdr->type = EAP_IDENTITY;
                     85:        memcpy(hdr->data, id.ptr, id.len);
                     86: 
                     87:        *out = eap_payload_create_data(chunk_create((u_char*)hdr, len));
                     88:        return SUCCESS;
                     89: }
                     90: 
                     91: METHOD(eap_method_t, initiate_peer, status_t,
                     92:        private_eap_identity_t *this, eap_payload_t **out)
                     93: {
                     94:        /* peer never initiates */
                     95:        return FAILED;
                     96: }
                     97: 
                     98: METHOD(eap_method_t, process_server, status_t,
                     99:        private_eap_identity_t *this, eap_payload_t *in, eap_payload_t **out)
                    100: {
                    101:        chunk_t data;
                    102: 
                    103:        data = chunk_skip(in->get_data(in), 5);
                    104:        if (data.len)
                    105:        {
                    106:                this->identity = chunk_clone(data);
                    107:        }
                    108:        return SUCCESS;
                    109: }
                    110: 
                    111: METHOD(eap_method_t, initiate_server, status_t,
                    112:        private_eap_identity_t *this, eap_payload_t **out)
                    113: {
                    114:        eap_identity_header_t hdr;
                    115: 
                    116:        hdr.code = EAP_REQUEST;
                    117:        hdr.identifier = this->identifier;
                    118:        hdr.length = htons(sizeof(eap_identity_header_t));
                    119:        hdr.type = EAP_IDENTITY;
                    120: 
                    121:        *out = eap_payload_create_data(chunk_create((u_char*)&hdr,
                    122:                                                                                                sizeof(eap_identity_header_t)));
                    123:        return NEED_MORE;
                    124: }
                    125: 
                    126: METHOD(eap_method_t, get_type, eap_type_t,
                    127:        private_eap_identity_t *this, uint32_t *vendor)
                    128: {
                    129:        *vendor = 0;
                    130:        return EAP_IDENTITY;
                    131: }
                    132: 
                    133: METHOD(eap_method_t, get_msk, status_t,
                    134:        private_eap_identity_t *this, chunk_t *msk)
                    135: {
                    136:        if (this->identity.ptr)
                    137:        {
                    138:                *msk = this->identity;
                    139:                return SUCCESS;
                    140:        }
                    141:        return FAILED;
                    142: }
                    143: 
                    144: METHOD(eap_method_t, get_identifier, uint8_t,
                    145:        private_eap_identity_t *this)
                    146: {
                    147:        return this->identifier;
                    148: }
                    149: 
                    150: METHOD(eap_method_t, set_identifier, void,
                    151:        private_eap_identity_t *this, uint8_t identifier)
                    152: {
                    153:        this->identifier = identifier;
                    154: }
                    155: 
                    156: METHOD(eap_method_t, is_mutual, bool,
                    157:        private_eap_identity_t *this)
                    158: {
                    159:        return FALSE;
                    160: }
                    161: 
                    162: METHOD(eap_method_t, destroy, void,
                    163:        private_eap_identity_t *this)
                    164: {
                    165:        this->peer->destroy(this->peer);
                    166:        free(this->identity.ptr);
                    167:        free(this);
                    168: }
                    169: 
                    170: /*
                    171:  * Described in header.
                    172:  */
                    173: eap_identity_t *eap_identity_create_peer(identification_t *server,
                    174:                                                                                 identification_t *peer)
                    175: {
                    176:        private_eap_identity_t *this;
                    177: 
                    178:        INIT(this,
                    179:                .public =  {
                    180:                        .eap_method = {
                    181:                                .initiate = _initiate_peer,
                    182:                                .process = _process_peer,
                    183:                                .get_type = _get_type,
                    184:                                .is_mutual = _is_mutual,
                    185:                                .get_msk = _get_msk,
                    186:                                .get_identifier = _get_identifier,
                    187:                                .set_identifier = _set_identifier,
                    188:                                .destroy = _destroy,
                    189:                        },
                    190:                },
                    191:                .peer = peer->clone(peer),
                    192:                .identity = chunk_empty,
                    193:        );
                    194: 
                    195:        return &this->public;
                    196: }
                    197: 
                    198: /*
                    199:  * Described in header.
                    200:  */
                    201: eap_identity_t *eap_identity_create_server(identification_t *server,
                    202:                                                                                   identification_t *peer)
                    203: {
                    204:        private_eap_identity_t *this;
                    205: 
                    206:        INIT(this,
                    207:                .public = {
                    208:                        .eap_method = {
                    209:                                .initiate = _initiate_server,
                    210:                                .process = _process_server,
                    211:                                .get_type = _get_type,
                    212:                                .is_mutual = _is_mutual,
                    213:                                .get_msk = _get_msk,
                    214:                                .get_identifier = _get_identifier,
                    215:                                .set_identifier = _set_identifier,
                    216:                                .destroy = _destroy,
                    217:                        },
                    218:                },
                    219:                .peer = peer->clone(peer),
                    220:                .identity = chunk_empty,
                    221:        );
                    222: 
                    223:        return &this->public;
                    224: }
                    225: 

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