2019-06-10 16:30:40 +02:00
|
|
|
#include "cmd.h"
|
|
|
|
|
|
|
|
|
|
|
|
u32 CheckCmdSize(CmdHeader* cmd, u64 fsize) {
|
|
|
|
u64 cmdsize = sizeof(CmdHeader) +
|
|
|
|
(cmd->n_entries * sizeof(u32)) +
|
|
|
|
(cmd->n_cmacs * sizeof(u32)) +
|
|
|
|
(cmd->n_entries * 0x10);
|
|
|
|
|
|
|
|
return (fsize == cmdsize) ? 0 : 1;
|
|
|
|
}
|
2020-07-22 00:20:16 +02:00
|
|
|
|
|
|
|
u32 BuildCmdData(CmdHeader* cmd, TitleMetaData* tmd) {
|
|
|
|
u32 content_count = getbe16(tmd->content_count);
|
|
|
|
|
|
|
|
// header basic info
|
|
|
|
cmd->cmd_id = 0x1;
|
|
|
|
cmd->n_entries = content_count;
|
|
|
|
cmd->n_cmacs = content_count;
|
|
|
|
cmd->unknown = 0x0; // this means no CMACs, only valid for NAND
|
|
|
|
|
|
|
|
// copy content ids
|
|
|
|
u32* cnt_id = (u32*) (cmd + 1);
|
|
|
|
u32* cnt_id_cpy = cnt_id + content_count;
|
|
|
|
TmdContentChunk* chunk = (TmdContentChunk*) (tmd + 1);
|
|
|
|
for (u32 i = 0; (i < content_count) && (i < TMD_MAX_CONTENTS); i++, chunk++) {
|
|
|
|
cnt_id[i] = getbe32(chunk->id);
|
|
|
|
cnt_id_cpy[i] = cnt_id[i];
|
|
|
|
}
|
|
|
|
|
|
|
|
// bubble sort the second content id list
|
|
|
|
u32 b = 0;
|
|
|
|
while ((b < content_count) && (b < TMD_MAX_CONTENTS)) {
|
|
|
|
for (b = 1; (b < content_count) && (b < TMD_MAX_CONTENTS); b++) {
|
|
|
|
if (cnt_id_cpy[b] < cnt_id_cpy[b-1]) {
|
|
|
|
u32 swp = cnt_id_cpy[b];
|
|
|
|
cnt_id_cpy[b] = cnt_id_cpy[b-1];
|
|
|
|
cnt_id_cpy[b-1] = swp;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// set CMACs to 0xFF
|
|
|
|
u8* cnt_cmac = (u8*) (cnt_id + (2*cmd->n_entries));
|
|
|
|
memset(cmd->cmac, 0xFF, 0x10);
|
|
|
|
memset(cnt_cmac, 0xFF, 0x10 * content_count);
|
|
|
|
|
|
|
|
// we still need to fix / set the CMACs inside the CMD file!
|
|
|
|
return 0;
|
|
|
|
}
|