From 74a053bd4e064e0b991dc2423c50f8353dfbf0fb Mon Sep 17 00:00:00 2001 From: zhanghaipeng Date: Tue, 31 Mar 2026 15:07:57 +0800 Subject: [PATCH] fix(bt/bluedroid): fix BLE SMP pairing failure on BLE-only devices when using default param --- components/bt/host/bluedroid/bta/dm/bta_dm_co.c | 12 ++++++------ .../bt/host/bluedroid/stack/include/stack/btm_api.h | 9 +++++++-- components/bt/host/bluedroid/stack/smp/smp_keys.c | 7 ++++--- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/components/bt/host/bluedroid/bta/dm/bta_dm_co.c b/components/bt/host/bluedroid/bta/dm/bta_dm_co.c index 085697acb9..cf60dc1370 100644 --- a/components/bt/host/bluedroid/bta/dm/bta_dm_co.c +++ b/components/bt/host/bluedroid/bta/dm/bta_dm_co.c @@ -45,8 +45,8 @@ tBTE_APPL_CFG bte_appl_cfg = { BTM_AUTH_SPGB_YES, // Authentication requirements #endif BTM_LOCAL_IO_CAPS_BLE, - BTM_BLE_INITIATOR_KEY_SIZE, - BTM_BLE_RESPONDER_KEY_SIZE, + BTM_BLE_INITIATOR_KEY_MASK, + BTM_BLE_RESPONDER_KEY_MASK, BTM_BLE_MAX_KEY_SIZE, BTM_BLE_MIN_KEY_SIZE, BTM_BLE_ONLY_ACCEPT_SPECIFIED_SEC_AUTH_DISABLE, @@ -57,8 +57,8 @@ void bta_dm_co_security_param_init(void) { bte_appl_cfg.ble_auth_req = BTA_LE_AUTH_REQ_SC_MITM_BOND; bte_appl_cfg.ble_io_cap = BTM_LOCAL_IO_CAPS_BLE; - bte_appl_cfg.ble_init_key = BTM_BLE_INITIATOR_KEY_SIZE; - bte_appl_cfg.ble_resp_key = BTM_BLE_RESPONDER_KEY_SIZE; + bte_appl_cfg.ble_init_key = BTM_BLE_INITIATOR_KEY_MASK; + bte_appl_cfg.ble_resp_key = BTM_BLE_RESPONDER_KEY_MASK; bte_appl_cfg.ble_max_key_size = BTM_BLE_MAX_KEY_SIZE; bte_appl_cfg.ble_min_key_size = BTM_BLE_MIN_KEY_SIZE; bte_appl_cfg.ble_accept_auth_enable = BTM_BLE_ONLY_ACCEPT_SPECIFIED_SEC_AUTH_DISABLE; @@ -368,11 +368,11 @@ void bta_dm_co_ble_io_req(BD_ADDR bd_addr, tBTA_IO_CAP *p_io_cap, *p_io_cap = bte_appl_cfg.ble_io_cap; } - if (bte_appl_cfg.ble_init_key <= BTM_BLE_INITIATOR_KEY_SIZE) { + if ((bte_appl_cfg.ble_init_key & ~BTM_BLE_INITIATOR_KEY_MASK) == 0) { *p_init_key = bte_appl_cfg.ble_init_key; } - if (bte_appl_cfg.ble_resp_key <= BTM_BLE_RESPONDER_KEY_SIZE) { + if ((bte_appl_cfg.ble_resp_key & ~BTM_BLE_RESPONDER_KEY_MASK) == 0) { *p_resp_key = bte_appl_cfg.ble_resp_key; } diff --git a/components/bt/host/bluedroid/stack/include/stack/btm_api.h b/components/bt/host/bluedroid/stack/include/stack/btm_api.h index 94a000a976..15dccaa115 100644 --- a/components/bt/host/bluedroid/stack/include/stack/btm_api.h +++ b/components/bt/host/bluedroid/stack/include/stack/btm_api.h @@ -1586,8 +1586,13 @@ typedef UINT8 tBTM_IO_CAP; #define BTM_BLE_CSR_KEY_MASK (1 << 2) #define BTM_BLE_LINK_KEY_MASK (1 << 3) -#define BTM_BLE_INITIATOR_KEY_SIZE 15 -#define BTM_BLE_RESPONDER_KEY_SIZE 15 +#if (CLASSIC_BT_INCLUDED == TRUE) +#define BTM_BLE_INITIATOR_KEY_MASK (BTM_BLE_ENC_KEY_MASK | BTM_BLE_ID_KEY_MASK | BTM_BLE_CSR_KEY_MASK | BTM_BLE_LINK_KEY_MASK) +#define BTM_BLE_RESPONDER_KEY_MASK (BTM_BLE_ENC_KEY_MASK | BTM_BLE_ID_KEY_MASK | BTM_BLE_CSR_KEY_MASK | BTM_BLE_LINK_KEY_MASK) +#else +#define BTM_BLE_INITIATOR_KEY_MASK (BTM_BLE_ENC_KEY_MASK | BTM_BLE_ID_KEY_MASK | BTM_BLE_CSR_KEY_MASK) +#define BTM_BLE_RESPONDER_KEY_MASK (BTM_BLE_ENC_KEY_MASK | BTM_BLE_ID_KEY_MASK | BTM_BLE_CSR_KEY_MASK) +#endif #define BTM_BLE_MAX_KEY_SIZE 16 #define BTM_BLE_MIN_KEY_SIZE 7 diff --git a/components/bt/host/bluedroid/stack/smp/smp_keys.c b/components/bt/host/bluedroid/stack/smp/smp_keys.c index 0ed04c0b33..ba6b7fd309 100644 --- a/components/bt/host/bluedroid/stack/smp/smp_keys.c +++ b/components/bt/host/bluedroid/stack/smp/smp_keys.c @@ -2299,9 +2299,10 @@ BOOLEAN smp_calculate_link_key_from_long_term_key(tSMP_CB *p_cb) link_key_type = BTM_LKEY_TYPE_UNAUTH_COMB; } } else { - SMP_TRACE_ERROR ("%s failed to update link_key. Sec Mode = %d, sm4 = 0x%02x", - __func__, btm_cb.security_mode, p_dev_rec->sm4); - return FALSE; + SMP_TRACE_WARNING ("%s BR/EDR transport not available (Sec Mode = %d, sm4 = 0x%02x), " + "skip LK derivation", + __func__, btm_cb.security_mode, p_dev_rec->sm4); + return TRUE; } link_key_type += BTM_LTK_DERIVED_LKEY_OFFSET;