Skip to content

Commit

Permalink
Merge branch 'bugfix/install_key_refactor_v4.4' into 'release/v4.4'
Browse files Browse the repository at this point in the history
esp_wifi: Refactor key install code(backport v4.4)

See merge request espressif/esp-idf!16532
  • Loading branch information
jack0c committed Dec 24, 2021
2 parents f9ab0ac + d57b946 commit 214d62b
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 41 deletions.
16 changes: 12 additions & 4 deletions components/wpa_supplicant/esp_supplicant/src/esp_wifi_driver.h
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,16 @@ typedef struct {
uint8_t data[0];
} wifi_mgmt_frm_req_t;

enum key_flag {
KEY_FLAG_MODIFY = BIT(0),
KEY_FLAG_DEFAULT = BIT(1),
KEY_FLAG_RX = BIT(2),
KEY_FLAG_TX = BIT(3),
KEY_FLAG_GROUP = BIT(4),
KEY_FLAG_PAIRWISE = BIT(5),
KEY_FLAG_PMK = BIT(6),
};

uint8_t *esp_wifi_ap_get_prof_pmk_internal(void);
struct wifi_ssid *esp_wifi_ap_get_prof_ap_ssid_internal(void);
uint8_t esp_wifi_ap_get_prof_authmode_internal(void);
Expand All @@ -208,15 +218,13 @@ uint16_t esp_wifi_get_spp_attrubute_internal(uint8_t ifx);
bool esp_wifi_sta_is_running_internal(void);
bool esp_wifi_auth_done_internal(void);
int esp_wifi_set_ap_key_internal(int alg, const u8 *addr, int idx, u8 *key, size_t key_len);
int esp_wifi_get_sta_hw_key_idx_internal(int key_idx);
int esp_wifi_set_sta_key_internal(int alg, u8 *addr, int key_idx, int set_tx,
u8 *seq, size_t seq_len, u8 *key, size_t key_len, int key_entry_valid);
u8 *seq, size_t seq_len, u8 *key, size_t key_len, enum key_flag key_flag);
int esp_wifi_get_sta_key_internal(uint8_t *ifx, int *alg, u8 *addr, int *key_idx,
u8 *key, size_t key_len, int key_entry_valid);
u8 *key, size_t key_len, enum key_flag key_flag);
bool esp_wifi_wpa_ptk_init_done_internal(uint8_t *mac);
uint8_t esp_wifi_sta_set_reset_param_internal(uint8_t reset_flag);
uint8_t esp_wifi_get_sta_gtk_index_internal(void);
void esp_wifi_set_sta_gtk_index_internal(u8 valid, u8 index);
int esp_wifi_register_tx_cb_internal(wifi_tx_cb_t fn, u8 id);
int esp_wifi_register_wpa_cb_internal(struct wpa_funcs *cb);
int esp_wifi_unregister_wpa_cb_internal(void);
Expand Down
8 changes: 4 additions & 4 deletions components/wpa_supplicant/esp_supplicant/src/esp_wpa_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,15 @@
#include "esp_common_i.h"

void wpa_install_key(enum wpa_alg alg, u8 *addr, int key_idx, int set_tx,
u8 *seq, size_t seq_len, u8 *key, size_t key_len, int key_entry_valid)
u8 *seq, size_t seq_len, u8 *key, size_t key_len, enum key_flag key_flag)
{
esp_wifi_set_sta_key_internal(alg, addr, key_idx, set_tx, seq, seq_len, key, key_len, key_entry_valid);
esp_wifi_set_sta_key_internal(alg, addr, key_idx, set_tx, seq, seq_len, key, key_len, key_flag);
}

int wpa_get_key(uint8_t *ifx, int *alg, u8 *addr, int *key_idx,
u8 *key, size_t key_len, int key_entry_valid)
u8 *key, size_t key_len, enum key_flag key_flag)
{
return esp_wifi_get_sta_key_internal(ifx, alg, addr, key_idx, key, key_len, key_entry_valid);
return esp_wifi_get_sta_key_internal(ifx, alg, addr, key_idx, key, key_len, key_flag);
}

