IOS/ES: Verify containers in ImportTitleInit
This commit is contained in:
parent
719af1aff4
commit
8a49e1f7db
|
@ -114,7 +114,8 @@ public:
|
||||||
// Title management
|
// Title management
|
||||||
ReturnCode ImportTicket(const std::vector<u8>& ticket_bytes, const std::vector<u8>& cert_chain);
|
ReturnCode ImportTicket(const std::vector<u8>& ticket_bytes, const std::vector<u8>& cert_chain);
|
||||||
ReturnCode ImportTmd(Context& context, const std::vector<u8>& tmd_bytes);
|
ReturnCode ImportTmd(Context& context, const std::vector<u8>& tmd_bytes);
|
||||||
ReturnCode ImportTitleInit(Context& context, const std::vector<u8>& tmd_bytes);
|
ReturnCode ImportTitleInit(Context& context, const std::vector<u8>& tmd_bytes,
|
||||||
|
const std::vector<u8>& cert_chain);
|
||||||
ReturnCode ImportContentBegin(Context& context, u64 title_id, u32 content_id);
|
ReturnCode ImportContentBegin(Context& context, u64 title_id, u32 content_id);
|
||||||
ReturnCode ImportContentData(Context& context, u32 content_fd, const u8* data, u32 data_size);
|
ReturnCode ImportContentData(Context& context, u32 content_fd, const u8* data, u32 data_size);
|
||||||
ReturnCode ImportContentEnd(Context& context, u32 content_fd);
|
ReturnCode ImportContentEnd(Context& context, u32 content_fd);
|
||||||
|
|
|
@ -123,7 +123,8 @@ IPCCommandResult ES::ImportTmd(Context& context, const IOCtlVRequest& request)
|
||||||
return GetDefaultReply(ImportTmd(context, tmd));
|
return GetDefaultReply(ImportTmd(context, tmd));
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnCode ES::ImportTitleInit(Context& context, const std::vector<u8>& tmd_bytes)
|
ReturnCode ES::ImportTitleInit(Context& context, const std::vector<u8>& tmd_bytes,
|
||||||
|
const std::vector<u8>& cert_chain)
|
||||||
{
|
{
|
||||||
INFO_LOG(IOS_ES, "ImportTitleInit");
|
INFO_LOG(IOS_ES, "ImportTitleInit");
|
||||||
context.title_import.tmd.SetBytes(tmd_bytes);
|
context.title_import.tmd.SetBytes(tmd_bytes);
|
||||||
|
@ -136,11 +137,34 @@ ReturnCode ES::ImportTitleInit(Context& context, const std::vector<u8>& tmd_byte
|
||||||
// Finish a previous import (if it exists).
|
// Finish a previous import (if it exists).
|
||||||
FinishStaleImport(context.title_import.tmd.GetTitleId());
|
FinishStaleImport(context.title_import.tmd.GetTitleId());
|
||||||
|
|
||||||
|
ReturnCode ret = VerifyContainer(VerifyContainerType::TMD, VerifyMode::UpdateCertStore,
|
||||||
|
context.title_import.tmd, cert_chain);
|
||||||
|
if (ret != IPC_SUCCESS)
|
||||||
|
{
|
||||||
|
context.title_import.tmd.SetBytes({});
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto ticket = DiscIO::FindSignedTicket(context.title_import.tmd.GetTitleId());
|
||||||
|
if (!ticket.IsValid())
|
||||||
|
return ES_NO_TICKET;
|
||||||
|
|
||||||
|
std::vector<u8> cert_store;
|
||||||
|
ret = ReadCertStore(&cert_store);
|
||||||
|
if (ret != IPC_SUCCESS)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = VerifyContainer(VerifyContainerType::Ticket, VerifyMode::DoNotUpdateCertStore, ticket,
|
||||||
|
cert_store);
|
||||||
|
if (ret != IPC_SUCCESS)
|
||||||
|
{
|
||||||
|
context.title_import.tmd.SetBytes({});
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
if (!InitImport(context.title_import.tmd.GetTitleId()))
|
if (!InitImport(context.title_import.tmd.GetTitleId()))
|
||||||
return ES_EIO;
|
return ES_EIO;
|
||||||
|
|
||||||
// TODO: check and use the other vectors.
|
|
||||||
|
|
||||||
return IPC_SUCCESS;
|
return IPC_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -154,7 +178,9 @@ IPCCommandResult ES::ImportTitleInit(Context& context, const IOCtlVRequest& requ
|
||||||
|
|
||||||
std::vector<u8> tmd(request.in_vectors[0].size);
|
std::vector<u8> tmd(request.in_vectors[0].size);
|
||||||
Memory::CopyFromEmu(tmd.data(), request.in_vectors[0].address, request.in_vectors[0].size);
|
Memory::CopyFromEmu(tmd.data(), request.in_vectors[0].address, request.in_vectors[0].size);
|
||||||
return GetDefaultReply(ImportTitleInit(context, tmd));
|
std::vector<u8> certs(request.in_vectors[1].size);
|
||||||
|
Memory::CopyFromEmu(certs.data(), request.in_vectors[1].address, request.in_vectors[1].size);
|
||||||
|
return GetDefaultReply(ImportTitleInit(context, tmd, certs));
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnCode ES::ImportContentBegin(Context& context, u64 title_id, u32 content_id)
|
ReturnCode ES::ImportContentBegin(Context& context, u64 title_id, u32 content_id)
|
||||||
|
|
|
@ -28,7 +28,7 @@ bool InstallWAD(const std::string& wad_path)
|
||||||
|
|
||||||
IOS::HLE::Device::ES::Context context;
|
IOS::HLE::Device::ES::Context context;
|
||||||
if (es->ImportTicket(wad.GetTicket().GetBytes(), wad.GetCertificateChain()) < 0 ||
|
if (es->ImportTicket(wad.GetTicket().GetBytes(), wad.GetCertificateChain()) < 0 ||
|
||||||
es->ImportTitleInit(context, tmd.GetBytes()) < 0)
|
es->ImportTitleInit(context, tmd.GetBytes(), wad.GetCertificateChain()) < 0)
|
||||||
{
|
{
|
||||||
PanicAlertT("WAD installation failed: Could not initialise title import.");
|
PanicAlertT("WAD installation failed: Could not initialise title import.");
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in New Issue