diff options
| author | 2020-10-12 17:58:36 -0700 | |
|---|---|---|
| committer | 2020-10-12 17:58:36 -0700 | |
| commit | d291fc1a517d0db07e4b32f5b4ad294c5e93e984 (patch) | |
| tree | 5f5b71a00d40fdf7d0daa2478e7410922d7da56a | |
| parent | Merge pull request #4766 from ReinUsesLisp/tmml-cube (diff) | |
| parent | file_sys/nsp: Make SetTicketKeys actually do something (diff) | |
| download | yuzu-d291fc1a517d0db07e4b32f5b4ad294c5e93e984.tar.gz yuzu-d291fc1a517d0db07e4b32f5b4ad294c5e93e984.tar.xz yuzu-d291fc1a517d0db07e4b32f5b4ad294c5e93e984.zip | |
Merge pull request #3929 from FearlessTobi/ticket-keys
file_sys/nsp: Make SetTicketKeys actually do something
| -rw-r--r-- | src/core/file_sys/submission_package.cpp | 61 | ||||
| -rw-r--r-- | src/core/file_sys/submission_package.h | 1 |
2 files changed, 30 insertions, 32 deletions
diff --git a/src/core/file_sys/submission_package.cpp b/src/core/file_sys/submission_package.cpp index 07ae90819..90641d23b 100644 --- a/src/core/file_sys/submission_package.cpp +++ b/src/core/file_sys/submission_package.cpp | |||
| @@ -19,38 +19,6 @@ | |||
| 19 | #include "core/loader/loader.h" | 19 | #include "core/loader/loader.h" |
| 20 | 20 | ||
| 21 | namespace FileSys { | 21 | namespace FileSys { |
| 22 | namespace { | ||
| 23 | void SetTicketKeys(const std::vector<VirtualFile>& files) { | ||
| 24 | auto& keys = Core::Crypto::KeyManager::Instance(); | ||
| 25 | |||
| 26 | for (const auto& ticket_file : files) { | ||
| 27 | if (ticket_file == nullptr) { | ||
| 28 | continue; | ||
| 29 | } | ||
| 30 | |||
| 31 | if (ticket_file->GetExtension() != "tik") { | ||
| 32 | continue; | ||
| 33 | } | ||
| 34 | |||
| 35 | if (ticket_file->GetSize() < | ||
| 36 | Core::Crypto::TICKET_FILE_TITLEKEY_OFFSET + sizeof(Core::Crypto::Key128)) { | ||
| 37 | continue; | ||
| 38 | } | ||
| 39 | |||
| 40 | Core::Crypto::Key128 key{}; | ||
| 41 | ticket_file->Read(key.data(), key.size(), Core::Crypto::TICKET_FILE_TITLEKEY_OFFSET); | ||
| 42 | |||
| 43 | // We get the name without the extension in order to create the rights ID. | ||
| 44 | std::string name_only(ticket_file->GetName()); | ||
| 45 | name_only.erase(name_only.size() - 4); | ||
| 46 | |||
| 47 | const auto rights_id_raw = Common::HexStringToArray<16>(name_only); | ||
| 48 | u128 rights_id; | ||
| 49 | std::memcpy(rights_id.data(), rights_id_raw.data(), sizeof(u128)); | ||
| 50 | keys.SetKey(Core::Crypto::S128KeyType::Titlekey, key, rights_id[1], rights_id[0]); | ||
| 51 | } | ||
| 52 | } | ||
| 53 | } // Anonymous namespace | ||
| 54 | 22 | ||
| 55 | NSP::NSP(VirtualFile file_) | 23 | NSP::NSP(VirtualFile file_) |
| 56 | : file(std::move(file_)), status{Loader::ResultStatus::Success}, | 24 | : file(std::move(file_)), status{Loader::ResultStatus::Success}, |
| @@ -232,6 +200,35 @@ VirtualDir NSP::GetParentDirectory() const { | |||
| 232 | return file->GetContainingDirectory(); | 200 | return file->GetContainingDirectory(); |
| 233 | } | 201 | } |
| 234 | 202 | ||
| 203 | void NSP::SetTicketKeys(const std::vector<VirtualFile>& files) { | ||
| 204 | for (const auto& ticket_file : files) { | ||
| 205 | if (ticket_file == nullptr) { | ||
| 206 | continue; | ||
| 207 | } | ||
| 208 | |||
| 209 | if (ticket_file->GetExtension() != "tik") { | ||
| 210 | continue; | ||
| 211 | } | ||
| 212 | |||
| 213 | if (ticket_file->GetSize() < | ||
| 214 | Core::Crypto::TICKET_FILE_TITLEKEY_OFFSET + sizeof(Core::Crypto::Key128)) { | ||
| 215 | continue; | ||
| 216 | } | ||
| 217 | |||
| 218 | Core::Crypto::Key128 key{}; | ||
| 219 | ticket_file->Read(key.data(), key.size(), Core::Crypto::TICKET_FILE_TITLEKEY_OFFSET); | ||
| 220 | |||
| 221 | // We get the name without the extension in order to create the rights ID. | ||
| 222 | std::string name_only(ticket_file->GetName()); | ||
| 223 | name_only.erase(name_only.size() - 4); | ||
| 224 | |||
| 225 | const auto rights_id_raw = Common::HexStringToArray<16>(name_only); | ||
| 226 | u128 rights_id; | ||
| 227 | std::memcpy(rights_id.data(), rights_id_raw.data(), sizeof(u128)); | ||
| 228 | keys.SetKey(Core::Crypto::S128KeyType::Titlekey, key, rights_id[1], rights_id[0]); | ||
| 229 | } | ||
| 230 | } | ||
| 231 | |||
| 235 | void NSP::InitializeExeFSAndRomFS(const std::vector<VirtualFile>& files) { | 232 | void NSP::InitializeExeFSAndRomFS(const std::vector<VirtualFile>& files) { |
| 236 | exefs = pfs; | 233 | exefs = pfs; |
| 237 | 234 | ||
diff --git a/src/core/file_sys/submission_package.h b/src/core/file_sys/submission_package.h index 2db5e46b8..c70a11b5b 100644 --- a/src/core/file_sys/submission_package.h +++ b/src/core/file_sys/submission_package.h | |||
| @@ -63,6 +63,7 @@ public: | |||
| 63 | VirtualDir GetParentDirectory() const override; | 63 | VirtualDir GetParentDirectory() const override; |
| 64 | 64 | ||
| 65 | private: | 65 | private: |
| 66 | void SetTicketKeys(const std::vector<VirtualFile>& files); | ||
| 66 | void InitializeExeFSAndRomFS(const std::vector<VirtualFile>& files); | 67 | void InitializeExeFSAndRomFS(const std::vector<VirtualFile>& files); |
| 67 | void ReadNCAs(const std::vector<VirtualFile>& files); | 68 | void ReadNCAs(const std::vector<VirtualFile>& files); |
| 68 | 69 | ||