bool save_passwords(void) { password *pwd; SceUID fd; char path[PATH_MAX]; u32 magic; STRCPY_S(path, scene_appdir()); STRCAT_S(path, "password.lst"); rc4_prepare_key((u8 *) CRYPT_KEY, sizeof(CRYPT_KEY) - 1, &g_key); fd = sceIoOpen(path, PSP_O_WRONLY | PSP_O_CREAT | PSP_O_TRUNC, 0777); if (fd < 0) { return false; } magic = CRYPT_MAGIC; sceIoWrite(fd, &magic, sizeof(magic)); for (pwd = g_pwd_head.next; pwd != NULL; pwd = pwd->next) { write_chars(fd, pwd->b->ptr, strlen(pwd->b->ptr)); write_chars(fd, "\r\n", sizeof("\r\n") - 1); } sceIoClose(fd); return true; }
int BootDecryptEEPROM(EEPROMDATA *eeprom) { BYTE baKeyHash[20]; BYTE baDataHashConfirm[20]; BYTE baEepromDataLocalCopy[0x30]; struct rc4_key RC4_key; int version = 0; int counter; int n,f; // Static Version change not included yet for (counter=9;counter<13;counter++) { memset(&RC4_key,0,sizeof(rc4_key)); memcpy(&baEepromDataLocalCopy[0], eeprom, 0x30); // Calculate the Key-Hash HMAC_hdd_calculation(counter, baKeyHash, &baEepromDataLocalCopy[0], 20, NULL); //initialize RC4 key rc4_prepare_key(baKeyHash, 20, &RC4_key); //decrypt data (from eeprom) with generated key rc4_crypt(&baEepromDataLocalCopy[20],8,&RC4_key); //confounder of some kind? rc4_crypt(&baEepromDataLocalCopy[28],20,&RC4_key); //"real" data // Calculate the Confirm-Hash HMAC_hdd_calculation(counter, baDataHashConfirm, &baEepromDataLocalCopy[20], 8, &baEepromDataLocalCopy[28], 20, NULL); f=0; for(n=0;n<0x14;n++) { if(baEepromDataLocalCopy[n]!=baDataHashConfirm[n]) f=1; } if (f==0) { // Confirm Hash is correct // Copy actual Xbox Version to Return Value version=counter; // exits the loop break; } } //copy out HDKey memcpy(eeprom,&baEepromDataLocalCopy[0],0x30); return version; }
u32 BootHddKeyGenerateEepromKeyData( u8 *pbEeprom_data, u8 *pbResult ) { u8 baKeyHash[20]; u8 baDataHashConfirm[20]; u8 baEepromDataLocalCopy[0x30]; struct rc4_key RC4_key; int version = 0; int counter; // Static Version change not included yet for (counter=9;counter<13;counter++) { memset(&RC4_key,0,sizeof(rc4_key)); memcpy(&baEepromDataLocalCopy[0], pbEeprom_data, 0x30); // Calculate the Key-Hash HMAC_hdd_calculation(counter, baKeyHash, &baEepromDataLocalCopy[0], 20, NULL); //initialize RC4 key rc4_prepare_key(baKeyHash, 20, &RC4_key); //decrypt data (from eeprom) with generated key rc4_crypt(&baEepromDataLocalCopy[20],8,&RC4_key); //confounder of some kind? rc4_crypt(&baEepromDataLocalCopy[28],20,&RC4_key); //"real" data // Calculate the Confirm-Hash HMAC_hdd_calculation(counter, baDataHashConfirm, &baEepromDataLocalCopy[20], 8, &baEepromDataLocalCopy[28], 20, NULL); if (!memcmp(baEepromDataLocalCopy,baDataHashConfirm,0x14)) { // Confirm Hash is correct // Copy actual Xbox Version to Return Value version=counter; // exits the loop break; } } //copy out HDKey memcpy(pbResult,&baEepromDataLocalCopy[28],16); return version; }
bool load_passwords(void) { SceUID fd; char linebuf[LINEBUF], path[PATH_MAX]; rc4_key *pkey; STRCPY_S(path, scene_appdir()); STRCAT_S(path, "password.lst"); if (is_encrypted(path)) { rc4_prepare_key((u8 *) CRYPT_KEY, sizeof(CRYPT_KEY) - 1, &g_key); pkey = &g_key; } else { pkey = NULL; } fd = sceIoOpen(path, PSP_O_RDONLY, 0); if (fd < 0) { return false; } if (pkey != NULL) { sceIoLseek(fd, 4, PSP_SEEK_SET); } linebuf[sizeof(linebuf) - 1] = '\0'; while (read_lines(fd, linebuf, sizeof(linebuf) - 1, pkey) >= 0) { add_password(linebuf); } sceIoClose(fd); return true; }