Lines Matching full:data
77 static void eap_pwd_state(struct eap_pwd_data *data, int state)
80 eap_pwd_state_txt(data->state), eap_pwd_state_txt(state));
81 data->state = state;
87 struct eap_pwd_data *data;
96 data = os_zalloc(sizeof(*data));
97 if (data == NULL)
100 data->group_num = sm->cfg->pwd_group;
102 data->group_num);
103 data->state = PWD_ID_Req;
105 data->id_server = (u8 *) os_strdup("server");
106 if (data->id_server)
107 data->id_server_len = os_strlen((char *) data->id_server);
109 data->password = os_malloc(sm->user->password_len);
110 if (data->password == NULL) {
113 bin_clear_free(data->id_server, data->id_server_len);
114 os_free(data);
117 data->password_len = sm->user->password_len;
118 os_memcpy(data->password, sm->user->password, data->password_len);
119 data->password_hash = sm->user->password_hash;
121 data->salt_len = sm->user->salt_len;
122 if (data->salt_len) {
123 data->salt = os_memdup(sm->user->salt, sm->user->salt_len);
124 if (!data->salt) {
127 bin_clear_free(data->id_server, data->id_server_len);
128 bin_clear_free(data->password, data->password_len);
129 os_free(data);
134 data->in_frag_pos = data->out_frag_pos = 0;
135 data->inbuf = data->outbuf = NULL;
137 data->mtu = sm->cfg->fragment_size > 0 ? sm->cfg->fragment_size : 1020;
139 return data;
145 struct eap_pwd_data *data = priv;
147 crypto_bignum_deinit(data->private_value, 1);
148 crypto_bignum_deinit(data->peer_scalar, 1);
149 crypto_bignum_deinit(data->my_scalar, 1);
150 crypto_bignum_deinit(data->k, 1);
151 crypto_ec_point_deinit(data->my_element, 1);
152 crypto_ec_point_deinit(data->peer_element, 1);
153 bin_clear_free(data->id_peer, data->id_peer_len);
154 bin_clear_free(data->id_server, data->id_server_len);
155 bin_clear_free(data->password, data->password_len);
156 bin_clear_free(data->salt, data->salt_len);
157 if (data->grp) {
158 crypto_ec_deinit(data->grp->group);
159 crypto_ec_point_deinit(data->grp->pwe, 1);
160 os_free(data->grp);
162 wpabuf_free(data->inbuf);
163 wpabuf_free(data->outbuf);
164 bin_clear_free(data, sizeof(*data));
168 static void eap_pwd_build_id_req(struct eap_sm *sm, struct eap_pwd_data *data,
175 if (data->out_frag_pos)
178 data->outbuf = wpabuf_alloc(sizeof(struct eap_pwd_id) +
179 data->id_server_len);
180 if (data->outbuf == NULL) {
181 eap_pwd_state(data, FAILURE);
185 if (os_get_random((u8 *) &data->token, sizeof(data->token)) < 0) {
186 wpabuf_free(data->outbuf);
187 data->outbuf = NULL;
188 eap_pwd_state(data, FAILURE);
193 data->password, data->password_len);
194 if (data->salt_len)
196 data->salt, data->salt_len);
202 if (data->salt_len) {
203 switch (data->password_len) {
205 data->password_prep = EAP_PWD_PREP_SSHA1;
208 data->password_prep = EAP_PWD_PREP_SSHA256;
211 data->password_prep = EAP_PWD_PREP_SSHA512;
216 (int) data->password_len);
217 eap_pwd_state(data, FAILURE);
222 data->password_prep = data->password_hash ? EAP_PWD_PREP_MS :
226 wpabuf_put_be16(data->outbuf, data->group_num);
227 wpabuf_put_u8(data->outbuf, EAP_PWD_DEFAULT_RAND_FUNC);
228 wpabuf_put_u8(data->outbuf, EAP_PWD_DEFAULT_PRF);
229 wpabuf_put_data(data->outbuf, &data->token, sizeof(data->token));
230 wpabuf_put_u8(data->outbuf, data->password_prep);
231 wpabuf_put_data(data->outbuf, data->id_server, data->id_server_len);
236 struct eap_pwd_data *data, u8 id)
247 if (data->out_frag_pos)
250 prime_len = crypto_ec_prime_len(data->grp->group);
251 order_len = crypto_ec_order_len(data->grp->group);
253 data->private_value = crypto_bignum_init();
254 data->my_element = crypto_ec_point_init(data->grp->group);
255 data->my_scalar = crypto_bignum_init();
257 if (!data->private_value || !data->my_element || !data->my_scalar ||
264 if (eap_pwd_get_rand_mask(data->grp, data->private_value, mask,
265 data->my_scalar) < 0)
268 if (crypto_ec_point_mul(data->grp->group, data->grp->pwe, mask,
269 data->my_element) < 0) {
272 eap_pwd_state(data, FAILURE);
276 if (crypto_ec_point_invert(data->grp->group, data->my_element) < 0) {
282 data->outbuf = wpabuf_alloc(2 * prime_len + order_len +
283 (data->salt ? 1 + data->salt_len : 0));
284 if (data->outbuf == NULL)
288 if (data->salt_len) {
289 wpabuf_put_u8(data->outbuf, data->salt_len);
290 wpabuf_put_data(data->outbuf, data->salt, data->salt_len);
294 element = wpabuf_put(data->outbuf, 2 * prime_len);
295 scalar = wpabuf_put(data->outbuf, order_len);
296 if (crypto_bignum_to_bin(data->my_scalar, scalar, order_len,
300 if (crypto_ec_point_to_bin(data->grp->group, data->my_element, element,
309 if (data->outbuf == NULL)
310 eap_pwd_state(data, FAILURE);
315 struct eap_pwd_data *data, u8 id)
327 if (data->out_frag_pos)
330 prime_len = crypto_ec_prime_len(data->grp->group);
331 order_len = crypto_ec_order_len(data->grp->group);
355 if (crypto_bignum_to_bin(data->k, cruft, prime_len, prime_len) < 0)
361 if (crypto_ec_point_to_bin(data->grp->group, data->my_element, cruft,
370 if (crypto_bignum_to_bin(data->my_scalar, cruft, order_len,
377 if (crypto_ec_point_to_bin(data->grp->group, data->peer_element, cruft,
386 if (crypto_bignum_to_bin(data->peer_scalar, cruft, order_len,
393 grp = htons(data->group_num);
407 os_memcpy(data->my_confirm, conf, SHA256_MAC_LEN);
409 data->outbuf = wpabuf_alloc(SHA256_MAC_LEN);
410 if (data->outbuf == NULL)
413 wpabuf_put_data(data->outbuf, conf, SHA256_MAC_LEN);
417 if (data->outbuf == NULL)
418 eap_pwd_state(data, FAILURE);
426 struct eap_pwd_data *data = priv;
436 if (data->in_frag_pos) {
441 eap_pwd_state(data, FAILURE);
444 switch (data->state) {
455 eap_pwd_state(data, FAILURE); /* just to be sure */
463 * build the data portion of a request
465 switch (data->state) {
467 eap_pwd_build_id_req(sm, data, id);
471 eap_pwd_build_commit_req(sm, data, id);
475 eap_pwd_build_confirm_req(sm, data, id);
480 data->state);
481 eap_pwd_state(data, FAILURE);
486 if (data->state == FAILURE)
490 * determine whether that data needs to be fragmented
492 len = wpabuf_len(data->outbuf) - data->out_frag_pos;
493 if ((len + EAP_PWD_HDR_SIZE) > data->mtu) {
494 len = data->mtu - EAP_PWD_HDR_SIZE;
500 if (data->out_frag_pos == 0) {
502 totlen = wpabuf_len(data->outbuf) +
513 * alloc an eap request and populate it with the data
520 eap_pwd_state(data, FAILURE);
528 buf = wpabuf_head_u8(data->outbuf);
529 wpabuf_put_data(req, buf + data->out_frag_pos, len);
530 data->out_frag_pos += len;
532 * either not fragged or last fragment, either way free up the data
534 if (data->out_frag_pos >= wpabuf_len(data->outbuf)) {
535 wpabuf_free(data->outbuf);
536 data->outbuf = NULL;
537 data->out_frag_pos = 0;
547 struct eap_pwd_data *data = priv;
560 if (data->state == PWD_ID_Req &&
564 if (data->state == PWD_Commit_Req &&
568 if (data->state == PWD_Confirm_Req &&
573 *pos, data->state);
580 struct eap_pwd_data *data,
595 if ((data->group_num != be_to_host16(id->group_num)) ||
597 (os_memcmp(id->token, (u8 *)&data->token, sizeof(data->token))) ||
599 (id->prep != data->password_prep)) {
601 eap_pwd_state(data, FAILURE);
604 if (data->id_peer || data->grp) {
605 wpa_printf(MSG_INFO, "EAP-pwd: data was already allocated");
608 data->id_peer = os_malloc(payload_len - sizeof(struct eap_pwd_id));
609 if (data->id_peer == NULL) {
613 data->id_peer_len = payload_len - sizeof(struct eap_pwd_id);
614 os_memcpy(data->id_peer, id->identity, data->id_peer_len);
616 data->id_peer, data->id_peer_len);
618 data->grp = get_eap_pwd_group(data->group_num);
619 if (data->grp == NULL) {
630 if (data->password_prep == EAP_PWD_PREP_MS) {
631 res = hash_nt_password_hash(data->password, pwhashhash);
637 password = data->password;
638 password_len = data->password_len;
641 res = compute_password_element(data->grp, data->group_num,
643 data->id_server, data->id_server_len,
644 data->id_peer, data->id_peer_len,
645 (u8 *) &data->token);
653 (int) crypto_ec_prime_len_bits(data->grp->group));
655 eap_pwd_state(data, PWD_Commit_Req);
660 eap_pwd_process_commit_resp(struct eap_sm *sm, struct eap_pwd_data *data,
670 prime_len = crypto_ec_prime_len(data->grp->group);
671 order_len = crypto_ec_order_len(data->grp->group);
681 data->k = crypto_bignum_init();
682 K = crypto_ec_point_init(data->grp->group);
683 if (!data->k || !K) {
684 wpa_printf(MSG_INFO, "EAP-PWD (server): peer data allocation "
691 data->peer_element = eap_pwd_get_element(data->grp, ptr);
692 if (!data->peer_element) {
698 data->peer_scalar = eap_pwd_get_scalar(data->grp, ptr);
699 if (!data->peer_scalar) {
700 wpa_printf(MSG_INFO, "EAP-PWD (server): peer data allocation "
706 if (crypto_bignum_cmp(data->my_scalar, data->peer_scalar) == 0 ||
707 crypto_ec_point_cmp(data->grp->group, data->my_element,
708 data->peer_element) == 0) {
715 if ((crypto_ec_point_mul(data->grp->group, data->grp->pwe,
716 data->peer_scalar, K) < 0) ||
717 (crypto_ec_point_add(data->grp->group, K, data->peer_element,
719 (crypto_ec_point_mul(data->grp->group, K, data->private_value,
732 if (crypto_ec_point_is_at_infinity(data->grp->group, K)) {
737 if (crypto_ec_point_x(data->grp->group, K, data->k)) {
748 eap_pwd_state(data, PWD_Confirm_Req);
750 eap_pwd_state(data, FAILURE);
755 eap_pwd_process_confirm_resp(struct eap_sm *sm, struct eap_pwd_data *data,
764 prime_len = crypto_ec_prime_len(data->grp->group);
765 order_len = crypto_ec_order_len(data->grp->group);
775 grp = htons(data->group_num);
799 if (crypto_bignum_to_bin(data->k, cruft, prime_len, prime_len) < 0)
805 if (crypto_ec_point_to_bin(data->grp->group, data->peer_element, cruft,
814 if (crypto_bignum_to_bin(data->peer_scalar, cruft, order_len,
821 if (crypto_ec_point_to_bin(data->grp->group, data->my_element, cruft,
830 if (crypto_bignum_to_bin(data->my_scalar, cruft, order_len,
851 if (compute_keys(data->grp, data->k,
852 data->peer_scalar, data->my_scalar, conf,
853 data->my_confirm, &cs, data->msk, data->emsk,
854 data->session_id) < 0)
855 eap_pwd_state(data, FAILURE);
857 eap_pwd_state(data, SUCCESS);
868 struct eap_pwd_data *data = priv;
887 * if we're fragmenting then this should be an ACK with no data,
890 if (data->out_frag_pos) {
915 if (data->inbuf) {
920 data->inbuf = wpabuf_alloc(tot_len);
921 if (data->inbuf == NULL) {
926 data->in_frag_pos = 0;
933 if (EAP_PWD_GET_MORE_BIT(lm_exch) || data->in_frag_pos) {
934 if (!data->inbuf) {
937 eap_pwd_state(data, FAILURE);
940 if ((data->in_frag_pos + len) > wpabuf_size(data->inbuf)) {
943 (int) data->in_frag_pos, (int) len,
944 (int) wpabuf_size(data->inbuf));
945 eap_pwd_state(data, FAILURE);
948 wpabuf_put_data(data->inbuf, pos, len);
949 data->in_frag_pos += len;
960 if (data->in_frag_pos && data->inbuf) {
961 pos = wpabuf_head_u8(data->inbuf);
962 len = data->in_frag_pos;
968 eap_pwd_process_id_resp(sm, data, pos, len);
971 eap_pwd_process_commit_resp(sm, data, pos, len);
974 eap_pwd_process_confirm_resp(sm, data, pos, len);
981 if (data->in_frag_pos) {
982 wpabuf_free(data->inbuf);
983 data->inbuf = NULL;
984 data->in_frag_pos = 0;
991 struct eap_pwd_data *data = priv;
994 if (data->state != SUCCESS)
997 key = os_memdup(data->msk, EAP_MSK_LEN);
1009 struct eap_pwd_data *data = priv;
1012 if (data->state != SUCCESS)
1015 key = os_memdup(data->emsk, EAP_EMSK_LEN);
1027 struct eap_pwd_data *data = priv;
1028 return data->state == SUCCESS;
1034 struct eap_pwd_data *data = priv;
1035 return (data->state == SUCCESS) || (data->state == FAILURE);
1041 struct eap_pwd_data *data = priv;
1044 if (data->state != SUCCESS)
1047 id = os_memdup(data->session_id, 1 + SHA256_MAC_LEN);