Skip to content

Commit 94e058e

Browse files
Merge pull request #423 from LedgerHQ/pr-stax-fix-app-ble-pairing
Stax : fix BLE pairing in apps
2 parents 81485be + 9ce677f commit 94e058e

File tree

6 files changed

+59
-22
lines changed

6 files changed

+59
-22
lines changed

include/os_io_seproxyhal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,7 @@ void io_seproxyhal_play_tune(tune_index_e tune_index);
316316
void io_seph_ble_enable(unsigned char enable);
317317
void io_seph_ble_clear_bond_db(void);
318318
void io_seph_ble_name_changed(void);
319+
void io_seph_ux_accept_pairing(unsigned char status);
319320
#endif // HAVE_BLE
320321
void io_seph_ux_redisplay(void);
321322

include/seproxyhal_protocol.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@
205205
#define SEPROXYHAL_TAG_UX_CMD_BLE_RESET_PAIRINGS 0x02
206206
#define SEPROXYHAL_TAG_UX_CMD_REDISPLAY 0x03
207207
#define SEPROXYHAL_TAG_UX_CMD_BLE_NAME_CHANGED 0x04
208+
#define SEPROXYHAL_TAG_UX_CMD_ACCEPT_PAIRING 0x05
208209

209210
#ifdef HAVE_SERIALIZED_NBGL
210211
#define SEPROXYHAL_TAG_NBGL_SERIALIZED 0x5C

lib_blewbxx_impl/include/ledger_ble.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ void LEDGER_BLE_send(uint8_t *packet, uint16_t packet_length);
3939
void LEDGER_BLE_receive(void);
4040
void LEDGER_BLE_enable_advertising(uint8_t enable);
4141
void LEDGER_BLE_reset_pairings(void);
42+
void LEDGER_BLE_accept_pairing(uint8_t status);
4243

4344
#define LEDGER_BLE_get_mac_address(address) \
4445
{ \

lib_blewbxx_impl/src/ledger_ble.c

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -747,12 +747,16 @@ static void ask_user_pairing_numeric_comparison(uint32_t code)
747747
bolos_ux_params_t ux_params;
748748

749749
ux_params.u.pairing_request.type = BOLOS_UX_ASYNCHMODAL_PAIRING_REQUEST_NUMCOMP;
750+
ux_params.ux_id = BOLOS_UX_ASYNCHMODAL_PAIRING_REQUEST;
751+
ux_params.len = sizeof(ux_params.u.pairing_request);
752+
ledger_ble_data.pairing_in_progress = 1;
750753
ux_params.u.pairing_request.pairing_info_len = 6;
751754
SPRINTF(ux_params.u.pairing_request.pairing_info, "%06d", (unsigned int) code);
752-
ux_params.ux_id = BOLOS_UX_ASYNCHMODAL_PAIRING_REQUEST;
753-
ux_params.len = sizeof(ux_params.u.pairing_request);
755+
#ifdef TARGET_STAX
756+
G_io_asynch_ux_callback.asynchmodal_end_callback = NULL;
757+
#else // !TARGET_STAX
754758
G_io_asynch_ux_callback.asynchmodal_end_callback = rsp_user_pairing_numeric_comparison;
755-
ledger_ble_data.pairing_in_progress = 1;
759+
#endif // !TARGET_STAX
756760
os_ux(&ux_params);
757761
}
758762

@@ -779,28 +783,35 @@ static void ask_user_pairing_passkey(void)
779783
{
780784
bolos_ux_params_t ux_params;
781785

782-
ledger_ble_data.pairing_code = cx_rng_u32_range_func(0, 1000000, cx_rng_u32);
783786
ux_params.u.pairing_request.type = BOLOS_UX_ASYNCHMODAL_PAIRING_REQUEST_PASSKEY;
787+
ux_params.ux_id = BOLOS_UX_ASYNCHMODAL_PAIRING_REQUEST;
788+
ux_params.len = sizeof(ux_params.u.pairing_request);
789+
ledger_ble_data.pairing_in_progress = 1;
790+
ledger_ble_data.pairing_code = cx_rng_u32_range_func(0, 1000000, cx_rng_u32);
784791
ux_params.u.pairing_request.pairing_info_len = 6;
785792
SPRINTF(ux_params.u.pairing_request.pairing_info, "%06d", ledger_ble_data.pairing_code);
786-
ux_params.ux_id = BOLOS_UX_ASYNCHMODAL_PAIRING_REQUEST;
787-
ux_params.len = sizeof(ux_params.u.pairing_request);
793+
#ifdef TARGET_STAX
794+
G_io_asynch_ux_callback.asynchmodal_end_callback = NULL;
795+
#else // !TARGET_STAX
788796
G_io_asynch_ux_callback.asynchmodal_end_callback = rsp_user_pairing_passkey;
789-
ledger_ble_data.pairing_in_progress = 1;
797+
#endif // !TARGET_STAX
790798
os_ux(&ux_params);
791799
}
792800

