#include #include #include #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: \n"); fprintf(stderr, "Options:\n--crypt= 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; }