From fb1218c9a55e74c3a4bb67c06e19a1b5b3975d7c Mon Sep 17 00:00:00 2001 From: yocvito Date: Mon, 30 Jan 2023 13:31:24 +0100 Subject: [PATCH] Removes pin verif when using BT for bad-USB --- applications/main/bad_usb/bad_usb_script.c | 6 +++ applications/services/bt/bt_service/bt.c | 47 +++++++++---------- applications/services/bt/bt_service/bt.h | 4 ++ firmware/targets/f7/api_symbols.csv | 6 ++- firmware/targets/f7/ble_glue/gap.c | 13 ++++- firmware/targets/f7/furi_hal/furi_hal_bt.c | 10 ++++ .../targets/furi_hal_include/furi_hal_bt.h | 4 ++ 7 files changed, 63 insertions(+), 27 deletions(-) diff --git a/applications/main/bad_usb/bad_usb_script.c b/applications/main/bad_usb/bad_usb_script.c index 6ad428b4d..a93a18046 100644 --- a/applications/main/bad_usb/bad_usb_script.c +++ b/applications/main/bad_usb/bad_usb_script.c @@ -641,15 +641,19 @@ static int32_t bad_usb_worker(void* context) { int32_t delay_val = 0; FuriHalUsbInterface* usb_mode_prev = NULL; + GapPairing old_pairing_method = GapPairingNone; if (bad_usb->bt) { bt_timeout = bt_hid_delays[LevelRssi39_0]; bt_disconnect(bad_usb->bt); furi_delay_ms(200); bt_keys_storage_set_storage_path(bad_usb->bt, HID_BT_KEYS_STORAGE_PATH); + if(!bt_set_profile(bad_usb->bt, BtProfileHidKeyboard)) { FURI_LOG_E(TAG, "Failed to switch to HID profile"); return -1; } + old_pairing_method = bt_get_profile_pairing_method(bad_usb->bt); + bt_set_profile_pairing_method(bad_usb->bt, GapPairingNone); furi_hal_bt_start_advertising(); bt_set_status_changed_callback(bad_usb->bt, bad_usb_bt_hid_state_callback, bad_usb); } else { @@ -843,6 +847,8 @@ static int32_t bad_usb_worker(void* context) { bt_keys_storage_set_default_path(bad_usb->bt); + bt_set_profile_pairing_method(bad_usb->bt, old_pairing_method); + if(!bt_set_profile(bad_usb->bt, BtProfileSerial)) { FURI_LOG_E(TAG, "Failed to switch to Serial profile"); } diff --git a/applications/services/bt/bt_service/bt.c b/applications/services/bt/bt_service/bt.c index ad3ae71c9..d37216bad 100644 --- a/applications/services/bt/bt_service/bt.c +++ b/applications/services/bt/bt_service/bt.c @@ -370,12 +370,16 @@ static void bt_close_connection(Bt* bt) { furi_event_flag_set(bt->api_event, BT_API_UNLOCK_EVENT); } -static void bt_restart(Bt* bt) { - if(bt->profile == BtProfileHidKeyboard) { - furi_hal_bt_change_app(FuriHalBtProfileHidKeyboard, bt_on_gap_event_callback, bt); +static inline FuriHalBtProfile get_hal_bt_profile(BtProfile profile) { + if(profile == BtProfileHidKeyboard) { + return FuriHalBtProfileHidKeyboard; } else { - furi_hal_bt_change_app(FuriHalBtProfileSerial, bt_on_gap_event_callback, bt); + return FuriHalBtProfileSerial; } +} + +static void bt_restart(Bt* bt) { + furi_hal_bt_change_app(get_hal_bt_profile(bt->profile), bt_on_gap_event_callback, bt); furi_hal_bt_start_advertising(); } @@ -388,44 +392,28 @@ void bt_set_profile_adv_name(Bt* bt, const char* fmt, ...) { va_start(args, fmt); vsnprintf(name, sizeof(name), fmt, args); va_end(args); - if(bt->profile == BtProfileHidKeyboard) { - furi_hal_bt_set_profile_adv_name(FuriHalBtProfileHidKeyboard, name); - } else { - furi_hal_bt_set_profile_adv_name(FuriHalBtProfileSerial, name); - } + furi_hal_bt_set_profile_adv_name(get_hal_bt_profile(bt->profile), name); bt_restart(bt); } const char* bt_get_profile_adv_name(Bt* bt) { furi_assert(bt); - if(bt->profile == BtProfileHidKeyboard) { - return furi_hal_bt_get_profile_adv_name(FuriHalBtProfileHidKeyboard); - } else { - return furi_hal_bt_get_profile_adv_name(FuriHalBtProfileSerial); - } + return furi_hal_bt_get_profile_adv_name(get_hal_bt_profile(bt->profile)); } void bt_set_profile_mac_address(Bt* bt, const uint8_t mac[6]) { furi_assert(bt); furi_assert(mac); - if(bt->profile == BtProfileHidKeyboard) { - furi_hal_bt_set_profile_mac_addr(FuriHalBtProfileHidKeyboard, mac); - } else { - furi_hal_bt_set_profile_mac_addr(FuriHalBtProfileSerial, mac); - } + furi_hal_bt_set_profile_mac_addr(get_hal_bt_profile(bt->profile), mac); bt_restart(bt); } const uint8_t* bt_get_profile_mac_address(Bt* bt) { furi_assert(bt); - if(bt->profile == BtProfileHidKeyboard) { - return furi_hal_bt_get_profile_mac_addr(FuriHalBtProfileHidKeyboard); - } else { - return furi_hal_bt_get_profile_mac_addr(FuriHalBtProfileSerial); - } + return furi_hal_bt_get_profile_mac_addr(get_hal_bt_profile(bt->profile)); } bool bt_remote_rssi(Bt* bt, BtRssi* rssi) { @@ -443,6 +431,17 @@ bool bt_remote_rssi(Bt* bt, BtRssi* rssi) { return true; } +void bt_set_profile_pairing_method(Bt* bt, GapPairing pairing_method) { + furi_assert(bt); + furi_hal_bt_set_profile_pairing_method(get_hal_bt_profile(bt->profile), pairing_method); + bt_restart(bt); +} + +GapPairing bt_get_profile_pairing_method(Bt* bt) { + furi_assert(bt); + return furi_hal_bt_get_profile_pairing_method(get_hal_bt_profile(bt->profile)); +} + int32_t bt_srv(void* p) { UNUSED(p); Bt* bt = bt_alloc(); diff --git a/applications/services/bt/bt_service/bt.h b/applications/services/bt/bt_service/bt.h index 60420a7f7..046887a2c 100644 --- a/applications/services/bt/bt_service/bt.h +++ b/applications/services/bt/bt_service/bt.h @@ -2,6 +2,7 @@ #include #include +#include #ifdef __cplusplus extern "C" { @@ -48,6 +49,9 @@ const uint8_t* bt_get_profile_mac_address(Bt* bt); bool bt_remote_rssi(Bt* bt, BtRssi* rssi); +void bt_set_profile_pairing_method(Bt* bt, GapPairing pairing_method); +GapPairing bt_get_profile_pairing_method(Bt* bt); + /** Disconnect from Central * * @param bt Bt instance diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index aabe45714..213e6061f 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,13.0,, +Version,+,13.2,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/cli/cli.h,, Header,+,applications/services/cli/cli_vcp.h,, @@ -573,12 +573,14 @@ Function,+,bt_disconnect,void,Bt* Function,+,bt_forget_bonded_devices,void,Bt* Function,+,bt_get_profile_adv_name,const char*,Bt* Function,+,bt_get_profile_mac_address,const uint8_t*,Bt* +Function,+,bt_get_profile_pairing_method,GapPairing,Bt* Function,+,bt_keys_storage_set_default_path,void,Bt* Function,+,bt_keys_storage_set_storage_path,void,"Bt*, const char*" Function,+,bt_remote_rssi,_Bool,"Bt*, BtRssi*" Function,+,bt_set_profile,_Bool,"Bt*, BtProfile" Function,+,bt_set_profile_adv_name,void,"Bt*, const char*, ..." Function,+,bt_set_profile_mac_address,void,"Bt*, const uint8_t[6]" +Function,+,bt_set_profile_pairing_method,void,"Bt*, GapPairing" Function,+,bt_set_status_changed_callback,void,"Bt*, BtStatusChangedCallback, void*" Function,+,buffered_file_stream_alloc,Stream*,Storage* Function,+,buffered_file_stream_close,_Bool,Stream* @@ -1004,6 +1006,7 @@ Function,+,furi_hal_bt_get_conn_rssi,uint32_t,uint8_t* Function,+,furi_hal_bt_get_key_storage_buff,void,"uint8_t**, uint16_t*" Function,+,furi_hal_bt_get_profile_adv_name,const char*,FuriHalBtProfile Function,+,furi_hal_bt_get_profile_mac_addr,const uint8_t*,FuriHalBtProfile +Function,+,furi_hal_bt_get_profile_pairing_method,GapPairing,FuriHalBtProfile Function,+,furi_hal_bt_get_radio_stack,FuriHalBtStack, Function,+,furi_hal_bt_get_rssi,float, Function,+,furi_hal_bt_get_transmitted_packets,uint32_t, @@ -1039,6 +1042,7 @@ Function,+,furi_hal_bt_serial_tx,_Bool,"uint8_t*, uint16_t" Function,+,furi_hal_bt_set_key_storage_change_callback,void,"BleGlueKeyStorageChangedCallback, void*" Function,+,furi_hal_bt_set_profile_adv_name,void,"FuriHalBtProfile, const char[( 1 + ( 8 + 1 ) ) - 1]" Function,+,furi_hal_bt_set_profile_mac_addr,void,"FuriHalBtProfile, const uint8_t[( 6 )]" +Function,+,furi_hal_bt_set_profile_pairing_method,void,"FuriHalBtProfile, GapPairing" Function,+,furi_hal_bt_start_advertising,void, Function,+,furi_hal_bt_start_app,_Bool,"FuriHalBtProfile, GapEventCallback, void*" Function,+,furi_hal_bt_start_packet_rx,void,"uint8_t, uint8_t" diff --git a/firmware/targets/f7/ble_glue/gap.c b/firmware/targets/f7/ble_glue/gap.c index 668509218..66786297f 100644 --- a/firmware/targets/f7/ble_glue/gap.c +++ b/firmware/targets/f7/ble_glue/gap.c @@ -377,15 +377,24 @@ static void gap_init_svc(Gap* gap) { aci_gap_set_io_capability(IO_CAP_DISPLAY_YES_NO); keypress_supported = true; } + + uint8_t conf_mitm = CFG_MITM_PROTECTION; + uint8_t conf_used_fixed_pin = CFG_USED_FIXED_PIN; + + if (gap->config->pairing_method == GapPairingNone) { + conf_mitm = 0; + conf_used_fixed_pin = 0; + } + // Setup authentication aci_gap_set_authentication_requirement( gap->config->bonding_mode, - CFG_MITM_PROTECTION, + conf_mitm, CFG_SC_SUPPORT, keypress_supported, CFG_ENCRYPTION_KEY_SIZE_MIN, CFG_ENCRYPTION_KEY_SIZE_MAX, - CFG_USED_FIXED_PIN, // 0x0 for no pin + conf_used_fixed_pin, // 0x0 for no pin 0, PUBLIC_ADDR); // Configure whitelist diff --git a/firmware/targets/f7/furi_hal/furi_hal_bt.c b/firmware/targets/f7/furi_hal/furi_hal_bt.c index 1e7b80040..f33c92c62 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_bt.c +++ b/firmware/targets/f7/furi_hal/furi_hal_bt.c @@ -495,3 +495,13 @@ const uint8_t* furi_hal_bt_get_profile_mac_addr(FuriHalBtProfile profile) { furi_assert(profile < FuriHalBtProfileNumber); return profile_config[profile].config.mac_address; } + +void furi_hal_bt_set_profile_pairing_method(FuriHalBtProfile profile, GapPairing pairing_method) { + furi_assert(profile < FuriHalBtProfileNumber); + profile_config[profile].config.pairing_method = pairing_method; +} + +GapPairing furi_hal_bt_get_profile_pairing_method(FuriHalBtProfile profile) { + furi_assert(profile < FuriHalBtProfileNumber); + return profile_config[profile].config.pairing_method; +} diff --git a/firmware/targets/furi_hal_include/furi_hal_bt.h b/firmware/targets/furi_hal_include/furi_hal_bt.h index fb17436f4..3e554bb4f 100644 --- a/firmware/targets/furi_hal_include/furi_hal_bt.h +++ b/firmware/targets/furi_hal_include/furi_hal_bt.h @@ -246,6 +246,10 @@ const uint8_t* furi_hal_bt_get_profile_mac_addr(FuriHalBtProfile profile); uint32_t furi_hal_bt_get_conn_rssi(uint8_t* rssi); +void furi_hal_bt_set_profile_pairing_method(FuriHalBtProfile profile, GapPairing pairing_method); + +GapPairing furi_hal_bt_get_profile_pairing_method(FuriHalBtProfile profile); + #ifdef __cplusplus } #endif