Home | History | Annotate | Download | only in rsn_supp

Lines Matching refs:peerkey

2  * WPA Supplicant - PeerKey for Direct Link Setup (DLS)
27 #include "peerkey.h"
53 struct wpa_peerkey *peerkey = timeout_ctx;
60 struct wpa_peerkey *peerkey)
62 eloop_cancel_timeout(wpa_supplicant_smk_timeout, sm, peerkey);
63 os_free(peerkey);
130 int ver, struct wpa_peerkey *peerkey)
139 kde_len = peerkey->rsnie_p_len +
157 os_memcpy(reply->key_nonce, peerkey->pnonce, WPA_NONCE_LEN);
163 pos = wpa_add_ie(pos, peerkey->rsnie_p, peerkey->rsnie_p_len);
166 pos = wpa_add_kde(pos, RSN_KEY_DATA_MAC_ADDR, peerkey->addr, ETH_ALEN);
169 wpa_add_kde(pos, RSN_KEY_DATA_NONCE, peerkey->inonce, WPA_NONCE_LEN);
183 struct wpa_peerkey *peerkey;
227 wpa_printf(MSG_DEBUG, "RSN: Using CCMP for PeerKey");
230 wpa_printf(MSG_DEBUG, "RSN: Using TKIP for PeerKey");
243 peerkey = os_zalloc(sizeof(*peerkey));
244 if (peerkey == NULL)
246 os_memcpy(peerkey->addr, kde.mac_addr, ETH_ALEN);
247 os_memcpy(peerkey->inonce, key->key_nonce, WPA_NONCE_LEN);
248 os_memcpy(peerkey->rsnie_i, kde.rsn_ie, kde.rsn_ie_len);
249 peerkey->rsnie_i_len = kde.rsn_ie_len;
250 peerkey->cipher = cipher;
254 peerkey->use_sha256 = 1;
257 if (os_get_random(peerkey->pnonce, WPA_NONCE_LEN)) {
260 wpa_supplicant_peerkey_free(sm, peerkey);
264 hdr = (struct rsn_ie_hdr *) peerkey->rsnie_p;
281 hdr->len = (pos - peerkey->rsnie_p) - 2;
282 peerkey->rsnie_p_len = pos - peerkey->rsnie_p;
284 peerkey->rsnie_p, peerkey->rsnie_p_len);
286 wpa_supplicant_send_smk_m3(sm, src_addr, key, ver, peerkey);
288 peerkey->next = sm->peerkey;
289 sm->peerkey = peerkey;
334 struct wpa_peerkey *peerkey)
352 if (peerkey->cipher == WPA_CIPHER_CCMP)
360 if (peerkey->cipher == WPA_CIPHER_CCMP)
365 os_memcpy(msg->replay_counter, peerkey->replay_counter,
367 inc_byte_array(peerkey->replay_counter, WPA_REPLAY_COUNTER_LEN);
371 peerkey->smkid, PMKID_LEN);
373 if (os_get_random(peerkey->inonce, WPA_NONCE_LEN)) {
380 peerkey->inonce, WPA_NONCE_LEN);
381 os_memcpy(msg->key_nonce, peerkey->inonce, WPA_NONCE_LEN);
384 MAC2STR(peerkey->addr));
385 wpa_eapol_key_send(sm, NULL, ver, peerkey->addr, ETH_P_EAPOL,
391 struct wpa_peerkey *peerkey)
400 kde_len = peerkey->rsnie_i_len +
411 if (peerkey->cipher == WPA_CIPHER_CCMP)
420 if (peerkey->cipher == WPA_CIPHER_CCMP)
425 os_memcpy(msg->replay_counter, peerkey->replay_counter,
427 inc_byte_array(peerkey->replay_counter, WPA_REPLAY_COUNTER_LEN);
431 pos = wpa_add_ie(pos, peerkey->rsnie_i, peerkey->rsnie_i_len);
432 lifetime = host_to_be32(peerkey->lifetime);
436 os_memcpy(msg->key_nonce, peerkey->inonce, WPA_NONCE_LEN);
439 MAC2STR(peerkey->addr));
440 wpa_eapol_key_send(sm, peerkey->stk.kck, ver, peerkey->addr,
445 static int wpa_supplicant_process_smk_m4(struct wpa_peerkey *peerkey,
451 if (os_memcmp(kde->smk + PMK_LEN, peerkey->pnonce, WPA_NONCE_LEN) != 0)
458 if (os_memcmp(kde->nonce, peerkey->inonce, WPA_NONCE_LEN) != 0) {
472 struct wpa_peerkey *peerkey,
487 if (os_memcmp(key->key_nonce, peerkey->inonce, WPA_NONCE_LEN) != 0) {
493 if (os_memcmp(kde->smk + PMK_LEN, peerkey->inonce, WPA_NONCE_LEN) != 0)
500 os_memcpy(peerkey->rsnie_p, kde->rsn_ie, kde->rsn_ie_len);
501 peerkey->rsnie_p_len = kde->rsn_ie_len;
502 os_memcpy(peerkey->pnonce, kde->nonce, WPA_NONCE_LEN);
506 wpa_printf(MSG_DEBUG, "RSN: Using CCMP for PeerKey");
507 peerkey->cipher = WPA_CIPHER_CCMP;
509 wpa_printf(MSG_DEBUG, "RSN: Using TKIP for PeerKey");
510 peerkey->cipher = WPA_CIPHER_TKIP;
529 struct wpa_peerkey *peerkey;
555 for (peerkey = sm->peerkey; peerkey; peerkey = peerkey->next) {
556 if (os_memcmp(peerkey->addr, kde.mac_addr, ETH_ALEN) == 0 &&
557 os_memcmp(peerkey->initiator ? peerkey->inonce :
558 peerkey->pnonce,
562 if (peerkey == NULL) {
569 if (peerkey->initiator) {
571 peerkey, &kde) < 0)
574 if (wpa_supplicant_process_smk_m4(peerkey, &kde) < 0)
578 os_memcpy(peerkey->smk, kde.smk, PMK_LEN);
579 peerkey
580 wpa_hexdump_key(MSG_DEBUG, "RSN: SMK", peerkey->smk, PMK_LEN);
585 peerkey->lifetime = lifetime;
587 peerkey->expiration = now.sec + lifetime;
589 sm, peerkey);
591 if (peerkey->initiator) {
592 rsn_smkid(peerkey->smk, peerkey->pnonce, peerkey->addr,
593 peerkey->inonce, sm->own_addr, peerkey->smkid,
594 peerkey->use_sha256);
595 wpa_supplicant_send_stk_1_of_4(sm, peerkey);
597 rsn_smkid(peerkey->smk, peerkey->pnonce, sm->own_addr,
598 peerkey->inonce, peerkey->addr, peerkey->smkid,
599 peerkey->use_sha256);
601 wpa_hexdump(MSG_DEBUG, "RSN: SMKID", peerkey->smkid, PMKID_LEN);
648 struct wpa_peerkey *peerkey;
650 for (peerkey = sm->peerkey; peerkey; peerkey = peerkey->next) {
651 if (os_memcmp(peerkey->addr, kde.mac_addr, ETH_ALEN) ==
655 if (peerkey == NULL) {
668 struct wpa_peerkey *peerkey,
680 MACSTR " (ver=%d)", MAC2STR(peerkey->addr), ver);
692 if (os_memcmp(ie.pmkid, peerkey->smkid, PMKID_LEN) != 0) {
698 if (os_get_random(peerkey->pnonce, WPA_NONCE_LEN)) {
704 peerkey->pnonce, WPA_NONCE_LEN);
708 stk = &peerkey->tstk;
709 wpa_pmk_to_ptk(peerkey->smk, PMK_LEN, "Peer key expansion",
710 sm->own_addr, peerkey->addr,
711 peerkey->pnonce, key->key_nonce,
713 peerkey->use_sha256);
718 peerkey->tstk_set = 1;
720 kde_buf_len = peerkey->rsnie_p_len +
727 pos = wpa_add_ie(pos, peerkey->rsnie_p, peerkey->rsnie_p_len);
728 lifetime = host_to_be32(peerkey->lifetime);
731 wpa_add_kde(pos, RSN_KEY_DATA_PMKID, peerkey->smkid, PMKID_LEN);
733 if (wpa_supplicant_send_2_of_4(sm, peerkey->addr, key, ver,
734 peerkey->pnonce, kde_buf, kde_buf_len,
741 os_memcpy(peerkey->inonce, key->key_nonce, WPA_NONCE_LEN);
746 struct wpa_peerkey *peerkey,
757 if (lifetime >= peerkey->lifetime) {
760 "seconds - ignored", lifetime, peerkey->lifetime);
766 lifetime, peerkey->lifetime);
767 peerkey->lifetime = lifetime;
770 peerkey->expiration = now.sec + lifetime;
771 eloop_cancel_timeout(wpa_supplicant_smk_timeout, sm, peerkey);
773 sm, peerkey);
778 struct wpa_peerkey *peerkey,
787 MACSTR " (ver=%d)", MAC2STR(peerkey->addr), ver);
802 if (os_memcmp(kde.pmkid, peerkey->smkid, PMKID_LEN) != 0) {
808 if (kde.rsn_ie_len != peerkey->rsnie_p_len ||
809 os_memcmp(kde.rsn_ie, peerkey->rsnie_p, kde.rsn_ie_len) != 0) {
813 peerkey->rsnie_p, peerkey->rsnie_p_len);
819 wpa_supplicant_update_smk_lifetime(sm, peerkey, &kde);
821 wpa_supplicant_send_stk_3_of_4(sm, peerkey);
822 os_memcpy(peerkey->pnonce, key->key_nonce, WPA_NONCE_LEN);
827 struct wpa_peerkey *peerkey,
838 MACSTR " (ver=%d)", MAC2STR(peerkey->addr), ver);
853 if (kde.rsn_ie_len != peerkey->rsnie_i_len ||
854 os_memcmp(kde.rsn_ie, peerkey->rsnie_i, kde.rsn_ie_len) != 0) {
859 peerkey->rsnie_i, peerkey->rsnie_i_len);
866 if (os_memcmp(peerkey->inonce, key->key_nonce, WPA_NONCE_LEN) != 0) {
870 MAC2STR(peerkey->addr));
874 wpa_supplicant_update_smk_lifetime(sm, peerkey, &kde);
876 if (wpa_supplicant_send_4_of_4(sm, peerkey->addr, key, ver,
878 NULL, 0, &peerkey->stk))
881 _key = (u8 *) peerkey->stk.tk1;
882 if (peerkey->cipher == WPA_CIPHER_TKIP) {
885 os_memcpy(key_buf + 16, peerkey->stk.u.auth.rx_mic_key, 8);
886 os_memcpy(key_buf + 24, peerkey->stk.u.auth.tx_mic_key, 8);
893 if (wpa_sm_set_key(sm, peerkey->cipher, peerkey->addr, 0, 1,
903 struct wpa_peerkey *peerkey,
910 MACSTR " (ver=%d)", MAC2STR(peerkey->addr), ver);
913 if (wpa_sm_set_key(sm, peerkey->cipher, peerkey->addr, 0, 1,
914 rsc, sizeof(rsc), (u8 *) peerkey->stk.tk1,
915 peerkey->cipher == WPA_CIPHER_TKIP ? 32 : 16) < 0) {
924 * peerkey_verify_eapol_key_mic - Verify PeerKey MIC
926 * @peerkey: Pointer to the PeerKey data for the peer
934 struct wpa_peerkey *peerkey,
941 if (peerkey->initiator && !peerkey->stk_set) {
942 wpa_pmk_to_ptk(peerkey->smk, PMK_LEN, "Peer key expansion",
943 sm->own_addr, peerkey->addr,
944 peerkey->inonce, key->key_nonce,
945 (u8 *) &peerkey->stk, sizeof(peerkey->stk),
946 peerkey->use_sha256);
947 peerkey->stk_set = 1;
951 if (peerkey->tstk_set) {
953 wpa_eapol_key_mic(peerkey->tstk.kck, ver, buf, len,
960 peerkey->tstk_set = 0;
961 peerkey->stk_set = 1;
962 os_memcpy(&peerkey->stk, &peerkey->tstk,
963 sizeof(peerkey->stk));
967 if (!ok && peerkey->stk_set) {
969 wpa_eapol_key_mic(peerkey->stk.kck, ver, buf, len,
985 os_memcpy(peerkey->replay_counter, key->replay_counter,
987 peerkey->replay_counter_set = 1;
1009 struct wpa_peerkey *peerkey;
1035 peerkey = os_zalloc(sizeof(*peerkey));
1036 if (peerkey == NULL)
1038 peerkey->initiator = 1;
1039 os_memcpy(peerkey->addr, peer, ETH_ALEN);
1042 peerkey->use_sha256 = 1;
1050 hdr = (struct rsn_ie_hdr *) peerkey->rsnie_i;
1074 hdr->len = (pos - peerkey->rsnie_i) - 2;
1075 peerkey->rsnie_i_len = pos - peerkey->rsnie_i;
1077 peerkey->rsnie_i, peerkey->rsnie_i_len);
1079 kde_len = peerkey->rsnie_i_len + 2 + RSN_SELECTOR_LEN + ETH_ALEN;
1085 wpa_supplicant_peerkey_free(sm, peerkey);
1098 if (os_get_random(peerkey->inonce, WPA_NONCE_LEN)) {
1102 wpa_supplicant_peerkey_free(sm, peerkey);
1105 os_memcpy(req->key_nonce, peerkey->inonce, WPA_NONCE_LEN);
1113 pos = wpa_add_ie(pos, peerkey->rsnie_i, peerkey->rsnie_i_len);
1122 peerkey->next = sm->peerkey;
1123 sm->peerkey = peerkey;
1130 * peerkey_deinit - Free PeerKey values
1135 struct wpa_peerkey *prev, *peerkey = sm->peerkey;
1136 while (peerkey) {
1137 prev = peerkey;
1138 peerkey = peerkey->next;
1144 void peerkey_rx_eapol_4way(struct wpa_sm *sm, struct wpa_peerkey *peerkey,
1150 wpa_supplicant_process_stk_3_of_4(sm, peerkey, key, ver);
1153 wpa_supplicant_process_stk_1_of_4(sm, peerkey, key, ver);
1156 wpa_supplicant_process_stk_4_of_4(sm, peerkey, key, ver);
1159 wpa_supplicant_process_stk_2_of_4(sm, peerkey, key, ver);