1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-02-02 02:41:28 +00:00

feat(ble): add command to erase bond belonging to currently connected device

[no changelog]
This commit is contained in:
tychovrahe 2025-01-13 13:11:26 +01:00
parent 53f0a840a3
commit 69679d9f9f
3 changed files with 50 additions and 10 deletions

View File

@ -81,6 +81,7 @@ typedef enum {
INTERNAL_CMD_ACK = 0x05, INTERNAL_CMD_ACK = 0x05,
INTERNAL_CMD_ALLOW_PAIRING = 0x06, INTERNAL_CMD_ALLOW_PAIRING = 0x06,
INTERNAL_CMD_REJECT_PAIRING = 0x07, INTERNAL_CMD_REJECT_PAIRING = 0x07,
INTERNAL_CMD_UNPAIR = 0x08,
} internal_cmd_t; } internal_cmd_t;
// BLE management functions // BLE management functions
@ -98,6 +99,8 @@ void management_send_pairing_cancelled_event(void);
bool bonds_erase_all(void); bool bonds_erase_all(void);
// Get number of bonded devices // Get number of bonded devices
int bonds_get_count(void); int bonds_get_count(void);
// Erase current bond
bool bonds_erase_current(void);
// Advertising functions // Advertising functions
// Initialization // Initialization

View File

@ -21,6 +21,7 @@
#include <zephyr/types.h> #include <zephyr/types.h>
#include <zephyr/bluetooth/bluetooth.h> #include <zephyr/bluetooth/bluetooth.h>
#include <zephyr/bluetooth/conn.h>
#include <zephyr/logging/log.h> #include <zephyr/logging/log.h>
@ -31,8 +32,6 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME);
#include "ble_internal.h" #include "ble_internal.h"
bool bonds_erase_all(void) { bool bonds_erase_all(void) {
int err = bt_unpair(BT_ID_DEFAULT, BT_ADDR_LE_ANY); int err = bt_unpair(BT_ID_DEFAULT, BT_ADDR_LE_ANY);
if (err) { if (err) {
@ -57,3 +56,24 @@ int bonds_get_count(void) {
return bond_cnt; return bond_cnt;
} }
bool bonds_erase_current(void) {
int err;
struct bt_conn *current = connection_get_current();
if (current == NULL) {
return false;
}
struct bt_conn_info info;
err = bt_conn_get_info(current, &info);
if (err) {
LOG_ERR("Failed to get connection info (err %d)", err);
return false;
}
err = bt_unpair(BT_ID_DEFAULT, info.le.dst);
return err == 0;
}

View File

@ -67,6 +67,13 @@ void management_send_success_event(void) {
trz_comm_send_msg(NRF_SERVICE_BLE_MANAGER, tx_data, sizeof(tx_data)); trz_comm_send_msg(NRF_SERVICE_BLE_MANAGER, tx_data, sizeof(tx_data));
} }
void management_send_failure_event(void) {
uint8_t tx_data[] = {
INTERNAL_EVENT_FAILURE,
};
trz_comm_send_msg(NRF_SERVICE_BLE_MANAGER, tx_data, sizeof(tx_data));
}
void management_send_pairing_cancelled_event(void) { void management_send_pairing_cancelled_event(void) {
uint8_t tx_data[1] = {0}; uint8_t tx_data[1] = {0};
@ -91,8 +98,11 @@ void management_send_pairing_request_event(uint8_t *data, uint16_t len) {
static void process_command(uint8_t *data, uint16_t len) { static void process_command(uint8_t *data, uint16_t len) {
uint8_t cmd = data[0]; uint8_t cmd = data[0];
bool success = true;
bool send_respons = true;
switch (cmd) { switch (cmd) {
case INTERNAL_CMD_SEND_STATE: case INTERNAL_CMD_SEND_STATE:
send_respons = false;
management_send_status_event(); management_send_status_event();
break; break;
case INTERNAL_CMD_ADVERTISING_ON: case INTERNAL_CMD_ADVERTISING_ON:
@ -103,25 +113,32 @@ static void process_command(uint8_t *data, uint16_t len) {
break; break;
case INTERNAL_CMD_ERASE_BONDS: case INTERNAL_CMD_ERASE_BONDS:
bonds_erase_all(); bonds_erase_all();
management_send_success_event();
break; break;
case INTERNAL_CMD_DISCONNECT: case INTERNAL_CMD_DISCONNECT:
connection_disconnect(); connection_disconnect();
management_send_success_event();
case INTERNAL_CMD_ACK: case INTERNAL_CMD_ACK:
// pb_msg_ack(); // pb_msg_ack();
break; break;
case INTERNAL_CMD_ALLOW_PAIRING: case INTERNAL_CMD_ALLOW_PAIRING:
pairing_num_comp_reply(true); pairing_num_comp_reply(true);
management_send_success_event();
break; break;
case INTERNAL_CMD_REJECT_PAIRING: case INTERNAL_CMD_REJECT_PAIRING:
pairing_num_comp_reply(false); pairing_num_comp_reply(false);
management_send_success_event(); break;
case INTERNAL_CMD_UNPAIR:
success = bonds_erase_current();
break; break;
default: default:
break; break;
} }
if (send_respons) {
if (success) {
management_send_success_event();
} else {
management_send_failure_event();
}
}
} }
void management_init(void) { k_sem_give(&management_ok); } void management_init(void) { k_sem_give(&management_ok); }