summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Lioncash2018-10-03 01:20:54 -0400
committerGravatar Lioncash2018-10-03 01:20:57 -0400
commit4f18d3588879fcfdbab7dbc1f0a1ecda61ea4b0f (patch)
tree35b42f61ece7db714f1804a3b3c732c301c3cf50 /src
parentsubmission_package: Invert conditionals within NSP's constructor to reduce ne... (diff)
downloadyuzu-4f18d3588879fcfdbab7dbc1f0a1ecda61ea4b0f.tar.gz
yuzu-4f18d3588879fcfdbab7dbc1f0a1ecda61ea4b0f.tar.xz
yuzu-4f18d3588879fcfdbab7dbc1f0a1ecda61ea4b0f.zip
submission_package: Move ticket key setting to its own function
This behavior is entirely independent of the surrounding code, so it can be put in its own function to keep the behavior separate.
Diffstat (limited to 'src')
-rw-r--r--src/core/file_sys/submission_package.cpp49
1 files changed, 28 insertions, 21 deletions
diff --git a/src/core/file_sys/submission_package.cpp b/src/core/file_sys/submission_package.cpp
index 6ff43fa77..b1ebab17f 100644
--- a/src/core/file_sys/submission_package.cpp
+++ b/src/core/file_sys/submission_package.cpp
@@ -18,6 +18,33 @@
18#include "core/loader/loader.h" 18#include "core/loader/loader.h"
19 19
20namespace FileSys { 20namespace FileSys {
21namespace {
22void SetTicketKeys(const std::vector<VirtualFile>& files) {
23 Core::Crypto::KeyManager keys;
24
25 for (const auto& ticket_file : files) {
26 if (ticket_file->GetExtension() != "tik") {
27 continue;
28 }
29
30 if (ticket_file == nullptr ||
31 ticket_file->GetSize() <
32 Core::Crypto::TICKET_FILE_TITLEKEY_OFFSET + sizeof(Core::Crypto::Key128)) {
33 continue;
34 }
35
36 Core::Crypto::Key128 key{};
37 ticket_file->Read(key.data(), key.size(), Core::Crypto::TICKET_FILE_TITLEKEY_OFFSET);
38 std::string_view name_only(ticket_file->GetName());
39 name_only.remove_suffix(4);
40 const auto rights_id_raw = Common::HexStringToArray<16>(name_only);
41 u128 rights_id;
42 std::memcpy(rights_id.data(), rights_id_raw.data(), sizeof(u128));
43 keys.SetKey(Core::Crypto::S128KeyType::Titlekey, key, rights_id[1], rights_id[0]);
44 }
45}
46} // Anonymous namespace
47
21NSP::NSP(VirtualFile file_) 48NSP::NSP(VirtualFile file_)
22 : file(std::move(file_)), status{Loader::ResultStatus::Success}, 49 : file(std::move(file_)), status{Loader::ResultStatus::Success},
23 pfs(std::make_shared<PartitionFilesystem>(file)) { 50 pfs(std::make_shared<PartitionFilesystem>(file)) {
@@ -43,27 +70,7 @@ NSP::NSP(VirtualFile file_)
43 extracted = false; 70 extracted = false;
44 const auto files = pfs->GetFiles(); 71 const auto files = pfs->GetFiles();
45 72
46 Core::Crypto::KeyManager keys; 73 SetTicketKeys(files);
47 for (const auto& ticket_file : files) {
48 if (ticket_file->GetExtension() != "tik") {
49 continue;
50 }
51
52 if (ticket_file == nullptr ||
53 ticket_file->GetSize() <
54 Core::Crypto::TICKET_FILE_TITLEKEY_OFFSET + sizeof(Core::Crypto::Key128)) {
55 continue;
56 }
57
58 Core::Crypto::Key128 key{};
59 ticket_file->Read(key.data(), key.size(), Core::Crypto::TICKET_FILE_TITLEKEY_OFFSET);
60 std::string_view name_only(ticket_file->GetName());
61 name_only.remove_suffix(4);
62 const auto rights_id_raw = Common::HexStringToArray<16>(name_only);
63 u128 rights_id;
64 std::memcpy(rights_id.data(), rights_id_raw.data(), sizeof(u128));
65 keys.SetKey(Core::Crypto::S128KeyType::Titlekey, key, rights_id[1], rights_id[0]);
66 }
67 74
68 for (const auto& outer_file : files) { 75 for (const auto& outer_file : files) {
69 if (outer_file->GetName().substr(outer_file->GetName().size() - 9) != ".cnmt.nca") { 76 if (outer_file->GetName().substr(outer_file->GetName().size() - 9) != ".cnmt.nca") {