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>