Lines Matching refs:data

73 static void eap_ikev2_state(struct eap_ikev2_data *data, int state)
76 eap_ikev2_state_txt(data->state),
78 data->state = state;
84 struct eap_ikev2_data *data;
86 data = os_zalloc(sizeof(*data));
87 if (data == NULL)
89 data->state = MSG;
90 data->fragment_size = sm->fragment_size > 0 ? sm->fragment_size :
92 data->ikev2.state = SA_INIT;
93 data->ikev2.peer_auth = PEER_AUTH_SECRET;
94 data->ikev2.key_pad = (u8 *) os_strdup("Key Pad for EAP-IKEv2");
95 if (data->ikev2.key_pad == NULL)
97 data->ikev2.key_pad_len = 21;
100 data->ikev2.proposal.proposal_num = 1;
101 data->ikev2.proposal.integ = AUTH_HMAC_SHA1_96;
102 data->ikev2.proposal.prf = PRF_HMAC_SHA1;
103 data->ikev2.proposal.encr = ENCR_AES_CBC;
104 data->ikev2.proposal.dh = DH_GROUP2_1024BIT_MODP;
106 data->ikev2.IDi = os_malloc(sm->server_id_len);
107 if (data->ikev2.IDi == NULL)
109 os_memcpy(data->ikev2.IDi, sm->server_id, sm->server_id_len);
110 data->ikev2.IDi_len = sm->server_id_len;
112 data->ikev2.get_shared_secret = eap_ikev2_get_shared_secret;
113 data->ikev2.cb_ctx = sm;
115 return data;
118 ikev2_initiator_deinit(&data->ikev2);
119 os_free(data);
126 struct eap_ikev2_data *data = priv;
127 wpabuf_free(data->in_buf);
128 wpabuf_free(data->out_buf);
129 ikev2_initiator_deinit(&data->ikev2);
130 bin_clear_free(data, sizeof(*data));
134 static struct wpabuf * eap_ikev2_build_msg(struct eap_ikev2_data *data, u8 id)
143 send_len = wpabuf_len(data->out_buf) - data->out_used;
144 if (1 + send_len > data->fragment_size) {
145 send_len = data->fragment_size - 1;
147 if (data->out_used == 0) {
156 if (data->keys_ready) {
161 integ = ikev2_get_integ(data->ikev2.proposal.integ);
178 wpabuf_put_be32(req, wpabuf_len(data->out_buf));
180 wpabuf_put_data(req, wpabuf_head_u8(data->out_buf) + data->out_used,
182 data->out_used += send_len;
187 ikev2_integ_hash(data->ikev2.proposal.integ,
188 data->ikev2.keys.SK_ai,
189 data->ikev2.keys.SK_integ_len,
193 if (data->out_used == wpabuf_len(data->out_buf)) {
197 wpabuf_free(data->out_buf);
198 data->out_buf = NULL;
199 data->out_used = 0;
203 (unsigned long) wpabuf_len(data->out_buf) -
204 data->out_used);
205 eap_ikev2_state(data, WAIT_FRAG_ACK);
214 struct eap_ikev2_data *data = priv;
216 switch (data->state) {
218 if (data->out_buf == NULL) {
219 data->out_buf = ikev2_initiator_build(&data->ikev2);
220 if (data->out_buf == NULL) {
225 data->out_used = 0;
229 return eap_ikev2_build_msg(data, id);
234 "buildReq", data->state);
257 static int eap_ikev2_process_icv(struct eap_ikev2_data *data,
264 data->ikev2.proposal.integ, &data->ikev2.keys, 0,
270 } else if (data->keys_ready && !frag_ack) {
280 static int eap_ikev2_process_cont(struct eap_ikev2_data *data,
284 if (len > wpabuf_tailroom(data->in_buf)) {
286 eap_ikev2_state(data, FAIL);
290 wpabuf_put_data(data->in_buf, buf, len);
293 (unsigned long) wpabuf_tailroom(data->in_buf));
299 static int eap_ikev2_process_fragment(struct eap_ikev2_data *data,
304 if (data->in_buf == NULL && !(flags & IKEV2_FLAGS_LENGTH_INCLUDED)) {
310 if (data->in_buf == NULL) {
312 data->in_buf = wpabuf_alloc(message_length);
313 if (data->in_buf == NULL) {
318 wpabuf_put_data(data->in_buf, buf, len);
322 (unsigned long) wpabuf_tailroom(data->in_buf));
329 static int eap_ikev2_server_keymat(struct eap_ikev2_data *data)
332 data->ikev2.proposal.prf, &data->ikev2.keys,
333 data->ikev2.i_nonce, data->ikev2.i_nonce_len,
334 data->ikev2.r_nonce, data->ikev2.r_nonce_len,
335 data->keymat) < 0) {
340 data->keymat_ok = 1;
348 struct eap_ikev2_data *data = priv;
369 if (eap_ikev2_process_icv(data, respData, flags, pos, &end,
370 data->state == WAIT_FRAG_ACK && len == 0) < 0)
372 eap_ikev2_state(data, FAIL);
379 eap_ikev2_state(data, FAIL);
389 eap_ikev2_state(data, FAIL);
396 if (data->state == WAIT_FRAG_ACK) {
400 eap_ikev2_state(data, FAIL);
404 eap_ikev2_state(data, MSG);
408 if (data->in_buf && eap_ikev2_process_cont(data, pos, end - pos) < 0) {
409 eap_ikev2_state(data, FAIL);
414 if (eap_ikev2_process_fragment(data, flags, message_length,
416 eap_ikev2_state(data, FAIL);
418 eap_ikev2_state(data, FRAG_ACK);
420 } else if (data->state == FRAG_ACK) {
422 data->state = MSG;
425 if (data->in_buf == NULL) {
428 data->in_buf = &tmpbuf;
431 if (ikev2_initiator_process(&data->ikev2, data->in_buf) < 0) {
432 if (data->in_buf == &tmpbuf)
433 data->in_buf = NULL;
434 eap_ikev2_state(data, FAIL);
438 switch (data->ikev2.state) {
442 data->keys_ready = 1;
445 if (data->state == FAIL)
449 if (eap_ikev2_server_keymat(data))
451 eap_ikev2_state(data, DONE);
457 if (data->in_buf != &tmpbuf)
458 wpabuf_free(data->in_buf);
459 data->in_buf = NULL;
465 struct eap_ikev2_data *data = priv;
466 return data->state == DONE || data->state == FAIL;
472 struct eap_ikev2_data *data = priv;
473 return data->state == DONE && data->ikev2.state == IKEV2_DONE &&
474 data->keymat_ok;
480 struct eap_ikev2_data *data = priv;
483 if (data->state != DONE || !data->keymat_ok)
488 os_memcpy(key, data->keymat, EAP_MSK_LEN);
498 struct eap_ikev2_data *data = priv;
501 if (data->state != DONE || !data->keymat_ok)
506 os_memcpy(key, data->keymat + EAP_MSK_LEN, EAP_EMSK_LEN);