mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
Merge branch 'bugfix/dpp_bugs_5.1' into 'release/v5.1'
fix(wpa_supplicant): Fix few dpp bugs(v5.1) See merge request espressif/esp-idf!26464
This commit is contained in:
commit
cf16ab59be
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD
|
||||
* SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
@ -22,7 +22,7 @@ static void *s_dpp_api_lock = NULL;
|
||||
|
||||
static bool s_dpp_stop_listening;
|
||||
static int s_dpp_auth_retries;
|
||||
struct esp_dpp_context_t s_dpp_ctx;
|
||||
static struct esp_dpp_context_t s_dpp_ctx;
|
||||
static wifi_action_rx_cb_t s_action_rx_cb = esp_supp_rx_action;
|
||||
|
||||
#define DPP_API_LOCK() os_mutex_lock(s_dpp_api_lock)
|
||||
@ -379,6 +379,10 @@ static void esp_dpp_task(void *pvParameters )
|
||||
static int counter;
|
||||
int channel;
|
||||
|
||||
if (p->num_chan <= 0) {
|
||||
wpa_printf(MSG_ERROR, "Listen channel not set");
|
||||
break;
|
||||
}
|
||||
channel = p->chan_list[counter++ % p->num_chan];
|
||||
esp_wifi_remain_on_channel(WIFI_IF_STA, WIFI_ROC_REQ, channel,
|
||||
BOOTSTRAP_ROC_WAIT_TIME, s_action_rx_cb);
|
||||
@ -518,6 +522,10 @@ esp_err_t
|
||||
esp_supp_dpp_bootstrap_gen(const char *chan_list, enum dpp_bootstrap_type type,
|
||||
const char *key, const char *uri_info)
|
||||
{
|
||||
if (!s_dpp_ctx.dpp_global) {
|
||||
wpa_printf(MSG_ERROR, "DPP: failed to bootstrap as dpp not initialized.");
|
||||
return ESP_FAIL;
|
||||
}
|
||||
struct dpp_bootstrap_params_t *params = &s_dpp_ctx.bootstrap_params;
|
||||
char *uri_chan_list = esp_dpp_parse_chan_list(chan_list);
|
||||
char *command = os_zalloc(1200);
|
||||
@ -581,6 +589,11 @@ fail:
|
||||
|
||||
esp_err_t esp_supp_dpp_start_listen(void)
|
||||
{
|
||||
if (!s_dpp_ctx.dpp_global || s_dpp_ctx.id < 1) {
|
||||
wpa_printf(MSG_ERROR, "DPP: failed to start listen as dpp not initialized or bootstrapped.");
|
||||
return ESP_FAIL;
|
||||
}
|
||||
|
||||
if (esp_wifi_get_user_init_flag_internal() == 0) {
|
||||
wpa_printf(MSG_ERROR, "DPP: ROC not possible before wifi is started");
|
||||
return ESP_ERR_INVALID_STATE;
|
||||
@ -598,6 +611,15 @@ void esp_supp_dpp_stop_listen(void)
|
||||
|
||||
esp_err_t esp_supp_dpp_init(esp_supp_dpp_event_cb_t cb)
|
||||
{
|
||||
wifi_mode_t mode = 0;
|
||||
if (esp_wifi_get_mode(&mode) || ((mode != WIFI_MODE_STA) && (mode != WIFI_MODE_APSTA))) {
|
||||
wpa_printf(MSG_ERROR, "DPP: failed to init as not in station mode.");
|
||||
return ESP_FAIL;
|
||||
}
|
||||
if (s_dpp_ctx.dpp_global) {
|
||||
wpa_printf(MSG_ERROR, "DPP: failed to init as init already done.");
|
||||
return ESP_FAIL;
|
||||
}
|
||||
struct dpp_global_config cfg = {0};
|
||||
int ret;
|
||||
|
||||
@ -647,7 +669,10 @@ void esp_supp_dpp_deinit(void)
|
||||
esp_event_handler_unregister(WIFI_EVENT, WIFI_EVENT_ROC_DONE,
|
||||
&offchan_event_handler);
|
||||
s_dpp_auth_retries = 0;
|
||||
dpp_global_deinit(s_dpp_ctx.dpp_global);
|
||||
esp_dpp_post_evt(SIG_DPP_DEL_TASK, 0);
|
||||
if (s_dpp_ctx.dpp_global) {
|
||||
dpp_global_deinit(s_dpp_ctx.dpp_global);
|
||||
s_dpp_ctx.dpp_global = NULL;
|
||||
esp_dpp_post_evt(SIG_DPP_DEL_TASK, 0);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -43,7 +43,7 @@ struct dpp_global {
|
||||
static const struct dpp_curve_params dpp_curves[] = {
|
||||
/* The mandatory to support and the default NIST P-256 curve needs to
|
||||
* be the first entry on this list. */
|
||||
{ "sec256r1", 32, 32, 16, 32, "P-256", 19, "ES256" },
|
||||
{ "secp256r1", 32, 32, 16, 32, "P-256", 19, "ES256" },
|
||||
{ "secp384r1", 48, 48, 24, 48, "P-384", 20, "ES384" },
|
||||
{ "secp521r1", 64, 64, 32, 66, "P-521", 21, "ES512" },
|
||||
{ "brainpoolP256r1", 32, 32, 16, 32, "BP-256", 28, "BS256" },
|
||||
@ -4669,7 +4669,8 @@ static struct crypto_key * dpp_parse_jwk(struct json_token *jwk,
|
||||
{
|
||||
struct json_token *token;
|
||||
const struct dpp_curve_params *curve;
|
||||
struct wpabuf *x = NULL, *y = NULL, *a = NULL;
|
||||
struct wpabuf *x = NULL, *y = NULL;
|
||||
unsigned char *a = NULL;
|
||||
struct crypto_ec_group *group;
|
||||
struct crypto_key *pkey = NULL;
|
||||
size_t len;
|
||||
@ -4731,17 +4732,19 @@ static struct crypto_key * dpp_parse_jwk(struct json_token *jwk,
|
||||
goto fail;
|
||||
}
|
||||
|
||||
len = wpabuf_len(x);
|
||||
a = wpabuf_concat(x, y);
|
||||
pkey = crypto_ec_set_pubkey_point(group, wpabuf_head(a),
|
||||
len);
|
||||
len = wpabuf_len(x) + wpabuf_len(y);
|
||||
a = os_zalloc(len);
|
||||
os_memcpy(a, wpabuf_head(x), wpabuf_len(x));
|
||||
os_memcpy(a + wpabuf_len(x), wpabuf_head(y), wpabuf_len(y));
|
||||
pkey = crypto_ec_set_pubkey_point(group, a, len);
|
||||
|
||||
crypto_ec_deinit((struct crypto_ec *)group);
|
||||
*key_curve = curve;
|
||||
|
||||
fail:
|
||||
wpabuf_free(a);
|
||||
wpabuf_free(x);
|
||||
wpabuf_free(y);
|
||||
os_free(a);
|
||||
|
||||
return pkey;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user