diff --git a/core/embed/io/ble/inc/io/ble.h b/core/embed/io/ble/inc/io/ble.h index 7b0f76d17c..17867055e7 100644 --- a/core/embed/io/ble/inc/io/ble.h +++ b/core/embed/io/ble/inc/io/ble.h @@ -17,8 +17,7 @@ * along with this program. If not, see . */ -#ifndef TREZORHAL_BLE_H -#define TREZORHAL_BLE_H +#pragma once // This module provides interface to BLE (Bluetooth Low Energy) functionality. // It allows the device to advertise itself, connect to other devices, and @@ -30,6 +29,7 @@ #define BLE_TX_PACKET_SIZE 64 #define BLE_ADV_NAME_LEN 20 +#define BLE_PAIRING_CODE_LEN 6 typedef enum { BLE_SWITCH_OFF = 0, // Turn off BLE advertising, disconnect @@ -150,5 +150,3 @@ uint32_t ble_read(uint8_t *data, uint16_t max_len); // When not using static address, the address is random and may not correspond // to what is actually used for advertising bool ble_get_mac(uint8_t *mac, size_t max_len); - -#endif diff --git a/core/embed/io/ble/stm32/ble.c b/core/embed/io/ble/stm32/ble.c index 77488b4bc5..d39f29e6b9 100644 --- a/core/embed/io/ble/stm32/ble.c +++ b/core/embed/io/ble/stm32/ble.c @@ -82,7 +82,7 @@ static const syshandle_vmt_t ble_iface_handle_vmt; static bool ble_send_state_request(ble_driver_t *drv) { (void)drv; - uint8_t cmd = INTERNAL_CMD_PING; + uint8_t cmd = INTERNAL_CMD_SEND_STATE; return nrf_send_msg(NRF_SERVICE_BLE_MANAGER, &cmd, sizeof(cmd), NULL, NULL) >= 0; } @@ -147,10 +147,15 @@ static bool ble_send_pairing_reject(ble_driver_t *drv) { return result; } -static bool ble_send_pairing_accept(ble_driver_t *drv) { - uint8_t cmd = INTERNAL_CMD_ALLOW_PAIRING; - bool result = - nrf_send_msg(NRF_SERVICE_BLE_MANAGER, &cmd, sizeof(cmd), NULL, NULL); +static bool ble_send_pairing_accept(ble_driver_t *drv, uint8_t *code) { + cmd_allow_pairing_t data = { + .cmd_id = INTERNAL_CMD_ALLOW_PAIRING, + }; + + memcpy(data.code, code, sizeof(data.code)); + + bool result = nrf_send_msg(NRF_SERVICE_BLE_MANAGER, (uint8_t *)&data, + sizeof(data), NULL, NULL); if (result) { drv->pairing_requested = false; @@ -160,8 +165,8 @@ static bool ble_send_pairing_accept(ble_driver_t *drv) { } static bool ble_send_mac_request(ble_driver_t *drv) { - (void)drv; - uint8_t cmd = INTERNAL_CMD_MAC_REQUEST; + UNUSED(drv); + uint8_t cmd = INTERNAL_CMD_GET_MAC; return nrf_send_msg(NRF_SERVICE_BLE_MANAGER, &cmd, sizeof(cmd), NULL, NULL); } @@ -235,8 +240,9 @@ static void ble_process_rx_msg_pairing_request(const uint8_t *data, return; } - ble_event_t event = {.type = BLE_PAIRING_REQUEST, .data_len = 6}; - memcpy(event.data, &data[1], 6); + ble_event_t event = {.type = BLE_PAIRING_REQUEST, + .data_len = BLE_PAIRING_CODE_LEN}; + memcpy(event.data, &data[1], BLE_PAIRING_CODE_LEN); if (!tsqueue_enqueue(&drv->event_queue, (uint8_t *)&event, sizeof(event), NULL)) { ble_send_pairing_reject(drv); @@ -589,7 +595,7 @@ bool ble_issue_command(ble_command_t *command) { result = ble_send_erase_bonds(drv); break; case BLE_ALLOW_PAIRING: - result = ble_send_pairing_accept(drv); + result = ble_send_pairing_accept(drv, command->data.raw); break; case BLE_REJECT_PAIRING: result = ble_send_pairing_reject(drv); diff --git a/core/embed/io/ble/stm32/ble_comm_defs.h b/core/embed/io/ble/stm32/ble_comm_defs.h index 2a062b376e..e2065df968 100644 --- a/core/embed/io/ble/stm32/ble_comm_defs.h +++ b/core/embed/io/ble/stm32/ble_comm_defs.h @@ -43,13 +43,15 @@ typedef struct { typedef enum { INTERNAL_EVENT_STATUS = 0x01, + INTERNAL_EVENT_SUCCESS = 0x02, + INTERNAL_EVENT_FAILURE = 0x03, INTERNAL_EVENT_PAIRING_REQUEST = 0x04, INTERNAL_EVENT_PAIRING_CANCELLED = 0x05, INTERNAL_EVENT_MAC = 0x06, } internal_event_t; typedef enum { - INTERNAL_CMD_PING = 0x00, + INTERNAL_CMD_SEND_STATE = 0x00, INTERNAL_CMD_ADVERTISING_ON = 0x01, INTERNAL_CMD_ADVERTISING_OFF = 0x02, INTERNAL_CMD_ERASE_BONDS = 0x03, @@ -58,7 +60,7 @@ typedef enum { INTERNAL_CMD_ALLOW_PAIRING = 0x06, INTERNAL_CMD_REJECT_PAIRING = 0x07, INTERNAL_CMD_UNPAIR = 0x08, - INTERNAL_CMD_MAC_REQUEST = 0x09, + INTERNAL_CMD_GET_MAC = 0x09, } internal_cmd_t; typedef struct { @@ -69,3 +71,8 @@ typedef struct { uint32_t device_code; uint8_t name[BLE_ADV_NAME_LEN]; } cmd_advertising_on_t; + +typedef struct { + uint8_t cmd_id; + uint8_t code[BLE_PAIRING_CODE_LEN]; +} cmd_allow_pairing_t;