Annotation of embedaddon/strongswan/src/libcharon/plugins/eap_identity/eap_identity.c, revision 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>