From ea678c3fd1c8231a065a0eb1433986b1f960e504 Mon Sep 17 00:00:00 2001 From: xiewenxiang Date: Thu, 3 Dec 2020 20:36:19 +0800 Subject: [PATCH] component/bt: support BLE Application Layer Encryption key size check --- .../bt/bluedroid/api/include/api/esp_gap_ble_api.h | 2 ++ components/bt/bluedroid/bta/dm/bta_dm_co.c | 12 ++++++++++++ components/bt/bluedroid/bta/include/bta/bta_dm_co.h | 2 ++ .../bt/bluedroid/btc/profile/std/gap/btc_gap_ble.c | 6 ++++++ .../bt/bluedroid/common/include/common/bte_appl.h | 1 + components/bt/bluedroid/stack/gatt/gatt_db.c | 12 ++++++++++++ .../bt/bluedroid/stack/include/stack/btm_api.h | 1 + 7 files changed, 36 insertions(+) diff --git a/components/bt/bluedroid/api/include/api/esp_gap_ble_api.h b/components/bt/bluedroid/api/include/api/esp_gap_ble_api.h index 19e47c35172..8326e96caf9 100644 --- a/components/bt/bluedroid/api/include/api/esp_gap_ble_api.h +++ b/components/bt/bluedroid/api/include/api/esp_gap_ble_api.h @@ -287,6 +287,8 @@ typedef enum { ESP_BLE_SM_ONLY_ACCEPT_SPECIFIED_SEC_AUTH, /* Enable/Disable OOB support */ ESP_BLE_SM_OOB_SUPPORT, + /* Appl encryption key size */ + ESP_BLE_APP_ENC_KEY_SIZE, ESP_BLE_SM_MAX_PARAM, } esp_ble_sm_param_t; diff --git a/components/bt/bluedroid/bta/dm/bta_dm_co.c b/components/bt/bluedroid/bta/dm/bta_dm_co.c index 5fdf0812a5f..2a8bff6cbee 100644 --- a/components/bt/bluedroid/bta/dm/bta_dm_co.c +++ b/components/bt/bluedroid/bta/dm/bta_dm_co.c @@ -51,6 +51,7 @@ tBTE_APPL_CFG bte_appl_cfg = { BTM_BLE_MIN_KEY_SIZE, BTM_BLE_ONLY_ACCEPT_SPECIFIED_SEC_AUTH_DISABLE, BTM_BLE_OOB_DISABLE, + BTM_BLE_APPL_ENC_KEY_SIZE, }; #endif @@ -427,6 +428,17 @@ void bta_dm_co_ble_set_min_key_size(UINT8 ble_key_size) #endif ///SMP_INCLUDED == TRUE } +void bta_dm_co_ble_set_appl_enc_key_size(UINT8 ble_key_size) +{ +#if (SMP_INCLUDED == TRUE) + if(ble_key_size >= bte_appl_cfg.ble_min_key_size && ble_key_size <= bte_appl_cfg.ble_max_key_size) { + bte_appl_cfg.ble_appl_enc_key_size = ble_key_size; + } else { + APPL_TRACE_ERROR("%s error:Invalid key size value, key_size =%d",__func__, ble_key_size); + } +#endif ///SMP_INCLUDED == TRUE +} + void bta_dm_co_ble_set_accept_auth_enable(UINT8 enable) { #if (SMP_INCLUDED == TRUE) diff --git a/components/bt/bluedroid/bta/include/bta/bta_dm_co.h b/components/bt/bluedroid/bta/include/bta/bta_dm_co.h index 99667cb0163..42e5fd54b35 100644 --- a/components/bt/bluedroid/bta/include/bta/bta_dm_co.h +++ b/components/bt/bluedroid/bta/include/bta/bta_dm_co.h @@ -214,4 +214,6 @@ extern UINT8 bta_dm_co_ble_get_accept_auth_enable(void); extern UINT8 bta_dm_co_ble_get_auth_req(void); extern void bta_dm_co_ble_oob_support(UINT8 enable); + +extern void bta_dm_co_ble_set_appl_enc_key_size(UINT8 ble_key_size); #endif diff --git a/components/bt/bluedroid/btc/profile/std/gap/btc_gap_ble.c b/components/bt/bluedroid/btc/profile/std/gap/btc_gap_ble.c index 505488fa09b..6efcb9c5910 100644 --- a/components/bt/bluedroid/btc/profile/std/gap/btc_gap_ble.c +++ b/components/bt/bluedroid/btc/profile/std/gap/btc_gap_ble.c @@ -1220,6 +1220,12 @@ void btc_gap_ble_call_handler(btc_msg_t *msg) bta_dm_co_ble_oob_support(enable); break; } + case ESP_BLE_APP_ENC_KEY_SIZE: { + uint8_t key_size = 0; + STREAM_TO_UINT8(key_size, value); + bta_dm_co_ble_set_appl_enc_key_size(key_size); + break; + } default: break; } diff --git a/components/bt/bluedroid/common/include/common/bte_appl.h b/components/bt/bluedroid/common/include/common/bte_appl.h index 67f4108358e..573b86dba0b 100644 --- a/components/bt/bluedroid/common/include/common/bte_appl.h +++ b/components/bt/bluedroid/common/include/common/bte_appl.h @@ -34,6 +34,7 @@ typedef struct { UINT8 ble_min_key_size; UINT8 ble_accept_auth_enable; UINT8 oob_support; + UINT8 ble_appl_enc_key_size; #endif } tBTE_APPL_CFG; diff --git a/components/bt/bluedroid/stack/gatt/gatt_db.c b/components/bt/bluedroid/stack/gatt/gatt_db.c index 9c1920fe8e9..eb5eb6d2470 100644 --- a/components/bt/bluedroid/stack/gatt/gatt_db.c +++ b/components/bt/bluedroid/stack/gatt/gatt_db.c @@ -34,6 +34,7 @@ #include "gatt_int.h" #include "stack/l2c_api.h" #include "btm_int.h" +#include "common/bte_appl.h" /******************************************************************************** ** L O C A L F U N C T I O N P R O T O T Y P E S * @@ -124,10 +125,15 @@ static tGATT_STATUS gatts_check_attr_readability(tGATT_ATTR16 *p_attr, tGATT_PERM perm = p_attr->permission; UNUSED(offset); + +#if SMP_INCLUDED == TRUE + min_key_size = bte_appl_cfg.ble_appl_enc_key_size; +#else min_key_size = (((perm & GATT_ENCRYPT_KEY_SIZE_MASK) >> 12)); if (min_key_size != 0 ) { min_key_size += 6; } +#endif if (!(perm & GATT_READ_ALLOWED)) { GATT_TRACE_ERROR( "GATT_READ_NOT_PERMIT\n"); @@ -1073,10 +1079,16 @@ tGATT_STATUS gatts_write_attr_perm_check (tGATT_SVC_DB *p_db, UINT8 op_code, while (p_attr != NULL) { if (p_attr->handle == handle) { perm = p_attr->permission; + + #if SMP_INCLUDED == TRUE + min_key_size = bte_appl_cfg.ble_appl_enc_key_size; + #else min_key_size = (((perm & GATT_ENCRYPT_KEY_SIZE_MASK) >> 12)); if (min_key_size != 0 ) { min_key_size += 6; } + + #endif GATT_TRACE_DEBUG( "gatts_write_attr_perm_check p_attr->permission =0x%04x min_key_size==0x%04x", p_attr->permission, min_key_size); diff --git a/components/bt/bluedroid/stack/include/stack/btm_api.h b/components/bt/bluedroid/stack/include/stack/btm_api.h index 754a2b945ca..29d8502cb70 100644 --- a/components/bt/bluedroid/stack/include/stack/btm_api.h +++ b/components/bt/bluedroid/stack/include/stack/btm_api.h @@ -1430,6 +1430,7 @@ typedef UINT8 tBTM_IO_CAP; #define BTM_BLE_RESPONDER_KEY_SIZE 15 #define BTM_BLE_MAX_KEY_SIZE 16 #define BTM_BLE_MIN_KEY_SIZE 7 +#define BTM_BLE_APPL_ENC_KEY_SIZE 7 typedef UINT8 tBTM_AUTH_REQ;