card_image.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <array>
  5. #include <memory>
  6. #include <vector>
  7. #include "common/common_types.h"
  8. #include "common/swap.h"
  9. #include "core/file_sys/vfs/vfs.h"
  10. namespace Core::Crypto {
  11. class KeyManager;
  12. }
  13. namespace Loader {
  14. enum class ResultStatus : u16;
  15. }
  16. namespace FileSys {
  17. class NCA;
  18. enum class NCAContentType : u8;
  19. class NSP;
  20. enum class GamecardSize : u8 {
  21. S_1GB = 0xFA,
  22. S_2GB = 0xF8,
  23. S_4GB = 0xF0,
  24. S_8GB = 0xE0,
  25. S_16GB = 0xE1,
  26. S_32GB = 0xE2,
  27. };
  28. struct GamecardInfo {
  29. u64_le firmware_version;
  30. u32_le access_control_flags;
  31. u32_le read_wait_time1;
  32. u32_le read_wait_time2;
  33. u32_le write_wait_time1;
  34. u32_le write_wait_time2;
  35. u32_le firmware_mode;
  36. u32_le cup_version;
  37. std::array<u8, 4> reserved1;
  38. u64_le update_partition_hash;
  39. u64_le cup_id;
  40. std::array<u8, 0x38> reserved2;
  41. };
  42. static_assert(sizeof(GamecardInfo) == 0x70, "GamecardInfo has incorrect size.");
  43. struct GamecardHeader {
  44. std::array<u8, 0x100> signature;
  45. u32_le magic;
  46. u32_le secure_area_start;
  47. u32_le backup_area_start;
  48. u8 kek_index;
  49. GamecardSize size;
  50. u8 header_version;
  51. u8 flags;
  52. u64_le package_id;
  53. u64_le valid_data_end;
  54. u128 info_iv;
  55. u64_le hfs_offset;
  56. u64_le hfs_size;
  57. std::array<u8, 0x20> hfs_header_hash;
  58. std::array<u8, 0x20> initial_data_hash;
  59. u32_le secure_mode_flag;
  60. u32_le title_key_flag;
  61. u32_le key_flag;
  62. u32_le normal_area_end;
  63. GamecardInfo info;
  64. };
  65. static_assert(sizeof(GamecardHeader) == 0x200, "GamecardHeader has incorrect size.");
  66. enum class XCIPartition : u8 { Update, Normal, Secure, Logo };
  67. class XCI : public ReadOnlyVfsDirectory {
  68. public:
  69. explicit XCI(VirtualFile file, u64 program_id = 0, size_t program_index = 0);
  70. ~XCI() override;
  71. Loader::ResultStatus GetStatus() const;
  72. Loader::ResultStatus GetProgramNCAStatus() const;
  73. u8 GetFormatVersion();
  74. VirtualDir GetPartition(XCIPartition partition);
  75. std::vector<VirtualDir> GetPartitions();
  76. std::shared_ptr<NSP> GetSecurePartitionNSP() const;
  77. VirtualDir GetSecurePartition();
  78. VirtualDir GetNormalPartition();
  79. VirtualDir GetUpdatePartition();
  80. VirtualDir GetLogoPartition();
  81. VirtualFile GetPartitionRaw(XCIPartition partition) const;
  82. VirtualFile GetSecurePartitionRaw() const;
  83. VirtualFile GetStoragePartition0() const;
  84. VirtualFile GetStoragePartition1() const;
  85. VirtualFile GetNormalPartitionRaw() const;
  86. VirtualFile GetUpdatePartitionRaw() const;
  87. VirtualFile GetLogoPartitionRaw() const;
  88. u64 GetProgramTitleID() const;
  89. std::vector<u64> GetProgramTitleIDs() const;
  90. u32 GetSystemUpdateVersion();
  91. u64 GetSystemUpdateTitleID() const;
  92. bool HasProgramNCA() const;
  93. VirtualFile GetProgramNCAFile() const;
  94. const std::vector<std::shared_ptr<NCA>>& GetNCAs() const;
  95. std::shared_ptr<NCA> GetNCAByType(NCAContentType type) const;
  96. VirtualFile GetNCAFileByType(NCAContentType type) const;
  97. std::vector<VirtualFile> GetFiles() const override;
  98. std::vector<VirtualDir> GetSubdirectories() const override;
  99. std::string GetName() const override;
  100. VirtualDir GetParentDirectory() const override;
  101. // Creates a directory that contains all the NCAs in the gamecard
  102. VirtualDir ConcatenatedPseudoDirectory();
  103. std::array<u8, 0x200> GetCertificate() const;
  104. private:
  105. Loader::ResultStatus AddNCAFromPartition(XCIPartition part);
  106. Loader::ResultStatus TryReadHeader();
  107. VirtualFile file;
  108. GamecardHeader header{};
  109. Loader::ResultStatus status;
  110. Loader::ResultStatus program_nca_status;
  111. std::vector<VirtualDir> partitions;
  112. std::vector<VirtualFile> partitions_raw;
  113. std::shared_ptr<NSP> secure_partition;
  114. std::shared_ptr<NCA> program;
  115. std::vector<std::shared_ptr<NCA>> ncas;
  116. u64 update_normal_partition_end;
  117. Core::Crypto::KeyManager& keys;
  118. };
  119. } // namespace FileSys