void _KEY1::applyKeycode(u8 modulo) { encrypt(&keyCode[1]); encrypt(&keyCode[0]); u32 scratch[2] = {0}; for (u32 i = 0; i <= 0x44; i += 4) // xor with reversed byte-order (bswap) keyBuf[DWNUM(i)] ^= bswap32(keyCode[DWNUM(i % modulo)]); for (u32 i = 0; i <= 0x1040; i += 8) { encrypt(scratch); // encrypt S (64bit) by keybuf keyBuf[DWNUM(i)] = scratch[1]; // write S to keybuf (first upper 32bit) keyBuf[DWNUM(i+4)] = scratch[0]; // write S to keybuf (then lower 32bit) } }
void _KEY1::decrypt(u32 *ptr) { u32 y = ptr[0]; u32 x = ptr[1]; for (u32 i = 0x11; i >= 0x02; i--) { u32 z = keyBuf[i] ^ x; x = keyBuf[DWNUM(0x048 + (((z >> 24) & 0xFF) << 2))]; x = keyBuf[DWNUM(0x448 + (((z >> 16) & 0xFF) << 2))] + x; x = keyBuf[DWNUM(0x848 + (((z >> 8) & 0xFF) << 2))] ^ x; x = keyBuf[DWNUM(0xC48 + (((z >> 0) & 0xFF) << 2))] + x; x = y ^ x; y = z; } ptr[0] = x ^ keyBuf[DWNUM(0x04)]; ptr[1] = y ^ keyBuf[DWNUM(0x00)]; }
void _KEY1::encrypt(u32 *ptr) { u32 y = ptr[0]; u32 x = ptr[1]; for (u32 i = 0x00; i <= 0x0F; i++) { u32 z = keyBuf[i] ^ x; x = keyBuf[DWNUM(0x048 + (((z >> 24) & 0xFF) << 2))]; x = keyBuf[DWNUM(0x448 + (((z >> 16) & 0xFF) << 2))] + x; x = keyBuf[DWNUM(0x848 + (((z >> 8) & 0xFF) << 2))] ^ x; x = keyBuf[DWNUM(0xC48 + (((z >> 0) & 0xFF) << 2))] + x; x = y ^ x; y = z; } ptr[0] = x ^ keyBuf[DWNUM(0x40)]; ptr[1] = y ^ keyBuf[DWNUM(0x44)]; }
$NetBSD$ Relocated patch for src/NDSSystem.cpp to here. Source file changed. --- src/firmware.cpp.orig 2011-01-27 10:27:00.000000000 +0000 +++ src/firmware.cpp @@ -74,7 +74,9 @@ void CFIRMWARE::crypt64BitDown(u32 *ptr) ptr[1] = (Y ^ keyBuf[DWNUM(0x00)]); } +#ifndef bswap32 #define bswap32(val) (((val & 0x000000FF) << 24) | ((val & 0x0000FF00) << 8) | ((val & 0x00FF0000) >> 8) | ((val & 0xFF000000) >> 24)) +#endif void CFIRMWARE::applyKeycode(u32 modulo) { crypt64BitUp(&keyCode[1]);