18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * WPA Supplicant - test code for pre-authentication 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2003-2007, Jouni Malinen <j@w1.fi> 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license. 6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details. 78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * IEEE 802.1X Supplicant test code (to be used in place of wpa_supplicant.c. 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Not used in production version. 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "includes.h" 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <assert.h> 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common.h" 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "config.h" 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "eapol_supp/eapol_supp_sm.h" 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "eloop.h" 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "rsn_supp/wpa.h" 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "eap_peer/eap.h" 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "wpa_supplicant_i.h" 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "l2_packet/l2_packet.h" 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ctrl_iface.h" 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "pcsc_funcs.h" 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "rsn_supp/preauth.h" 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "rsn_supp/pmksa_cache.h" 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "drivers/driver.h" 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtextern int wpa_debug_level; 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtextern int wpa_debug_show_keys; 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpa_driver_ops *wpa_drivers[] = { NULL }; 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct preauth_test_data { 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int auth_timed_out; 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void _wpa_supplicant_deauthenticate(void *wpa_s, int reason_code) 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_deauthenticate(wpa_s, reason_code); 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic u8 * wpa_alloc_eapol(const struct wpa_supplicant *wpa_s, u8 type, 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const void *data, u16 data_len, 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t *msg_len, void **data_pos) 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct ieee802_1x_hdr *hdr; 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *msg_len = sizeof(*hdr) + data_len; 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hdr = os_malloc(*msg_len); 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hdr == NULL) 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hdr->version = wpa_s->conf->eapol_version; 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hdr->type = type; 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hdr->length = htons(data_len); 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (data) 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(hdr + 1, data, data_len); 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(hdr + 1, 0, data_len); 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (data_pos) 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *data_pos = hdr + 1; 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return (u8 *) hdr; 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic u8 * _wpa_alloc_eapol(void *wpa_s, u8 type, 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const void *data, u16 data_len, 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t *msg_len, void **data_pos) 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_alloc_eapol(wpa_s, type, data, data_len, msg_len, data_pos); 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void _wpa_supplicant_set_state(void *ctx, enum wpa_states state) 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->wpa_state = state; 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic enum wpa_states _wpa_supplicant_get_state(void *ctx) 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_s->wpa_state; 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_ether_send(void *wpa_s, const u8 *dest, u16 proto, 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *buf, size_t len) 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s - not implemented\n", __func__); 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void * wpa_supplicant_get_network_ctx(void *wpa_s) 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_supplicant_get_ssid(wpa_s); 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void _wpa_supplicant_cancel_auth_timeout(void *wpa_s) 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_cancel_auth_timeout(wpa_s); 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_supplicant_get_beacon_ie(void *wpa_s) 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s - not implemented\n", __func__); 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_supplicant_get_bssid(void *wpa_s, u8 *bssid) 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s - not implemented\n", __func__); 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_supplicant_set_key(void *wpa_s, enum wpa_alg alg, 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *addr, int key_idx, int set_tx, 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *seq, size_t seq_len, 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *key, size_t key_len) 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s - not implemented\n", __func__); 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_supplicant_mlme_setprotection(void *wpa_s, const u8 *addr, 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int protection_type, 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int key_type) 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s - not implemented\n", __func__); 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_supplicant_add_pmkid(void *wpa_s, 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *bssid, const u8 *pmkid) 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s - not implemented\n", __func__); 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_supplicant_remove_pmkid(void *wpa_s, 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *bssid, const u8 *pmkid) 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s - not implemented\n", __func__); 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_supplicant_set_config_blob(void *ctx, 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_config_blob *blob) 1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_set_blob(wpa_s->conf, blob); 1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const struct wpa_config_blob * 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtwpa_supplicant_get_config_blob(void *ctx, const char *name) 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = ctx; 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_config_get_blob(wpa_s->conf, name); 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void test_eapol_clean(struct wpa_supplicant *wpa_s) 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt rsn_preauth_deinit(wpa_s->wpa); 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pmksa_candidate_free(wpa_s->wpa); 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_sm_deinit(wpa_s->wpa); 1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt scard_deinit(wpa_s->scard); 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s->ctrl_iface) { 1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface); 1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->ctrl_iface = NULL; 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_free(wpa_s->conf); 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void eapol_test_timeout(void *eloop_ctx, void *timeout_ctx) 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct preauth_test_data *p = eloop_ctx; 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("EAPOL test timed out\n"); 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p->auth_timed_out = 1; 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_terminate(); 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void eapol_test_poll(void *eloop_ctx, void *timeout_ctx) 2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = eloop_ctx; 2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!rsn_preauth_in_progress(wpa_s->wpa)) 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_terminate(); 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else { 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_register_timeout(0, 100000, eapol_test_poll, eloop_ctx, 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt timeout_ctx); 2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_driver_ops dummy_driver; 2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_init_conf(struct wpa_supplicant *wpa_s, const char *ifname) 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct l2_packet_data *l2; 2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_sm_ctx *ctx; 2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&dummy_driver, 0, sizeof(dummy_driver)); 2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->driver = &dummy_driver; 2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctx = os_zalloc(sizeof(*ctx)); 2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt assert(ctx != NULL); 2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctx->ctx = wpa_s; 2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctx->msg_ctx = wpa_s; 2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctx->set_state = _wpa_supplicant_set_state; 2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctx->get_state = _wpa_supplicant_get_state; 2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctx->deauthenticate = _wpa_supplicant_deauthenticate; 2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctx->set_key = wpa_supplicant_set_key; 2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctx->get_network_ctx = wpa_supplicant_get_network_ctx; 2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctx->get_bssid = wpa_supplicant_get_bssid; 2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctx->ether_send = wpa_ether_send; 2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctx->get_beacon_ie = wpa_supplicant_get_beacon_ie; 2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctx->alloc_eapol = _wpa_alloc_eapol; 2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctx->cancel_auth_timeout = _wpa_supplicant_cancel_auth_timeout; 2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctx->add_pmkid = wpa_supplicant_add_pmkid; 2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctx->remove_pmkid = wpa_supplicant_remove_pmkid; 2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctx->set_config_blob = wpa_supplicant_set_config_blob; 2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctx->get_config_blob = wpa_supplicant_get_config_blob; 2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctx->mlme_setprotection = wpa_supplicant_mlme_setprotection; 2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->wpa = wpa_sm_init(ctx); 2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt assert(wpa_s->wpa != NULL); 2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PROTO, WPA_PROTO_RSN); 2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strlcpy(wpa_s->ifname, ifname, sizeof(wpa_s->ifname)); 2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_sm_set_ifname(wpa_s->wpa, wpa_s->ifname, NULL); 2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt l2 = l2_packet_init(wpa_s->ifname, NULL, ETH_P_RSN_PREAUTH, NULL, 2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL, 0); 2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt assert(l2 != NULL); 2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (l2_packet_get_own_addr(l2, wpa_s->own_addr)) { 2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_WARNING, "Failed to get own L2 address\n"); 2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt exit(-1); 2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt l2_packet_deinit(l2); 2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr); 2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void eapol_test_terminate(int sig, void *signal_ctx) 2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant *wpa_s = signal_ctx; 2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_msg(wpa_s, MSG_INFO, "Signal %d received - terminating", sig); 2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_terminate(); 2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint main(int argc, char *argv[]) 2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_supplicant wpa_s; 2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret = 1; 2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 bssid[ETH_ALEN]; 2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct preauth_test_data preauth_test; 2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_program_init()) 2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&preauth_test, 0, sizeof(preauth_test)); 2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_level = 0; 2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_debug_show_keys = 1; 2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 4) { 2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("usage: preauth_test <conf> <target MAC address> " 2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<ifname>\n"); 2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hwaddr_aton(argv[2], bssid)) { 2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Failed to parse target address '%s'.\n", argv[2]); 2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (eap_register_methods()) { 3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Failed to register EAP methods"); 3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (eloop_init()) { 3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Failed to initialize event loop"); 3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&wpa_s, 0, sizeof(wpa_s)); 31264f47c5c24428834677459e048420f86e3514c20Dmitry Shmidt wpa_s.conf = wpa_config_read(argv[1], NULL); 3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s.conf == NULL) { 3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Failed to parse configuration file '%s'.\n", argv[1]); 3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s.conf->ssid == NULL) { 3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("No networks defined.\n"); 3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_init_conf(&wpa_s, argv[3]); 3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s.ctrl_iface = wpa_supplicant_ctrl_iface_init(&wpa_s); 3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_s.ctrl_iface == NULL) { 3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Failed to initialize control interface '%s'.\n" 3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "You may have another preauth_test process already " 3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "running or the file was\n" 3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "left by an unclean termination of preauth_test in " 3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "which case you will need\n" 3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "to manually remove this file before starting " 3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "preauth_test again.\n", 3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s.conf->ctrl_interface); 3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_supplicant_scard_init(&wpa_s, wpa_s.conf->ssid)) 3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (rsn_preauth_init(wpa_s.wpa, bssid, &wpa_s.conf->ssid->eap)) 3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_register_timeout(30, 0, eapol_test_timeout, &preauth_test, NULL); 3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_register_timeout(0, 100000, eapol_test_poll, &wpa_s, NULL); 3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_register_signal_terminate(eapol_test_terminate, &wpa_s); 3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_register_signal_reconfig(eapol_test_terminate, &wpa_s); 3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_run(); 3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (preauth_test.auth_timed_out) 3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = -2; 3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else { 3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = pmksa_cache_set_current(wpa_s.wpa, NULL, bssid, NULL, 0) 3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ? 0 : -3; 3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt test_eapol_clean(&wpa_s); 3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eap_peer_unregister_methods(); 3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_destroy(); 3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_program_deinit(); 3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ret; 3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 364