IOSC: Add GetDeviceId and GetDeviceCertificate
This commit is contained in:
parent
f3c63b3108
commit
b3c7874a3a
|
@ -23,6 +23,7 @@
|
|||
#include "Common/File.h"
|
||||
#include "Common/FileUtil.h"
|
||||
#include "Common/ScopeGuard.h"
|
||||
#include "Common/StringUtil.h"
|
||||
#include "Common/Swap.h"
|
||||
#include "Core/IOS/Device.h"
|
||||
#include "Core/ec_wii.h"
|
||||
|
@ -442,6 +443,40 @@ ReturnCode IOSC::SetOwnership(Handle handle, u32 new_owner, u32 pid)
|
|||
return IPC_SUCCESS;
|
||||
}
|
||||
|
||||
u32 IOSC::GetDeviceId() const
|
||||
{
|
||||
return m_key_entries[HANDLE_CONSOLE_ID].misc_data;
|
||||
}
|
||||
|
||||
// Based off of twintig http://git.infradead.org/?p=users/segher/wii.git
|
||||
// Copyright 2007,2008 Segher Boessenkool <segher@kernel.crashing.org>
|
||||
// Licensed under the terms of the GNU GPL, version 2
|
||||
// http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
|
||||
static Certificate MakeBlankSigECCert(const char* signer, const char* name, const u8* private_key,
|
||||
u32 key_id)
|
||||
{
|
||||
Certificate cert_out{};
|
||||
const u32 type = Common::swap32(static_cast<u32>(SignatureType::ECC));
|
||||
std::memcpy(cert_out.data(), &type, sizeof(type));
|
||||
std::strncpy(reinterpret_cast<char*>(cert_out.data()) + 0x80, signer, 0x40);
|
||||
const u32 two = Common::swap32(2);
|
||||
std::memcpy(cert_out.data() + 0xc0, &two, sizeof(two));
|
||||
std::strncpy(reinterpret_cast<char*>(cert_out.data()) + 0xc4, name, 0x40);
|
||||
const u32 swapped_key_id = Common::swap32(key_id);
|
||||
std::memcpy(cert_out.data() + 0x104, &swapped_key_id, sizeof(swapped_key_id));
|
||||
ec_priv_to_pub(private_key, cert_out.data() + 0x108);
|
||||
return cert_out;
|
||||
}
|
||||
|
||||
Certificate IOSC::GetDeviceCertificate() const
|
||||
{
|
||||
const std::string name = StringFromFormat("NG%08x", GetDeviceId());
|
||||
auto cert = MakeBlankSigECCert("Root-CA00000001-MS00000002", name.c_str(),
|
||||
m_key_entries[HANDLE_CONSOLE_KEY].data.data(), m_console_key_id);
|
||||
std::copy(m_console_signature.begin(), m_console_signature.end(), cert.begin() + 4);
|
||||
return cert;
|
||||
}
|
||||
|
||||
constexpr std::array<u8, 512> ROOT_PUBLIC_KEY = {
|
||||
{0xF8, 0x24, 0x6C, 0x58, 0xBA, 0xE7, 0x50, 0x03, 0x01, 0xFB, 0xB7, 0xC2, 0xEB, 0xE0, 0x01,
|
||||
0x05, 0x71, 0xDA, 0x92, 0x23, 0x78, 0xF0, 0x51, 0x4E, 0xC0, 0x03, 0x1D, 0xD0, 0xD2, 0x1E,
|
||||
|
|
|
@ -21,7 +21,7 @@ enum class SignatureType : u32
|
|||
{
|
||||
RSA4096 = 0x00010000,
|
||||
RSA2048 = 0x00010001,
|
||||
// XXX: Add support for ECC (0x00010002).
|
||||
ECC = 0x00010002,
|
||||
};
|
||||
|
||||
enum class PublicKeyType : u32
|
||||
|
@ -97,6 +97,7 @@ union Cert
|
|||
#pragma pack(pop)
|
||||
|
||||
using ECCSignature = std::array<u8, 60>;
|
||||
using Certificate = std::array<u8, 0x180>;
|
||||
|
||||
namespace HLE
|
||||
{
|
||||
|
@ -198,6 +199,9 @@ public:
|
|||
ReturnCode GetOwnership(Handle handle, u32* owner) const;
|
||||
ReturnCode SetOwnership(Handle handle, u32 owner, u32 pid);
|
||||
|
||||
u32 GetDeviceId() const;
|
||||
Certificate GetDeviceCertificate() const;
|
||||
|
||||
void DoState(PointerWrap& p);
|
||||
|
||||
private:
|
||||
|
|
Loading…
Reference in New Issue