git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlToolsRED@391 7061adef-622a-194b-ae81-725974e89856

This commit is contained in:
miya 2009-09-08 08:56:22 +00:00
parent 23bd4bd497
commit 2e3ecc4622
3 changed files with 137 additions and 32 deletions

View File

@ -6,6 +6,7 @@
#include "logprintf.h"
#include "error_report.h"
#define TITLE_LIST_ENCRYPTION 1
#define ATTRIBUTE_BACK 1
@ -292,6 +293,7 @@ s32 my_fs_crypto_read(FSFile *f, void *ptr, s32 size)
return readSize;
}
s32 my_fs_crypto_write(FSFile *f, void *ptr, s32 size)
{
s32 writtenSize;
@ -2061,7 +2063,14 @@ BOOL TitleIDLoad(const char *path, MY_USER_APP_TID **pBuffer, int *count, char *
goto function_end;
}
if( sizeof(int) != FS_ReadFile(&f, &id_count, (s32)sizeof(int)) ) {
#ifdef TITLE_LIST_ENCRYPTION
readSize = my_fs_crypto_read(&f, &id_count, (s32)sizeof(int));
#else /* TITLE_LIST_ENCRYPTION */
readSize = FS_ReadFile(&f, &id_count, (s32)sizeof(int));
#endif /* TITLE_LIST_ENCRYPTION */
if( sizeof(int) != readSize ) {
miya_log_fprintf(log_fd, "Failed Read File %s\n",__FUNCTION__);
miya_log_fprintf(log_fd, " path=%s\n", path );
miya_log_fprintf(log_fd, " res=%s\n", my_fs_util_get_fs_result_word( FS_GetArchiveResultCode(path) ));
@ -2070,8 +2079,14 @@ BOOL TitleIDLoad(const char *path, MY_USER_APP_TID **pBuffer, int *count, char *
}
if( (id_count < 0 ) || (128 < id_count) ) {
ret_flag = FALSE;
miya_log_fprintf(log_fd, "%s Failed suspicous data id_count=%d\n",__FUNCTION__, id_count );
goto function_end;
}
*count = id_count;
// size = (int)sizeof(u64) * id_count;
size = (int)sizeof(MY_USER_APP_TID) * id_count;
// *pBuffer = (u64 *)OS_Alloc( (u32)size );
@ -2082,7 +2097,11 @@ BOOL TitleIDLoad(const char *path, MY_USER_APP_TID **pBuffer, int *count, char *
goto function_end;
}
#ifdef TITLE_LIST_ENCRYPTION
readSize = my_fs_crypto_read(&f, (void *)*pBuffer, (s32)size );
#else /* TITLE_LIST_ENCRYPTION */
readSize = FS_ReadFile(&f, (void *)*pBuffer, (s32)size );
#endif /* TITLE_LIST_ENCRYPTION */
if( readSize != size ) {
miya_log_fprintf(log_fd, "Failed Read File: %s request size %d read size %d\n",path, size, readSize);
if( readSize != size ) {
@ -2118,7 +2137,7 @@ BOOL TitleIDSave(const char *path, MY_USER_APP_TID *pData, int count, char *log_
FSFile *log_fd;
FSFile log_fd_real;
BOOL ret_flag = TRUE;
int write_size;
log_fd = &log_fd_real;
FS_InitFile(&f);
@ -2167,7 +2186,12 @@ BOOL TitleIDSave(const char *path, MY_USER_APP_TID *pData, int count, char *log_
goto function_end;
}
if( sizeof(int) != FS_WriteFile(&f, &count, (s32)sizeof(int)) ) {
#ifdef TITLE_LIST_ENCRYPTION
write_size = my_fs_crypto_write(&f, &count, (s32)sizeof(int));
#else /* TITLE_LIST_ENCRYPTION */
write_size = FS_WriteFile(&f, &count, (s32)sizeof(int));
#endif /* TITLE_LIST_ENCRYPTION */
if( sizeof(int) != write_size ) {
res = FS_GetArchiveResultCode( path );
miya_log_fprintf(log_fd, "%s file write error %s\n", __FUNCTION__,path );
miya_log_fprintf(log_fd, " Failed write file:%s\n", my_fs_util_get_fs_result_word( res ));
@ -2190,7 +2214,12 @@ BOOL TitleIDSave(const char *path, MY_USER_APP_TID *pData, int count, char *log_
if( ( pData != NULL ) && ( count != 0 ) ) {
/* 16•¶Žš¾©ç */
if( (count*sizeof(MY_USER_APP_TID)) != FS_WriteFile(&f, pData, (s32)(count*sizeof(MY_USER_APP_TID)) )) {
#ifdef TITLE_LIST_ENCRYPTION
write_size = my_fs_crypto_write(&f, pData, (s32)(count*sizeof(MY_USER_APP_TID)));
#else /* TITLE_LIST_ENCRYPTION */
write_size = FS_WriteFile(&f, pData, (s32)(count*sizeof(MY_USER_APP_TID)));
#endif /* TITLE_LIST_ENCRYPTION */
if( (count*sizeof(MY_USER_APP_TID)) != write_size ) {
res = FS_GetArchiveResultCode( path );
miya_log_fprintf(log_fd, "%s file write error %s\n", __FUNCTION__,path );
miya_log_fprintf(log_fd, " Failed write file:%s\n", my_fs_util_get_fs_result_word( res ));
@ -2262,7 +2291,12 @@ BOOL TitleIDLoadETicketOnly(const char *path, MY_USER_ETICKET_TID **pBuffer, int
goto function_end;
}
if( sizeof(int) != FS_ReadFile(&f, &id_count, (s32)sizeof(int)) ) {
#ifdef TITLE_LIST_ENCRYPTION
readSize = my_fs_crypto_read(&f, &id_count, (s32)sizeof(int));
#else /* TITLE_LIST_ENCRYPTION */
readSize = FS_ReadFile(&f, &id_count, (s32)sizeof(int));
#endif /* TITLE_LIST_ENCRYPTION */
if( sizeof(int) != readSize ) {
miya_log_fprintf(log_fd, "Failed Read File %s\n",__FUNCTION__);
miya_log_fprintf(log_fd, " path=%s\n", path );
miya_log_fprintf(log_fd, " res=%s\n", my_fs_util_get_fs_result_word( FS_GetArchiveResultCode(path) ));
@ -2270,6 +2304,13 @@ BOOL TitleIDLoadETicketOnly(const char *path, MY_USER_ETICKET_TID **pBuffer, int
goto function_end;
}
if( (id_count < 0 ) || (128 < id_count) ) {
ret_flag = FALSE;
miya_log_fprintf(log_fd, "%s Failed suspicous data id_count=%d\n",__FUNCTION__, id_count );
goto function_end;
}
*count = id_count;
size = (int)sizeof(MY_USER_ETICKET_TID) * id_count;
@ -2279,7 +2320,11 @@ BOOL TitleIDLoadETicketOnly(const char *path, MY_USER_ETICKET_TID **pBuffer, int
miya_log_fprintf(log_fd, "%s Failed memory alloc size %d\n",__FUNCTION__, size);
goto function_end;
}
#ifdef TITLE_LIST_ENCRYPTION
readSize = my_fs_crypto_read(&f, (void *)*pBuffer, (s32)size );
#else /* TITLE_LIST_ENCRYPTION */
readSize = FS_ReadFile(&f, (void *)*pBuffer, (s32)size );
#endif /* TITLE_LIST_ENCRYPTION */
if( readSize != size ) {
miya_log_fprintf(log_fd, "Failed Read File: %s request size %d read size %d\n",path, size, readSize);
if( readSize != size ) {
@ -2313,6 +2358,7 @@ BOOL TitleIDSaveETicketOnly(const char *path, MY_USER_ETICKET_TID *pData, int co
FSFile *log_fd;
FSFile log_fd_real;
BOOL ret_flag = TRUE;
int write_size;
log_fd = &log_fd_real;
@ -2359,7 +2405,13 @@ BOOL TitleIDSaveETicketOnly(const char *path, MY_USER_ETICKET_TID *pData, int co
goto function_end;
}
if( sizeof(int) != FS_WriteFile(&f, &count, (s32)sizeof(int)) ) {
#ifdef TITLE_LIST_ENCRYPTION
write_size = my_fs_crypto_write(&f, &count, (s32)sizeof(int));
#else /* TITLE_LIST_ENCRYPTION */
write_size = FS_WriteFile(&f, &count, (s32)sizeof(int));
#endif /* TITLE_LIST_ENCRYPTION */
if( sizeof(int) != write_size ) {
res = FS_GetArchiveResultCode( path );
miya_log_fprintf(log_fd, "%s file write error %s\n", __FUNCTION__,path );
miya_log_fprintf(log_fd, " Failed write file:%s\n", my_fs_util_get_fs_result_word( res ));
@ -2372,7 +2424,12 @@ BOOL TitleIDSaveETicketOnly(const char *path, MY_USER_ETICKET_TID *pData, int co
if( ( pData != NULL ) && ( count != 0 ) ) {
/* 16•¶Žš¾©ç */
if( (count*sizeof(MY_USER_ETICKET_TID)) != FS_WriteFile(&f, pData, (s32)(count*sizeof(MY_USER_ETICKET_TID)) )) {
#ifdef TITLE_LIST_ENCRYPTION
write_size = my_fs_crypto_write(&f, pData, (s32)(count*sizeof(MY_USER_ETICKET_TID)) );
#else /* TITLE_LIST_ENCRYPTION */
write_size = FS_WriteFile(&f, pData, (s32)(count*sizeof(MY_USER_ETICKET_TID)) );
#endif /* TITLE_LIST_ENCRYPTION */
if( (count*sizeof(MY_USER_ETICKET_TID)) != write_size ) {
res = FS_GetArchiveResultCode( path );
miya_log_fprintf(log_fd, "%s file write error %s\n", __FUNCTION__,path );
miya_log_fprintf(log_fd, " Failed write file:%s\n", my_fs_util_get_fs_result_word(res));

View File

@ -3,7 +3,7 @@
#define MY_DATA_VERSION_MAJOR 1
#define MY_DATA_VERSION_MINOR 7
#define MY_DATA_VERSION_MINOR 8
typedef struct {
u8 version_major;

View File

@ -27,6 +27,15 @@ typedef int BOOL;
#endif
/* グローバルデータ */
#define MAX_TITLE_IDS 2048
static int num_of_title_ids = 0;
static u32 title_id_hi_array[MAX_TITLE_IDS];
static u32 title_id_lo_array[MAX_TITLE_IDS];
static u16 title_ver_array[MAX_TITLE_IDS];
static u16 title_gid_array[MAX_TITLE_IDS];
static char title_rom_file_full_path[MAX_TITLE_IDS][256];
/* tadのデータは基本的にビッグエンディアン */
@ -83,25 +92,6 @@ typedef struct NAMTadInfo
u32 fileSize;
} NAMTadInfo;
#if 0
pInfo->sizes.cert = NAMi_EndianU32(pHeader->certSize);
pInfo->sizes.crl = NAMi_EndianU32(pHeader->crlSize);
pInfo->sizes.ticket = NAMi_EndianU32(pHeader->ticketSize);
pInfo->sizes.tmd = NAMi_EndianU32(pHeader->tmdSize);
pInfo->sizes.content = NAMi_EndianU32(pHeader->contentSize);
pInfo->sizes.meta = NAMi_EndianU32(pHeader->metaSize);
pInfo->offsets.cert = MATH_ROUNDUP(sizeof(NAMiTADHeader), TAD_ALIGN);
pInfo->offsets.crl = pInfo->offsets.cert + MATH_ROUNDUP(pInfo->sizes.cert, TAD_ALIGN);
pInfo->offsets.ticket = pInfo->offsets.crl + MATH_ROUNDUP(pInfo->sizes.crl, TAD_ALIGN);
pInfo->offsets.tmd = pInfo->offsets.ticket + MATH_ROUNDUP(pInfo->sizes.ticket, TAD_ALIGN);
pInfo->offsets.content = pInfo->offsets.tmd + MATH_ROUNDUP(pInfo->sizes.tmd, TAD_ALIGN);
pInfo->offsets.meta = pInfo->offsets.content + MATH_ROUNDUP(pInfo->sizes.content, TAD_ALIGN);
#endif
#define ES_APP_ENC_HANDLE 6
@ -126,6 +116,7 @@ typedef u16 ESContentType; /* content type */
typedef u8 ESTmdReserved[62]; /* reserved field in TMD structure */
typedef u8 ESTicketReserved[47]; /* reserved field in eTicket structure */
typedef u8 ESSysAccessMask[2]; /* 16 bit cidx Mask to indicate which
content can be accessed by sys app */
#if !defined(__ES_INTERNAL__)
/* IOSC types */
@ -536,7 +527,7 @@ static write_tad_table_form(FILE *fp, u32 tid_hi, u32 tid_lo, char *filename)
}
#endif
static void read_file_and_print_titleid( char *path , char *d_name, FILE *fp_out, FILE *fp_mk, BOOL is_sd )
static BOOL read_file_and_print_titleid( char *path , char *d_name, FILE *fp_out, FILE *fp_mk, BOOL is_sd )
{
FILE *fp_in = NULL;
TAD_INFO tad_info;
@ -545,16 +536,21 @@ static void read_file_and_print_titleid( char *path , char *d_name, FILE *fp_out
u32 titleid_lo = 0;
u16 t_ver;
u16 gid;
int i;
BOOL ret_flag = TRUE;
fp_in = fopen(path,"rb"); /* fseek効かすため */
if( fp_in == NULL ) {
fprintf(stderr, "error: file open %s\n",path);
ret_flag = FALSE;
goto end_file;
}
/* TADファイルかどうかチェック */
if( FALSE == read_tad_info(fp_in, &tad_info) ) {
// fprintf(stderr, "error:%s %d\n",__FUNCTION__,__LINE__);
ret_flag = FALSE;
goto end_file;
}
@ -562,6 +558,7 @@ static void read_file_and_print_titleid( char *path , char *d_name, FILE *fp_out
fseek( fp_in, 0, SEEK_END );
if( tad_info.fileSize != ftell( fp_in ) ) {
printf( "file size is not expected size(=%d)", tad_info.fileSize );
ret_flag = FALSE;
goto end_file;
}
@ -582,6 +579,35 @@ static void read_file_and_print_titleid( char *path , char *d_name, FILE *fp_out
printf("inputfile = %s\n", path);
}
/* ここでタイトルIDの重複チェックする */
for( i = 0 ; i < num_of_title_ids ; i++ ) {
if( (title_id_hi_array[i] == titleid_hi) && (title_id_lo_array[i] == titleid_lo) ) {
if( title_ver_array[i] == t_ver ) {
/* バージョンも含めて重複してる! */
fprintf(stderr, "Error: title exists redundantly\n");
}
else {
/* バージョン違いだけど重複してる */
fprintf(stderr, "Warning: title exists in different versions\n");
}
fprintf(stderr, " 0x%08x%08x, 0x%04x , 0x%04x %s\n",
title_id_hi_array[i], title_id_lo_array[i],
title_ver_array[i], title_gid_array[i], title_rom_file_full_path[i] );
fprintf(stderr, " 0x%08x%08x, 0x%04x , 0x%04x %s\n", titleid_hi, titleid_lo, t_ver , gid , path);
}
}
title_id_hi_array[ num_of_title_ids ] = titleid_hi;
title_id_lo_array[ num_of_title_ids ] = titleid_lo;
title_ver_array[ num_of_title_ids ] = t_ver;
title_gid_array[ num_of_title_ids ] = gid;
strcpy( title_rom_file_full_path[num_of_title_ids], path);
num_of_title_ids++;
if( fp_out ) {
if( is_sd == FALSE ) {
fprintf(fp_out, "0x%08x%08x, 0x%04x , 0x%04x , rom:/%s,\n", titleid_hi, titleid_lo, t_ver , gid , d_name);
@ -612,10 +638,12 @@ static void read_file_and_print_titleid( char *path , char *d_name, FILE *fp_out
fclose(fp_in);
}
return ret_flag;
}
int main(int argc, char **argv)
{
int i;
FILE *fp_in = NULL;
FILE *fp_out = NULL;
FILE *fp_mk = NULL;
@ -650,6 +678,7 @@ int main(int argc, char **argv)
struct stat st;
char *full_path;
char rom_file_full_path[256];
BOOL func_ret_flag;
// test();
@ -752,7 +781,15 @@ int main(int argc, char **argv)
}
}
/* チェック用のテーブル初期化(いらんけど) */
num_of_title_ids = 0;
for( i = 0 ; i < MAX_TITLE_IDS ; i++ ) {
title_id_hi_array[i] = 0;
title_id_lo_array[i] = 0;
title_ver_array[i] = 0;
title_gid_array[i] = 0;
title_rom_file_full_path[i][0] = 0;
}
/* ディレクトリ中のTADファイルをリストにして表示する。 */
while( (dr = readdir(dir)) != NULL ) {
@ -782,17 +819,28 @@ int main(int argc, char **argv)
}
if( st.st_size >= 32 ) {
if( file_dir_flag ) {
/* テーブルファイルに登録するときディレクトリ名をつけて処理する、というフラグ */
strcpy( rom_file_full_path, file_dir);
strcat( rom_file_full_path, "/");
if( sd_flag == TRUE ) {
strcat( rom_file_full_path, "en_");
}
strcat( rom_file_full_path, dr->d_name);
read_file_and_print_titleid( full_path ,rom_file_full_path, fp_out , fp_mk , sd_flag);
func_ret_flag = read_file_and_print_titleid( full_path ,rom_file_full_path, fp_out , fp_mk , sd_flag);
}
else {
read_file_and_print_titleid( full_path ,dr->d_name, fp_out , fp_mk , sd_flag);
func_ret_flag = read_file_and_print_titleid( full_path ,dr->d_name, fp_out , fp_mk , sd_flag);
}
if( func_ret_flag == TRUE ) {
/*
tadファイルだったのでテーブルファイルに登録された
*/
// printf("cryptopc.exe tad1024.der %s\n",full_path);
}
}
}