2 * Copyright (C) 2007-2008 Martin Willi
4 * Copyright (C) secunet Security Networks AG
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>.
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
17 #include "eap_identity.h"
22 typedef struct private_eap_identity_t private_eap_identity_t
;
25 * Private data of an eap_identity_t object.
27 struct private_eap_identity_t
{
30 * Public authenticator_t interface.
32 eap_identity_t
public;
37 identification_t
*peer
;
40 * received identity chunk
50 typedef struct eap_identity_header_t eap_identity_header_t
;
53 * packed EAP Identity header struct
55 struct eap_identity_header_t
{
56 /** EAP code (REQUEST/RESPONSE) */
58 /** unique message identifier */
60 /** length of whole message */
66 } __attribute__((__packed__
));
68 METHOD(eap_method_t
, process_peer
, status_t
,
69 private_eap_identity_t
*this, eap_payload_t
*in
, eap_payload_t
**out
)
72 eap_identity_header_t
*hdr
;
75 id
= this->peer
->get_encoding(this->peer
);
76 len
= sizeof(eap_identity_header_t
) + id
.len
;
79 this->identifier
= in
->get_identifier(in
);
82 hdr
->code
= EAP_RESPONSE
;
83 hdr
->identifier
= this->identifier
;
84 hdr
->length
= htons(len
);
85 hdr
->type
= EAP_IDENTITY
;
86 memcpy(hdr
->data
, id
.ptr
, id
.len
);
88 *out
= eap_payload_create_data(chunk_create((u_char
*)hdr
, len
));
92 METHOD(eap_method_t
, initiate_peer
, status_t
,
93 private_eap_identity_t
*this, eap_payload_t
**out
)
95 /* peer never initiates */
99 METHOD(eap_method_t
, process_server
, status_t
,
100 private_eap_identity_t
*this, eap_payload_t
*in
, eap_payload_t
**out
)
104 data
= chunk_skip(in
->get_data(in
), 5);
107 this->identity
= chunk_clone(data
);
112 METHOD(eap_method_t
, initiate_server
, status_t
,
113 private_eap_identity_t
*this, eap_payload_t
**out
)
115 eap_identity_header_t hdr
;
117 hdr
.code
= EAP_REQUEST
;
118 hdr
.identifier
= this->identifier
;
119 hdr
.length
= htons(sizeof(eap_identity_header_t
));
120 hdr
.type
= EAP_IDENTITY
;
122 *out
= eap_payload_create_data(chunk_create((u_char
*)&hdr
,
123 sizeof(eap_identity_header_t
)));
127 METHOD(eap_method_t
, get_type
, eap_type_t
,
128 private_eap_identity_t
*this, uint32_t *vendor
)
134 METHOD(eap_method_t
, get_msk
, status_t
,
135 private_eap_identity_t
*this, chunk_t
*msk
)
137 if (this->identity
.ptr
)
139 *msk
= this->identity
;
145 METHOD(eap_method_t
, get_identifier
, uint8_t,
146 private_eap_identity_t
*this)
148 return this->identifier
;
151 METHOD(eap_method_t
, set_identifier
, void,
152 private_eap_identity_t
*this, uint8_t identifier
)
154 this->identifier
= identifier
;
157 METHOD(eap_method_t
, is_mutual
, bool,
158 private_eap_identity_t
*this)
163 METHOD(eap_method_t
, destroy
, void,
164 private_eap_identity_t
*this)
166 this->peer
->destroy(this->peer
);
167 free(this->identity
.ptr
);
172 * Described in header.
174 eap_identity_t
*eap_identity_create_peer(identification_t
*server
,
175 identification_t
*peer
)
177 private_eap_identity_t
*this;
182 .initiate
= _initiate_peer
,
183 .process
= _process_peer
,
184 .get_type
= _get_type
,
185 .is_mutual
= _is_mutual
,
187 .get_identifier
= _get_identifier
,
188 .set_identifier
= _set_identifier
,
192 .peer
= peer
->clone(peer
),
193 .identity
= chunk_empty
,
196 return &this->public;
200 * Described in header.
202 eap_identity_t
*eap_identity_create_server(identification_t
*server
,
203 identification_t
*peer
)
205 private_eap_identity_t
*this;
210 .initiate
= _initiate_server
,
211 .process
= _process_server
,
212 .get_type
= _get_type
,
213 .is_mutual
= _is_mutual
,
215 .get_identifier
= _get_identifier
,
216 .set_identifier
= _set_identifier
,
220 .peer
= peer
->clone(peer
),
221 .identity
= chunk_empty
,
224 return &this->public;