| 
									
										
										
										
											2015-05-24 06:55:12 +02:00
										 |  |  | // Copyright 2009 Dolphin Emulator Project
 | 
					
						
							| 
									
										
										
										
											2015-05-18 01:08:10 +02:00
										 |  |  | // Licensed under GPLv2+
 | 
					
						
							| 
									
										
										
										
											2013-04-17 23:09:55 -04:00
										 |  |  | // Refer to the license.txt file included.
 | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-10 13:54:46 -05:00
										 |  |  | #pragma once
 | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-21 01:47:53 +01:00
										 |  |  | #include <cstddef>
 | 
					
						
							| 
									
										
										
										
											2016-07-06 20:33:05 +02:00
										 |  |  | #include <memory>
 | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | #include <string>
 | 
					
						
							| 
									
										
										
										
											2015-06-21 13:19:52 -04:00
										 |  |  | #include <unordered_map>
 | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | #include <vector>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-07 20:06:58 -05:00
										 |  |  | #include "Common/CommonTypes.h"
 | 
					
						
							| 
									
										
										
										
											2015-06-21 13:19:52 -04:00
										 |  |  | #include "Common/NandPaths.h"
 | 
					
						
							| 
									
										
										
										
											2016-07-06 20:33:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-14 20:12:16 -04:00
										 |  |  | namespace File | 
					
						
							| 
									
										
										
										
											2016-07-06 20:33:05 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-10-14 20:12:16 -04:00
										 |  |  | class IOFile; | 
					
						
							| 
									
										
										
										
											2016-07-06 20:33:05 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace DiscIO | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-12-23 18:41:21 +01:00
										 |  |  | enum class Region; | 
					
						
							| 
									
										
										
										
											2016-10-14 20:12:16 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-02 00:59:21 +01:00
										 |  |  | bool AddTicket(const std::vector<u8>& signed_ticket); | 
					
						
							|  |  |  | std::vector<u8> FindSignedTicket(u64 title_id); | 
					
						
							|  |  |  | std::vector<u8> FindTicket(u64 title_id); | 
					
						
							| 
									
										
										
										
											2017-01-02 05:32:08 +01:00
										 |  |  | std::vector<u8> GetKeyFromTicket(const std::vector<u8>& ticket); | 
					
						
							| 
									
										
										
										
											2015-12-19 13:46:01 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-16 20:08:37 +01:00
										 |  |  | class CNANDContentData | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2016-09-10 04:38:04 +00:00
										 |  |  |   virtual ~CNANDContentData() = 0; | 
					
						
							| 
									
										
										
										
											2016-09-14 19:50:43 -04:00
										 |  |  |   virtual void Open() {} | 
					
						
							| 
									
										
										
										
											2016-09-14 19:15:27 -04:00
										 |  |  |   virtual std::vector<u8> Get() = 0; | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   virtual bool GetRange(u32 start, u32 size, u8* buffer) = 0; | 
					
						
							| 
									
										
										
										
											2016-09-14 19:50:43 -04:00
										 |  |  |   virtual void Close() {} | 
					
						
							| 
									
										
										
										
											2016-03-16 20:08:37 +01:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class CNANDContentDataFile final : public CNANDContentData | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2016-10-14 20:12:16 -04:00
										 |  |  |   explicit CNANDContentDataFile(const std::string& filename); | 
					
						
							|  |  |  |   ~CNANDContentDataFile(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   void Open() override; | 
					
						
							| 
									
										
										
										
											2016-09-14 19:15:27 -04:00
										 |  |  |   std::vector<u8> Get() override; | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   bool GetRange(u32 start, u32 size, u8* buffer) override; | 
					
						
							|  |  |  |   void Close() override; | 
					
						
							| 
									
										
										
										
											2016-03-16 20:08:37 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   void EnsureOpen(); | 
					
						
							| 
									
										
										
										
											2016-03-20 13:09:21 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   const std::string m_filename; | 
					
						
							|  |  |  |   std::unique_ptr<File::IOFile> m_file; | 
					
						
							| 
									
										
										
										
											2016-03-16 20:08:37 +01:00
										 |  |  | }; | 
					
						
							|  |  |  | class CNANDContentDataBuffer final : public CNANDContentData | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2016-09-14 19:50:43 -04:00
										 |  |  |   explicit CNANDContentDataBuffer(const std::vector<u8>& buffer) : m_buffer(buffer) {} | 
					
						
							|  |  |  |   std::vector<u8> Get() override { return m_buffer; } | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   bool GetRange(u32 start, u32 size, u8* buffer) override; | 
					
						
							| 
									
										
										
										
											2016-03-16 20:08:37 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   const std::vector<u8> m_buffer; | 
					
						
							| 
									
										
										
										
											2016-03-16 20:08:37 +01:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | struct SNANDContent | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   u32 m_ContentID; | 
					
						
							|  |  |  |   u16 m_Index; | 
					
						
							|  |  |  |   u16 m_Type; | 
					
						
							|  |  |  |   u32 m_Size; | 
					
						
							|  |  |  |   u8 m_SHA1Hash[20]; | 
					
						
							|  |  |  |   u8 m_Header[36];  // all of the above
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   std::unique_ptr<CNANDContentData> m_Data; | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-21 13:19:52 -04:00
										 |  |  | // Instances of this class must be created by CNANDContentManager
 | 
					
						
							|  |  |  | class CNANDContentLoader final | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2016-09-14 19:44:41 -04:00
										 |  |  |   explicit CNANDContentLoader(const std::string& content_name); | 
					
						
							| 
									
										
										
										
											2016-09-14 19:45:49 -04:00
										 |  |  |   ~CNANDContentLoader(); | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   bool IsValid() const { return m_Valid; } | 
					
						
							|  |  |  |   void RemoveTitle() const; | 
					
						
							|  |  |  |   u64 GetTitleID() const { return m_TitleID; } | 
					
						
							|  |  |  |   u16 GetIosVersion() const { return m_IosVersion; } | 
					
						
							|  |  |  |   u32 GetBootIndex() const { return m_BootIndex; } | 
					
						
							|  |  |  |   size_t GetContentSize() const { return m_Content.size(); } | 
					
						
							|  |  |  |   const SNANDContent* GetContentByIndex(int index) const; | 
					
						
							|  |  |  |   const u8* GetTMDView() const { return m_TMDView; } | 
					
						
							|  |  |  |   const u8* GetTMDHeader() const { return m_TMDHeader; } | 
					
						
							|  |  |  |   const std::vector<u8>& GetTicket() const { return m_Ticket; } | 
					
						
							|  |  |  |   const std::vector<SNANDContent>& GetContent() const { return m_Content; } | 
					
						
							|  |  |  |   u16 GetTitleVersion() const { return m_TitleVersion; } | 
					
						
							|  |  |  |   u16 GetNumEntries() const { return m_NumEntries; } | 
					
						
							| 
									
										
										
										
											2016-12-23 18:41:21 +01:00
										 |  |  |   DiscIO::Region GetRegion() const; | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   u8 GetCountryChar() const { return m_Country; } | 
					
						
							|  |  |  |   enum | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     TMD_VIEW_SIZE = 0x58, | 
					
						
							|  |  |  |     TMD_HEADER_SIZE = 0x1E4, | 
					
						
							|  |  |  |     CONTENT_HEADER_SIZE = 0x24, | 
					
						
							|  |  |  |     TICKET_SIZE = 0x2A4 | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2015-06-21 13:19:52 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   bool Initialize(const std::string& name); | 
					
						
							|  |  |  |   void InitializeContentEntries(const std::vector<u8>& tmd, | 
					
						
							|  |  |  |                                 const std::vector<u8>& decrypted_title_key, | 
					
						
							|  |  |  |                                 const std::vector<u8>& data_app); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   bool m_Valid; | 
					
						
							|  |  |  |   bool m_IsWAD; | 
					
						
							|  |  |  |   std::string m_Path; | 
					
						
							|  |  |  |   u64 m_TitleID; | 
					
						
							|  |  |  |   u16 m_IosVersion; | 
					
						
							|  |  |  |   u32 m_BootIndex; | 
					
						
							|  |  |  |   u16 m_NumEntries; | 
					
						
							|  |  |  |   u16 m_TitleVersion; | 
					
						
							|  |  |  |   u8 m_TMDView[TMD_VIEW_SIZE]; | 
					
						
							|  |  |  |   u8 m_TMDHeader[TMD_HEADER_SIZE]; | 
					
						
							|  |  |  |   std::vector<u8> m_Ticket; | 
					
						
							|  |  |  |   u8 m_Country; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   std::vector<SNANDContent> m_Content; | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-09 16:08:32 +01:00
										 |  |  | // we open the NAND Content files too often... let's cache them
 | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | class CNANDContentManager | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   static CNANDContentManager& Access() | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     static CNANDContentManager instance; | 
					
						
							|  |  |  |     return instance; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   u64 Install_WiiWAD(const std::string& fileName); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const CNANDContentLoader& GetNANDLoader(const std::string& content_path); | 
					
						
							|  |  |  |   const CNANDContentLoader& GetNANDLoader(u64 title_id, Common::FromWhichRoot from); | 
					
						
							|  |  |  |   bool RemoveTitle(u64 title_id, Common::FromWhichRoot from); | 
					
						
							|  |  |  |   void ClearCache(); | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-03 01:08:54 -04:00
										 |  |  | private: | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   CNANDContentManager() {} | 
					
						
							|  |  |  |   ~CNANDContentManager(); | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   CNANDContentManager(CNANDContentManager const&) = delete; | 
					
						
							|  |  |  |   void operator=(CNANDContentManager const&) = delete; | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   std::unordered_map<std::string, std::unique_ptr<CNANDContentLoader>> m_map; | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-13 04:50:18 +00:00
										 |  |  | class CSharedContent | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   static CSharedContent& AccessInstance() | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     static CSharedContent instance; | 
					
						
							|  |  |  |     return instance; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-05-13 04:50:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   std::string GetFilenameFromSHA1(const u8* hash); | 
					
						
							|  |  |  |   std::string AddSharedContent(const u8* hash); | 
					
						
							|  |  |  |   void UpdateLocation(); | 
					
						
							| 
									
										
										
										
											2010-05-13 04:50:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   CSharedContent(); | 
					
						
							|  |  |  |   virtual ~CSharedContent(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   CSharedContent(CSharedContent const&) = delete; | 
					
						
							|  |  |  |   void operator=(CSharedContent const&) = delete; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma pack(push, 1)
 | 
					
						
							|  |  |  |   struct SElement | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     u8 FileName[8]; | 
					
						
							|  |  |  |     u8 SHA1Hash[20]; | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2010-05-13 04:50:18 +00:00
										 |  |  | #pragma pack(pop)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   u32 m_LastID; | 
					
						
							|  |  |  |   std::string m_ContentMap; | 
					
						
							|  |  |  |   std::vector<SElement> m_Elements; | 
					
						
							| 
									
										
										
										
											2010-05-13 04:50:18 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class cUIDsys | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   static cUIDsys& AccessInstance() | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     static cUIDsys instance; | 
					
						
							|  |  |  |     return instance; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-05-13 04:50:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   u32 GetUIDFromTitle(u64 title_id); | 
					
						
							|  |  |  |   void AddTitle(u64 title_id); | 
					
						
							|  |  |  |   void GetTitleIDs(std::vector<u64>& title_ids, bool owned = false); | 
					
						
							|  |  |  |   void UpdateLocation(); | 
					
						
							| 
									
										
										
										
											2010-05-13 04:50:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-03 01:08:54 -04:00
										 |  |  | private: | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   cUIDsys(); | 
					
						
							|  |  |  |   virtual ~cUIDsys(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   cUIDsys(cUIDsys const&) = delete; | 
					
						
							|  |  |  |   void operator=(cUIDsys const&) = delete; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma pack(push, 1)
 | 
					
						
							|  |  |  |   struct SElement | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     u8 titleID[8]; | 
					
						
							|  |  |  |     u8 UID[4]; | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2010-05-13 04:50:18 +00:00
										 |  |  | #pragma pack(pop)
 | 
					
						
							| 
									
										
										
										
											2014-06-03 01:08:54 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   u32 m_LastUID; | 
					
						
							|  |  |  |   std::string m_UidSys; | 
					
						
							|  |  |  |   std::vector<SElement> m_Elements; | 
					
						
							| 
									
										
										
										
											2010-05-13 04:50:18 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | } |