25static const kventry kvlookup[] =
91 printf(
"%02X",
data[i]);
113 if(buffer[0]==0xC0 && buffer[1]==0xFF && buffer[2]==0xFF && buffer[3]==0xFF)
115 memcpy(
data,&buffer[0x20],0x10);
128 if(buffer[0]==0xC0 && buffer[1]==0xFF && buffer[2]==0xFF && buffer[3]==0xFF)
130 memcpy(
data,&buffer[0x20],0x10);
140int kv_get_key(
unsigned char keyid,
unsigned char *keybuf,
int *keybuflen,
unsigned char *keyvault)
145 if (*keybuflen != kvlookup[keyid].
length)
147 *keybuflen = kvlookup[keyid].
length;
150 memcpy(keybuf, keyvault + kvlookup[keyid].offset, kvlookup[keyid].
length);
161 unsigned char cpu_key[0x10];
168 unsigned char hmac_key[0x10];
169 memcpy(hmac_key,
data, 0x10);
172 unsigned char rc4_key[0x10];
173 memset(rc4_key, 0, 0x10);
175 HMAC_SHA1(cpu_key, hmac_key, rc4_key, 0x10);
178 unsigned char rc4_state[0x100];
179 memset(rc4_state, 0, 0x100);
189 unsigned char out[20];
190 unsigned char tmp[] = {0x07, 0x12};
212 if (
data[index] != out[index])
234 printf(
"! Attempting to decrypt DVDKey with Virtual CPU Key !\n");
238 printf(
" ! kv_get_dvd_key Failure: kv_read\n");
240 printf(
" ! the hash check failed probably as a result of decryption failure\n");
241 printf(
" ! make sure that the CORRECT key vault for this console is in flash\n");
242 printf(
" ! the key vault should be at offset 0x4200 for a length of 0x4200\n");
243 printf(
" ! in the 'raw' flash binary from THIS console\n");
250 printf(
" ! kv_get_dvd_key Failure: kv_get_key %d\n", result);
261 unsigned char key[0x10];
265 memset(key,
'\0',
sizeof(key));
270 memset(key,
'\0',
sizeof(key));
272 print_key(
" * your virtual cpu key", key);
274 memset(key,
'\0',
sizeof(key));
279 printf(
" ! Unable to read Keyvault data from NAND\n");
363 int i,
j,
k,
status, startblock, current, offsetinblock, blockcnt, filelength;
364 unsigned char *updxell, *user, *spare;
367 f = fopen(path,
"rb");
374 printf(
" ! sfcx is not initialized! Unable to update XeLL in NAND!\n");
379 fseek(f, 0, SEEK_END);
381 fseek(f, 0, SEEK_SET);
384 printf(
" ! %s does not have the correct size of 256kb. Aborting update!\n", path);
388 printf(
"\n * found XeLL update. press power NOW if you don't want to update.\n");
393 current = xelloffsets[
k];
401 printf(
" ! Error while memallocating filebuffer (spare)\n");
404 user = (
unsigned char*)malloc(blockcnt*
sfc.
block_sz);
406 printf(
" ! Error while memallocating filebuffer (user)\n");
422 printf(
" * XeLL Binary in NAND found @ 0x%08X\n", (startblock*
sfc.
block_sz)+offsetinblock);
424 updxell = (
unsigned char*)malloc(
XELL_SIZE);
426 printf(
" ! Error while memallocating filebuffer (updxell)\n");
433 printf(
" ! Error reading file from %s\n", path);
438 printf(
" ! XeLL does not seem to have matching footer, Aborting update!\n");
443 memcpy(&user[offsetinblock], updxell,
XELL_SIZE);
444 printf(
" * Writing to NAND!\n");
463 printf(
" * XeLL flashed! Reboot the xbox to enjoy the new build\n");
468 printf(
" ! Couldn't locate XeLL binary in NAND. Aborting!\n");
474 unsigned int DVEversion, tmp;
477 tmp = (tmp & ~0xF0) | ((DVEversion >> 12) & 0xF0);
483 return ((read32(0xd0000008) << 24) >> 24);
489 asm volatile(
"mfpvr %0" :
"=r" (PVR));
495 return ((read32(0xd0010000) >> 16) & 0xFFFF);
500 unsigned int PVR, PCIBridgeRevisionID, consoleVersion, DVEversion;
506 if(PVR == 0x710200 || PVR == 0x710300)
508 if(consoleVersion < 0x5821)
510 else if(consoleVersion >= 0x5821 && consoleVersion < 0x5831)
514 else if(consoleVersion >= 0x5831 && consoleVersion < 0x5841)
516 else if(consoleVersion >= 0x5841 && consoleVersion < 0x5851)
519 if (DVEversion >= 0x20 && PVR == 0x710800)
528 else if(consoleVersion >= 0x5851)
540 memcpy(&tmp, (
const void*)(0x80000200C8000000ULL), 2);
549 memcpy(buf, (
const void*)(0x80000200C8000000ULL + offset), len);
void HMAC_SHA1_EndMessage(unsigned char *out, HMAC_SHA1_CTX *ctx)
void HMAC_SHA1(void *secret, void *data, void *res, int len)
void HMAC_SHA1_UpdateMessage(HMAC_SHA1_CTX *ctx, unsigned char *data, unsigned int datalen)
void HMAC_SHA1_Done(HMAC_SHA1_CTX *ctx)
void HMAC_SHA1_Init(HMAC_SHA1_CTX *ctx)
void HMAC_SHA1_StartMessage(HMAC_SHA1_CTX *ctx)
void HMAC_SHA1_UpdateKey(HMAC_SHA1_CTX *ctx, unsigned char *key, unsigned int keylen)
void HMAC_SHA1_EndKey(HMAC_SHA1_CTX *ctx)
void rc4_init(unsigned char *state, unsigned char *key, int len)
void rc4_crypt(unsigned char *state, unsigned char *data, int len)
int xenon_get_logical_nand_data(void *buf, unsigned int offset, unsigned int len)
unsigned int xenon_get_CPU_PVR()
void print_key(char *name, unsigned char *data)
int get_virtual_cpukey(unsigned char *data)
int updateXeLL(char *path)
unsigned int xenon_get_PCIBridgeRevisionID()
unsigned int xenon_get_kv_offset()
unsigned int xenon_get_XenosID()
int kv_read(unsigned char *data, int virtualcpukey)
void print_cpu_dvd_keys(void)
struct XCONFIG_SECURED_SETTINGS secured_settings
int kv_get_key(unsigned char keyid, unsigned char *keybuf, int *keybuflen, unsigned char *keyvault)
unsigned int xenon_get_DVE()
unsigned int xenon_get_kv_size()
int xenon_logical_nand_data_ok()
int xenon_get_console_type()
int cpu_get_key(unsigned char *data)
int kv_get_dvd_key(unsigned char *dvd_key)
#define XEKEY_RESERVED_WORD2
#define XEKEY_RESERVED_QWORD2
#define XEKEY_RESERVED_KEY4
#define XEKEY_WIRELESS_CONTROLLER_3P_2DES_KEY1
#define XEKEY_WIRED_CONTROLLER_3P_2DES_KEY2
#define XEKEY_KEY_OBFUSCATION_KEY
#define XEKEY_RESERVED_BYTE3
#define XEKEY_GLOBAL_DEVICE_2DES_KEY1
#define XEKEY_ROAMABLE_OBFUSCATION_KEY
#define XEKEY_WIRELESS_CONTROLLER_MS_2DES_KEY1
#define REV_CORONA_PHISON
#define XEKEY_PRIMARY_ACTIVATION_KEY
#define XEKEY_RESERVED_DWORD4
#define XEKEY_WIRELESS_CONTROLLER_MS_2DES_KEY2
#define XEKEY_WIRED_WEBCAM_3P_2DES_KEY1
#define XEKEY_SECONDARY_ACTIVATION_KEY
#define XEKEY_MEMORY_UNIT_3P_2DES_KEY2
#define XEKEY_RESERVED_KEY1
#define XEKEY_CARDEA_PRIVATE_KEY
#define XELL_OFFSET_COUNT
#define XEKEY_RESERVED_KEY3
#define XEKEY_RESTRICTED_HVEXT_LOADER
#define XEKEY_WIRED_CONTROLLER_3P_2DES_KEY1
#define XEKEY_RESERVED_RANDOM_KEY1
#define XEKEY_OTHER_XSM3_DEVICE_MS_2DES_KEY1
#define XEKEY_MEMORY_UNIT_MS_2DES_KEY2
#define REV_WINCHESTER_MMC
#define XEKEY_MANUFACTURING_MODE
#define XEKEY_MEMORY_UNIT_MS_2DES_KEY1
#define XEKEY_WIRED_CONTROLLER_MS_2DES_KEY1
#define XEKEY_RESERVED_QWORD3
#define XEKEY_XEIKA_PRIVATE_KEY
#define XEKEY_MEMORY_UNIT_3P_2DES_KEY1
#define XEKEY_CONSOLE_SERIAL_NUMBER
#define XEKEY_WIRED_WEBCAM_MS_2DES_KEY1
#define XEKEY_CONSOLE_OBFUSCATION_KEY
#define XEKEY_RESERVED_WORD1
#define XEKEY_RESTRICTED_PRIVILEDGES
#define XEKEY_WIRELESS_CONTROLLER_3P_2DES_KEY2
#define XEKEY_WIRED_WEBCAM_3P_2DES_KEY2
#define XEKEY_CONSOLE_CERTIFICATE
#define XEKEY_RESERVED_DWORD2
#define XEKEY_RESERVED_DWORD3
#define XEKEY_RESERVED_QWORD4
#define XEKEY_CONSOLE_PRIVATE_KEY
#define XEKEY_WIRED_WEBCAM_MS_2DES_KEY2
#define XEKEY_RESERVED_RANDOM_KEY2
#define XEKEY_OTHER_XSM3_DEVICE_3P_2DES_KEY1
#define XEKEY_ALTERNATE_KEY_VAULT
#define XEKEY_XEIKA_CERTIFICATE
#define XEKEY_GAME_REGION
#define XEKEY_RESERVED_KEY2
#define XEKEY_OTHER_XSM3_DEVICE_3P_2DES_KEY2
#define XEKEY_OTHER_XSM3_DEVICE_MS_2DES_KEY2
#define XEKEY_RESERVED_BYTE2
#define XEKEY_GLOBAL_DEVICE_2DES_KEY2
#define XEKEY_MOBO_SERIAL_NUMBER
#define XEKEY_CARDEA_CERTIFICATE
#define XEKEY_WIRED_CONTROLLER_MS_2DES_KEY2
unsigned char pagebuf[MAX_PAGE_SZ]
uint64_t xenon_secotp_read_line(int nr)
unsigned long sfcx_readreg(int addr)
int sfcx_is_pageerased(unsigned char *data)
int sfcx_read_page(unsigned char *data, int address, int raw)
int sfcx_write_page(unsigned char *data, int address)
void sfcx_calcecc(unsigned int *data)
int sfcx_erase_block(int address)
int xenon_smc_ana_read(uint8_t addr, uint32_t *val)
#define XELL_FOOTER_LENGTH
#define XELL_FOOTER_OFFSET