diff --git a/features_config.h b/features_config.h index d848b0acdfc..683eff2fcef 100644 --- a/features_config.h +++ b/features_config.h @@ -1,2 +1,14 @@ +// Include Bluetooth token input automation #define TOTP_BADBT_TYPE_ENABLED -#define TOTP_AUTOMATION_ICONS_ENABLED \ No newline at end of file + +// Include token input automation icons on the main screen +#define TOTP_AUTOMATION_ICONS_ENABLED + +// List of compatible firmwares +#define TOTP_FIRMWARE_OFFICIAL_STABLE 1 +#define TOTP_FIRMWARE_OFFICIAL_DEV 2 +#define TOTP_FIRMWARE_XTREME 3 +// End of list + +// Target firmware to build for +#define TOTP_TARGET_FIRMWARE TOTP_FIRMWARE_XTREME \ No newline at end of file diff --git a/workers/bt_type_code/bt_type_code.c b/workers/bt_type_code/bt_type_code.c index b84dfead929..ec4c1619dac 100644 --- a/workers/bt_type_code/bt_type_code.c +++ b/workers/bt_type_code/bt_type_code.c @@ -1,5 +1,6 @@ #include "bt_type_code.h" #include +#include #include #include "../../types/common.h" #include "../../types/token_info.h" @@ -11,6 +12,26 @@ static inline bool totp_type_code_worker_stop_requested() { return furi_thread_flags_get() & TotpBtTypeCodeWorkerEventStop; } +#if TOTP_TARGET_FIRMWARE == TOTP_FIRMWARE_XTREME +static void totp_type_code_worker_bt_set_app_mac(uint8_t* mac) { + uint8_t max_i; + size_t uid_size = furi_hal_version_uid_size(); + if(uid_size < 6) { + max_i = uid_size; + } else { + max_i = 6; + } + + const uint8_t* uid = furi_hal_version_uid(); + memcpy(mac, uid, max_i); + for(uint8_t i = max_i; i < 6; i++) { + mac[i] = 0; + } + + mac[0] = 0b10; +} +#endif + static void totp_type_code_worker_type_code(TotpBtTypeCodeWorkerContext* context) { uint8_t i = 0; do { @@ -30,7 +51,7 @@ static void totp_type_code_worker_type_code(TotpBtTypeCodeWorkerContext* context } static int32_t totp_type_code_worker_callback(void* context) { - furi_assert(context); + furi_check(context); FuriMutex* context_mutex = furi_mutex_alloc(FuriMutexTypeNormal); if(context_mutex == NULL) { return 251; @@ -74,7 +95,7 @@ void totp_bt_type_code_worker_start( char* code_buf, uint8_t code_buf_length, FuriMutex* code_buf_update_sync) { - furi_assert(context != NULL); + furi_check(context != NULL); context->string = code_buf; context->string_length = code_buf_length; context->string_sync = code_buf_update_sync; @@ -87,7 +108,7 @@ void totp_bt_type_code_worker_start( } void totp_bt_type_code_worker_stop(TotpBtTypeCodeWorkerContext* context) { - furi_assert(context != NULL); + furi_check(context != NULL); furi_thread_flags_set(furi_thread_get_id(context->thread), TotpBtTypeCodeWorkerEventStop); furi_thread_join(context->thread); furi_thread_free(context->thread); @@ -98,7 +119,7 @@ void totp_bt_type_code_worker_notify( TotpBtTypeCodeWorkerContext* context, TotpBtTypeCodeWorkerEvent event, uint8_t flags) { - furi_assert(context != NULL); + furi_check(context != NULL); context->flags = flags; furi_thread_flags_set(furi_thread_get_id(context->thread), event); } @@ -114,11 +135,33 @@ TotpBtTypeCodeWorkerContext* totp_bt_type_code_worker_init() { furi_hal_bt_reinit(); furi_delay_ms(200); bt_keys_storage_set_storage_path(context->bt, HID_BT_KEYS_STORAGE_PATH); + +#if TOTP_TARGET_FIRMWARE == TOTP_FIRMWARE_XTREME + totp_type_code_worker_bt_set_app_mac(&context->bt_mac[0]); + memcpy( + &context->previous_bt_name[0], + furi_hal_bt_get_profile_adv_name(FuriHalBtProfileHidKeyboard), + TOTP_BT_WORKER_BT_ADV_NAME_MAX_LEN); + memcpy( + &context->previous_bt_mac[0], + furi_hal_bt_get_profile_mac_addr(FuriHalBtProfileHidKeyboard), + TOTP_BT_WORKER_BT_MAC_ADDRESS_LEN); + char new_name[TOTP_BT_WORKER_BT_ADV_NAME_MAX_LEN]; + snprintf(new_name, sizeof(new_name), "%s TOTP Auth", furi_hal_version_get_name_ptr()); + furi_hal_bt_set_profile_adv_name(FuriHalBtProfileHidKeyboard, new_name); + furi_hal_bt_set_profile_mac_addr(FuriHalBtProfileHidKeyboard, context->bt_mac); +#endif + if(!bt_set_profile(context->bt, BtProfileHidKeyboard)) { FURI_LOG_E(LOGGING_TAG, "Failed to switch BT to keyboard HID profile"); } furi_hal_bt_start_advertising(); + +#if TOTP_TARGET_FIRMWARE == TOTP_FIRMWARE_XTREME + bt_enable_peer_key_update(context->bt); +#endif + context->is_advertising = true; bt_set_status_changed_callback(context->bt, connection_status_changed_callback, context); @@ -126,7 +169,7 @@ TotpBtTypeCodeWorkerContext* totp_bt_type_code_worker_init() { } void totp_bt_type_code_worker_free(TotpBtTypeCodeWorkerContext* context) { - furi_assert(context != NULL); + furi_check(context != NULL); if(context->thread != NULL) { totp_bt_type_code_worker_stop(context); @@ -142,6 +185,11 @@ void totp_bt_type_code_worker_free(TotpBtTypeCodeWorkerContext* context) { furi_delay_ms(200); bt_keys_storage_set_default_path(context->bt); +#if TOTP_TARGET_FIRMWARE == TOTP_FIRMWARE_XTREME + furi_hal_bt_set_profile_adv_name(FuriHalBtProfileHidKeyboard, context->previous_bt_name); + furi_hal_bt_set_profile_mac_addr(FuriHalBtProfileHidKeyboard, context->previous_bt_mac); +#endif + if(!bt_set_profile(context->bt, BtProfileSerial)) { FURI_LOG_E(LOGGING_TAG, "Failed to switch BT to Serial profile"); } diff --git a/workers/bt_type_code/bt_type_code.h b/workers/bt_type_code/bt_type_code.h index 46fdb7aff82..edbe52e1482 100644 --- a/workers/bt_type_code/bt_type_code.h +++ b/workers/bt_type_code/bt_type_code.h @@ -4,6 +4,12 @@ #include #include #include +#include "../../features_config.h" + +#if TOTP_TARGET_FIRMWARE == TOTP_FIRMWARE_XTREME +#define TOTP_BT_WORKER_BT_ADV_NAME_MAX_LEN 18 +#define TOTP_BT_WORKER_BT_MAC_ADDRESS_LEN GAP_MAC_ADDR_SIZE +#endif typedef uint8_t TotpBtTypeCodeWorkerEvent; @@ -16,6 +22,11 @@ typedef struct { Bt* bt; bool is_advertising; bool is_connected; +#if TOTP_TARGET_FIRMWARE == TOTP_FIRMWARE_XTREME + uint8_t bt_mac[TOTP_BT_WORKER_BT_MAC_ADDRESS_LEN]; + char previous_bt_name[TOTP_BT_WORKER_BT_ADV_NAME_MAX_LEN + 1]; + uint8_t previous_bt_mac[TOTP_BT_WORKER_BT_MAC_ADDRESS_LEN]; +#endif } TotpBtTypeCodeWorkerContext; enum TotpBtTypeCodeWorkerEvents { diff --git a/workers/usb_type_code/usb_type_code.c b/workers/usb_type_code/usb_type_code.c index d3e09a06574..5f7ccddf86f 100644 --- a/workers/usb_type_code/usb_type_code.c +++ b/workers/usb_type_code/usb_type_code.c @@ -41,7 +41,7 @@ static void totp_type_code_worker_type_code(TotpUsbTypeCodeWorkerContext* contex } static int32_t totp_type_code_worker_callback(void* context) { - furi_assert(context); + furi_check(context); FuriMutex* context_mutex = furi_mutex_alloc(FuriMutexTypeNormal); if(context_mutex == NULL) { return 251; @@ -89,7 +89,7 @@ TotpUsbTypeCodeWorkerContext* totp_usb_type_code_worker_start( } void totp_usb_type_code_worker_stop(TotpUsbTypeCodeWorkerContext* context) { - furi_assert(context != NULL); + furi_check(context != NULL); furi_thread_flags_set(furi_thread_get_id(context->thread), TotpUsbTypeCodeWorkerEventStop); furi_thread_join(context->thread); furi_thread_free(context->thread); @@ -101,7 +101,7 @@ void totp_usb_type_code_worker_notify( TotpUsbTypeCodeWorkerContext* context, TotpUsbTypeCodeWorkerEvent event, uint8_t flags) { - furi_assert(context != NULL); + furi_check(context != NULL); context->flags = flags; furi_thread_flags_set(furi_thread_get_id(context->thread), event); } \ No newline at end of file