From d9ef20e5a53166fe3ecdca5ed225232eb7ad2f64 Mon Sep 17 00:00:00 2001 From: Zach Hilman Date: Wed, 17 Apr 2019 11:29:21 -0400 Subject: es: Populate/synthesize tickets on construction --- src/core/crypto/key_manager.cpp | 26 +++++++++++++------------- src/core/crypto/key_manager.h | 1 + src/core/hle/service/es/es.cpp | 5 +++-- 3 files changed, 17 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/core/crypto/key_manager.cpp b/src/core/crypto/key_manager.cpp index 558790a49..3c51e3dc2 100644 --- a/src/core/crypto/key_manager.cpp +++ b/src/core/crypto/key_manager.cpp @@ -406,9 +406,7 @@ std::optional> ParseTicket(const Ticket& ticket, if (issuer == std::array{}) return {}; if (issuer[0] != 'R' || issuer[1] != 'o' || issuer[2] != 'o' || issuer[3] != 't') { - LOG_INFO(Crypto, - "Attempting to parse ticket with non-standard certificate authority {:08X}.", - issuer); + LOG_INFO(Crypto, "Attempting to parse ticket with non-standard certificate authority."); } Key128 rights_id = ticket.GetData().rights_id; @@ -481,16 +479,6 @@ KeyManager::KeyManager() { AttemptLoadKeyFile(yuzu_keys_dir, yuzu_keys_dir, "title.keys_autogenerated", true); AttemptLoadKeyFile(yuzu_keys_dir, hactool_keys_dir, "console.keys", false); AttemptLoadKeyFile(yuzu_keys_dir, yuzu_keys_dir, "console.keys_autogenerated", false); - - for (const auto& key : s128_keys) { - if (key.first.type == S128KeyType::Titlekey) { - u128 rights_id{key.first.field1, key.first.field2}; - Key128 rights_id_2; - std::memcpy(rights_id_2.data(), rights_id.data(), rights_id_2.size()); - const auto ticket = Ticket::SynthesizeCommon(key.second, rights_id_2); - common_tickets.insert_or_assign(rights_id, ticket); - } - } } static bool ValidCryptoRevisionString(std::string_view base, size_t begin, size_t length) { @@ -1011,6 +999,18 @@ void KeyManager::PopulateTickets() { } } +void KeyManager::SynthesizeTickets() { + for (const auto& key : s128_keys) { + if (key.first.type == S128KeyType::Titlekey) { + u128 rights_id{key.first.field1, key.first.field2}; + Key128 rights_id_2; + std::memcpy(rights_id_2.data(), rights_id.data(), rights_id_2.size()); + const auto ticket = Ticket::SynthesizeCommon(key.second, rights_id_2); + common_tickets.insert_or_assign(rights_id, ticket); + } + } +} + void KeyManager::SetKeyWrapped(S128KeyType id, Key128 key, u64 field1, u64 field2) { if (key == Key128{}) return; diff --git a/src/core/crypto/key_manager.h b/src/core/crypto/key_manager.h index ff6bd08e1..d4e89d35c 100644 --- a/src/core/crypto/key_manager.h +++ b/src/core/crypto/key_manager.h @@ -236,6 +236,7 @@ public: void DeriveBase(); void DeriveETicket(PartitionDataManager& data); void PopulateTickets(); + void SynthesizeTickets(); void PopulateFromPartitionData(PartitionDataManager& data); diff --git a/src/core/hle/service/es/es.cpp b/src/core/hle/service/es/es.cpp index 7e01f88b9..92fa2bef8 100644 --- a/src/core/hle/service/es/es.cpp +++ b/src/core/hle/service/es/es.cpp @@ -56,6 +56,9 @@ public: }; // clang-format on RegisterHandlers(functions); + + keys.PopulateTickets(); + keys.SynthesizeTickets(); } private: @@ -125,7 +128,6 @@ private: void CountCommonTicket(Kernel::HLERequestContext& ctx) { LOG_DEBUG(Service_ETicket, "called"); - keys.PopulateTickets(); const auto count = keys.GetCommonTickets().size(); IPC::ResponseBuilder rb{ctx, 3}; @@ -136,7 +138,6 @@ private: void CountPersonalizedTicket(Kernel::HLERequestContext& ctx) { LOG_DEBUG(Service_ETicket, "called"); - keys.PopulateTickets(); const auto count = keys.GetPersonalizedTickets().size(); IPC::ResponseBuilder rb{ctx, 3}; -- cgit v1.2.3