Implement support for real Xbox keys

This commit is contained in:
Luke Usher 2017-03-26 22:56:17 +01:00
parent 54be6c85a5
commit 856e1ba873
3 changed files with 83 additions and 20 deletions

View File

@ -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;
// ******************************************************************

View File

@ -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();

View File

@ -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 };