diff --git a/applications/main/subghz/scenes/subghz_scene_keeloq_decrypt.c b/applications/main/subghz/scenes/subghz_scene_keeloq_decrypt.c index 27505576..ee7d82dd 100644 --- a/applications/main/subghz/scenes/subghz_scene_keeloq_decrypt.c +++ b/applications/main/subghz/scenes/subghz_scene_keeloq_decrypt.c @@ -7,8 +7,9 @@ #include #include -#define KL_DECRYPT_EVENT_DONE (0xD2) -#define KL_TOTAL_KEYS 0x100000000ULL +#define KL_DECRYPT_EVENT_DONE (0xD2) +#define KL_DECRYPT_EVENT_CANDIDATE (0xD3) +#define KL_TOTAL_KEYS 0x100000000ULL #define KL_MSG_BF_REQUEST 0x10 #define KL_MSG_BF_PROGRESS 0x11 @@ -57,16 +58,12 @@ static void kl_ble_data_received(uint8_t* data, uint16_t size, void* context) { } else if(data[0] == KL_MSG_BF_RESULT && size >= 26) { uint8_t found = data[1]; - uint64_t mfkey = 0; - uint64_t devkey = 0; - uint32_t cnt = 0; - uint32_t elapsed_ms = 0; - memcpy(&mfkey, data + 2, 8); - memcpy(&devkey, data + 10, 8); - memcpy(&cnt, data + 18, 4); - memcpy(&elapsed_ms, data + 22, 4); if(found == 1) { + uint64_t mfkey = 0; + uint32_t cnt = 0; + memcpy(&mfkey, data + 2, 8); + memcpy(&cnt, data + 18, 4); uint16_t learn_type = (size >= 27) ? data[26] : 6; ctx->candidate_count++; @@ -77,60 +74,13 @@ static void kl_ble_data_received(uint8_t* data, uint16_t size, void* context) { subghz_view_keeloq_decrypt_update_candidates( ctx->subghz->subghz_keeloq_decrypt, ctx->candidate_count); - if(!ctx->subghz->keeloq_keys_manager) { - ctx->subghz->keeloq_keys_manager = subghz_keeloq_keys_alloc(); - } - char key_name[24]; - snprintf(key_name, sizeof(key_name), "BF_%07lX", ctx->serial); - subghz_keeloq_keys_add( - ctx->subghz->keeloq_keys_manager, - mfkey, - learn_type, - key_name); - subghz_keeloq_keys_save(ctx->subghz->keeloq_keys_manager); - - SubGhzKeystore* env_ks = subghz_environment_get_keystore( - ctx->subghz->txrx->environment); - SubGhzKeyArray_t* env_arr = subghz_keystore_get_data(env_ks); - SubGhzKey* entry = SubGhzKeyArray_push_raw(*env_arr); - entry->name = furi_string_alloc_set(key_name); - entry->key = mfkey; - entry->type = learn_type; + view_dispatcher_send_custom_event( + ctx->subghz->view_dispatcher, KL_DECRYPT_EVENT_CANDIDATE); } else if(found == 2) { ctx->success = (ctx->candidate_count > 0); - - if(ctx->candidate_count > 0) { - furi_string_printf( - ctx->result, - "Found %lu candidate(s)\n" - "Last: %08lX%08lX\n" - "Type:%u Cnt:%04lX\n" - "Saved to user keys", - ctx->candidate_count, - (uint32_t)(ctx->recovered_mfkey >> 32), - (uint32_t)(ctx->recovered_mfkey & 0xFFFFFFFF), - ctx->recovered_type, - ctx->recovered_cnt); - - FlipperFormat* fff = subghz_txrx_get_fff_data(ctx->subghz->txrx); - flipper_format_rewind(fff); - - char mf_str[20]; - snprintf(mf_str, sizeof(mf_str), "BF_%07lX", ctx->serial); - flipper_format_insert_or_update_string_cstr(fff, "Manufacture", mf_str); - - uint32_t cnt_val = ctx->recovered_cnt; - flipper_format_rewind(fff); - flipper_format_insert_or_update_uint32(fff, "Cnt", &cnt_val, 1); - - if(ctx->hop2 != 0) { - flipper_format_rewind(fff); - flipper_format_insert_or_update_uint32(fff, "Hop2", &ctx->hop2, 1); - } - } - - view_dispatcher_send_custom_event(ctx->subghz->view_dispatcher, KL_DECRYPT_EVENT_DONE); + view_dispatcher_send_custom_event( + ctx->subghz->view_dispatcher, KL_DECRYPT_EVENT_DONE); } } } @@ -229,12 +179,62 @@ bool subghz_scene_keeloq_decrypt_on_event(void* context, SceneManagerEvent event if(!ctx) return false; if(event.type == SceneManagerEventTypeCustom) { - if(event.event == KL_DECRYPT_EVENT_DONE) { + if(event.event == KL_DECRYPT_EVENT_CANDIDATE) { + if(!subghz->keeloq_keys_manager) { + subghz->keeloq_keys_manager = subghz_keeloq_keys_alloc(); + } + char key_name[24]; + snprintf(key_name, sizeof(key_name), "BF_%07lX", ctx->serial); + subghz_keeloq_keys_add( + subghz->keeloq_keys_manager, + ctx->recovered_mfkey, + ctx->recovered_type, + key_name); + subghz_keeloq_keys_save(subghz->keeloq_keys_manager); + + SubGhzKeystore* env_ks = subghz_environment_get_keystore( + subghz->txrx->environment); + SubGhzKeyArray_t* env_arr = subghz_keystore_get_data(env_ks); + SubGhzKey* entry = SubGhzKeyArray_push_raw(*env_arr); + entry->name = furi_string_alloc_set(key_name); + entry->key = ctx->recovered_mfkey; + entry->type = ctx->recovered_type; + return true; + + } else if(event.event == KL_DECRYPT_EVENT_DONE) { kl_ble_cleanup(ctx); subghz->keeloq_bf2.sig1_loaded = false; subghz->keeloq_bf2.sig2_loaded = false; if(ctx->success) { + furi_string_printf( + ctx->result, + "Found %lu candidate(s)\n" + "Last: %08lX%08lX\n" + "Type:%u Cnt:%04lX\n" + "Saved to user keys", + ctx->candidate_count, + (uint32_t)(ctx->recovered_mfkey >> 32), + (uint32_t)(ctx->recovered_mfkey & 0xFFFFFFFF), + ctx->recovered_type, + ctx->recovered_cnt); + + FlipperFormat* fff = subghz_txrx_get_fff_data(subghz->txrx); + flipper_format_rewind(fff); + + char mf_str[20]; + snprintf(mf_str, sizeof(mf_str), "BF_%07lX", ctx->serial); + flipper_format_insert_or_update_string_cstr(fff, "Manufacture", mf_str); + + uint32_t cnt_val = ctx->recovered_cnt; + flipper_format_rewind(fff); + flipper_format_insert_or_update_uint32(fff, "Cnt", &cnt_val, 1); + + if(ctx->hop2 != 0) { + flipper_format_rewind(fff); + flipper_format_insert_or_update_uint32(fff, "Hop2", &ctx->hop2, 1); + } + if(subghz_path_is_file(subghz->file_path)) { subghz_save_protocol_to_file( subghz,