Skip to content
Permalink
Browse files
Merge pull request #6088 from leoetlino/personalised-import
IOS: Assume ticket is unpersonalised for WAD imports
  • Loading branch information
leoetlino committed Oct 3, 2017
2 parents 63b11be + c0c1cb3 commit d790660
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 4 deletions.
@@ -106,7 +106,15 @@ class ES final : public Device
s32 SeekContent(u32 cfd, u32 offset, SeekMode mode, u32 uid);

// Title management
ReturnCode ImportTicket(const std::vector<u8>& ticket_bytes, const std::vector<u8>& cert_chain);
enum class TicketImportType
{
// Ticket may be personalised, so use console specific data for decryption if needed.
PossiblyPersonalised,
// Ticket is unpersonalised, so ignore any console specific decryption data.
Unpersonalised,
};
ReturnCode ImportTicket(const std::vector<u8>& ticket_bytes, const std::vector<u8>& cert_chain,
TicketImportType type = TicketImportType::PossiblyPersonalised);
ReturnCode ImportTmd(Context& context, const std::vector<u8>& tmd_bytes);
ReturnCode ImportTitleInit(Context& context, const std::vector<u8>& tmd_bytes,
const std::vector<u8>& cert_chain);
@@ -56,15 +56,16 @@ void ES::TitleImportExportContext::DoState(PointerWrap& p)
p.Do(content.buffer);
}

ReturnCode ES::ImportTicket(const std::vector<u8>& ticket_bytes, const std::vector<u8>& cert_chain)
ReturnCode ES::ImportTicket(const std::vector<u8>& ticket_bytes, const std::vector<u8>& cert_chain,
TicketImportType type)
{
IOS::ES::TicketReader ticket{ticket_bytes};
if (!ticket.IsValid())
return ES_EINVAL;

const u32 ticket_device_id = ticket.GetDeviceId();
const u32 device_id = EcWii::GetInstance().GetNGID();
if (ticket_device_id != 0)
if (type == TicketImportType::PossiblyPersonalised && ticket_device_id != 0)
{
if (device_id != ticket_device_id)
{
@@ -65,7 +65,8 @@ static bool InstallWAD(IOS::HLE::Kernel& ios, const DiscIO::WiiWAD& wad)
// Ensure the common key index is correct, as it's checked by IOS.
ticket.FixCommonKeyIndex();

while ((ret = es->ImportTicket(ticket.GetBytes(), wad.GetCertificateChain())) < 0 ||
while ((ret = es->ImportTicket(ticket.GetBytes(), wad.GetCertificateChain(),
IOS::HLE::Device::ES::TicketImportType::Unpersonalised)) < 0 ||
(ret = es->ImportTitleInit(context, tmd.GetBytes(), wad.GetCertificateChain())) < 0)
{
if (checks_enabled && ret == IOS::HLE::IOSC_FAIL_CHECKVALUE &&

0 comments on commit d790660

Please sign in to comment.