25static const kventry kvlookup[] =
91 printf(
"%02X",
data[i]);
111 if (buffer[0]==0xC0 && buffer[1]==0xFF && buffer[2]==0xFF && buffer[3]==0xFF)
113 memcpy(
data,&buffer[0x20],0x10);
122int kv_get_key(
unsigned char keyid,
unsigned char *keybuf,
int *keybuflen,
unsigned char *keyvault)
127 if (*keybuflen != kvlookup[keyid].
length)
129 *keybuflen = kvlookup[keyid].
length;
132 memcpy(keybuf, keyvault + kvlookup[keyid].offset, kvlookup[keyid].
length);
143 unsigned char cpu_key[0x10];
150 unsigned char hmac_key[0x10];
151 memcpy(hmac_key,
data, 0x10);
154 unsigned char rc4_key[0x10];
155 memset(rc4_key, 0, 0x10);
157 HMAC_SHA1(cpu_key, hmac_key, rc4_key, 0x10);
160 unsigned char rc4_state[0x100];
161 memset(rc4_state, 0, 0x100);
171 unsigned char out[20];
172 unsigned char tmp[] = {0x07, 0x12};
194 if (
data[index] != out[index])
216 printf(
"! Attempting to decrypt DVDKey with Virtual CPU Key !\n");
220 printf(
" ! kv_get_dvd_key Failure: kv_read\n");
222 printf(
" ! the hash check failed probably as a result of decryption failure\n");
223 printf(
" ! make sure that the CORRECT key vault for this console is in flash\n");
224 printf(
" ! the key vault should be at offset 0x4200 for a length of 0x4200\n");
225 printf(
" ! in the 'raw' flash binary from THIS console\n");
232 printf(
" ! kv_get_dvd_key Failure: kv_get_key %d\n", result);
243 unsigned char key[0x10];
247 memset(key,
'\0',
sizeof(key));
252 memset(key,
'\0',
sizeof(key));
254 print_key(
" * your virtual cpu key", key);
256 memset(key,
'\0',
sizeof(key));
261 printf(
" ! Unable to read Keyvault data from NAND\n");
345 int i,
j,
k,
status, startblock, current, offsetinblock, blockcnt, filelength;
346 unsigned char *updxell, *user, *spare;
349 f = fopen(path,
"rb");
356 printf(
" ! sfcx is not initialized! Unable to update XeLL in NAND!\n");
361 fseek(f, 0, SEEK_END);
363 fseek(f, 0, SEEK_SET);
366 printf(
" ! %s does not have the correct size of 256kb. Aborting update!\n", path);
370 printf(
"\n * found XeLL update. press power NOW if you don't want to update.\n");
375 current = xelloffsets[
k];
383 printf(
" ! Error while memallocating filebuffer (spare)\n");
386 user = (
unsigned char*)malloc(blockcnt*
sfc.
block_sz);
388 printf(
" ! Error while memallocating filebuffer (user)\n");
404 printf(
" * XeLL Binary in NAND found @ 0x%08X\n", (startblock*
sfc.
block_sz)+offsetinblock);
406 updxell = (
unsigned char*)malloc(
XELL_SIZE);
408 printf(
" ! Error while memallocating filebuffer (updxell)\n");
415 printf(
" ! Error reading file from %s\n", path);
420 printf(
" ! XeLL does not seem to have matching footer, Aborting update!\n");
425 memcpy(&user[offsetinblock], updxell,
XELL_SIZE);
426 printf(
" * Writing to NAND!\n");
445 printf(
" * XeLL flashed! Reboot the xbox to enjoy the new build\n");
450 printf(
" ! Couldn't locate XeLL binary in NAND. Aborting!\n");
456 unsigned int DVEversion, tmp;
459 tmp = (tmp & ~0xF0) | ((DVEversion >> 12) & 0xF0);
465 return ((read32(0xd0000008) << 24) >> 24);
471 asm volatile(
"mfpvr %0" :
"=r" (PVR));
477 return ((read32(0xd0010000) >> 16) & 0xFFFF);
482 unsigned int PVR, PCIBridgeRevisionID, consoleVersion, DVEversion;
488 if(PVR == 0x710200 || PVR == 0x710300)
490 if(consoleVersion < 0x5821)
492 else if(consoleVersion >= 0x5821 && consoleVersion < 0x5831)
496 else if(consoleVersion >= 0x5831 && consoleVersion < 0x5841)
498 else if(consoleVersion >= 0x5841 && consoleVersion < 0x5851)
501 if (DVEversion >= 0x20 && PVR == 0x710800)
510 else if(consoleVersion >= 0x5851)
522 memcpy(&tmp, (
const void*)(0x80000200C8000000ULL), 2);
531 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