aboutsummaryrefslogtreecommitdiffstats
path: root/src/rsn_supp
diff options
context:
space:
mode:
authorDmitry Shmidt <dimitrysh@google.com>2014-01-28 10:57:39 -0800
committerDmitry Shmidt <dimitrysh@google.com>2014-01-28 11:02:20 -0800
commitcf32e60fa7e0d33fe1551a6dba8dcbbec47ea50e (patch)
tree454f4b5c08cbd7d8cd14a732784cfbf624806965 /src/rsn_supp
parent1846323989242844f0e857458a8939fa5836429c (diff)
downloadandroid_external_wpa_supplicant_8-cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50e.tar.gz
android_external_wpa_supplicant_8-cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50e.tar.bz2
android_external_wpa_supplicant_8-cf32e60fa7e0d33fe1551a6dba8dcbbec47ea50e.zip
Cumulative patch from commit 2e988392436227c51002b573ee27a8cee37f70e9
2e98839 P2P: Disable DNS server from dnsmasq c07f261 P2P NFC: Add script for connection handover with nfcpy 12288d8 WPS NFC: Protect nfcpy pretty print calls against exceptions c209dd1 WPS NFC: nfcpy script to use new connection handover design 6202500 WPS NFC: Logging level configuration to wps-nfc.py and wps-ap-nfc.py 1f1b5b3 WPS NFC: Clean up nfcpy script no-wait operations 79ede5a WPS NFC: Validate ctrl_iface response before decoding it ab1db08 WPS NFC: Use argparse in the nfcpy scripts 6f8fa6e WPS NFC: Update wps-nfc.py and wps-ap-nfc.py to use new nfcpy API b56f6c8 P2P NFC: Add support for freq option in NFC ctrl_iface commands 91a6501 WPS NFC: Use BSSID and AP Channel from handover select 91226e0 WPS: Add testing option to corrupt public key hash 7312776 WPS NFC: add more debug prints for connection handover report 5cd4f66 WPS NFC: Use AP Channel information from credential container d2f1837 WPS NFC: Add BSSID and AP channel info to Configuration Token 75dbf98 WPS-STRICT: Update valid Device Password ID and Config Error range 5cd4740 P2P NFC: WPA state machine config with driver-based BSS selection 8e9f53c P2P NFC: Static handover with NFC Tag on client dd87677 P2P NFC: Enable own NFC Tag on GO Registrar abe44e3 P2P NFC: Add GO info into handover message when in client role 23318be P2P NFC: Optimize join-a-group operation based on NFC information 86e3208 P2P NFC: Copy DH parameters to a separate group interface d4b4d7f WPS NFC: Update DH keys for ER operations ac08752 WPS NFC: Use pubkey mismatch config error from Enrollee 59b45d1 P2P NFC: Add processing of P2P client while NFC handover case 74df9ec P2P NFC: Do not try to join peer if both devices are already GO 201b0f5 P2P: Add test option to disable IP address assignment request 25ef852 P2P: Add support for IP address assignment in 4-way handshake fdd48ff P2P NFC: Optimize GO Negotiation retries c4f87a7 P2P NFC: Add NFC tag enabling for static handover dd37a93 P2P NFC: Report handover select from tag for static handover db6ae69 P2P NFC: Report connection handover as trigger for P2P 9358878 P2P NFC: Build connection handover messages c00ab85 P2P NFC: Define WPS_NFC config method 0deab08 P2P NFC: Allow separate WPS/P2P IES to be parsed fca9958 P2P NFC: Pass OOB Dev Password through P2P parser ab9e344 P2P NFC: Pass OOB Device Password ID to P2P 5154689 P2P NFC: Add WPS attribute building for P2P NFC 01afd8d P2P NFC: Add NDEF helpers for P2P connection handover messages 9e323a2 P2P NFC: Add OOB GO Negotiation Channel attribute 14d8645 WPS NFC: Allow BSSID and channel to be included in handover select 50d1f89 NFC: Update WPS ER to use the new connection handover design d950793 WPS NFC: Add support for wpa_supplicant AP/GO mode to use handover fa4c298 WPS NFC: Process new style handover select 068cdb1 WPS NFC: New style connection handover select from AP/Registrar 3189ca0 WPS NFC: Add AP mode connection handover report 41f9ffb WPS NFC: Build new style carrier record for connection handover request 3f1639d WPS NFC: Split DH key generation to a separate function 9754917 WPS NFC: Update NFC connection handover design 34b6795 WPS NFC: Use abbreviated handshake if both PK hashes delivered OOB 57630e6 WPS: Preparations for allowing SSID filtering for provisioning step 5f45455 WPS NFC: Validate peer public key hash on Enrollee ff40cd6 WPS NFC: Send M2D with config error 20 on pkhash mismatch e435417 WPS: Remove Version attribute from NFC messages 72403ec WPS: Add builder functions for AP Channel and RF Bands attributes ea43ad9 P2P: Make group operating channel available 9f7cd9a P2P: Split add-group-info into a helper function 253f2e3 P2P: Apply unsafe frequency rules to available channels 1682c62 Add a header file defining QCA OUI and vendor extensions Change-Id: Ia7604d018e1ffb25e06bdc01ce258fc4a0569245 Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
Diffstat (limited to 'src/rsn_supp')
-rw-r--r--src/rsn_supp/wpa.c57
-rw-r--r--src/rsn_supp/wpa.h3
-rw-r--r--src/rsn_supp/wpa_i.h5
-rw-r--r--src/rsn_supp/wpa_ie.c19
-rw-r--r--src/rsn_supp/wpa_ie.h4
5 files changed, 86 insertions, 2 deletions
diff --git a/src/rsn_supp/wpa.c b/src/rsn_supp/wpa.c
index a294730d..4474c3b1 100644
--- a/src/rsn_supp/wpa.c
+++ b/src/rsn_supp/wpa.c
@@ -379,6 +379,8 @@ static void wpa_supplicant_process_1_of_4(struct wpa_sm *sm,
struct wpa_ptk *ptk;
u8 buf[8];
int res;
+ u8 *kde, *kde_buf = NULL;
+ size_t kde_len;
if (wpa_sm_get_network_ctx(sm) == NULL) {
wpa_msg(sm->ctx->msg_ctx, MSG_WARNING, "WPA: No SSID info "
@@ -435,15 +437,39 @@ static void wpa_supplicant_process_1_of_4(struct wpa_sm *sm,
os_memcpy(ptk->u.auth.rx_mic_key, buf, 8);
sm->tptk_set = 1;
+ kde = sm->assoc_wpa_ie;
+ kde_len = sm->assoc_wpa_ie_len;
+
+#ifdef CONFIG_P2P
+ if (sm->p2p) {
+ kde_buf = os_malloc(kde_len + 2 + RSN_SELECTOR_LEN + 1);
+ if (kde_buf) {
+ u8 *pos;
+ wpa_printf(MSG_DEBUG, "P2P: Add IP Address Request KDE "
+ "into EAPOL-Key 2/4");
+ os_memcpy(kde_buf, kde, kde_len);
+ kde = kde_buf;
+ pos = kde + kde_len;
+ *pos++ = WLAN_EID_VENDOR_SPECIFIC;
+ *pos++ = RSN_SELECTOR_LEN + 1;
+ RSN_SELECTOR_PUT(pos, WFA_KEY_DATA_IP_ADDR_REQ);
+ pos += RSN_SELECTOR_LEN;
+ *pos++ = 0x01;
+ kde_len = pos - kde;
+ }
+ }
+#endif /* CONFIG_P2P */
+
if (wpa_supplicant_send_2_of_4(sm, sm->bssid, key, ver, sm->snonce,
- sm->assoc_wpa_ie, sm->assoc_wpa_ie_len,
- ptk))
+ kde, kde_len, ptk))
goto failed;
+ os_free(kde_buf);
os_memcpy(sm->anonce, key->key_nonce, WPA_NONCE_LEN);
return;
failed:
+ os_free(kde_buf);
wpa_sm_deauthenticate(sm, WLAN_REASON_UNSPECIFIED);
}
@@ -1090,6 +1116,14 @@ static void wpa_supplicant_process_3_of_4(struct wpa_sm *sm,
goto failed;
}
+#ifdef CONFIG_P2P
+ if (ie.ip_addr_alloc) {
+ os_memcpy(sm->p2p_ip_addr, ie.ip_addr_alloc, 3 * 4);
+ wpa_hexdump(MSG_DEBUG, "P2P: IP address info",
+ sm->p2p_ip_addr, sizeof(sm->p2p_ip_addr));
+ }
+#endif /* CONFIG_P2P */
+
if (wpa_supplicant_send_4_of_4(sm, sm->bssid, key, ver, key_info,
NULL, 0, &sm->ptk)) {
goto failed;
@@ -2086,6 +2120,10 @@ void wpa_sm_notify_assoc(struct wpa_sm *sm, const u8 *bssid)
#ifdef CONFIG_TDLS
wpa_tdls_assoc(sm);
#endif /* CONFIG_TDLS */
+
+#ifdef CONFIG_P2P
+ os_memset(sm->p2p_ip_addr, 0, sizeof(sm->p2p_ip_addr));
+#endif /* CONFIG_P2P */
}
@@ -2209,6 +2247,7 @@ void wpa_sm_set_config(struct wpa_sm *sm, struct rsn_supp_config *config)
} else
sm->ssid_len = 0;
sm->wpa_ptk_rekey = config->wpa_ptk_rekey;
+ sm->p2p = config->p2p;
} else {
sm->network_ctx = NULL;
sm->peerkey_enabled = 0;
@@ -2218,6 +2257,7 @@ void wpa_sm_set_config(struct wpa_sm *sm, struct rsn_supp_config *config)
sm->eap_conf_ctx = NULL;
sm->ssid_len = 0;
sm->wpa_ptk_rekey = 0;
+ sm->p2p = 0;
}
}
@@ -2731,3 +2771,16 @@ int wpa_sm_rx_eapol_peerkey(struct wpa_sm *sm, const u8 *src_addr,
return 1;
}
#endif /* CONFIG_PEERKEY */
+
+
+#ifdef CONFIG_P2P
+
+int wpa_sm_get_p2p_ip_addr(struct wpa_sm *sm, u8 *buf)
+{
+ if (sm == NULL || WPA_GET_BE32(sm->p2p_ip_addr) == 0)
+ return -1;
+ os_memcpy(buf, sm->p2p_ip_addr, 3 * 4);
+ return 0;
+}
+
+#endif /* CONFIG_P2P */
diff --git a/src/rsn_supp/wpa.h b/src/rsn_supp/wpa.h
index 9884ce12..20b3f621 100644
--- a/src/rsn_supp/wpa.h
+++ b/src/rsn_supp/wpa.h
@@ -95,6 +95,7 @@ struct rsn_supp_config {
const u8 *ssid;
size_t ssid_len;
int wpa_ptk_rekey;
+ int p2p;
};
#ifndef CONFIG_NO_WPA
@@ -145,6 +146,8 @@ void wpa_sm_update_replay_ctr(struct wpa_sm *sm, const u8 *replay_ctr);
void wpa_sm_pmksa_cache_flush(struct wpa_sm *sm, void *network_ctx);
+int wpa_sm_get_p2p_ip_addr(struct wpa_sm *sm, u8 *buf);
+
#else /* CONFIG_NO_WPA */
static inline struct wpa_sm * wpa_sm_init(struct wpa_sm_ctx *ctx)
diff --git a/src/rsn_supp/wpa_i.h b/src/rsn_supp/wpa_i.h
index cad6c8d9..75cfb479 100644
--- a/src/rsn_supp/wpa_i.h
+++ b/src/rsn_supp/wpa_i.h
@@ -58,6 +58,7 @@ struct wpa_sm {
u8 ssid[32];
size_t ssid_len;
int wpa_ptk_rekey;
+ int p2p;
u8 own_addr[ETH_ALEN];
const char *ifname;
@@ -122,6 +123,10 @@ struct wpa_sm {
u8 *assoc_resp_ies; /* MDIE and FTIE from (Re)Association Response */
size_t assoc_resp_ies_len;
#endif /* CONFIG_IEEE80211R */
+
+#ifdef CONFIG_P2P
+ u8 p2p_ip_addr[3 * 4];
+#endif /* CONFIG_P2P */
};
diff --git a/src/rsn_supp/wpa_ie.c b/src/rsn_supp/wpa_ie.c
index ab8d104d..e58bdc47 100644
--- a/src/rsn_supp/wpa_ie.c
+++ b/src/rsn_supp/wpa_ie.c
@@ -345,6 +345,25 @@ static int wpa_parse_generic(const u8 *pos, const u8 *end,
}
#endif /* CONFIG_IEEE80211W */
+#ifdef CONFIG_P2P
+ if (pos[1] >= RSN_SELECTOR_LEN + 1 &&
+ RSN_SELECTOR_GET(pos + 2) == WFA_KEY_DATA_IP_ADDR_REQ) {
+ ie->ip_addr_req = pos + 2 + RSN_SELECTOR_LEN;
+ wpa_hexdump(MSG_DEBUG, "WPA: IP Address Request in EAPOL-Key",
+ ie->ip_addr_req, pos[1] - RSN_SELECTOR_LEN);
+ return 0;
+ }
+
+ if (pos[1] >= RSN_SELECTOR_LEN + 3 * 4 &&
+ RSN_SELECTOR_GET(pos + 2) == WFA_KEY_DATA_IP_ADDR_ALLOC) {
+ ie->ip_addr_alloc = pos + 2 + RSN_SELECTOR_LEN;
+ wpa_hexdump(MSG_DEBUG,
+ "WPA: IP Address Allocation in EAPOL-Key",
+ ie->ip_addr_alloc, pos[1] - RSN_SELECTOR_LEN);
+ return 0;
+ }
+#endif /* CONFIG_P2P */
+
return 0;
}
diff --git a/src/rsn_supp/wpa_ie.h b/src/rsn_supp/wpa_ie.h
index 0375767d..82b6fa3f 100644
--- a/src/rsn_supp/wpa_ie.h
+++ b/src/rsn_supp/wpa_ie.h
@@ -59,6 +59,10 @@ struct wpa_eapol_ie_parse {
size_t supp_oper_classes_len;
u8 qosinfo;
u16 aid;
+#ifdef CONFIG_P2P
+ const u8 *ip_addr_req;
+ const u8 *ip_addr_alloc;
+#endif /* CONFIG_P2P */
};
int wpa_supplicant_parse_ies(const u8 *buf, size_t len,