/**
Expand Down
76 changes: 49 additions & 27 deletions components/wpa_supplicant/src/rsn_supp/wpa.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,13 +54,13 @@ u8 assoc_ie_buf[ASSOC_IE_LEN+2];

void set_assoc_ie(u8 * assoc_buf);

int wpa_sm_set_key(struct install_key *sm, enum wpa_alg alg,
static int wpa_sm_set_key(struct install_key *sm, enum wpa_alg alg,
u8 *addr, int key_idx, int set_tx,
u8 *seq, size_t seq_len,
u8 *key, size_t key_len,
int key_entry_valid);
enum key_flag key_flag);

int wpa_sm_get_key(uint8_t *ifx, int *alg, u8 *addr, int *key_idx, u8 *key, size_t key_len, int key_entry_valid);
static int wpa_sm_get_key(uint8_t *ifx, int *alg, u8 *addr, int *key_idx, u8 *key, size_t key_len, enum key_flag key_flag);

void wpa_set_passphrase(char * passphrase, u8 *ssid, size_t ssid_len);

Expand Down Expand Up @@ -691,7 +691,7 @@ static void wpa_sm_rekey_ptk(void *eloop_ctx, void *timeout_ctx)
}


static int wpa_supplicant_install_ptk(struct wpa_sm *sm)
static int wpa_supplicant_install_ptk(struct wpa_sm *sm, enum key_flag key_flag)
{
int keylen;
enum wpa_alg alg;
Expand All @@ -706,12 +706,8 @@ static int wpa_supplicant_install_ptk(struct wpa_sm *sm)
"NONE - do not use pairwise keys");
return 0;
}
//now only use keyentry 0 for pairwise key
sm->key_entry_valid = esp_wifi_get_sta_hw_key_idx_internal(0); //KEY_IDX_STA_PTK

wpa_hexdump(MSG_DEBUG, "WPA: Pairwise Key", sm->ptk.tk, keylen);
if (wpa_sm_set_key(&(sm->install_ptk), alg, sm->bssid, 0, 1, (sm->install_ptk).seq, WPA_KEY_RSC_LEN,
sm->ptk.tk, keylen, sm->key_entry_valid) < 0) {
sm->ptk.tk, keylen, KEY_FLAG_PAIRWISE | key_flag) < 0) {
#ifdef DEBUG_PRINT
wpa_printf(MSG_DEBUG, "WPA: Failed to set PTK to the "
"driver (alg=%d keylen=%d bssid=" MACSTR ")",
Expand Down Expand Up @@ -788,7 +784,6 @@ void wpa_supplicant_key_neg_complete(struct wpa_sm *sm,

}


static int wpa_supplicant_install_gtk(struct wpa_sm *sm,
struct wpa_gtk_data *gd)
{
Expand Down Expand Up @@ -817,21 +812,19 @@ static int wpa_supplicant_install_gtk(struct wpa_sm *sm,
memcpy(gtk_buf + 24, gd->gtk + 24, 8);
_gtk = gtk_buf;
}
//now only use keycache entry1 for group key
sm->key_entry_valid = esp_wifi_get_sta_hw_key_idx_internal(gd->keyidx);
if (sm->pairwise_cipher == WPA_CIPHER_NONE) {
if (wpa_sm_set_key(&(sm->install_gtk), gd->alg,
sm->bssid, //(u8 *) "\xff\xff\xff\xff\xff\xff",
gd->keyidx, 1, key_rsc, gd->key_rsc_len,
_gtk, gd->gtk_len,sm->key_entry_valid) < 0) {
_gtk, gd->gtk_len, (KEY_FLAG_GROUP | KEY_FLAG_RX | KEY_FLAG_TX)) < 0) {
wpa_printf(MSG_DEBUG, "WPA: Failed to set "
"GTK to the driver (Group only).");
return -1;
}
} else if (wpa_sm_set_key(&(sm->install_gtk), gd->alg,
sm->bssid, //(u8 *) "\xff\xff\xff\xff\xff\xff",
gd->keyidx, gd->tx, key_rsc, gd->key_rsc_len,
_gtk, gd->gtk_len, sm->key_entry_valid) < 0) {
_gtk, gd->gtk_len, KEY_FLAG_GROUP | KEY_FLAG_RX) < 0) {
wpa_printf(MSG_DEBUG, "WPA: Failed to set GTK to "
"the driver (alg=%d keylen=%d keyidx=%d)",
gd->alg, gd->gtk_len, gd->keyidx);
Expand All @@ -849,8 +842,7 @@ static bool wpa_supplicant_gtk_in_use(struct wpa_sm *sm, struct wpa_gtk_data *gd
u8 ifx;
int alg;
u8 bssid[6];
int keyidx;
int hw_keyidx;
int keyidx = gd->keyidx;

#ifdef DEBUG_PRINT
wpa_printf(MSG_DEBUG, "WPA: Judge GTK: (keyidx=%d len=%d).", gd->keyidx, gd->gtk_len);
Expand All @@ -864,11 +856,10 @@ static bool wpa_supplicant_gtk_in_use(struct wpa_sm *sm, struct wpa_gtk_data *gd
_gtk = gtk_buf;
}

hw_keyidx = esp_wifi_get_sta_hw_key_idx_internal(gd->keyidx);
if (wpa_sm_get_key(&ifx, &alg, bssid, &keyidx, gtk_get, gd->gtk_len, hw_keyidx - 2) == 0) {
if (wpa_sm_get_key(&ifx, &alg, bssid, &keyidx, gtk_get, gd->gtk_len, KEY_FLAG_GROUP) == 0) {
if (ifx == 0 && alg == gd->alg && memcmp(bssid, sm->bssid, ETH_ALEN) == 0 &&
memcmp(_gtk, gtk_get, gd->gtk_len) == 0) {
wpa_printf(MSG_DEBUG, "GTK %d is already in use in entry %d, it may be an attack, ignore it.", gd->keyidx, hw_keyidx);
wpa_printf(MSG_DEBUG, "GTK %d is already in use, it may be an attack, ignore it.", gd->keyidx);
return true;
}
}
Expand Down Expand Up @@ -1236,6 +1227,9 @@ static void wpa_supplicant_process_3_of_4(struct wpa_sm *sm,
goto failed;
}

if (sm->key_install && sm->key_info & WPA_KEY_INFO_INSTALL) {
wpa_supplicant_install_ptk(sm, KEY_FLAG_RX);
}
/*after txover, callback will continue run remain task*/
if (wpa_supplicant_send_4_of_4(sm, sm->bssid, key, ver, key_info,
&sm->ptk)) {
Expand All @@ -1248,12 +1242,41 @@ static void wpa_supplicant_process_3_of_4(struct wpa_sm *sm,
wpa_sm_deauthenticate(sm, WLAN_REASON_UNSPECIFIED);
}

static int wpa_supplicant_activate_ptk(struct wpa_sm *sm)
{
int keylen;
enum wpa_alg alg;

alg = wpa_cipher_to_alg(sm->pairwise_cipher);
keylen = wpa_cipher_key_len(sm->pairwise_cipher);

if (alg == WIFI_WPA_ALG_NONE) {
wpa_printf(MSG_DEBUG, "WPA: Pairwise Cipher Suite: "
"NONE - do not use pairwise keys");
return 0;
}

wpa_printf(MSG_DEBUG,
"WPA: Activate PTK bssid=" MACSTR ")",
MAC2STR(sm->bssid));

if (wpa_sm_set_key(&(sm->install_ptk), alg, sm->bssid, 0, 1, (sm->install_ptk).seq,
WPA_KEY_RSC_LEN, sm->ptk.tk, keylen,
(KEY_FLAG_MODIFY | KEY_FLAG_PAIRWISE | KEY_FLAG_RX | KEY_FLAG_TX)) < 0) {
wpa_printf(MSG_WARNING,
"WPA: Failed to activate PTK for TX (idx=%d bssid="
MACSTR ")", 0, MAC2STR(sm->bssid));
return -1;
}
return 0;
}

static int wpa_supplicant_send_4_of_4_txcallback(struct wpa_sm *sm)
{
u16 key_info=sm->key_info;

if (sm->key_install && key_info & WPA_KEY_INFO_INSTALL) {
if (wpa_supplicant_install_ptk(sm))
if (wpa_supplicant_activate_ptk(sm))
goto failed;
}
else if (sm->key_install == false) {
Expand Down Expand Up @@ -2098,7 +2121,6 @@ bool wpa_sm_init(char * payload, WPA_SEND_FUNC snd_func,
sm->get_ppkey = ppgetkey;
sm->wpa_deauthenticate = wpa_deauth;
sm->wpa_neg_complete = wpa_neg_complete;
sm->key_entry_valid = 0;
sm->key_install = false;

spp_attrubute = esp_wifi_get_spp_attrubute_internal(WIFI_IF_STA);
Expand Down Expand Up @@ -2293,12 +2315,12 @@ set_assoc_ie(u8 * assoc_buf)
sm->config_assoc_ie(sm->proto, assoc_buf, sm->assoc_wpa_ie_len);
}

int
static int
wpa_sm_set_key(struct install_key *key_sm, enum wpa_alg alg,
u8 *addr, int key_idx, int set_tx,
u8 *seq, size_t seq_len,
u8 *key, size_t key_len,
int key_entry_valid)
enum key_flag key_flag)
{
struct wpa_sm *sm = &gWpaSm;

Expand All @@ -2315,15 +2337,15 @@ wpa_sm_set_key(struct install_key *key_sm, enum wpa_alg alg,
key_sm->set_tx = set_tx;
memcpy(key_sm->key, key, key_len);

sm->install_ppkey(alg, addr, key_idx, set_tx, seq, seq_len, key, key_len, key_entry_valid);
sm->install_ppkey(alg, addr, key_idx, set_tx, seq, seq_len, key, key_len, key_flag);
return 0;
}

int
wpa_sm_get_key(uint8_t *ifx, int *alg, u8 *addr, int *key_idx, u8 *key, size_t key_len, int key_entry_valid)
static int
wpa_sm_get_key(uint8_t *ifx, int *alg, u8 *addr, int *key_idx, u8 *key, size_t key_len, enum key_flag key_flag)
{
struct wpa_sm *sm = &gWpaSm;
return sm->get_ppkey(ifx, alg, addr, key_idx, key, key_len, key_entry_valid);
return sm->get_ppkey(ifx, alg, addr, key_idx, key, key_len, key_flag);
}

void wpa_supplicant_clr_countermeasures(u16 *pisunicast)
Expand Down
9 changes: 4 additions & 5 deletions components/wpa_supplicant/src/rsn_supp/wpa_i.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,14 +75,13 @@ struct wpa_sm {

struct install_key install_ptk;
struct install_key install_gtk;
int key_entry_valid; //present current avaliable entry for bssid, for pairkey:0,5,10,15,20, gtk: pairkey_no+i (i:1~4)

void (* sendto) (void *buffer, uint16_t len);
void (*config_assoc_ie) (u8 proto, u8 *assoc_buf, u32 assoc_wpa_ie_len);
void (*install_ppkey) (enum wpa_alg alg, u8 *addr, int key_idx, int set_tx,
u8 *seq, unsigned int seq_len, u8 *key, unsigned int key_len, int key_entry_valid);
u8 *seq, unsigned int seq_len, u8 *key, unsigned int key_len, enum key_flag key_flag);
int (*get_ppkey) (uint8_t *ifx, int *alg, uint8_t *addr, int *key_idx,
uint8_t *key, size_t key_len, int key_entry_valid);
uint8_t *key, size_t key_len, enum key_flag key_flag);
void (*wpa_deauthenticate)(u8 reason_code);
void (*wpa_neg_complete)(void);
struct wpa_gtk_data gd; //used for calllback save param
Expand Down Expand Up @@ -145,9 +144,9 @@ typedef void (* WPA_SEND_FUNC)(void *buffer, u16 len);
typedef void (* WPA_SET_ASSOC_IE)(u8 proto, u8 *assoc_buf, u32 assoc_wpa_ie_len);

typedef void (*WPA_INSTALL_KEY) (enum wpa_alg alg, u8 *addr, int key_idx, int set_tx,
u8 *seq, size_t seq_len, u8 *key, size_t key_len, int key_entry_valid);
u8 *seq, size_t seq_len, u8 *key, size_t key_len, enum key_flag key_flag);

typedef int (*WPA_GET_KEY) (u8 *ifx, int *alg, u8 *addt, int *keyidx, u8 *key, size_t key_len, int key_entry_valid);
typedef int (*WPA_GET_KEY) (u8 *ifx, int *alg, u8 *addt, int *keyidx, u8 *key, size_t key_len, enum key_flag key_flag);

typedef void (*WPA_DEAUTH_FUNC)(u8 reason_code);

Expand Down

0 comments on commit 214d62b

Please sign in to comment.