LibXenon
Bare-metal Xbox 360 homebrew library
Loading...
Searching...
No Matches
xb360.c
Go to the documentation of this file.
1/*
2 * xb360.c
3 *
4 * Created on: Sep 4, 2008
5 */
6
7#include <string.h>
8#include <stdio.h>
9#include <stdlib.h>
10#include <pci/io.h>
11#include <time/time.h>
15#include <xenon_smc/xenon_smc.h>
16#include <crypt/hmac_sha1.h>
17#include <crypt/rc4.h>
18
19#include "xb360.h"
20
22
23extern struct sfc sfc;
24
25static const kventry kvlookup[] =
26 {
27 {XEKEY_MANUFACTURING_MODE, 0x18, 0x01},
28 {XEKEY_ALTERNATE_KEY_VAULT, 0x19, 0x01},
29 {XEKEY_RESERVED_BYTE2, 0x1A, 0x01},
30 {XEKEY_RESERVED_BYTE3, 0x1B, 0x01},
31 {XEKEY_RESERVED_WORD1, 0x1C, 0x02},
32 {XEKEY_RESERVED_WORD2, 0x1E, 0x02},
34 {XEKEY_RESERVED_DWORD2, 0x24, 0x04},
35 {XEKEY_RESERVED_DWORD3, 0x28, 0x04},
36 {XEKEY_RESERVED_DWORD4, 0x2c, 0x04},
37 {XEKEY_RESTRICTED_PRIVILEDGES, 0x30, 0x08},
38 {XEKEY_RESERVED_QWORD2, 0x38, 0x08},
39 {XEKEY_RESERVED_QWORD3, 0x40, 0x08},
40 {XEKEY_RESERVED_QWORD4, 0x48, 0x08},
41 {XEKEY_RESERVED_KEY1, 0x50, 0x10},
42 {XEKEY_RESERVED_KEY2, 0x60, 0x10},
43 {XEKEY_RESERVED_KEY3, 0x70, 0x10},
44 {XEKEY_RESERVED_KEY4, 0x80, 0x10},
45 {XEKEY_RESERVED_RANDOM_KEY1, 0x90, 0x10},
46 {XEKEY_RESERVED_RANDOM_KEY2, 0xA0, 0x10},
47 {XEKEY_CONSOLE_SERIAL_NUMBER, 0xB0, 0x0C},
48 {XEKEY_MOBO_SERIAL_NUMBER, 0xBC, 0x0C},
49 {XEKEY_GAME_REGION, 0xC8, 0x02},
51 {XEKEY_KEY_OBFUSCATION_KEY, 0xE0, 0x10},
53 {XEKEY_DVD_KEY, 0x100, 0x10},
54 {XEKEY_PRIMARY_ACTIVATION_KEY, 0x110, 0x18},
55 {XEKEY_SECONDARY_ACTIVATION_KEY, 0x128, 0x10},
56 {XEKEY_GLOBAL_DEVICE_2DES_KEY1, 0x138, 0x10},
57 {XEKEY_GLOBAL_DEVICE_2DES_KEY2, 0x148, 0x10},
64 {XEKEY_MEMORY_UNIT_MS_2DES_KEY1, 0x1B8, 0x10},
65 {XEKEY_MEMORY_UNIT_MS_2DES_KEY2, 0x1C8, 0x10},
74 {XEKEY_MEMORY_UNIT_3P_2DES_KEY1, 0x258, 0x10},
75 {XEKEY_MEMORY_UNIT_3P_2DES_KEY2, 0x268, 0x10},
78 {XEKEY_CONSOLE_PRIVATE_KEY, 0x298, 0x1D0},
79 {XEKEY_XEIKA_PRIVATE_KEY, 0x468, 0x390},
80 {XEKEY_CARDEA_PRIVATE_KEY, 0x7F8, 0x1D0},
81 {XEKEY_CONSOLE_CERTIFICATE, 0x9C8, 0x1A8},
82 {XEKEY_XEIKA_CERTIFICATE, 0xB70, 0x1388},
83 {XEKEY_CARDEA_CERTIFICATE, 0x1EF8, 0x2108}
84 };
85
86void print_key(char *name, unsigned char *data)
87{
88 int i=0;
89 printf("%s: ", name);
90 for(i=0; i<16; i++)
91 printf("%02X",data[i]);
92 printf("\n");
93}
94
95int cpu_get_key(unsigned char *data)
96{
97 *(unsigned long long*)&data[0] = xenon_secotp_read_line(3) | xenon_secotp_read_line(4);
98 *(unsigned long long*)&data[8] = xenon_secotp_read_line(5) | xenon_secotp_read_line(6);
99 return 0;
100}
101
102int get_virtual_cpukey(unsigned char *data)
103{
104 unsigned char buffer[VFUSES_SIZE];
105
107 return 2; //Unable to read NAND data...
108
109 //if we got here then it was at least able to read from nand
110 //now we need to verify the data somehow
111 if (buffer[0]==0xC0 && buffer[1]==0xFF && buffer[2]==0xFF && buffer[3]==0xFF)
112 {
113 memcpy(data,&buffer[0x20],0x10);
114 return 0;
115 }
116 else
117 /* No Virtual Fuses were found at 0x95000*/
118 return 1;
119}
120
121
122int kv_get_key(unsigned char keyid, unsigned char *keybuf, int *keybuflen, unsigned char *keyvault)
123{
124 if (keyid > 0x38)
125 return 1;
126
127 if (*keybuflen != kvlookup[keyid].length)
128 {
129 *keybuflen = kvlookup[keyid].length;
130 return 2;
131 }
132 memcpy(keybuf, keyvault + kvlookup[keyid].offset, kvlookup[keyid].length);
133
134 return 0;
135}
136
137
138int kv_read(unsigned char *data, int virtualcpukey)
139{
141 return -1;
142
143 unsigned char cpu_key[0x10];
144 if (virtualcpukey)
145 get_virtual_cpukey(cpu_key);
146 else
147 cpu_get_key(cpu_key);
148 //print_key("kv_read: cpu key", cpu_key);
149
150 unsigned char hmac_key[0x10];
151 memcpy(hmac_key, data, 0x10);
152 //print_key("kv_read: hmac key", hmac_key);
153
154 unsigned char rc4_key[0x10];
155 memset(rc4_key, 0, 0x10);
156
157 HMAC_SHA1(cpu_key, hmac_key, rc4_key, 0x10);
158 //print_key("kv_read: rc4 key", rc4_key);
159
160 unsigned char rc4_state[0x100];
161 memset(rc4_state, 0, 0x100);
162
163 rc4_init(rc4_state, rc4_key ,0x10);
164 rc4_crypt(rc4_state, (unsigned char*) &data[0x10], KV_FLASH_SIZE - 0x10);
165
166 //Now then do a little check to make sure it is somewhat correct
167 //We check the hmac_sha1 of the data and compare that to
168 //the hmac_sha1 key in the header of the keyvault
169 //basically the reverse of what we did to generate the key for rc4
170 unsigned char data2[KV_FLASH_SIZE];
171 unsigned char out[20];
172 unsigned char tmp[] = {0x07, 0x12};
173 HMAC_SHA1_CTX ctx;
174
175 //the hmac_sha1 seems destructive
176 //so we make a copy of the data
177 memcpy(data2, data, KV_FLASH_SIZE);
178
179 HMAC_SHA1_Init(&ctx);
180 HMAC_SHA1_UpdateKey(&ctx, (unsigned char *) cpu_key, 0x10);
181 HMAC_SHA1_EndKey(&ctx);
182
184
185 HMAC_SHA1_UpdateMessage(&ctx, (unsigned char*) &data2[0x10], KV_FLASH_SIZE - 0x10);
186 HMAC_SHA1_UpdateMessage(&ctx, (unsigned char*) &tmp[0x00], 0x02); //Special appendage
187
188 HMAC_SHA1_EndMessage(out, &ctx);
189 HMAC_SHA1_Done(&ctx);
190
191 int index = 0;
192 while (index < 0x10)
193 {
194 if (data[index] != out[index])
195 {
196 // Hmm something is wrong, hmac is not matching
197 //printf(" ! kv_read: kv hash check failed\n");
198 return 2;
199 }
200 index += 1;
201 }
202
203 return 0;
204}
205
206int kv_get_dvd_key(unsigned char *dvd_key)
207{
208 if (KV_FLASH_SIZE == 0)
209 return -1; //It's bad data!
210 unsigned char buffer[KV_FLASH_SIZE], tmp[0x10];
211 int result = 0;
212 int keylen = 0x10;
213
214 result = kv_read(buffer, 0);
215 if (result == 2 && get_virtual_cpukey(tmp) == 0){
216 printf("! Attempting to decrypt DVDKey with Virtual CPU Key !\n");
217 result = kv_read(buffer, 1);
218 }
219 if (result != 0){
220 printf(" ! kv_get_dvd_key Failure: kv_read\n");
221 if (result == 2){ //Hash failure
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");
226 }
227 return 1;
228 }
229
230 result = kv_get_key(XEKEY_DVD_KEY, dvd_key, &keylen, buffer);
231 if (result != 0){
232 printf(" ! kv_get_dvd_key Failure: kv_get_key %d\n", result);
233 return result;
234 }
235
236 //print_key("dvd key", dvd_key);
237 return 0;
238
239}
240
242{
243 unsigned char key[0x10];
244
245 printf("\n");
246
247 memset(key, '\0', sizeof(key));
248 if (cpu_get_key(key)==0)
249 print_key(" * your cpu key", key);
251 {
252 memset(key, '\0',sizeof(key));
253 if (get_virtual_cpukey(key)==0)
254 print_key(" * your virtual cpu key", key);
255
256 memset(key, '\0', sizeof(key));
257 if (kv_get_dvd_key(key)==0)
258 print_key(" * your dvd key", key);
259 }
260 else
261 printf(" ! Unable to read Keyvault data from NAND\n");
262 printf("\n");
263}
264
265//This version crashes... dunno why... but... old one works perfectly fine so, why change it?!
266
267//int updateXeLL(void * addr, unsigned len)
268//{
269// int i, j, k, startblock, current, offsetinblock, blockcnt;
270// unsigned char *user, *spare;
271//
272// if (sfc.initialized != SFCX_INITIALIZED){
273// printf(" ! sfcx is not initialized! Unable to update XeLL in NAND!\n");
274// return -1;
275// }
276//
277// printf("\n * found XeLL update. press power NOW if you don't want to update.\n");
278// delay(15);
279//
280// for (k = 0; k < XELL_OFFSET_COUNT; k++)
281// {
282// current = xelloffsets[k];
283// offsetinblock = current % sfc.block_sz;
284// startblock = current/sfc.block_sz;
285// blockcnt = offsetinblock ? (XELL_SIZE/sfc.block_sz)+1 : (XELL_SIZE/sfc.block_sz);
286//
287//
288// spare = (unsigned char*)malloc(blockcnt*sfc.pages_in_block*sfc.meta_sz);
289// if(!spare){
290// printf(" ! Error while memallocating filebuffer (spare)\n");
291// return -1;
292// }
293// user = (unsigned char*)malloc(blockcnt*sfc.block_sz);
294// if(!user){
295// printf(" ! Error while memallocating filebuffer (user)\n");
296// return -1;
297// }
298// j = 0;
299// unsigned char pagebuf[MAX_PAGE_SZ];
300//
301// for (i = (startblock*sfc.pages_in_block); i< (startblock+blockcnt)*sfc.pages_in_block; i++)
302// {
303// sfcx_read_page(pagebuf, (i*sfc.page_sz), 1);
304// //Split rawpage into user & spare
305// memcpy(&user[j*sfc.page_sz],pagebuf,sfc.page_sz);
306// memcpy(&spare[j*sfc.meta_sz],&pagebuf[sfc.page_sz],sfc.meta_sz);
307// j++;
308// }
309//
310// if (memcmp(&user[offsetinblock+(XELL_FOOTER_OFFSET)],XELL_FOOTER,XELL_FOOTER_LENGTH) == 0){
311// printf(" * XeLL Binary in NAND found @ 0x%08X\n", (startblock*sfc.block_sz)+offsetinblock);
312//
313// memcpy(&user[offsetinblock], addr,len); //Copy over updxell.bin
314// printf(" * Writing to NAND!\n");
315// j = 0;
316// for (i = startblock*sfc.pages_in_block; i < (startblock+blockcnt)*sfc.pages_in_block; i ++)
317// {
318// if (!(i%sfc.pages_in_block))
319// sfcx_erase_block(i*sfc.page_sz);
320//
321// /* Copy user & spare data together in a single rawpage */
322// memcpy(pagebuf,&user[j*sfc.page_sz],sfc.page_sz);
323// memcpy(&pagebuf[sfc.page_sz],&spare[j*sfc.meta_sz],sfc.meta_sz);
324// j++;
325//
326// if (!(sfcx_is_pageerased(pagebuf))) // We dont need to write to erased pages
327// {
328// memset(&pagebuf[sfc.page_sz+0x0C],0x0, 4); //zero only EDC bytes
329// sfcx_calcecc((unsigned int *)pagebuf); //recalc EDC bytes
330// sfcx_write_page(pagebuf, i*sfc.page_sz);
331// }
332// }
333// printf(" * XeLL flashed! Reboot the xbox to enjoy the new build\n");
334// for(;;);
335//
336// }
337// }
338// printf(" ! Couldn't locate XeLL binary in NAND. Aborting!\n");
339// return -1; // if this point is reached, updating xell failed
340//}
341
342int updateXeLL(char *path)
343{
344 FILE *f;
345 int i, j, k, status, startblock, current, offsetinblock, blockcnt, filelength;
346 unsigned char *updxell, *user, *spare;
347
348 /* Check if updxell.bin is present */
349 f = fopen(path, "rb");
350 if (!f){
351 return -1; //Can't find/open updxell.bin
352 }
353
355 fclose(f);
356 printf(" ! sfcx is not initialized! Unable to update XeLL in NAND!\n");
357 return -1;
358 }
359
360 /* Check filesize of updxell.bin, only accept full 256kb binaries */
361 fseek(f, 0, SEEK_END);
362 filelength=ftell(f);
363 fseek(f, 0, SEEK_SET);
364 if (filelength != XELL_SIZE){
365 fclose(f);
366 printf(" ! %s does not have the correct size of 256kb. Aborting update!\n", path);
367 return -1;
368 }
369
370 printf("\n * found XeLL update. press power NOW if you don't want to update.\n");
371 delay(15);
372
373 for (k = 0; k < XELL_OFFSET_COUNT; k++)
374 {
375 current = xelloffsets[k];
376 offsetinblock = current % sfc.block_sz;
377 startblock = current/sfc.block_sz;
378 blockcnt = offsetinblock ? (XELL_SIZE/sfc.block_sz)+1 : (XELL_SIZE/sfc.block_sz);
379
380
381 spare = (unsigned char*)malloc(blockcnt*sfc.pages_in_block*sfc.meta_sz);
382 if(!spare){
383 printf(" ! Error while memallocating filebuffer (spare)\n");
384 return -1;
385 }
386 user = (unsigned char*)malloc(blockcnt*sfc.block_sz);
387 if(!user){
388 printf(" ! Error while memallocating filebuffer (user)\n");
389 return -1;
390 }
391 j = 0;
392 unsigned char pagebuf[MAX_PAGE_SZ];
393
394 for (i = (startblock*sfc.pages_in_block); i< (startblock+blockcnt)*sfc.pages_in_block; i++)
395 {
397 //Split rawpage into user & spare
398 memcpy(&user[j*sfc.page_sz],pagebuf,sfc.page_sz);
399 memcpy(&spare[j*sfc.meta_sz],&pagebuf[sfc.page_sz],sfc.meta_sz);
400 j++;
401 }
402
403 if (memcmp(&user[offsetinblock+(XELL_FOOTER_OFFSET)],XELL_FOOTER,XELL_FOOTER_LENGTH) == 0){
404 printf(" * XeLL Binary in NAND found @ 0x%08X\n", (startblock*sfc.block_sz)+offsetinblock);
405
406 updxell = (unsigned char*)malloc(XELL_SIZE);
407 if(!updxell){
408 printf(" ! Error while memallocating filebuffer (updxell)\n");
409 return -1;
410 }
411
412 status = fread(updxell,1,XELL_SIZE,f);
413 if (status != XELL_SIZE){
414 fclose(f);
415 printf(" ! Error reading file from %s\n", path);
416 return -1;
417 }
418
419 if (memcmp(&updxell[XELL_FOOTER_OFFSET],XELL_FOOTER, XELL_FOOTER_LENGTH)){
420 printf(" ! XeLL does not seem to have matching footer, Aborting update!\n");
421 return -1;
422 }
423
424 fclose(f);
425 memcpy(&user[offsetinblock], updxell,XELL_SIZE); //Copy over updxell.bin
426 printf(" * Writing to NAND!\n");
427 j = 0;
428 for (i = startblock*sfc.pages_in_block; i < (startblock+blockcnt)*sfc.pages_in_block; i ++)
429 {
430 if (!(i%sfc.pages_in_block))
432
433 /* Copy user & spare data together in a single rawpage */
434 memcpy(pagebuf,&user[j*sfc.page_sz],sfc.page_sz);
435 memcpy(&pagebuf[sfc.page_sz],&spare[j*sfc.meta_sz],sfc.meta_sz);
436 j++;
437
438 if (!(sfcx_is_pageerased(pagebuf))) // We dont need to write to erased pages
439 {
440 memset(&pagebuf[sfc.page_sz+0x0C],0x0, 4); //zero only EDC bytes
441 sfcx_calcecc((unsigned int *)pagebuf); //recalc EDC bytes
443 }
444 }
445 printf(" * XeLL flashed! Reboot the xbox to enjoy the new build\n");
446 for(;;);
447
448 }
449 }
450 printf(" ! Couldn't locate XeLL binary in NAND. Aborting!\n");
451 return -1;
452}
453
454unsigned int xenon_get_DVE()
455{
456 unsigned int DVEversion, tmp;
457 xenon_smc_ana_read(0xfe, &DVEversion);
458 tmp = DVEversion;
459 tmp = (tmp & ~0xF0) | ((DVEversion >> 12) & 0xF0);
460 return (tmp & 0xFF);
461}
462
464{
465 return ((read32(0xd0000008) << 24) >> 24);
466}
467
468unsigned int xenon_get_CPU_PVR()
469{
470 unsigned int PVR;
471 asm volatile("mfpvr %0" : "=r" (PVR));
472 return PVR;
473}
474
475unsigned int xenon_get_XenosID()
476{
477 return ((read32(0xd0010000) >> 16) & 0xFFFF);
478}
479
481{
482 unsigned int PVR, PCIBridgeRevisionID, consoleVersion, DVEversion;
483
484 PCIBridgeRevisionID = xenon_get_PCIBridgeRevisionID();
485 consoleVersion = xenon_get_XenosID();
486 DVEversion = xenon_get_DVE();
487 PVR = xenon_get_CPU_PVR();
488 if(PVR == 0x710200 || PVR == 0x710300) //TODO: Add XenosID check also!
489 return REV_ZEPHYR;
490 if(consoleVersion < 0x5821)
491 return REV_XENON;
492 else if(consoleVersion >= 0x5821 && consoleVersion < 0x5831)
493 {
494 return REV_FALCON;
495 }
496 else if(consoleVersion >= 0x5831 && consoleVersion < 0x5841)
497 return REV_JASPER;
498 else if(consoleVersion >= 0x5841 && consoleVersion < 0x5851)
499 {
500 //TODO: If PVR is always the same for trinity, move it to the if statement above...
501 if (DVEversion >= 0x20 && PVR == 0x710800)
502 {
503 if (PCIBridgeRevisionID >= 0x70 && sfcx_readreg(SFCX_PHISON) != 0)
504 return REV_CORONA_PHISON;
505 return REV_CORONA;
506 }
507 else
508 return REV_TRINITY;
509 }
510 else if(consoleVersion >= 0x5851)
511 {
512 if (PCIBridgeRevisionID >= 0x70 && sfcx_readreg(SFCX_PHISON) != 0)
513 return REV_WINCHESTER_MMC;
514 return REV_WINCHESTER;
515 }
516 return REV_UNKNOWN;
517}
518
520{
521 uint16_t tmp;
522 memcpy(&tmp, (const void*)(0x80000200C8000000ULL), 2);
523 if (tmp != 0xFF4F)
524 return -1;
525 return 0;
526}
527
528int xenon_get_logical_nand_data(void* buf, unsigned int offset, unsigned int len)
529{
531 memcpy(buf, (const void*)(0x80000200C8000000ULL + offset), len);
532 else
533 return -1;
534 return 0;
535}
536
537unsigned int xenon_get_kv_size()
538{
539 unsigned int ret;
540 if (xenon_get_logical_nand_data(&ret, 0x60, 4) == 0)
541 return ret;
542 return 0;
543}
544
546{
547 unsigned int ret;
548 if (xenon_get_logical_nand_data(&ret, 0x6C, 4) == 0)
549 return ret;
550 return 0;
551}
uint16_t length
Definition: ata.h:4
u32 status
Definition: ehci_defs.h:15
void HMAC_SHA1_EndMessage(unsigned char *out, HMAC_SHA1_CTX *ctx)
Definition: hmac_sha1.c:170
void HMAC_SHA1(void *secret, void *data, void *res, int len)
Definition: hmac_sha1.c:190
void HMAC_SHA1_UpdateMessage(HMAC_SHA1_CTX *ctx, unsigned char *data, unsigned int datalen)
Definition: hmac_sha1.c:166
void HMAC_SHA1_Done(HMAC_SHA1_CTX *ctx)
Definition: hmac_sha1.c:181
void HMAC_SHA1_Init(HMAC_SHA1_CTX *ctx)
Definition: hmac_sha1.c:71
void HMAC_SHA1_StartMessage(HMAC_SHA1_CTX *ctx)
Definition: hmac_sha1.c:161
void HMAC_SHA1_UpdateKey(HMAC_SHA1_CTX *ctx, unsigned char *key, unsigned int keylen)
Definition: hmac_sha1.c:79
void HMAC_SHA1_EndKey(HMAC_SHA1_CTX *ctx)
Definition: hmac_sha1.c:133
u16 uint16_t
Definition: libfdt_env.h:10
void rc4_init(unsigned char *state, unsigned char *key, int len)
Definition: rc4.c:5
void rc4_crypt(unsigned char *state, unsigned char *data, int len)
Definition: rc4.c:22
Definition: xb360.h:102
int length
Definition: xb360.h:105
Definition: xenon_sfcx.h:84
int page_sz
Definition: xenon_sfcx.h:88
int meta_sz
Definition: xenon_sfcx.h:89
int block_sz
Definition: xenon_sfcx.h:93
int initialized
Definition: xenon_sfcx.h:85
int pages_in_block
Definition: xenon_sfcx.h:92
void delay(int u)
Definition: time.c:22
int xenon_get_logical_nand_data(void *buf, unsigned int offset, unsigned int len)
Definition: xb360.c:528
unsigned int xenon_get_CPU_PVR()
Definition: xb360.c:468
void print_key(char *name, unsigned char *data)
Definition: xb360.c:86
int get_virtual_cpukey(unsigned char *data)
Definition: xb360.c:102
int updateXeLL(char *path)
Definition: xb360.c:342
unsigned int xenon_get_PCIBridgeRevisionID()
Definition: xb360.c:463
unsigned int xenon_get_kv_offset()
Definition: xb360.c:545
unsigned int xenon_get_XenosID()
Definition: xb360.c:475
int kv_read(unsigned char *data, int virtualcpukey)
Definition: xb360.c:138
void print_cpu_dvd_keys(void)
Definition: xb360.c:241
struct XCONFIG_SECURED_SETTINGS secured_settings
Definition: xenon_config.c:17
int kv_get_key(unsigned char keyid, unsigned char *keybuf, int *keybuflen, unsigned char *keyvault)
Definition: xb360.c:122
unsigned int xenon_get_DVE()
Definition: xb360.c:454
unsigned int xenon_get_kv_size()
Definition: xb360.c:537
int xenon_logical_nand_data_ok()
Definition: xb360.c:519
int xenon_get_console_type()
Definition: xb360.c:480
int cpu_get_key(unsigned char *data)
Definition: xb360.c:95
int kv_get_dvd_key(unsigned char *dvd_key)
Definition: xb360.c:206
#define XEKEY_RESERVED_WORD2
Definition: xb360.h:15
#define XEKEY_RESERVED_QWORD2
Definition: xb360.h:21
#define XELL_SIZE
Definition: xb360.h:78
#define XEKEY_RESERVED_KEY4
Definition: xb360.h:27
#define KV_FLASH_SIZE
Definition: xb360.h:71
#define XEKEY_WIRELESS_CONTROLLER_3P_2DES_KEY1
Definition: xb360.h:51
#define XEKEY_WIRED_CONTROLLER_3P_2DES_KEY2
Definition: xb360.h:56
#define KV_FLASH_OFFSET
Definition: xb360.h:72
#define XEKEY_KEY_OBFUSCATION_KEY
Definition: xb360.h:34
#define XEKEY_RESERVED_BYTE3
Definition: xb360.h:13
#define REV_XENON
Definition: xb360.h:91
#define XEKEY_GLOBAL_DEVICE_2DES_KEY1
Definition: xb360.h:39
#define XEKEY_ROAMABLE_OBFUSCATION_KEY
Definition: xb360.h:35
#define REV_CORONA
Definition: xb360.h:96
#define VFUSES_SIZE
Definition: xb360.h:75
#define XEKEY_WIRELESS_CONTROLLER_MS_2DES_KEY1
Definition: xb360.h:41
#define VFUSES_OFFSET
Definition: xb360.h:76
#define REV_ZEPHYR
Definition: xb360.h:92
#define REV_CORONA_PHISON
Definition: xb360.h:97
#define XEKEY_PRIMARY_ACTIVATION_KEY
Definition: xb360.h:37
#define XEKEY_RESERVED_DWORD4
Definition: xb360.h:19
#define XEKEY_WIRELESS_CONTROLLER_MS_2DES_KEY2
Definition: xb360.h:42
#define XEKEY_WIRED_WEBCAM_3P_2DES_KEY1
Definition: xb360.h:53
#define XEKEY_SECONDARY_ACTIVATION_KEY
Definition: xb360.h:38
#define XEKEY_MEMORY_UNIT_3P_2DES_KEY2
Definition: xb360.h:58
#define XEKEY_RESERVED_KEY1
Definition: xb360.h:24
#define XEKEY_CARDEA_PRIVATE_KEY
Definition: xb360.h:63
#define XELL_OFFSET_COUNT
Definition: xb360.h:83
#define XEKEY_RESERVED_KEY3
Definition: xb360.h:26
#define XEKEY_RESTRICTED_HVEXT_LOADER
Definition: xb360.h:16
#define XEKEY_WIRED_CONTROLLER_3P_2DES_KEY1
Definition: xb360.h:55
#define XEKEY_RESERVED_RANDOM_KEY1
Definition: xb360.h:28
#define XEKEY_OTHER_XSM3_DEVICE_MS_2DES_KEY1
Definition: xb360.h:49
#define XEKEY_MEMORY_UNIT_MS_2DES_KEY2
Definition: xb360.h:48
#define REV_WINCHESTER_MMC
Definition: xb360.h:99
#define XEKEY_MANUFACTURING_MODE
Definition: xb360.h:10
#define XEKEY_MEMORY_UNIT_MS_2DES_KEY1
Definition: xb360.h:47
#define XEKEY_WIRED_CONTROLLER_MS_2DES_KEY1
Definition: xb360.h:45
#define XEKEY_RESERVED_QWORD3
Definition: xb360.h:22
#define XEKEY_XEIKA_PRIVATE_KEY
Definition: xb360.h:62
#define XEKEY_MEMORY_UNIT_3P_2DES_KEY1
Definition: xb360.h:57
#define XEKEY_CONSOLE_SERIAL_NUMBER
Definition: xb360.h:30
#define XEKEY_WIRED_WEBCAM_MS_2DES_KEY1
Definition: xb360.h:43
#define XEKEY_CONSOLE_OBFUSCATION_KEY
Definition: xb360.h:33
#define XEKEY_RESERVED_WORD1
Definition: xb360.h:14
#define XEKEY_RESTRICTED_PRIVILEDGES
Definition: xb360.h:20
#define XEKEY_DVD_KEY
Definition: xb360.h:36
#define XEKEY_WIRELESS_CONTROLLER_3P_2DES_KEY2
Definition: xb360.h:52
#define REV_TRINITY
Definition: xb360.h:95
#define XEKEY_WIRED_WEBCAM_3P_2DES_KEY2
Definition: xb360.h:54
#define XEKEY_CONSOLE_CERTIFICATE
Definition: xb360.h:64
#define XEKEY_RESERVED_DWORD2
Definition: xb360.h:17
#define REV_FALCON
Definition: xb360.h:93
#define REV_JASPER
Definition: xb360.h:94
#define XEKEY_RESERVED_DWORD3
Definition: xb360.h:18
#define REV_WINCHESTER
Definition: xb360.h:98
#define XEKEY_RESERVED_QWORD4
Definition: xb360.h:23
#define XEKEY_CONSOLE_PRIVATE_KEY
Definition: xb360.h:61
#define XEKEY_WIRED_WEBCAM_MS_2DES_KEY2
Definition: xb360.h:44
#define XEKEY_RESERVED_RANDOM_KEY2
Definition: xb360.h:29
#define XEKEY_OTHER_XSM3_DEVICE_3P_2DES_KEY1
Definition: xb360.h:59
#define XEKEY_ALTERNATE_KEY_VAULT
Definition: xb360.h:11
#define XEKEY_XEIKA_CERTIFICATE
Definition: xb360.h:65
#define XEKEY_GAME_REGION
Definition: xb360.h:32
#define XEKEY_RESERVED_KEY2
Definition: xb360.h:25
#define XEKEY_OTHER_XSM3_DEVICE_3P_2DES_KEY2
Definition: xb360.h:60
#define XEKEY_OTHER_XSM3_DEVICE_MS_2DES_KEY2
Definition: xb360.h:50
#define REV_UNKNOWN
Definition: xb360.h:100
#define XEKEY_RESERVED_BYTE2
Definition: xb360.h:12
#define XEKEY_GLOBAL_DEVICE_2DES_KEY2
Definition: xb360.h:40
#define XEKEY_MOBO_SERIAL_NUMBER
Definition: xb360.h:31
#define XEKEY_CARDEA_CERTIFICATE
Definition: xb360.h:66
#define XEKEY_WIRED_CONTROLLER_MS_2DES_KEY2
Definition: xb360.h:46
unsigned char pagebuf[MAX_PAGE_SZ]
Definition: xenon_config.c:20
uint64_t xenon_secotp_read_line(int nr)
Definition: xenon_secotp.c:3
unsigned long sfcx_readreg(int addr)
Definition: xenon_sfcx.c:20
int sfcx_is_pageerased(unsigned char *data)
Definition: xenon_sfcx.c:361
int sfcx_read_page(unsigned char *data, int address, int raw)
Definition: xenon_sfcx.c:25
int sfcx_write_page(unsigned char *data, int address)
Definition: xenon_sfcx.c:74
void sfcx_calcecc(unsigned int *data)
Definition: xenon_sfcx.c:211
int sfcx_erase_block(int address)
Definition: xenon_sfcx.c:150
#define SFCX_INITIALIZED
Definition: xenon_sfcx.h:76
#define SFCX_PHISON
Definition: xenon_sfcx.h:14
#define MAX_PAGE_SZ
Definition: xenon_sfcx.h:61
int xenon_smc_ana_read(uint8_t addr, uint32_t *val)
Definition: xenon_smc.c:149
#define XELL_FOOTER
#define XELL_FOOTER_LENGTH
#define XELL_FOOTER_OFFSET
union @15 data
u8 j
Definition: xenos_edid.h:10
u8 k
Definition: xenos_edid.h:9