From 70b51ec38eb7d78feec07c0e5c0fd52de30d54fe Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Mon, 16 Mar 2026 12:01:38 +0000 Subject: [PATCH] Add Wii U conversion support: implement command and usage for converting WUD/WUX to AaruFormat --- tool/CMakeLists.txt | 4 ++++ tool/aaruformattool.h | 1 + tool/commands.c | 24 ++++++++++++++++++++++++ tool/usage.c | 19 +++++++++++++++++++ tool/usage.h | 1 + 5 files changed, 49 insertions(+) diff --git a/tool/CMakeLists.txt b/tool/CMakeLists.txt index 5086fa8..4b61e88 100644 --- a/tool/CMakeLists.txt +++ b/tool/CMakeLists.txt @@ -35,9 +35,13 @@ add_executable(aaruformattool iso9660_mini.c iso9660_mini.h convert_ps3.c + convert_wiiu.c + wiiu_reader.c + wiiu_reader.h ${CMAKE_CURRENT_SOURCE_DIR}/../src/lib/aes128.c ${CMAKE_CURRENT_SOURCE_DIR}/../src/ps3/ps3_crypto.c ${CMAKE_CURRENT_SOURCE_DIR}/../src/ps3/ps3_encryption_map.c + ${CMAKE_CURRENT_SOURCE_DIR}/../src/wiiu/wiiu_crypto.c termbox2.h ) diff --git a/tool/aaruformattool.h b/tool/aaruformattool.h index 5d669e6..f93bdbe 100644 --- a/tool/aaruformattool.h +++ b/tool/aaruformattool.h @@ -45,5 +45,6 @@ int upgrade_ddt_to_alpha21(const char *path); int inject_media_tag(const char *tag_type, const char *media_tag_file, const char *image_file); int convert_ps3(const char *input_path, const char *output_path, const char *disc_key_hex, const char *data1_key_hex, const char *ird_path); +int convert_wiiu(const char *input_path, const char *output_path, const char *disc_key_hex); #endif // LIBAARUFORMAT_TOOL_AARUFORMATTOOL_H_ diff --git a/tool/commands.c b/tool/commands.c index 92d1912..8cd4a00 100644 --- a/tool/commands.c +++ b/tool/commands.c @@ -243,6 +243,29 @@ int cmd_convert_ps3(int argc, char *argv[]) return result; } +int cmd_convert_wiiu(int argc, char *argv[]) +{ + struct arg_str *input_filename = arg_str1(NULL, NULL, "", "Input WUD, WUX, or AaruFormat image"); + struct arg_str *output_filename = arg_str1(NULL, NULL, "", "Output AaruFormat image"); + struct arg_str *disc_key_arg = arg_str0(NULL, "disc-key", "", "32-char hex disc key"); + struct arg_end *end = arg_end(10); + void *argtable[] = {input_filename, output_filename, disc_key_arg, end}; + + if(arg_parse(argc, argv, argtable) > 0) + { + arg_print_errors(stderr, end, "convert-wiiu"); + usage_convert_wiiu(); + arg_freetable(argtable, sizeof(argtable) / sizeof(argtable[0])); + return -1; + } + + const char *disc_key_hex = disc_key_arg->count > 0 ? disc_key_arg->sval[0] : NULL; + + const int result = convert_wiiu(input_filename->sval[0], output_filename->sval[0], disc_key_hex); + arg_freetable(argtable, sizeof(argtable) / sizeof(argtable[0])); + return result; +} + Command commands[] = { { "identify", cmd_identify}, { "info", cmd_info}, @@ -256,6 +279,7 @@ Command commands[] = { {"upgrade-ddt-to-alpha21", cmd_upgrade_ddt_to_alpha21}, { "inject-media-tag", cmd_inject_media_tag}, { "convert-ps3", cmd_convert_ps3}, + { "convert-wiiu", cmd_convert_wiiu}, }; const size_t num_commands = sizeof(commands) / sizeof(commands[0]); diff --git a/tool/usage.c b/tool/usage.c index e87d1f4..49450d6 100644 --- a/tool/usage.c +++ b/tool/usage.c @@ -38,6 +38,8 @@ void usage() printf(" cli-compare Compares two AaruFormat images sector by sector (CLI mode).\n"); printf(" compare Compares two AaruFormat images.\n"); printf(" convert Converts an AaruFormat image to another AaruFormat image.\n"); + printf(" convert-ps3 Converts a PS3 disc image to AaruFormat with decrypted storage.\n"); + printf(" convert-wiiu Converts a Wii U disc image to AaruFormat with decrypted storage.\n"); printf(" identify Identifies if the indicated file is a supported AaruFormat image.\n"); printf(" info Prints information about a given AaruFormat image.\n"); printf(" inject-media-tag Injects a media tag into an AaruFormat image.\n"); @@ -180,3 +182,20 @@ void usage_convert_ps3() printf(" 4. Sidecar files: .disc_key, .data1, .ird\n"); printf(" 5. Source AaruFormat image media tags\n"); } + +void usage_convert_wiiu() +{ + printf("\nUsage:\n"); + printf(" aaruformattool convert-wiiu [options]\n\n"); + printf("Converts a Wii U disc WUD, WUX, or AaruFormat image to an AaruFormat image\n"); + printf("with decrypted sector storage and Wii U encryption metadata.\n\n"); + printf("Arguments:\n"); + printf(" Path to input WUD, WUX, or AaruFormat image.\n"); + printf(" Path to output AaruFormat image.\n\n"); + printf("Options:\n"); + printf(" --disc-key= 32-char hex disc key (16 bytes).\n\n"); + printf("Key resolution order:\n"); + printf(" 1. --disc-key argument\n"); + printf(" 2. Sidecar files: .disckey, .key\n"); + printf(" 3. Source AaruFormat image media tags\n"); +} diff --git a/tool/usage.h b/tool/usage.h index e9d2547..cb2a74e 100644 --- a/tool/usage.h +++ b/tool/usage.h @@ -34,5 +34,6 @@ void usage_convert(); void usage_upgrade_ddt_to_alpha21(); void usage_inject_media_tag(); void usage_convert_ps3(); +void usage_convert_wiiu(); #endif // LIBAARUFORMAT_USAGE_H