static int hostapd_wpa_auth_get_msk(void *ctx, const u8 *addr, u8 *msk, size_t *len) { struct hostapd_data *hapd = ctx; const u8 *key; size_t keylen; struct sta_info *sta; sta = ap_get_sta(hapd, addr); if (sta == NULL) { wpa_printf(MSG_DEBUG, "AUTH_GET_MSK: Cannot find STA"); return -1; } key = ieee802_1x_get_key(sta->eapol_sm, &keylen); if (key == NULL) { wpa_printf(MSG_DEBUG, "AUTH_GET_MSK: Key is null, eapol_sm: %p", sta->eapol_sm); return -1; } if (keylen > *len) keylen = *len; os_memcpy(msk, key, keylen); *len = keylen; return 0; }
void rsn_preauth_finished(struct hostapd_data *hapd, struct sta_info *sta, int success) { const u8 *key; size_t len; hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_WPA, HOSTAPD_LEVEL_INFO, "pre-authentication %s", success ? "succeeded" : "failed"); key = ieee802_1x_get_key(sta->eapol_sm, &len); if (len > PMK_LEN) len = PMK_LEN; if (success && key) { if (wpa_auth_pmksa_add_preauth(hapd->wpa_auth, key, len, sta->addr, dot11RSNAConfigPMKLifetime, sta->eapol_sm) == 0) { hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_WPA, HOSTAPD_LEVEL_DEBUG, "added PMKSA cache entry (pre-auth)"); } else { hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_WPA, HOSTAPD_LEVEL_DEBUG, "failed to add PMKSA cache entry " "(pre-auth)"); } } /* * Finish STA entry removal from timeout in order to avoid freeing * STA data before the caller has finished processing. */ eloop_register_timeout(0, 0, rsn_preauth_finished_cb, hapd, sta); }
void rsn_preauth_finished(struct asd_data *wasd, struct sta_info *sta, int success) { const u8 *key; size_t len; asd_logger(wasd, sta->addr, asd_MODULE_WPA, asd_LEVEL_INFO, "pre-authentication %s", success ? "succeeded" : "failed"); key = ieee802_1x_get_key(sta->eapol_sm, &len); if (len > PMK_LEN) len = PMK_LEN; if (success && key) { if (wpa_auth_pmksa_add_preauth(wasd->wpa_auth, key, len, sta->addr, dot11RSNAConfigPMKLifetime, sta->eapol_sm) == 0) { asd_logger(wasd, sta->addr, asd_MODULE_WPA, asd_LEVEL_DEBUG, "added PMKSA cache entry (pre-auth)"); unsigned char WLANID = wasd->WlanID; struct PMK_STAINFO *pmk_sta; if(ASD_WLAN[WLANID] != NULL){ pmk_sta = pmk_ap_sta_add(ASD_WLAN[WLANID],sta->addr); pmk_sta->idhi = sta->acct_session_id_hi; pmk_sta->idlo = sta->acct_session_id_lo; pmk_add_bssindex(wasd->BSSIndex,pmk_sta); } } else { asd_logger(wasd, sta->addr, asd_MODULE_WPA, asd_LEVEL_DEBUG, "failed to add PMKSA cache entry " "(pre-auth)"); } } /* * Finish STA entry removal from timeout in order to avoid freeing * STA data before the caller has finished processing. */ circle_register_timeout(0, 0, rsn_preauth_finished_cb, wasd, sta); }
static int hostapd_wpa_auth_get_msk(void *ctx, const u8 *addr, u8 *msk, size_t *len) { struct hostapd_data *hapd = ctx; const u8 *key; size_t keylen; struct sta_info *sta; sta = ap_get_sta(hapd, addr); if (sta == NULL) return -1; key = ieee802_1x_get_key(sta->eapol_sm, &keylen); if (key == NULL) return -1; if (keylen > *len) keylen = *len; os_memcpy(msk, key, keylen); *len = keylen; return 0; }