mirror of
https://github.com/esphome/esphome.git
synced 2026-09-24 21:44:04 +00:00
[esp32_ble] allow setting of min/max key_size and auth_req_mode
This commit is contained in:
@@ -187,6 +187,9 @@ def register_bt_logger(*loggers: BTLoggers) -> None:
|
||||
|
||||
CONF_BLE_ID = "ble_id"
|
||||
CONF_IO_CAPABILITY = "io_capability"
|
||||
CONF_AUTH_REQ_MODE = "auth_req_mode"
|
||||
CONF_MAX_KEY_SIZE = "max_key_size"
|
||||
CONF_MIN_KEY_SIZE = "min_key_size"
|
||||
CONF_ADVERTISING = "advertising"
|
||||
CONF_ADVERTISING_CYCLE_TIME = "advertising_cycle_time"
|
||||
CONF_DISABLE_BT_LOGS = "disable_bt_logs"
|
||||
@@ -237,6 +240,18 @@ IO_CAPABILITY = {
|
||||
"display_yes_no": IoCapability.IO_CAP_IO,
|
||||
}
|
||||
|
||||
AuthReqMode = esp32_ble_ns.enum("AuthReqMode")
|
||||
AUTH_REQ_MODE = {
|
||||
"no_bond": AuthReqMode.AUTH_REQ_NO_BOND,
|
||||
"bond": AuthReqMode.AUTH_REQ_BOND,
|
||||
"mitm": AuthReqMode.AUTH_REQ_MITM,
|
||||
"bond_mitm": AuthReqMode.AUTH_REQ_BOND_MITM,
|
||||
"sc_only": AuthReqMode.AUTH_REQ_SC_ONLY,
|
||||
"sc_bond": AuthReqMode.AUTH_REQ_SC_BOND,
|
||||
"sc_mitm": AuthReqMode.AUTH_REQ_SC_MITM,
|
||||
"sc_mitm_bond": AuthReqMode.AUTH_REQ_SC_MITM_BOND,
|
||||
}
|
||||
|
||||
esp_power_level_t = cg.global_ns.enum("esp_power_level_t")
|
||||
|
||||
TX_POWER_LEVELS = {
|
||||
@@ -257,6 +272,11 @@ CONFIG_SCHEMA = cv.Schema(
|
||||
cv.Optional(CONF_IO_CAPABILITY, default="none"): cv.enum(
|
||||
IO_CAPABILITY, lower=True
|
||||
),
|
||||
cv.Optional(CONF_AUTH_REQ_MODE, default="no_bond"): cv.enum(
|
||||
AUTH_REQ_MODE, lower=True
|
||||
),
|
||||
cv.Optional(CONF_MAX_KEY_SIZE, default="16"): cv.int_range(min=7, max=16),
|
||||
cv.Optional(CONF_MIN_KEY_SIZE, default="7"): cv.int_range(min=7, max=16),
|
||||
cv.Optional(CONF_ENABLE_ON_BOOT, default=True): cv.boolean,
|
||||
cv.Optional(CONF_ADVERTISING, default=False): cv.boolean,
|
||||
cv.Optional(
|
||||
@@ -477,6 +497,13 @@ async def to_code(config):
|
||||
var = cg.new_Pvariable(config[CONF_ID])
|
||||
cg.add(var.set_enable_on_boot(config[CONF_ENABLE_ON_BOOT]))
|
||||
cg.add(var.set_io_capability(config[CONF_IO_CAPABILITY]))
|
||||
if CONF_AUTH_REQ_MODE in config:
|
||||
cg.add(var.set_auth_req(config[CONF_AUTH_REQ_MODE]))
|
||||
if CONF_MAX_KEY_SIZE in config:
|
||||
cg.add(var.set_max_key_size(config[CONF_MAX_KEY_SIZE]))
|
||||
if CONF_MIN_KEY_SIZE in config:
|
||||
cg.add(var.set_min_key_size(config[CONF_MIN_KEY_SIZE]))
|
||||
|
||||
cg.add(var.set_advertising_cycle_time(config[CONF_ADVERTISING_CYCLE_TIME]))
|
||||
if (name := config.get(CONF_NAME)) is not None:
|
||||
cg.add(var.set_name(name))
|
||||
|
||||
@@ -296,12 +296,37 @@ bool ESP32BLE::ble_setup_() {
|
||||
return false;
|
||||
}
|
||||
|
||||
err = esp_ble_gap_set_security_param(ESP_BLE_SM_IOCAP_MODE, &(this->io_cap_), sizeof(uint8_t));
|
||||
err = esp_ble_gap_set_security_param(ESP_BLE_SM_IOCAP_MODE, &(this->io_cap_), sizeof(esp_ble_io_cap_t));
|
||||
if (err != ESP_OK) {
|
||||
ESP_LOGE(TAG, "esp_ble_gap_set_security_param failed: %d", err);
|
||||
ESP_LOGE(TAG, "esp_ble_gap_set_security_param iocap_mode failed: %d", err);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (this->max_key_size_) {
|
||||
err = esp_ble_gap_set_security_param(ESP_BLE_SM_MAX_KEY_SIZE, &(this->max_key_size_), sizeof(uint8_t));
|
||||
if (err != ESP_OK) {
|
||||
ESP_LOGE(TAG, "esp_ble_gap_set_security_param max_key_size failed: %d", err);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (this->min_key_size_) {
|
||||
err = esp_ble_gap_set_security_param(ESP_BLE_SM_MIN_KEY_SIZE, &(this->min_key_size_), sizeof(uint8_t));
|
||||
if (err != ESP_OK) {
|
||||
ESP_LOGE(TAG, "esp_ble_gap_set_security_param min_key_size failed: %d", err);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (this->auth_req_mode_) {
|
||||
err = esp_ble_gap_set_security_param(ESP_BLE_SM_AUTHEN_REQ_MODE, &(this->auth_req_mode_.value()),
|
||||
sizeof(esp_ble_auth_req_t));
|
||||
if (err != ESP_OK) {
|
||||
ESP_LOGE(TAG, "esp_ble_gap_set_security_param authen_req_mode failed: %d", err);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// BLE takes some time to be fully set up, 200ms should be more than enough
|
||||
delay(200); // NOLINT
|
||||
|
||||
@@ -645,13 +670,53 @@ void ESP32BLE::dump_config() {
|
||||
io_capability_s = "invalid";
|
||||
break;
|
||||
}
|
||||
|
||||
const char *auth_req_mode_s = "<default>";
|
||||
if (this->auth_req_mode_) {
|
||||
switch (this->auth_req_mode_.value()) {
|
||||
case AUTH_REQ_NO_BOND:
|
||||
auth_req_mode_s = "no_bond";
|
||||
break;
|
||||
case AUTH_REQ_BOND:
|
||||
auth_req_mode_s = "bond";
|
||||
break;
|
||||
case AUTH_REQ_MITM:
|
||||
auth_req_mode_s = "mitm";
|
||||
break;
|
||||
case AUTH_REQ_BOND_MITM:
|
||||
auth_req_mode_s = "bond_mitm";
|
||||
break;
|
||||
case AUTH_REQ_SC_ONLY:
|
||||
auth_req_mode_s = "sc_only";
|
||||
break;
|
||||
case AUTH_REQ_SC_BOND:
|
||||
auth_req_mode_s = "sc_bond";
|
||||
break;
|
||||
case AUTH_REQ_SC_MITM:
|
||||
auth_req_mode_s = "sc_mitm";
|
||||
break;
|
||||
case AUTH_REQ_SC_MITM_BOND:
|
||||
auth_req_mode_s = "sc_mitm_bond";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
char mac_s[18];
|
||||
format_mac_addr_upper(mac_address, mac_s);
|
||||
|
||||
ESP_LOGCONFIG(TAG,
|
||||
"BLE:\n"
|
||||
" MAC address: %s\n"
|
||||
" IO Capability: %s",
|
||||
mac_s, io_capability_s);
|
||||
ESP_LOGCONFIG(TAG, " Auth Req Mode: %s", auth_req_mode_s);
|
||||
if (this->max_key_size_ && this->min_key_size_) {
|
||||
ESP_LOGCONFIG(TAG, " Key Size: %u - %u", this->min_key_size_, this->max_key_size_);
|
||||
} else if (this->max_key_size_) {
|
||||
ESP_LOGCONFIG(TAG, " Key Size: <default> - %u", this->max_key_size_);
|
||||
} else if (this->max_key_size_) {
|
||||
ESP_LOGCONFIG(TAG, " Key Size: %u - <default>", this->min_key_size_);
|
||||
}
|
||||
} else {
|
||||
ESP_LOGCONFIG(TAG, "Bluetooth stack is not enabled");
|
||||
}
|
||||
|
||||
@@ -52,6 +52,17 @@ enum IoCapability {
|
||||
IO_CAP_KBDISP = ESP_IO_CAP_KBDISP,
|
||||
};
|
||||
|
||||
enum AuthReqMode {
|
||||
AUTH_REQ_NO_BOND = ESP_LE_AUTH_NO_BOND,
|
||||
AUTH_REQ_BOND = ESP_LE_AUTH_BOND,
|
||||
AUTH_REQ_MITM = ESP_LE_AUTH_REQ_MITM,
|
||||
AUTH_REQ_BOND_MITM = ESP_LE_AUTH_REQ_BOND_MITM,
|
||||
AUTH_REQ_SC_ONLY = ESP_LE_AUTH_REQ_SC_ONLY,
|
||||
AUTH_REQ_SC_BOND = ESP_LE_AUTH_REQ_SC_BOND,
|
||||
AUTH_REQ_SC_MITM = ESP_LE_AUTH_REQ_SC_MITM,
|
||||
AUTH_REQ_SC_MITM_BOND = ESP_LE_AUTH_REQ_SC_MITM_BOND,
|
||||
};
|
||||
|
||||
enum BLEComponentState : uint8_t {
|
||||
/** Nothing has been initialized yet. */
|
||||
BLE_COMPONENT_STATE_OFF = 0,
|
||||
@@ -99,6 +110,9 @@ class BLEStatusEventHandler {
|
||||
class ESP32BLE : public Component {
|
||||
public:
|
||||
void set_io_capability(IoCapability io_capability) { this->io_cap_ = (esp_ble_io_cap_t) io_capability; }
|
||||
void set_max_key_size(uint8_t key_size) { this->max_key_size_ = key_size; }
|
||||
void set_min_key_size(uint8_t key_size) { this->min_key_size_ = key_size; }
|
||||
void set_auth_req(AuthReqMode req) { this->auth_req_mode_ = (esp_ble_auth_req_t) req; }
|
||||
|
||||
void set_advertising_cycle_time(uint32_t advertising_cycle_time) {
|
||||
this->advertising_cycle_time_ = advertising_cycle_time;
|
||||
@@ -202,6 +216,7 @@ class ESP32BLE : public Component {
|
||||
const char *name_{nullptr}; // 4 bytes (pointer to string literal in flash)
|
||||
esp_ble_io_cap_t io_cap_{ESP_IO_CAP_NONE}; // 4 bytes (enum)
|
||||
uint32_t advertising_cycle_time_{}; // 4 bytes
|
||||
optional<esp_ble_auth_req_t> auth_req_mode_;
|
||||
|
||||
// 2-byte aligned members
|
||||
uint16_t appearance_{0}; // 2 bytes
|
||||
@@ -209,6 +224,8 @@ class ESP32BLE : public Component {
|
||||
// 1-byte aligned members (grouped together to minimize padding)
|
||||
BLEComponentState state_{BLE_COMPONENT_STATE_OFF}; // 1 byte (uint8_t enum)
|
||||
bool enable_on_boot_{}; // 1 byte
|
||||
uint8_t max_key_size_{0}; // range is 7..16, 0 is unset
|
||||
uint8_t min_key_size_{0}; // range is 7..16, 0 is unset
|
||||
};
|
||||
|
||||
// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
|
||||
|
||||
Reference in New Issue
Block a user