diff --git a/components/esp_wifi/include/esp_wifi_types_generic.h b/components/esp_wifi/include/esp_wifi_types_generic.h index f3abe1aefcf..91585166ba9 100644 --- a/components/esp_wifi/include/esp_wifi_types_generic.h +++ b/components/esp_wifi/include/esp_wifi_types_generic.h @@ -875,7 +875,7 @@ typedef struct { #define ESP_WIFI_NAN_NDP_PMK_LEN 32 /**< Length of NAN Datapath PMK */ #define ESP_WIFI_NAN_NPK_LEN ESP_WIFI_NAN_NDP_PMK_LEN /**< Length of NAN Pairwise Key (same as NDP PMK) */ #define ESP_WIFI_NAN_NDP_PMKID_LEN 16 /**< Length of NAN Datapath PMKID */ -#define ESP_WIFI_NAN_MAX_PEER_CREDS 2 /**< cred.pincode != UINT32_MAX && + cfg->cred.pincode > NAN_PAIRING_PINCODE_MAX) { + ESP_LOGE(TAG, "Invalid pincode %u (valid range %u..%u or UINT32_MAX for default)", + cfg->cred.pincode, NAN_PAIRING_PINCODE_MIN, NAN_PAIRING_PINCODE_MAX); + return ESP_ERR_INVALID_ARG; + } + int ret; switch (cfg->self_role) { @@ -497,13 +504,16 @@ static void nan_pairing_nik_fup_timeout_cb(void *eloop_data, void *user_ctx) } own->nik_fup_pending = false; - evt.status = WIFI_NAN_PAIRING_STATUS_REJECTED; + evt.status = WIFI_NAN_PAIRING_STATUS_ACCEPTED; evt.reason_code = WIFI_NAN_PAIRING_REASON_NIK_FUP_TIMEOUT; MACADDR_COPY(evt.peer_nmi, own->nik_fup_pending_peer_nmi); +#if defined(CONFIG_ESP_WIFI_NAN_SECURITY) + nan_app_remove_paired_peer(own->nik_fup_pending_peer_nmi); +#endif esp_nan_complete_pairing(own->svc_id); nan_app_post_event(WIFI_EVENT_NAN_PAIRING_CONFIRM, &evt, sizeof(evt)); - ESP_LOGW(TAG, "Pairing NIK follow-up timed out for peer " MACSTR, - MAC2STR(own->nik_fup_pending_peer_nmi)); + ESP_LOGW(TAG, "Pairing succeeded but NIK caching timed out for peer " MACSTR + " (reason=%u)", MAC2STR(own->nik_fup_pending_peer_nmi), evt.reason_code); } /** diff --git a/components/esp_wifi/wifi_apps/nan_app/src/nan_security.c b/components/esp_wifi/wifi_apps/nan_app/src/nan_security.c index 5fbf2b8227c..8e6df442bcc 100644 --- a/components/esp_wifi/wifi_apps/nan_app/src/nan_security.c +++ b/components/esp_wifi/wifi_apps/nan_app/src/nan_security.c @@ -99,36 +99,6 @@ static bool nan_csid_bitmap_has_pasn(uint16_t csid_bitmap) return (csid_bitmap & WIFI_NAN_CSID_BIT_NCS_PK_PASN_128) != 0; } -/* - * Service ID = first 6 bytes of SHA256(lowercase(service_name)) - * per Wi-Fi Aware v4.0 §5.1.5 (Service Name and Service ID). - */ -bool nan_compute_service_id(const char *service_name, uint8_t service_id[6]) -{ - if (!service_name || !g_wifi_default_wpa_crypto_funcs.sha256_vector) { - return false; - } - size_t name_len = strlen(service_name); - char *lower = os_malloc(name_len + 1); - if (!lower) { - return false; - } - strlcpy(lower, service_name, name_len + 1); - for (char *p = lower; *p; p++) { - *p = tolower((unsigned char) * p); - } - uint8_t hash[32]; - const uint8_t *addr[1] = {(const uint8_t *)lower}; - size_t len[1] = {name_len}; - int ret = g_wifi_default_wpa_crypto_funcs.sha256_vector(1, addr, len, hash); - os_free(lower); - if (ret != 0) { - return false; - } - memcpy(service_id, hash, 6); - return true; -} - #define NAN_SERVICE_ID_LEN 6 /* diff --git a/components/wpa_supplicant/esp_supplicant/src/esp_nan_supplicant.c b/components/wpa_supplicant/esp_supplicant/src/esp_nan_supplicant.c index c332d1a47bd..b5e2eee2840 100644 --- a/components/wpa_supplicant/esp_supplicant/src/esp_nan_supplicant.c +++ b/components/wpa_supplicant/esp_supplicant/src/esp_nan_supplicant.c @@ -1587,7 +1587,7 @@ static void nan_pasn_auth_eloop_cb(void *eloop_ctx, void *user_data) if (ctx->pincode != UINT32_MAX) { n = os_snprintf(pin_digits, sizeof(pin_digits), "%06u", - (unsigned)(ctx->pincode % 1000000U)); + (unsigned)ctx->pincode); if (os_snprintf_error(sizeof(pin_digits), n)) { nan_pasn_data_deinit(pd); os_free(ctx); @@ -1746,7 +1746,7 @@ int pasn_responder_init(const uint8_t *peer_addr, uint32_t pincode) if (pincode != UINT32_MAX) { n = os_snprintf(pin_digits, sizeof(pin_digits), "%06u", - (unsigned)(pincode % 1000000U)); + (unsigned)pincode); if (os_snprintf_error(sizeof(pin_digits), n)) { goto fail; } diff --git a/components/wpa_supplicant/esp_supplicant/src/esp_wifi_driver.h b/components/wpa_supplicant/esp_supplicant/src/esp_wifi_driver.h index a71272dcc4c..8040f4c297c 100644 --- a/components/wpa_supplicant/esp_supplicant/src/esp_wifi_driver.h +++ b/components/wpa_supplicant/esp_supplicant/src/esp_wifi_driver.h @@ -243,8 +243,8 @@ typedef enum { typedef struct { uint8_t peer_nik[ESP_WIFI_NAN_NIK_LEN]; /**< Peer's NAN Identity Key (16 bytes) */ uint8_t npk[ESP_WIFI_NAN_NPK_LEN]; /**< NAN Pairwise Key / NCS-SK PMK (32 bytes) */ - uint8_t service_hash[6]; - bool is_valid; + uint8_t service_hash[6]; /**< Service Hash of the corresponding service */ + bool is_valid; /**< True if this credential entry is valid */ } wifi_nan_peer_creds_t; typedef wifi_scan_channel_bitmap_t channel_bitmap_t; @@ -344,7 +344,7 @@ uint8_t esp_wifi_ap_get_owe_config_internal(void); esp_err_t esp_nan_complete_pairing(uint8_t svc_id); esp_err_t esp_wifi_nan_load_saved_creds(uint8_t own_nik[ESP_WIFI_NAN_NIK_LEN], bool *own_nik_valid, wifi_nan_peer_creds_t peer_creds[ESP_WIFI_NAN_MAX_PEER_CREDS], uint8_t *num_peer_creds); -esp_err_t esp_wifi_nan_save_own_nik(const uint8_t own_nik[ESP_WIFI_NAN_NIK_LEN]) ; +esp_err_t esp_wifi_nan_save_own_nik(const uint8_t own_nik[ESP_WIFI_NAN_NIK_LEN]); esp_err_t esp_wifi_nan_save_creds_for_peer(const uint8_t peer_nik[ESP_WIFI_NAN_NIK_LEN], const uint8_t npk[ESP_WIFI_NAN_NPK_LEN], const uint8_t service_hash[6]); esp_err_t esp_wifi_nan_erase_all_creds(void);