wpa_supplicant: Fix issues reported by coverity

This commit is contained in:
Kapil Gupta
2022-08-03 11:54:26 +05:30
parent 3cf24bd5d6
commit a5e418b4b6
10 changed files with 16 additions and 149 deletions

View File

@@ -556,8 +556,7 @@ void wpa_receive(struct wpa_authenticator *wpa_auth, struct wpa_state_machine *s
struct ieee802_1x_hdr *hdr; struct ieee802_1x_hdr *hdr;
struct wpa_eapol_key *key; struct wpa_eapol_key *key;
u16 key_info, key_data_length; u16 key_info, key_data_length;
enum { PAIRWISE_2, PAIRWISE_4, GROUP_2, REQUEST, enum { PAIRWISE_2, PAIRWISE_4, GROUP_2, REQUEST } msg;
SMK_M1, SMK_M3, SMK_ERROR } msg;
struct wpa_eapol_ie_parse kde; struct wpa_eapol_ie_parse kde;
int ft; int ft;
const u8 *eapol_key_ie; const u8 *eapol_key_ie;
@@ -616,16 +615,12 @@ void wpa_receive(struct wpa_authenticator *wpa_auth, struct wpa_state_machine *s
/* FIX: verify that the EAPOL-Key frame was encrypted if pairwise keys /* FIX: verify that the EAPOL-Key frame was encrypted if pairwise keys
* are set */ * are set */
if ((key_info & (WPA_KEY_INFO_SMK_MESSAGE | WPA_KEY_INFO_REQUEST)) == if (key_info & WPA_KEY_INFO_SMK_MESSAGE) {
(WPA_KEY_INFO_SMK_MESSAGE | WPA_KEY_INFO_REQUEST)) { wpa_printf(MSG_DEBUG, "WPA: Ignore SMK message");
if (key_info & WPA_KEY_INFO_ERROR) { return;
msg = SMK_ERROR; }
} else {
msg = SMK_M1; if (key_info & WPA_KEY_INFO_REQUEST) {
}
} else if (key_info & WPA_KEY_INFO_SMK_MESSAGE) {
msg = SMK_M3;
} else if (key_info & WPA_KEY_INFO_REQUEST) {
msg = REQUEST; msg = REQUEST;
} else if (!(key_info & WPA_KEY_INFO_KEY_TYPE)) { } else if (!(key_info & WPA_KEY_INFO_KEY_TYPE)) {
msg = GROUP_2; msg = GROUP_2;
@@ -635,7 +630,6 @@ void wpa_receive(struct wpa_authenticator *wpa_auth, struct wpa_state_machine *s
msg = PAIRWISE_2; msg = PAIRWISE_2;
} }
/* TODO: key_info type validation for PeerKey */
if (msg == REQUEST || msg == PAIRWISE_2 || msg == PAIRWISE_4 || if (msg == REQUEST || msg == PAIRWISE_2 || msg == PAIRWISE_4 ||
msg == GROUP_2) { msg == GROUP_2) {
u16 ver = key_info & WPA_KEY_INFO_TYPE_MASK; u16 ver = key_info & WPA_KEY_INFO_TYPE_MASK;
@@ -775,25 +769,6 @@ continue_processing:
return; return;
} }
break; break;
#ifdef CONFIG_PEERKEY
case SMK_M1:
case SMK_M3:
case SMK_ERROR:
if (!wpa_auth->conf.peerkey) {
wpa_printf( MSG_DEBUG, "RSN: SMK M1/M3/Error, but "
"PeerKey use disabled - ignoring message");
return;
}
if (!sm->PTK_valid) {
return;
}
break;
#else /* CONFIG_PEERKEY */
case SMK_M1:
case SMK_M3:
case SMK_ERROR:
return; /* STSL disabled - ignore SMK messages */
#endif /* CONFIG_PEERKEY */
case REQUEST: case REQUEST:
break; break;
} }
@@ -833,22 +808,13 @@ continue_processing:
* even though MAC address KDE is not normally encrypted, * even though MAC address KDE is not normally encrypted,
* supplicant is allowed to encrypt it. * supplicant is allowed to encrypt it.
*/ */
if (msg == SMK_ERROR) { if (key_info & WPA_KEY_INFO_ERROR) {
#ifdef CONFIG_PEERKEY
wpa_smk_error(wpa_auth, sm, key);
#endif /* CONFIG_PEERKEY */
return;
} else if (key_info & WPA_KEY_INFO_ERROR) {
if (wpa_receive_error_report( if (wpa_receive_error_report(
wpa_auth, sm, wpa_auth, sm,
!(key_info & WPA_KEY_INFO_KEY_TYPE)) > 0) !(key_info & WPA_KEY_INFO_KEY_TYPE)) > 0)
return; /* STA entry was removed */ return; /* STA entry was removed */
} else if (key_info & WPA_KEY_INFO_KEY_TYPE) { } else if (key_info & WPA_KEY_INFO_KEY_TYPE) {
wpa_request_new_ptk(sm); wpa_request_new_ptk(sm);
#ifdef CONFIG_PEERKEY
} else if (msg == SMK_M1) {
wpa_smk_m1(wpa_auth, sm, key);
#endif /* CONFIG_PEERKEY */
} else if (key_data_length > 0 && } else if (key_data_length > 0 &&
wpa_parse_kde_ies((const u8 *) (key + 1), wpa_parse_kde_ies((const u8 *) (key + 1),
key_data_length, &kde) == 0 && key_data_length, &kde) == 0 &&
@@ -884,13 +850,6 @@ continue_processing:
wpa_replay_counter_mark_invalid(sm->key_replay, NULL); wpa_replay_counter_mark_invalid(sm->key_replay, NULL);
} }
#ifdef CONFIG_PEERKEY
if (msg == SMK_M3) {
wpa_smk_m3(wpa_auth, sm, key);
return;
}
#endif /* CONFIG_PEERKEY */
wpa_printf( MSG_DEBUG, "wpa_rx: free eapol=%p\n", sm->last_rx_eapol_key); wpa_printf( MSG_DEBUG, "wpa_rx: free eapol=%p\n", sm->last_rx_eapol_key);
os_free(sm->last_rx_eapol_key); os_free(sm->last_rx_eapol_key);
sm->last_rx_eapol_key = (u8 *)os_malloc(data_len); sm->last_rx_eapol_key = (u8 *)os_malloc(data_len);
@@ -1022,11 +981,11 @@ void __wpa_send_eapol(struct wpa_authenticator *wpa_auth,
WPA_PUT_BE16(key->key_info, key_info); WPA_PUT_BE16(key->key_info, key_info);
alg = pairwise ? sm->pairwise : wpa_auth->conf.wpa_group; alg = pairwise ? sm->pairwise : wpa_auth->conf.wpa_group;
WPA_PUT_BE16(key->key_length, wpa_cipher_key_len(alg)); if (sm->wpa == WPA_VERSION_WPA2 && !pairwise)
if (key_info & WPA_KEY_INFO_SMK_MESSAGE)
WPA_PUT_BE16(key->key_length, 0); WPA_PUT_BE16(key->key_length, 0);
else
WPA_PUT_BE16(key->key_length, wpa_cipher_key_len(alg));
/* FIX: STSL: what to use as key_replay_counter? */
for (i = RSNA_MAX_EAPOL_RETRIES - 1; i > 0; i--) { for (i = RSNA_MAX_EAPOL_RETRIES - 1; i > 0; i--) {
sm->key_replay[i].valid = sm->key_replay[i - 1].valid; sm->key_replay[i].valid = sm->key_replay[i - 1].valid;
memcpy(sm->key_replay[i].counter, memcpy(sm->key_replay[i].counter,

View File

@@ -136,7 +136,6 @@ struct wpa_auth_config {
int rsn_pairwise; int rsn_pairwise;
int rsn_preauth; int rsn_preauth;
int eapol_version; int eapol_version;
int peerkey;
int wmm_enabled; int wmm_enabled;
int wmm_uapsd; int wmm_uapsd;
int disable_pmksa_caching; int disable_pmksa_caching;

View File

@@ -182,17 +182,6 @@ int wpa_auth_for_each_auth(struct wpa_authenticator *wpa_auth,
int (*cb)(struct wpa_authenticator *a, void *ctx), int (*cb)(struct wpa_authenticator *a, void *ctx),
void *cb_ctx); void *cb_ctx);
#ifdef CONFIG_PEERKEY
int wpa_stsl_remove(struct wpa_authenticator *wpa_auth,
struct wpa_stsl_negotiation *neg);
void wpa_smk_error(struct wpa_authenticator *wpa_auth,
struct wpa_state_machine *sm, struct wpa_eapol_key *key);
void wpa_smk_m1(struct wpa_authenticator *wpa_auth,
struct wpa_state_machine *sm, struct wpa_eapol_key *key);
void wpa_smk_m3(struct wpa_authenticator *wpa_auth,
struct wpa_state_machine *sm, struct wpa_eapol_key *key);
#endif /* CONFIG_PEERKEY */
#ifdef CONFIG_IEEE80211R #ifdef CONFIG_IEEE80211R
int wpa_write_mdie(struct wpa_auth_config *conf, u8 *buf, size_t len); int wpa_write_mdie(struct wpa_auth_config *conf, u8 *buf, size_t len);
int wpa_write_ftie(struct wpa_auth_config *conf, const u8 *r0kh_id, int wpa_write_ftie(struct wpa_auth_config *conf, const u8 *r0kh_id,

View File

@@ -216,8 +216,6 @@ int wpa_write_rsn_ie(struct wpa_auth_config *conf, u8 *buf, size_t len,
capab = 0; capab = 0;
if (conf->rsn_preauth) if (conf->rsn_preauth)
capab |= WPA_CAPABILITY_PREAUTH; capab |= WPA_CAPABILITY_PREAUTH;
if (conf->peerkey)
capab |= WPA_CAPABILITY_PEERKEY_ENABLED;
if (conf->wmm_enabled) { if (conf->wmm_enabled) {
/* 4 PTKSA replay counters when using WMM */ /* 4 PTKSA replay counters when using WMM */
capab |= (RSN_NUM_REPLAY_COUNTERS_16 << 2); capab |= (RSN_NUM_REPLAY_COUNTERS_16 << 2);
@@ -599,36 +597,6 @@ static int wpa_parse_generic(const u8 *pos, const u8 *end,
return 0; return 0;
} }
#ifdef CONFIG_PEERKEY
if (pos[1] > RSN_SELECTOR_LEN + 2 &&
RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_SMK) {
ie->smk = pos + 2 + RSN_SELECTOR_LEN;
ie->smk_len = pos[1] - RSN_SELECTOR_LEN;
return 0;
}
if (pos[1] > RSN_SELECTOR_LEN + 2 &&
RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_NONCE) {
ie->nonce = pos + 2 + RSN_SELECTOR_LEN;
ie->nonce_len = pos[1] - RSN_SELECTOR_LEN;
return 0;
}
if (pos[1] > RSN_SELECTOR_LEN + 2 &&
RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_LIFETIME) {
ie->lifetime = pos + 2 + RSN_SELECTOR_LEN;
ie->lifetime_len = pos[1] - RSN_SELECTOR_LEN;
return 0;
}
if (pos[1] > RSN_SELECTOR_LEN + 2 &&
RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_ERROR) {
ie->error = pos + 2 + RSN_SELECTOR_LEN;
ie->error_len = pos[1] - RSN_SELECTOR_LEN;
return 0;
}
#endif /* CONFIG_PEERKEY */
#ifdef CONFIG_IEEE80211W #ifdef CONFIG_IEEE80211W
if (pos[1] > RSN_SELECTOR_LEN + 2 && if (pos[1] > RSN_SELECTOR_LEN + 2 &&
RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_IGTK) { RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_IGTK) {

View File

@@ -19,16 +19,6 @@ struct wpa_eapol_ie_parse {
size_t gtk_len; size_t gtk_len;
const u8 *mac_addr; const u8 *mac_addr;
size_t mac_addr_len; size_t mac_addr_len;
#ifdef CONFIG_PEERKEY
const u8 *smk;
size_t smk_len;
const u8 *nonce;
size_t nonce_len;
const u8 *lifetime;
size_t lifetime_len;
const u8 *error;
size_t error_len;
#endif /* CONFIG_PEERKEY */
#ifdef CONFIG_IEEE80211W #ifdef CONFIG_IEEE80211W
const u8 *igtk; const u8 *igtk;
size_t igtk_len; size_t igtk_len;

View File

@@ -65,7 +65,6 @@ int sae_set_group(struct sae_data *sae, int group)
tmp->prime_len = tmp->dh->prime_len; tmp->prime_len = tmp->dh->prime_len;
if (tmp->prime_len > SAE_MAX_PRIME_LEN) { if (tmp->prime_len > SAE_MAX_PRIME_LEN) {
sae_clear_data(sae); sae_clear_data(sae);
os_free(tmp);
return ESP_FAIL; return ESP_FAIL;
} }
@@ -73,7 +72,6 @@ int sae_set_group(struct sae_data *sae, int group)
tmp->prime_len); tmp->prime_len);
if (tmp->prime_buf == NULL) { if (tmp->prime_buf == NULL) {
sae_clear_data(sae); sae_clear_data(sae);
os_free(tmp);
return ESP_FAIL; return ESP_FAIL;
} }
tmp->prime = tmp->prime_buf; tmp->prime = tmp->prime_buf;
@@ -82,7 +80,6 @@ int sae_set_group(struct sae_data *sae, int group)
tmp->dh->order_len); tmp->dh->order_len);
if (tmp->order_buf == NULL) { if (tmp->order_buf == NULL) {
sae_clear_data(sae); sae_clear_data(sae);
os_free(tmp);
return ESP_FAIL; return ESP_FAIL;
} }
tmp->order = tmp->order_buf; tmp->order = tmp->order_buf;
@@ -862,7 +859,7 @@ fail:
int sae_process_commit(struct sae_data *sae) int sae_process_commit(struct sae_data *sae)
{ {
u8 k[SAE_MAX_PRIME_LEN]; u8 k[SAE_MAX_PRIME_LEN] = {0};
if (sae->tmp == NULL || if (sae->tmp == NULL ||
(sae->tmp->ec && sae_derive_k_ecc(sae, k) < 0) || (sae->tmp->ec && sae_derive_k_ecc(sae, k) < 0) ||
(sae->tmp->dh && sae_derive_k_ffc(sae, k) < 0) || (sae->tmp->dh && sae_derive_k_ffc(sae, k) < 0) ||

View File

@@ -487,10 +487,6 @@ const char * wpa_cipher_txt(int cipher)
* PTK = PRF-X(PMK, "Pairwise key expansion", * PTK = PRF-X(PMK, "Pairwise key expansion",
* Min(AA, SA) || Max(AA, SA) || * Min(AA, SA) || Max(AA, SA) ||
* Min(ANonce, SNonce) || Max(ANonce, SNonce)) * Min(ANonce, SNonce) || Max(ANonce, SNonce))
*
* STK = PRF-X(SMK, "Peer key expansion",
* Min(MAC_I, MAC_P) || Max(MAC_I, MAC_P) ||
* Min(INonce, PNonce) || Max(INonce, PNonce))
*/ */
void wpa_pmk_to_ptk(const u8 *pmk, size_t pmk_len, const char *label, void wpa_pmk_to_ptk(const u8 *pmk, size_t pmk_len, const char *label,
const u8 *addr1, const u8 *addr2, const u8 *addr1, const u8 *addr2,

View File

@@ -73,12 +73,6 @@
#define RSN_KEY_DATA_GROUPKEY RSN_SELECTOR(0x00, 0x0f, 0xac, 1) #define RSN_KEY_DATA_GROUPKEY RSN_SELECTOR(0x00, 0x0f, 0xac, 1)
#define RSN_KEY_DATA_MAC_ADDR RSN_SELECTOR(0x00, 0x0f, 0xac, 3) #define RSN_KEY_DATA_MAC_ADDR RSN_SELECTOR(0x00, 0x0f, 0xac, 3)
#define RSN_KEY_DATA_PMKID RSN_SELECTOR(0x00, 0x0f, 0xac, 4) #define RSN_KEY_DATA_PMKID RSN_SELECTOR(0x00, 0x0f, 0xac, 4)
#ifdef CONFIG_PEERKEY
#define RSN_KEY_DATA_SMK RSN_SELECTOR(0x00, 0x0f, 0xac, 5)
#define RSN_KEY_DATA_NONCE RSN_SELECTOR(0x00, 0x0f, 0xac, 6)
#define RSN_KEY_DATA_LIFETIME RSN_SELECTOR(0x00, 0x0f, 0xac, 7)
#define RSN_KEY_DATA_ERROR RSN_SELECTOR(0x00, 0x0f, 0xac, 8)
#endif /* CONFIG_PEERKEY */
#ifdef CONFIG_IEEE80211W #ifdef CONFIG_IEEE80211W
#define RSN_KEY_DATA_IGTK RSN_SELECTOR(0x00, 0x0f, 0xac, 9) #define RSN_KEY_DATA_IGTK RSN_SELECTOR(0x00, 0x0f, 0xac, 9)
#endif /* CONFIG_IEEE80211W */ #endif /* CONFIG_IEEE80211W */
@@ -109,8 +103,6 @@
/* B4-B5: GTKSA Replay Counter */ /* B4-B5: GTKSA Replay Counter */
#define WPA_CAPABILITY_MFPR BIT(6) #define WPA_CAPABILITY_MFPR BIT(6)
#define WPA_CAPABILITY_MFPC BIT(7) #define WPA_CAPABILITY_MFPC BIT(7)
#define WPA_CAPABILITY_PEERKEY_ENABLED BIT(9)
/* IEEE 802.11r */ /* IEEE 802.11r */
#define MOBILITY_DOMAIN_ID_LEN 2 #define MOBILITY_DOMAIN_ID_LEN 2
@@ -232,23 +224,6 @@ struct rsn_ie_hdr {
u8 version[2]; /* little endian */ u8 version[2]; /* little endian */
} STRUCT_PACKED; } STRUCT_PACKED;
#ifdef CONFIG_PEERKEY
enum {
STK_MUI_4WAY_STA_AP = 1,
STK_MUI_4WAY_STAT_STA = 2,
STK_MUI_GTK = 3,
STK_MUI_SMK = 4
};
enum {
STK_ERR_STA_NR = 1,
STK_ERR_STA_NRSN = 2,
STK_ERR_CPHR_NS = 3,
STK_ERR_NO_STSL = 4
};
#endif /* CONFIG_PEERKEY */
struct rsn_error_kde { struct rsn_error_kde {
be16 mui; be16 mui;
be16 error_type; be16 error_type;

View File

@@ -795,6 +795,10 @@ int wps_process_wps_mX_req(u8 *ubuf, int len, enum wps_process_res *res)
} }
if ((flag & WPS_MSG_FLAG_MORE) || wps_buf != NULL) {//frag msg if ((flag & WPS_MSG_FLAG_MORE) || wps_buf != NULL) {//frag msg
if (tlen > 50000) {
wpa_printf(MSG_ERROR, "EAP-WSC: Invalid Message Length");
return ESP_FAIL;
}
wpa_printf(MSG_DEBUG, "rx frag msg id:%d, flag:%d, frag_len: %d, tot_len: %d, be_tot_len:%d", sm->current_identifier, flag, frag_len, tlen, be_tot_len); wpa_printf(MSG_DEBUG, "rx frag msg id:%d, flag:%d, frag_len: %d, tot_len: %d, be_tot_len:%d", sm->current_identifier, flag, frag_len, tlen, be_tot_len);
if (ESP_OK != wps_enrollee_process_msg_frag(&wps_buf, tlen, tbuf, frag_len, flag)) { if (ESP_OK != wps_enrollee_process_msg_frag(&wps_buf, tlen, tbuf, frag_len, flag)) {
if (wps_buf) { if (wps_buf) {

View File

@@ -25,16 +25,6 @@ struct wpa_eapol_ie_parse {
size_t gtk_len; size_t gtk_len;
const u8 *mac_addr; const u8 *mac_addr;
size_t mac_addr_len; size_t mac_addr_len;
#ifdef CONFIG_PEERKEY
const u8 *smk;
size_t smk_len;
const u8 *nonce;
size_t nonce_len;
const u8 *lifetime;
size_t lifetime_len;
const u8 *error;
size_t error_len;
#endif /* CONFIG_PEERKEY */
#ifdef CONFIG_IEEE80211W #ifdef CONFIG_IEEE80211W
const u8 *igtk; const u8 *igtk;
size_t igtk_len; size_t igtk_len;