Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #9019 from JosJuice/verify-wad-split-tmd-ticket
VolumeVerifier: Split TMD error from ticket error for WADs
  • Loading branch information
Tilka committed Aug 8, 2020
2 parents 3101d95 + 7ef0bc0 commit c0fde32
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 26 deletions.
67 changes: 42 additions & 25 deletions Source/Core/DiscIO/VolumeVerifier.cpp
Expand Up @@ -391,8 +391,6 @@ void VolumeVerifier::Start()
(m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.IsEncryptedAndHashed()) ||
IsDebugSigned();

if (m_volume.GetVolumeType() == Platform::WiiWAD)
CheckCorrectlySigned(PARTITION_NONE, Common::GetStringT("This title is not correctly signed."));
CheckDiscSize(CheckPartitions());
CheckMisc();

Expand Down Expand Up @@ -525,10 +523,24 @@ bool VolumeVerifier::CheckPartition(const Partition& partition)

if (!m_is_datel)
{
CheckCorrectlySigned(
partition,
StringFromFormat(Common::GetStringT("The %s partition is not correctly signed.").c_str(),
name.c_str()));
IOS::HLE::Kernel ios;
const auto es = ios.GetES();
const std::vector<u8>& cert_chain = m_volume.GetCertificateChain(partition);

if (IOS::HLE::IPC_SUCCESS !=
es->VerifyContainer(IOS::HLE::Device::ES::VerifyContainerType::Ticket,
IOS::HLE::Device::ES::VerifyMode::DoNotUpdateCertStore,
m_volume.GetTicket(partition), cert_chain) ||
IOS::HLE::IPC_SUCCESS !=
es->VerifyContainer(IOS::HLE::Device::ES::VerifyContainerType::TMD,
IOS::HLE::Device::ES::VerifyMode::DoNotUpdateCertStore,
m_volume.GetTMD(partition), cert_chain))
{
AddProblem(
Severity::Low,
StringFromFormat(Common::GetStringT("The %s partition is not correctly signed.").c_str(),
name.c_str()));
}
}

if (m_volume.SupportsIntegrityCheck() && !m_volume.CheckH3TableIntegrity(partition))
Expand Down Expand Up @@ -664,25 +676,6 @@ std::string VolumeVerifier::GetPartitionName(std::optional<u32> type) const
return name;
}

void VolumeVerifier::CheckCorrectlySigned(const Partition& partition, std::string error_text)
{
IOS::HLE::Kernel ios;
const auto es = ios.GetES();
const std::vector<u8> cert_chain = m_volume.GetCertificateChain(partition);

if (IOS::HLE::IPC_SUCCESS !=
es->VerifyContainer(IOS::HLE::Device::ES::VerifyContainerType::Ticket,
IOS::HLE::Device::ES::VerifyMode::DoNotUpdateCertStore,
m_volume.GetTicket(partition), cert_chain) ||
IOS::HLE::IPC_SUCCESS !=
es->VerifyContainer(IOS::HLE::Device::ES::VerifyContainerType::TMD,
IOS::HLE::Device::ES::VerifyMode::DoNotUpdateCertStore,
m_volume.GetTMD(partition), cert_chain))
{
AddProblem(Severity::Low, std::move(error_text));
}
}

bool VolumeVerifier::IsDebugSigned() const
{
const IOS::ES::TicketReader& ticket = m_volume.GetTicket(m_volume.GetGamePartition());
Expand Down Expand Up @@ -988,6 +981,30 @@ void VolumeVerifier::CheckMisc()
}
}

if (m_volume.GetVolumeType() == Platform::WiiWAD)
{
IOS::HLE::Kernel ios;
const auto es = ios.GetES();
const std::vector<u8>& cert_chain = m_volume.GetCertificateChain(PARTITION_NONE);

if (IOS::HLE::IPC_SUCCESS !=
es->VerifyContainer(IOS::HLE::Device::ES::VerifyContainerType::Ticket,
IOS::HLE::Device::ES::VerifyMode::DoNotUpdateCertStore, m_ticket,
cert_chain))
{
// i18n: "Ticket" here is a kind of digital authorization to use a certain title (e.g. a game)
AddProblem(Severity::Low, Common::GetStringT("The ticket is not correctly signed."));
}

if (IOS::HLE::IPC_SUCCESS !=
es->VerifyContainer(IOS::HLE::Device::ES::VerifyContainerType::TMD,
IOS::HLE::Device::ES::VerifyMode::DoNotUpdateCertStore, tmd,
cert_chain))
{
AddProblem(Severity::Low, Common::GetStringT("The TMD is not correctly signed."));
}
}

if (m_volume.IsNKit())
{
AddProblem(
Expand Down
1 change: 0 additions & 1 deletion Source/Core/DiscIO/VolumeVerifier.h
Expand Up @@ -148,7 +148,6 @@ class VolumeVerifier final
std::vector<Partition> CheckPartitions();
bool CheckPartition(const Partition& partition); // Returns false if partition should be ignored
std::string GetPartitionName(std::optional<u32> type) const;
void CheckCorrectlySigned(const Partition& partition, std::string error_text);
bool IsDebugSigned() const;
bool ShouldHaveChannelPartition() const;
bool ShouldHaveInstallPartition() const;
Expand Down

0 comments on commit c0fde32

Please sign in to comment.