793801
static void rsp_user_pairing_passkey(unsigned int status)
794802
{
795-
if (status != BOLOS_UX_OK) { // BLE_TODO
803+
if (status == BOLOS_UX_OK) {
796804
end_pairing_ux(BOLOS_UX_ASYNCHMODAL_PAIRING_STATUS_ACCEPT_PASSKEY);
797805
ledger_ble_data.pairing_code = cx_rng_u32_range_func(0, 1000000, cx_rng_u32);
806+
aci_gap_pass_key_resp(ledger_ble_data.connection.connection_handle,
807+
ledger_ble_data.pairing_code);
808+
}
809+
else if (status == BOLOS_UX_IGNORE) {
810+
ledger_ble_data.pairing_in_progress = 0;
798811
}
799812
else {
800813
end_pairing_ux(BOLOS_UX_ASYNCHMODAL_PAIRING_STATUS_CANCEL_PASSKEY);
801814
}
802-
aci_gap_pass_key_resp(ledger_ble_data.connection.connection_handle,
803-
ledger_ble_data.pairing_code);
804815
}
805816

806817
static void attribute_modified(uint8_t *buffer, uint16_t length)
@@ -1146,6 +1157,16 @@ void LEDGER_BLE_reset_pairings(void)
11461157
}
11471158
}
11481159

1160+
void LEDGER_BLE_accept_pairing(uint8_t status)
1161+
{
1162+
if (ledger_ble_data.pairing_in_progress == 1) {
1163+
rsp_user_pairing_numeric_comparison(status);
1164+
}
1165+
else if (ledger_ble_data.pairing_in_progress == 2) {
1166+
rsp_user_pairing_passkey(status);
1167+
}
1168+
}
1169+
11491170
int hci_send_req(struct hci_request *p_cmd, uint8_t async)
11501171
{
11511172
UNUSED(async);

lib_ux_stax/ux.c

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,6 @@ static bool ux_forward_event(bool ignoring_app_if_ux_busy)
3737
G_ux_params.len = 0;
3838
os_ux(&G_ux_params);
3939
G_ux_params.len = os_sched_last_status(TASK_BOLOS_UX);
40-
#ifdef HAVE_BLE
41-
if (G_ux.asynchmodal_end_callback
42-
&& (os_ux_get_status(BOLOS_UX_ASYNCHMODAL_PAIRING_REQUEST) != 0)) {
43-
asynchmodal_end_callback_t cb = G_ux.asynchmodal_end_callback;
44-
// reset G_ux.asynchmodal_end_callback for next time
45-
G_ux.asynchmodal_end_callback = NULL;
46-
cb(os_ux_get_status(BOLOS_UX_ASYNCHMODAL_PAIRING_REQUEST));
47-
// for app to redraw/refresh itself
48-
G_ux_params.len = BOLOS_UX_REDRAW;
49-
}
50-
#endif // HAVE_BLE
5140
if (G_ux_params.len == BOLOS_UX_REDRAW) {
5241
// enable drawing according to UX decision
5342
nbgl_objAllowDrawing(true);

src/os_io_seproxyhal.c

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -312,14 +312,28 @@ unsigned int io_seproxyhal_handle_event(void)
312312
G_io_app.name_changed = 1;
313313
io_seph_ble_enable(0);
314314
break;
315+
316+
case SEPROXYHAL_TAG_UX_CMD_ACCEPT_PAIRING:
317+
LEDGER_BLE_accept_pairing(G_io_seproxyhal_spi_buffer[4]);
318+
return 1;
319+
break;
315320
#endif // HAVE_BLE
316321

317322
#if !defined(HAVE_BOLOS) && defined(HAVE_BAGL)
318323
case SEPROXYHAL_TAG_UX_CMD_REDISPLAY:
319324
ux_stack_redisplay();
320325
return 1;
321326
break;
322-
#endif // HAVE_BOLOS
327+
#endif // HAVE_BOLOS && HAVE_BAGL
328+
329+
#if !defined(HAVE_BOLOS) && defined(HAVE_NBGL)
330+
case SEPROXYHAL_TAG_UX_CMD_REDISPLAY:
331+
nbgl_objAllowDrawing(true);
332+
nbgl_screenRedraw();
333+
nbgl_refresh();
334+
return 1;
335+
break;
336+
#endif // HAVE_BOLOS && HAVE_NBGL
323337

324338
default:
325339
return io_event(CHANNEL_SPI);
@@ -1081,6 +1095,16 @@ void io_seph_ux_redisplay(void)
10811095
io_seproxyhal_spi_send(G_io_seproxyhal_spi_buffer, 4);
10821096
}
10831097

1098+
void io_seph_ux_accept_pairing(unsigned char status)
1099+
{
1100+
G_io_seproxyhal_spi_buffer[0] = SEPROXYHAL_TAG_UX_CMD;
1101+
G_io_seproxyhal_spi_buffer[1] = 0;
1102+
G_io_seproxyhal_spi_buffer[2] = 2;
1103+
G_io_seproxyhal_spi_buffer[3] = SEPROXYHAL_TAG_UX_CMD_ACCEPT_PAIRING;
1104+
G_io_seproxyhal_spi_buffer[4] = status;
1105+
io_seproxyhal_spi_send(G_io_seproxyhal_spi_buffer, 5);
1106+
}
1107+
10841108
static const unsigned char seph_io_usb_disconnect[] = {
10851109
SEPROXYHAL_TAG_USB_CONFIG,
10861110
0,

0 commit comments

Comments
 (0)