26static const kventry kvlookup[] =
92 printf(
"%02X",
data[i]);
100 for (i = 0; i < 12; i++)
101 printf(
"%c",
data[i]);
120 const unsigned char fuseline0[0x8] = { 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
132 if( 0 == memcmp(buffer, fuseline0,
sizeof(fuseline0)) )
134 memcpy(
data,&buffer[0x20],0x10);
162 if( 0 == patchSlotSize )
164 patchSlotSize = 0x10000;
168 for(
int i = 0; i < patchSlotCount; i++)
170 uint32_t patchSlotAddress = patchSlotOffset + (i * patchSlotSize);
181 if( 0 == memcmp(buffer, fuseline0,
sizeof(fuseline0)) )
183 memcpy(
data,&buffer[0x20],0x10);
193int kv_get_key(
unsigned char keyid,
unsigned char *keybuf,
int *keybuflen,
unsigned char *keyvault)
198 if (*keybuflen != kvlookup[keyid].
length)
200 *keybuflen = kvlookup[keyid].
length;
203 memcpy(keybuf, keyvault + kvlookup[keyid].offset, kvlookup[keyid].
length);
214 unsigned char cpu_key[0x10];
221 unsigned char hmac_key[0x10];
222 memcpy(hmac_key,
data, 0x10);
225 unsigned char rc4_key[0x10];
226 memset(rc4_key, 0, 0x10);
228 HMAC_SHA1(cpu_key, hmac_key, rc4_key, 0x10);
231 unsigned char rc4_state[0x100];
232 memset(rc4_state, 0, 0x100);
242 unsigned char out[20];
243 unsigned char tmp[] = {0x07, 0x12};
265 if (
data[index] != out[index])
288 printf(
" ! the hash check failed probably as a result of decryption failure\n");
289 printf(
" ! make sure that the CORRECT key vault for this console is in flash\n");
290 printf(
" ! the key vault should be at offset 0x%x for a length of 0x%x\n", kvOffset, kvSize);
291 printf(
" ! in the 'raw' flash binary from THIS console\n");
310 printf(
" ! kv_get_dvd_key Failure: kv_read\n");
320 printf(
" ! kv_get_dvd_key Failure: kv_get_key %d\n", result);
341 printf(
" ! kv_get_cserial Failure: kv_read\n");
351 printf(
" ! kv_get_cserial Failure: kv_get_key %d\n", result);
360 unsigned char key[0x10];
361 unsigned char cserial[0xC];
365 memset(key,
'\0',
sizeof(key));
374 printf(
" ! Unable to read Keyvault data from NAND\n");
375 printf(
" ! xenon_logical_nand_data_ok error\n");
379 printf(
" ! Unable to read Keyvault data from NAND\n");
380 printf(
" ! Keyvault size or offset is zero\n");
384 memset(key,
'\0',
sizeof(key));
388 memset(key,
'\0',
sizeof(key));
392 memset(cserial,
'\0',
sizeof(cserial));
480 int i,
j,
k,
status, startblock, current, offsetinblock, blockcnt, filelength;
481 unsigned char *updxell, *user, *spare;
484 memset(&s, 0,
sizeof(
struct stat));
486 long size = s.st_size;
491 f = fopen(path,
"rb");
498 printf(
" ! sfcx is not initialized! Unable to update XeLL in NAND!\n");
503 fseek(f, 0, SEEK_END);
505 fseek(f, 0, SEEK_SET);
508 printf(
" ! %s does not have the correct size of 256kb. Aborting update!\n", path);
512 printf(
"\n * found XeLL update. press power NOW if you don't want to update.\n");
517 current = xelloffsets[
k];
525 printf(
" ! Error while memallocating filebuffer (spare)\n");
528 user = (
unsigned char*)malloc(blockcnt*
sfc.
block_sz);
530 printf(
" ! Error while memallocating filebuffer (user)\n");
546 printf(
" * XeLL Binary in NAND found @ 0x%08X\n", (startblock*
sfc.
block_sz)+offsetinblock);
548 updxell = (
unsigned char*)malloc(
XELL_SIZE);
550 printf(
" ! Error while memallocating filebuffer (updxell)\n");
557 printf(
" ! Error reading file from %s\n", path);
562 printf(
" ! XeLL does not seem to have matching footer, Aborting update!\n");
567 memcpy(&user[offsetinblock], updxell,
XELL_SIZE);
568 printf(
" * Writing to NAND!\n");
587 printf(
" * XeLL flashed! Reboot the xbox to enjoy the new build\n");
592 printf(
" ! Couldn't locate XeLL binary in NAND. Aborting!\n");
598 unsigned int DVEversion, tmp;
601 tmp = (tmp & ~0xF0) | ((DVEversion >> 12) & 0xF0);
607 return ((read32(0xd0000008) << 24) >> 24);
613 asm volatile(
"mfpvr %0" :
"=r" (PVR));
619 return ((read32(0xd0010000) >> 16) & 0xFFFF);
624 unsigned int PVR, PCIBridgeRevisionID, DVEversion;
632 if(DVEversion >= 0x11)
641 else if(PVR <= 0x710500)
643 if(PCIBridgeRevisionID >= 0x60)
652 else if(PVR <= 0x710800)
654 if (DVEversion >= 0x20)
663 else if(PVR <= 0x710A00)
676 memcpy(&tmp, (
const void*)(0x80000200C8000000ULL), 2);
685 memcpy(buf, (
const void*)(0x80000200C8000000ULL + offset), len);
712 return __builtin_bswap32(*(
unsigned int *)0xE1040000);
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)
int stat(const char *file, struct stat *st)
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()
int kv_get_cserial(unsigned char *serial)
void kv_print_hash_failure()
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)
unsigned int xenon_get_ram_size()
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()
void print_cserial(char *name, unsigned char *data)
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