Implement support for real Xbox keys
This commit is contained in:
parent
54be6c85a5
commit
856e1ba873
|
@ -54,6 +54,7 @@
|
|||
|
||||
// Options to AvSendTVEncoderOption() :
|
||||
#define AV_OPTION_MACROVISION_MODE 1
|
||||
|
||||
#define AV_OPTION_ENABLE_CC 2
|
||||
#define AV_OPTION_DISABLE_CC 3
|
||||
#define AV_OPTION_SEND_CC_DATA 4
|
||||
|
@ -416,6 +417,9 @@ XBSYSAPI EXPORTNUM(351) VOID NTAPI XcUpdateCrypto
|
|||
OUT PCRYPTO_VECTOR pROMVector OPTIONAL
|
||||
);
|
||||
|
||||
// Not exported by the kernel, but required to generate other keys
|
||||
XBSYSAPI XBOX_KEY_DATA XboxCertificateKey;
|
||||
|
||||
// ******************************************************************
|
||||
// * 0x0161 - XboxLANKey
|
||||
// ******************************************************************
|
||||
|
@ -424,11 +428,11 @@ XBSYSAPI EXPORTNUM(353) XBOX_KEY_DATA XboxLANKey;
|
|||
// ******************************************************************
|
||||
// * 0x0162 - XboxAlternateSignatureKeys
|
||||
// ******************************************************************
|
||||
XBSYSAPI EXPORTNUM(354) XBOX_KEY_DATA XboxAlternateSignatureKeys;
|
||||
XBSYSAPI EXPORTNUM(354) XBOX_KEY_DATA XboxAlternateSignatureKeys[16];
|
||||
|
||||
// ******************************************************************
|
||||
// * 0x0163 - XePublicKeyData
|
||||
// ******************************************************************
|
||||
// ****************1**************************************************
|
||||
XBSYSAPI EXPORTNUM(355) DWORD XePublicKeyData;
|
||||
|
||||
// ******************************************************************
|
||||
|
|
|
@ -163,6 +163,28 @@ void ApplyMediaPatches()
|
|||
|
||||
}
|
||||
|
||||
void SetupPerTitleKeys()
|
||||
{
|
||||
// Generate per-title keys from the XBE Certificate
|
||||
Xbe::Certificate *pCertificate = (Xbe::Certificate*)CxbxKrnl_XbeHeader->dwCertificateAddr;
|
||||
UCHAR Digest[20] = {};
|
||||
|
||||
// Set the LAN Key
|
||||
xboxkrnl::XcHMAC(xboxkrnl::XboxCertificateKey, xboxkrnl::XBOX_KEY_LENGTH, pCertificate->bzLanKey, xboxkrnl::XBOX_KEY_LENGTH, NULL, 0, Digest);
|
||||
memcpy(xboxkrnl::XboxLANKey, Digest, xboxkrnl::XBOX_KEY_LENGTH);
|
||||
|
||||
// Signature Key
|
||||
xboxkrnl::XcHMAC(xboxkrnl::XboxCertificateKey, xboxkrnl::XBOX_KEY_LENGTH, pCertificate->bzSignatureKey, xboxkrnl::XBOX_KEY_LENGTH, NULL, 0, Digest);
|
||||
memcpy(xboxkrnl::XboxSignatureKey, Digest, xboxkrnl::XBOX_KEY_LENGTH);
|
||||
|
||||
// Alternate Signature Keys
|
||||
for (int i = 0; i < 16; i++) {
|
||||
xboxkrnl::XcHMAC(xboxkrnl::XboxCertificateKey, xboxkrnl::XBOX_KEY_LENGTH, pCertificate->bzTitleAlternateSignatureKey[i], xboxkrnl::XBOX_KEY_LENGTH, NULL, 0, Digest);
|
||||
memcpy(xboxkrnl::XboxAlternateSignatureKeys[i], Digest, xboxkrnl::XBOX_KEY_LENGTH);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void CxbxLaunchXbe(void(*Entry)())
|
||||
{
|
||||
__try
|
||||
|
@ -477,6 +499,38 @@ void CxbxKrnlMain(int argc, char* argv[])
|
|||
}
|
||||
#pragma optimize("", on)
|
||||
|
||||
// Loads a keys.bin file as generated by dump-xbox
|
||||
// See https://github.com/JayFoxRox/xqemu-tools/blob/master/dump-xbox.c
|
||||
void LoadXboxKeys(std::string path)
|
||||
{
|
||||
std::string keys_path = path + "\\keys.bin";
|
||||
|
||||
// Attempt to open Keys.bin
|
||||
FILE* fp = fopen(keys_path.c_str(), "rb");
|
||||
|
||||
if (fp != nullptr) {
|
||||
// Determine size of Keys.bin
|
||||
xboxkrnl::XBOX_KEY_DATA keys[2];
|
||||
fseek(fp, 0, SEEK_END);
|
||||
long size = ftell(fp);
|
||||
rewind(fp);
|
||||
|
||||
// If the size of Keys.bin is correct (two keys), read it
|
||||
if (size == xboxkrnl::XBOX_KEY_LENGTH * 2) {
|
||||
fread(keys, xboxkrnl::XBOX_KEY_LENGTH, 2, fp);
|
||||
|
||||
memcpy(xboxkrnl::XboxEEPROMKey, &keys[0], xboxkrnl::XBOX_KEY_LENGTH);
|
||||
memcpy(xboxkrnl::XboxCertificateKey, &keys[1], xboxkrnl::XBOX_KEY_LENGTH);
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
return;
|
||||
}
|
||||
|
||||
// If we didn't already exist the function, keys.bin could not be loaded
|
||||
EmuWarning("Failed to load Keys.bin. Cxbx-Reloaded will be unable to read Save Data from a real Xbox");
|
||||
}
|
||||
|
||||
void CxbxKrnlInit
|
||||
(
|
||||
HWND hwndParent,
|
||||
|
@ -604,6 +658,10 @@ void CxbxKrnlInit
|
|||
strcat(szBuffer, "\\Cxbx-Reloaded\\");
|
||||
std::string basePath(szBuffer);
|
||||
CxbxBasePath = basePath + "EmuDisk\\";
|
||||
|
||||
// Load Per-Xbe Keys from the Cxbx-Reloaded AppData directory
|
||||
LoadXboxKeys(szBuffer);
|
||||
|
||||
// Determine XBE Path
|
||||
memset(szBuffer, 0, MAX_PATH);
|
||||
g_EmuShared->GetXbePath(szBuffer);
|
||||
|
@ -713,6 +771,9 @@ void CxbxKrnlInit
|
|||
// See: https://multimedia.cx/eggs/xbox-sphinx-protocol/
|
||||
ApplyMediaPatches();
|
||||
|
||||
// Setup per-title encryption keys
|
||||
SetupPerTitleKeys();
|
||||
|
||||
// initialize FS segment selector
|
||||
{
|
||||
EmuInitFS();
|
||||
|
|
|
@ -43,11 +43,15 @@ namespace xboxkrnl
|
|||
#include <xboxkrnl/xboxkrnl.h> // For XboxEEPROMKey, etc.
|
||||
};
|
||||
|
||||
// Certificate Key
|
||||
// Not exported but used to generate per-title keys
|
||||
xboxkrnl::XBOX_KEY_DATA xboxkrnl::XboxCertificateKey = { 0 };
|
||||
|
||||
// ******************************************************************
|
||||
// * 0x0141 - XboxEEPROMKey
|
||||
// ******************************************************************
|
||||
// TODO : What should we initialize this to?
|
||||
XBSYSAPI EXPORTNUM(321) xboxkrnl::XBOX_KEY_DATA xboxkrnl::XboxEEPROMKey = {};
|
||||
XBSYSAPI EXPORTNUM(321) xboxkrnl::XBOX_KEY_DATA xboxkrnl::XboxEEPROMKey = { 0 };
|
||||
|
||||
// ******************************************************************
|
||||
// * 0x0142 - XboxHardwareInfo
|
||||
|
@ -61,13 +65,7 @@ XBSYSAPI EXPORTNUM(322) xboxkrnl::XBOX_HARDWARE_INFO xboxkrnl::XboxHardwareInfo
|
|||
// ******************************************************************
|
||||
// * 0x0143 - XboxHDKey
|
||||
// ******************************************************************
|
||||
XBSYSAPI EXPORTNUM(323) xboxkrnl::UCHAR xboxkrnl::XboxHDKey[16] =
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
XBSYSAPI EXPORTNUM(323) xboxkrnl::XBOX_KEY_DATA xboxkrnl::XboxHDKey = { 0 };
|
||||
|
||||
// ******************************************************************
|
||||
// * 0x0144 - XboxKrnlVersion
|
||||
|
@ -81,23 +79,23 @@ XBSYSAPI EXPORTNUM(324) xboxkrnl::XBOX_KRNL_VERSION xboxkrnl::XboxKrnlVersion =
|
|||
|
||||
// ******************************************************************
|
||||
// * 0x0145 - XboxSignatureKey
|
||||
// Generated programatically using the Certificate Key and the XBE's
|
||||
// Signature Key
|
||||
// ******************************************************************
|
||||
XBSYSAPI EXPORTNUM(325) xboxkrnl::BYTE xboxkrnl::XboxSignatureKey[16] =
|
||||
{
|
||||
// cxbx default saved game key
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
};
|
||||
XBSYSAPI EXPORTNUM(325) xboxkrnl::XBOX_KEY_DATA xboxkrnl::XboxSignatureKey = { 0 };
|
||||
|
||||
// ******************************************************************
|
||||
// * 0x0161 - XboxLANKey
|
||||
// Generated programatically using the Certificate Key and the XBE's
|
||||
// LAN Key
|
||||
// ******************************************************************
|
||||
// TODO : What should we initialize this to?
|
||||
XBSYSAPI EXPORTNUM(353) xboxkrnl::XBOX_KEY_DATA xboxkrnl::XboxLANKey = {};
|
||||
XBSYSAPI EXPORTNUM(353) xboxkrnl::XBOX_KEY_DATA xboxkrnl::XboxLANKey = { 0 };
|
||||
|
||||
// ******************************************************************
|
||||
// * 0x0162 - XboxAlternateSignatureKeys
|
||||
// Generated programatically using the Certificate Key and the XBE's
|
||||
// Signature Keys
|
||||
// ******************************************************************
|
||||
// TODO : What should we initialize this to?
|
||||
XBSYSAPI EXPORTNUM(354) xboxkrnl::XBOX_KEY_DATA xboxkrnl::XboxAlternateSignatureKeys = {};
|
||||
XBSYSAPI EXPORTNUM(354) xboxkrnl::XBOX_KEY_DATA xboxkrnl::XboxAlternateSignatureKeys[16] = { 0 };
|
||||
|
||||
|
Loading…
Reference in New Issue