diff --git a/arm9/source/game/tadx.c b/arm9/source/game/tadx.c new file mode 100644 index 0000000..cf4064b --- /dev/null +++ b/arm9/source/game/tadx.c @@ -0,0 +1,15 @@ +#include "tadx.h" +#include "cia.h" + +u32 ValidateTadXHeader(TadXHeader* header) { + // super strict validation + if ((getbe32(header->size_header) != TADX_HEADER_SIZE) || + (getbe32(header->size_cert) != TADX_CERT_SIZE) || + (getbe32(header->size_ticket) != TICKET_TWL_SIZE) || + (getbe32(header->size_tmd) != TMD_SIZE_TWL) || + (getbe32(header->reserved0) != 0) || + (getbe32(header->reserved1) != 0) || + (getbe32(header->size_content) == 0)) + return 1; + return 0; +} diff --git a/arm9/source/game/tadx.h b/arm9/source/game/tadx.h new file mode 100644 index 0000000..adb7c41 --- /dev/null +++ b/arm9/source/game/tadx.h @@ -0,0 +1,39 @@ +#pragma once + +#include "common.h" +#include "ticket.h" +#include "tmd.h" + +#define TADX_HEADER_SIZE sizeof(TadXHeader) +#define TADX_CERT_SIZE 0xE80 + +#define TADX_OFFSET_CERT align(TADX_HEADER_SIZE, 40) +#define TADX_OFFSET_TICKET (TADX_OFFSET_CERT + align(TADX_CERT_SIZE, 40)) +#define TADX_OFFSET_TMD (TADX_OFFSET_TICKET + align(TICKET_TWL_SIZE, 40)) +#define TADX_OFFSET_CONTENT (TADX_OFFSET_TMD + align(TMD_SIZE_TWL, 40)) +#define TADX_OFFSET_CHUNK (TADX_OFFSET_TMD + TMD_SIZE_STUB) + +// this describes the TWL TAD exchangable format (similar to CIA) +// see: https://wiibrew.org/wiki/WAD_files#WAD_format +typedef struct { + u8 size_header[4]; + u8 type[2]; + u8 version[2]; + u8 size_cert[4]; + u8 reserved0[4]; + u8 size_ticket[4]; + u8 size_tmd[4]; + u8 size_content[4]; + u8 reserved1[4]; +} PACKED_STRUCT TadXHeader; + +typedef struct { + TadXHeader header; + u8 header_padding[0x40 - (TADX_HEADER_SIZE % 0x40)]; + u8 cert[TADX_CERT_SIZE]; + // cert is aligned and needs no padding + Ticket ticket; + u8 ticket_padding[0x40 - (TICKET_TWL_SIZE % 0x40)]; + u8 tmd[TMD_SIZE_TWL]; + u8 tmd_padding[0x40 - (TMD_SIZE_TWL % 40)]; +} PACKED_ALIGN(16) TadXStub;