mirror of
https://github.com/yellows8/dsi.git
synced 2025-06-19 03:35:34 -04:00
126 lines
2.1 KiB
C
126 lines
2.1 KiB
C
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <malloc.h>
|
|
#include "dsi.h"
|
|
|
|
//modified version of neimod's taddy app.
|
|
|
|
void save(const char* path, const unsigned char* buffer, unsigned int size)
|
|
{
|
|
FILE* f = fopen(path, "wb");
|
|
if (f)
|
|
{
|
|
fwrite(buffer, 1, size, f);
|
|
fclose(f);
|
|
}
|
|
}
|
|
|
|
int main(int argc, char* argv[])
|
|
{
|
|
FILE* f = 0;
|
|
int result = -1;
|
|
dsi_es_context ctx;
|
|
unsigned char metablock[0x20];
|
|
unsigned char footer[0x440];
|
|
unsigned char key[16];
|
|
int reencrypt = 0;
|
|
|
|
|
|
fprintf(stdout, "footercrypt, modified version of neimod's taddy app.\n");
|
|
|
|
if (argc < 5)
|
|
{
|
|
fprintf(stderr, "Usage: <in.bin> <key.bin> <out.bin> <options>\n");
|
|
fprintf(stderr, "Options:\n--crypt=<en/de> Decrypt when --crypt=de is used, encrypt when --crypt=en.\n");
|
|
return result;
|
|
}
|
|
|
|
if(strcmp(argv[4], "--crypt=en")==0)
|
|
{
|
|
reencrypt = 1;
|
|
}
|
|
else if(strcmp(argv[4], "--crypt=de")==0)
|
|
{
|
|
reencrypt = 0;
|
|
}
|
|
else
|
|
{
|
|
fprintf(stderr, "Unknown option %s\n", argv[3]);
|
|
goto clean;
|
|
}
|
|
|
|
// Read key from file
|
|
f = fopen(argv[2], "rb");
|
|
if (f == 0)
|
|
{
|
|
fprintf(stderr, "Could not open key file\n");
|
|
goto clean;
|
|
}
|
|
if (16 != fread(key, 1, 16, f))
|
|
{
|
|
fprintf(stderr, "Error reading key\n");
|
|
goto clean;
|
|
}
|
|
|
|
dsi_es_init(&ctx, key);
|
|
|
|
|
|
// Read and decrypt header
|
|
f = fopen(argv[1], "rb+");
|
|
|
|
if (f == 0)
|
|
goto clean;
|
|
|
|
result = 0;
|
|
|
|
fseek(f, 0x0, SEEK_SET);
|
|
if (0x440 != fread(footer, 1, 0x440, f))
|
|
{
|
|
fprintf(stderr, "Error reading footer.\n");
|
|
goto clean;
|
|
}
|
|
if(!reencrypt)
|
|
{
|
|
if (0x20 != fread(metablock, 1, 0x20, f))
|
|
{
|
|
fprintf(stderr, "Error reading footer metablock.\n");
|
|
goto clean;
|
|
}
|
|
}
|
|
|
|
if (reencrypt)
|
|
{
|
|
dsi_es_encrypt(&ctx, footer, metablock, sizeof(footer));
|
|
}
|
|
else
|
|
{
|
|
if (dsi_es_decrypt(&ctx, footer, metablock, sizeof(footer)) < 0)
|
|
{
|
|
fprintf(stderr, "Error decrypting footer.\n");
|
|
goto clean;
|
|
}
|
|
save(argv[3], footer, sizeof(footer));
|
|
}
|
|
|
|
if (reencrypt)
|
|
{
|
|
fclose(f);
|
|
f = fopen(argv[3], "wb");
|
|
fseek(f, 0x0, SEEK_SET);
|
|
fwrite(footer, 1, sizeof(footer), f);
|
|
fwrite(metablock, 1, sizeof(metablock), f);
|
|
}
|
|
|
|
|
|
|
|
|
|
fprintf(stdout, "Done - Have a nice day.\n");
|
|
|
|
clean:
|
|
if (f)
|
|
fclose(f);
|
|
|
|
return result;
|
|
}
|
|
|