Removes pin verif when using BT for bad-USB

This commit is contained in:
yocvito
2023-01-30 13:31:24 +01:00
parent feac699dcb
commit fb1218c9a5
7 changed files with 63 additions and 27 deletions

View File

@@ -641,15 +641,19 @@ static int32_t bad_usb_worker(void* context) {
int32_t delay_val = 0; int32_t delay_val = 0;
FuriHalUsbInterface* usb_mode_prev = NULL; FuriHalUsbInterface* usb_mode_prev = NULL;
GapPairing old_pairing_method = GapPairingNone;
if (bad_usb->bt) { if (bad_usb->bt) {
bt_timeout = bt_hid_delays[LevelRssi39_0]; bt_timeout = bt_hid_delays[LevelRssi39_0];
bt_disconnect(bad_usb->bt); bt_disconnect(bad_usb->bt);
furi_delay_ms(200); furi_delay_ms(200);
bt_keys_storage_set_storage_path(bad_usb->bt, HID_BT_KEYS_STORAGE_PATH); bt_keys_storage_set_storage_path(bad_usb->bt, HID_BT_KEYS_STORAGE_PATH);
if(!bt_set_profile(bad_usb->bt, BtProfileHidKeyboard)) { if(!bt_set_profile(bad_usb->bt, BtProfileHidKeyboard)) {
FURI_LOG_E(TAG, "Failed to switch to HID profile"); FURI_LOG_E(TAG, "Failed to switch to HID profile");
return -1; 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(); furi_hal_bt_start_advertising();
bt_set_status_changed_callback(bad_usb->bt, bad_usb_bt_hid_state_callback, bad_usb); bt_set_status_changed_callback(bad_usb->bt, bad_usb_bt_hid_state_callback, bad_usb);
} else { } else {
@@ -843,6 +847,8 @@ static int32_t bad_usb_worker(void* context) {
bt_keys_storage_set_default_path(bad_usb->bt); 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)) { if(!bt_set_profile(bad_usb->bt, BtProfileSerial)) {
FURI_LOG_E(TAG, "Failed to switch to Serial profile"); FURI_LOG_E(TAG, "Failed to switch to Serial profile");
} }

View File

@@ -370,12 +370,16 @@ static void bt_close_connection(Bt* bt) {
furi_event_flag_set(bt->api_event, BT_API_UNLOCK_EVENT); furi_event_flag_set(bt->api_event, BT_API_UNLOCK_EVENT);
} }
static void bt_restart(Bt* bt) { static inline FuriHalBtProfile get_hal_bt_profile(BtProfile profile) {
if(bt->profile == BtProfileHidKeyboard) { if(profile == BtProfileHidKeyboard) {
furi_hal_bt_change_app(FuriHalBtProfileHidKeyboard, bt_on_gap_event_callback, bt); return FuriHalBtProfileHidKeyboard;
} else { } 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(); furi_hal_bt_start_advertising();
} }
@@ -388,44 +392,28 @@ void bt_set_profile_adv_name(Bt* bt, const char* fmt, ...) {
va_start(args, fmt); va_start(args, fmt);
vsnprintf(name, sizeof(name), fmt, args); vsnprintf(name, sizeof(name), fmt, args);
va_end(args); va_end(args);
if(bt->profile == BtProfileHidKeyboard) { furi_hal_bt_set_profile_adv_name(get_hal_bt_profile(bt->profile), name);
furi_hal_bt_set_profile_adv_name(FuriHalBtProfileHidKeyboard, name);
} else {
furi_hal_bt_set_profile_adv_name(FuriHalBtProfileSerial, name);
}
bt_restart(bt); bt_restart(bt);
} }
const char* bt_get_profile_adv_name(Bt* bt) { const char* bt_get_profile_adv_name(Bt* bt) {
furi_assert(bt); furi_assert(bt);
if(bt->profile == BtProfileHidKeyboard) { return furi_hal_bt_get_profile_adv_name(get_hal_bt_profile(bt->profile));
return furi_hal_bt_get_profile_adv_name(FuriHalBtProfileHidKeyboard);
} else {
return furi_hal_bt_get_profile_adv_name(FuriHalBtProfileSerial);
}
} }
void bt_set_profile_mac_address(Bt* bt, const uint8_t mac[6]) { void bt_set_profile_mac_address(Bt* bt, const uint8_t mac[6]) {
furi_assert(bt); furi_assert(bt);
furi_assert(mac); furi_assert(mac);
if(bt->profile == BtProfileHidKeyboard) { furi_hal_bt_set_profile_mac_addr(get_hal_bt_profile(bt->profile), mac);
furi_hal_bt_set_profile_mac_addr(FuriHalBtProfileHidKeyboard, mac);
} else {
furi_hal_bt_set_profile_mac_addr(FuriHalBtProfileSerial, mac);
}
bt_restart(bt); bt_restart(bt);
} }
const uint8_t* bt_get_profile_mac_address(Bt* bt) { const uint8_t* bt_get_profile_mac_address(Bt* bt) {
furi_assert(bt); furi_assert(bt);
if(bt->profile == BtProfileHidKeyboard) { return furi_hal_bt_get_profile_mac_addr(get_hal_bt_profile(bt->profile));
return furi_hal_bt_get_profile_mac_addr(FuriHalBtProfileHidKeyboard);
} else {
return furi_hal_bt_get_profile_mac_addr(FuriHalBtProfileSerial);
}
} }
bool bt_remote_rssi(Bt* bt, BtRssi* rssi) { bool bt_remote_rssi(Bt* bt, BtRssi* rssi) {
@@ -443,6 +431,17 @@ bool bt_remote_rssi(Bt* bt, BtRssi* rssi) {
return true; 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) { int32_t bt_srv(void* p) {
UNUSED(p); UNUSED(p);
Bt* bt = bt_alloc(); Bt* bt = bt_alloc();

View File

@@ -2,6 +2,7 @@
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
#include <furi_hal_bt.h>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
@@ -48,6 +49,9 @@ const uint8_t* bt_get_profile_mac_address(Bt* bt);
bool bt_remote_rssi(Bt* bt, BtRssi* rssi); 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 /** Disconnect from Central
* *
* @param bt Bt instance * @param bt Bt instance

View File

@@ -1,5 +1,5 @@
entry,status,name,type,params entry,status,name,type,params
Version,+,13.0,, Version,+,13.2,,
Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/bt/bt_service/bt.h,,
Header,+,applications/services/cli/cli.h,, Header,+,applications/services/cli/cli.h,,
Header,+,applications/services/cli/cli_vcp.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_forget_bonded_devices,void,Bt*
Function,+,bt_get_profile_adv_name,const char*,Bt* Function,+,bt_get_profile_adv_name,const char*,Bt*
Function,+,bt_get_profile_mac_address,const uint8_t*,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_default_path,void,Bt*
Function,+,bt_keys_storage_set_storage_path,void,"Bt*, const char*" Function,+,bt_keys_storage_set_storage_path,void,"Bt*, const char*"
Function,+,bt_remote_rssi,_Bool,"Bt*, BtRssi*" Function,+,bt_remote_rssi,_Bool,"Bt*, BtRssi*"
Function,+,bt_set_profile,_Bool,"Bt*, BtProfile" Function,+,bt_set_profile,_Bool,"Bt*, BtProfile"
Function,+,bt_set_profile_adv_name,void,"Bt*, const char*, ..." 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_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,+,bt_set_status_changed_callback,void,"Bt*, BtStatusChangedCallback, void*"
Function,+,buffered_file_stream_alloc,Stream*,Storage* Function,+,buffered_file_stream_alloc,Stream*,Storage*
Function,+,buffered_file_stream_close,_Bool,Stream* 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_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_adv_name,const char*,FuriHalBtProfile
Function,+,furi_hal_bt_get_profile_mac_addr,const uint8_t*,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_radio_stack,FuriHalBtStack,
Function,+,furi_hal_bt_get_rssi,float, Function,+,furi_hal_bt_get_rssi,float,
Function,+,furi_hal_bt_get_transmitted_packets,uint32_t, 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_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_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_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_advertising,void,
Function,+,furi_hal_bt_start_app,_Bool,"FuriHalBtProfile, GapEventCallback, void*" Function,+,furi_hal_bt_start_app,_Bool,"FuriHalBtProfile, GapEventCallback, void*"
Function,+,furi_hal_bt_start_packet_rx,void,"uint8_t, uint8_t" Function,+,furi_hal_bt_start_packet_rx,void,"uint8_t, uint8_t"
1 entry status name type params
2 Version + 13.0 13.2
3 Header + applications/services/bt/bt_service/bt.h
4 Header + applications/services/cli/cli.h
5 Header + applications/services/cli/cli_vcp.h
573 Function + bt_forget_bonded_devices void Bt*
574 Function + bt_get_profile_adv_name const char* Bt*
575 Function + bt_get_profile_mac_address const uint8_t* Bt*
576 Function + bt_get_profile_pairing_method GapPairing Bt*
577 Function + bt_keys_storage_set_default_path void Bt*
578 Function + bt_keys_storage_set_storage_path void Bt*, const char*
579 Function + bt_remote_rssi _Bool Bt*, BtRssi*
580 Function + bt_set_profile _Bool Bt*, BtProfile
581 Function + bt_set_profile_adv_name void Bt*, const char*, ...
582 Function + bt_set_profile_mac_address void Bt*, const uint8_t[6]
583 Function + bt_set_profile_pairing_method void Bt*, GapPairing
584 Function + bt_set_status_changed_callback void Bt*, BtStatusChangedCallback, void*
585 Function + buffered_file_stream_alloc Stream* Storage*
586 Function + buffered_file_stream_close _Bool Stream*
1006 Function + furi_hal_bt_get_key_storage_buff void uint8_t**, uint16_t*
1007 Function + furi_hal_bt_get_profile_adv_name const char* FuriHalBtProfile
1008 Function + furi_hal_bt_get_profile_mac_addr const uint8_t* FuriHalBtProfile
1009 Function + furi_hal_bt_get_profile_pairing_method GapPairing FuriHalBtProfile
1010 Function + furi_hal_bt_get_radio_stack FuriHalBtStack
1011 Function + furi_hal_bt_get_rssi float
1012 Function + furi_hal_bt_get_transmitted_packets uint32_t
1042 Function + furi_hal_bt_set_key_storage_change_callback void BleGlueKeyStorageChangedCallback, void*
1043 Function + furi_hal_bt_set_profile_adv_name void FuriHalBtProfile, const char[( 1 + ( 8 + 1 ) ) - 1]
1044 Function + furi_hal_bt_set_profile_mac_addr void FuriHalBtProfile, const uint8_t[( 6 )]
1045 Function + furi_hal_bt_set_profile_pairing_method void FuriHalBtProfile, GapPairing
1046 Function + furi_hal_bt_start_advertising void
1047 Function + furi_hal_bt_start_app _Bool FuriHalBtProfile, GapEventCallback, void*
1048 Function + furi_hal_bt_start_packet_rx void uint8_t, uint8_t

View File

@@ -377,15 +377,24 @@ static void gap_init_svc(Gap* gap) {
aci_gap_set_io_capability(IO_CAP_DISPLAY_YES_NO); aci_gap_set_io_capability(IO_CAP_DISPLAY_YES_NO);
keypress_supported = true; 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 // Setup authentication
aci_gap_set_authentication_requirement( aci_gap_set_authentication_requirement(
gap->config->bonding_mode, gap->config->bonding_mode,
CFG_MITM_PROTECTION, conf_mitm,
CFG_SC_SUPPORT, CFG_SC_SUPPORT,
keypress_supported, keypress_supported,
CFG_ENCRYPTION_KEY_SIZE_MIN, CFG_ENCRYPTION_KEY_SIZE_MIN,
CFG_ENCRYPTION_KEY_SIZE_MAX, CFG_ENCRYPTION_KEY_SIZE_MAX,
CFG_USED_FIXED_PIN, // 0x0 for no pin conf_used_fixed_pin, // 0x0 for no pin
0, 0,
PUBLIC_ADDR); PUBLIC_ADDR);
// Configure whitelist // Configure whitelist

View File

@@ -495,3 +495,13 @@ const uint8_t* furi_hal_bt_get_profile_mac_addr(FuriHalBtProfile profile) {
furi_assert(profile < FuriHalBtProfileNumber); furi_assert(profile < FuriHalBtProfileNumber);
return profile_config[profile].config.mac_address; 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;
}

View File

@@ -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); 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 #ifdef __cplusplus
} }
#endif #endif