|
@@ -186,112 +186,11 @@ static void ieee802_1x_tx_key_one(struct hostapd_data *hapd,
|
|
|
}
|
|
|
|
|
|
|
|
|
-#ifndef CONFIG_NO_VLAN
|
|
|
-static struct hostapd_wep_keys *
|
|
|
-ieee802_1x_group_alloc(struct hostapd_data *hapd, const char *ifname)
|
|
|
-{
|
|
|
- struct hostapd_wep_keys *key;
|
|
|
-
|
|
|
- key = os_zalloc(sizeof(*key));
|
|
|
- if (key == NULL)
|
|
|
- return NULL;
|
|
|
-
|
|
|
- key->default_len = hapd->conf->default_wep_key_len;
|
|
|
-
|
|
|
- if (key->idx >= hapd->conf->broadcast_key_idx_max ||
|
|
|
- key->idx < hapd->conf->broadcast_key_idx_min)
|
|
|
- key->idx = hapd->conf->broadcast_key_idx_min;
|
|
|
- else
|
|
|
- key->idx++;
|
|
|
-
|
|
|
- if (!key->key[key->idx])
|
|
|
- key->key[key->idx] = os_malloc(key->default_len);
|
|
|
- if (key->key[key->idx] == NULL ||
|
|
|
- random_get_bytes(key->key[key->idx], key->default_len)) {
|
|
|
- printf("Could not generate random WEP key (dynamic VLAN).\n");
|
|
|
- os_free(key->key[key->idx]);
|
|
|
- key->key[key->idx] = NULL;
|
|
|
- os_free(key);
|
|
|
- return NULL;
|
|
|
- }
|
|
|
- key->len[key->idx] = key->default_len;
|
|
|
-
|
|
|
- wpa_printf(MSG_DEBUG, "%s: Default WEP idx %d for dynamic VLAN\n",
|
|
|
- ifname, key->idx);
|
|
|
- wpa_hexdump_key(MSG_DEBUG, "Default WEP key (dynamic VLAN)",
|
|
|
- key->key[key->idx], key->len[key->idx]);
|
|
|
-
|
|
|
- if (hostapd_drv_set_key(ifname, hapd, WPA_ALG_WEP,
|
|
|
- broadcast_ether_addr, key->idx, 1,
|
|
|
- NULL, 0, key->key[key->idx],
|
|
|
- key->len[key->idx]))
|
|
|
- printf("Could not set dynamic VLAN WEP encryption key.\n");
|
|
|
-
|
|
|
- hostapd_set_drv_ieee8021x(hapd, ifname, 1);
|
|
|
-
|
|
|
- return key;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-static struct hostapd_wep_keys *
|
|
|
-ieee802_1x_get_group(struct hostapd_data *hapd, struct hostapd_ssid *ssid,
|
|
|
- size_t vlan_id)
|
|
|
-{
|
|
|
- const char *ifname;
|
|
|
-
|
|
|
- if (vlan_id == 0)
|
|
|
- return &ssid->wep;
|
|
|
-
|
|
|
- if (vlan_id <= ssid->max_dyn_vlan_keys && ssid->dyn_vlan_keys &&
|
|
|
- ssid->dyn_vlan_keys[vlan_id])
|
|
|
- return ssid->dyn_vlan_keys[vlan_id];
|
|
|
-
|
|
|
- wpa_printf(MSG_DEBUG, "IEEE 802.1X: Creating new group "
|
|
|
- "state machine for VLAN ID %lu",
|
|
|
- (unsigned long) vlan_id);
|
|
|
-
|
|
|
- ifname = hostapd_get_vlan_id_ifname(hapd->conf->vlan, vlan_id);
|
|
|
- if (ifname == NULL) {
|
|
|
- wpa_printf(MSG_DEBUG, "IEEE 802.1X: Unknown VLAN ID %lu - "
|
|
|
- "cannot create group key state machine",
|
|
|
- (unsigned long) vlan_id);
|
|
|
- return NULL;
|
|
|
- }
|
|
|
-
|
|
|
- if (ssid->dyn_vlan_keys == NULL) {
|
|
|
- int size = (vlan_id + 1) * sizeof(ssid->dyn_vlan_keys[0]);
|
|
|
- ssid->dyn_vlan_keys = os_zalloc(size);
|
|
|
- if (ssid->dyn_vlan_keys == NULL)
|
|
|
- return NULL;
|
|
|
- ssid->max_dyn_vlan_keys = vlan_id;
|
|
|
- }
|
|
|
-
|
|
|
- if (ssid->max_dyn_vlan_keys < vlan_id) {
|
|
|
- struct hostapd_wep_keys **na;
|
|
|
- int size = (vlan_id + 1) * sizeof(ssid->dyn_vlan_keys[0]);
|
|
|
- na = os_realloc(ssid->dyn_vlan_keys, size);
|
|
|
- if (na == NULL)
|
|
|
- return NULL;
|
|
|
- ssid->dyn_vlan_keys = na;
|
|
|
- os_memset(&ssid->dyn_vlan_keys[ssid->max_dyn_vlan_keys + 1], 0,
|
|
|
- (vlan_id - ssid->max_dyn_vlan_keys) *
|
|
|
- sizeof(ssid->dyn_vlan_keys[0]));
|
|
|
- ssid->max_dyn_vlan_keys = vlan_id;
|
|
|
- }
|
|
|
-
|
|
|
- ssid->dyn_vlan_keys[vlan_id] = ieee802_1x_group_alloc(hapd, ifname);
|
|
|
-
|
|
|
- return ssid->dyn_vlan_keys[vlan_id];
|
|
|
-}
|
|
|
-#endif /* CONFIG_NO_VLAN */
|
|
|
-
|
|
|
-
|
|
|
void ieee802_1x_tx_key(struct hostapd_data *hapd, struct sta_info *sta)
|
|
|
{
|
|
|
struct eapol_authenticator *eapol = hapd->eapol_auth;
|
|
|
struct eapol_state_machine *sm = sta->eapol_sm;
|
|
|
#ifndef CONFIG_NO_VLAN
|
|
|
- struct hostapd_wep_keys *key = NULL;
|
|
|
int vlan_id;
|
|
|
#endif /* CONFIG_NO_VLAN */
|
|
|
|
|
@@ -307,12 +206,9 @@ void ieee802_1x_tx_key(struct hostapd_data *hapd, struct sta_info *sta)
|
|
|
vlan_id = 0;
|
|
|
|
|
|
if (vlan_id) {
|
|
|
- key = ieee802_1x_get_group(hapd, sta->ssid, vlan_id);
|
|
|
- if (key && key->key[key->idx])
|
|
|
- ieee802_1x_tx_key_one(hapd, sta, key->idx, 1,
|
|
|
- key->key[key->idx],
|
|
|
- key->len[key->idx]);
|
|
|
- } else
|
|
|
+ wpa_printf(MSG_ERROR, "Using WEP with vlans is not supported.");
|
|
|
+ return;
|
|
|
+ }
|
|
|
#endif /* CONFIG_NO_VLAN */
|
|
|
if (eapol->default_wep_key) {
|
|
|
ieee802_1x_tx_key_one(hapd, sta, eapol->default_wep_key_idx, 1,
|