summaryrefslogtreecommitdiff
path: root/src/core/file_sys
diff options
context:
space:
mode:
authorGravatar Steveice102023-09-05 12:09:42 -0700
committerGravatar GitHub2023-09-05 21:09:42 +0200
commit0a51fe78544daafceadbd5418e406bf11e703851 (patch)
tree83c7ae92e1c46ec70ec8ab79420362e5e4b0212d /src/core/file_sys
parentMerge pull request #11427 from zhaobot/tx-update-20230901020727 (diff)
downloadyuzu-0a51fe78544daafceadbd5418e406bf11e703851.tar.gz
yuzu-0a51fe78544daafceadbd5418e406bf11e703851.tar.xz
yuzu-0a51fe78544daafceadbd5418e406bf11e703851.zip
core: Add support for loading NSPs with personalized tickets. (#10048)
Co-authored-by: Morph <39850852+Morph1984@users.noreply.github.com>
Diffstat (limited to 'src/core/file_sys')
-rw-r--r--src/core/file_sys/submission_package.cpp35
-rw-r--r--src/core/file_sys/submission_package.h1
2 files changed, 3 insertions, 33 deletions
diff --git a/src/core/file_sys/submission_package.cpp b/src/core/file_sys/submission_package.cpp
index e1e89ce2d..68e8ec22f 100644
--- a/src/core/file_sys/submission_package.cpp
+++ b/src/core/file_sys/submission_package.cpp
@@ -164,24 +164,6 @@ VirtualFile NSP::GetNCAFile(u64 title_id, ContentRecordType type, TitleType titl
164 return nullptr; 164 return nullptr;
165} 165}
166 166
167std::vector<Core::Crypto::Key128> NSP::GetTitlekey() const {
168 if (extracted)
169 LOG_WARNING(Service_FS, "called on an NSP that is of type extracted.");
170 std::vector<Core::Crypto::Key128> out;
171 for (const auto& ticket_file : ticket_files) {
172 if (ticket_file == nullptr ||
173 ticket_file->GetSize() <
174 Core::Crypto::TICKET_FILE_TITLEKEY_OFFSET + sizeof(Core::Crypto::Key128)) {
175 continue;
176 }
177
178 out.emplace_back();
179 ticket_file->Read(out.back().data(), out.back().size(),
180 Core::Crypto::TICKET_FILE_TITLEKEY_OFFSET);
181 }
182 return out;
183}
184
185std::vector<VirtualFile> NSP::GetFiles() const { 167std::vector<VirtualFile> NSP::GetFiles() const {
186 return pfs->GetFiles(); 168 return pfs->GetFiles();
187} 169}
@@ -208,22 +190,11 @@ void NSP::SetTicketKeys(const std::vector<VirtualFile>& files) {
208 continue; 190 continue;
209 } 191 }
210 192
211 if (ticket_file->GetSize() < 193 auto ticket = Core::Crypto::Ticket::Read(ticket_file);
212 Core::Crypto::TICKET_FILE_TITLEKEY_OFFSET + sizeof(Core::Crypto::Key128)) { 194 if (!keys.AddTicket(ticket)) {
195 LOG_WARNING(Common_Filesystem, "Could not load NSP ticket {}", ticket_file->GetName());
213 continue; 196 continue;
214 } 197 }
215
216 Core::Crypto::Key128 key{};
217 ticket_file->Read(key.data(), key.size(), Core::Crypto::TICKET_FILE_TITLEKEY_OFFSET);
218
219 // We get the name without the extension in order to create the rights ID.
220 std::string name_only(ticket_file->GetName());
221 name_only.erase(name_only.size() - 4);
222
223 const auto rights_id_raw = Common::HexStringToArray<16>(name_only);
224 u128 rights_id;
225 std::memcpy(rights_id.data(), rights_id_raw.data(), sizeof(u128));
226 keys.SetKey(Core::Crypto::S128KeyType::Titlekey, key, rights_id[1], rights_id[0]);
227 } 198 }
228} 199}
229 200
diff --git a/src/core/file_sys/submission_package.h b/src/core/file_sys/submission_package.h
index 27f97c725..915bffca9 100644
--- a/src/core/file_sys/submission_package.h
+++ b/src/core/file_sys/submission_package.h
@@ -53,7 +53,6 @@ public:
53 TitleType title_type = TitleType::Application) const; 53 TitleType title_type = TitleType::Application) const;
54 VirtualFile GetNCAFile(u64 title_id, ContentRecordType type, 54 VirtualFile GetNCAFile(u64 title_id, ContentRecordType type,
55 TitleType title_type = TitleType::Application) const; 55 TitleType title_type = TitleType::Application) const;
56 std::vector<Core::Crypto::Key128> GetTitlekey() const;
57 56
58 std::vector<VirtualFile> GetFiles() const override; 57 std::vector<VirtualFile> GetFiles() const override;
59 58