Crypto: PSVita metadata and missing entry type

This commit is contained in:
Megamouse 2020-04-18 17:30:37 +02:00
parent 22d01e4d05
commit d35a29bbe4
2 changed files with 214 additions and 20 deletions

View file

@ -66,7 +66,7 @@ struct PKGExtHeader
be_t<u32> padding1;
be_t<u32> pkg_key_id; // Id of the AES key used for decryption. PSP = 0x1, PSVita = 0xC0000002, PSM = 0xC0000004
be_t<u32> full_header_hmac_offset; // ex: none (old pkg): 0, 0x930
u8 padding2[0x14];
u8 padding2[20];
};
struct PKGEntry
@ -106,14 +106,18 @@ public:
be_t<u32> content_type{ 0 };
be_t<u32> package_type{ 0 };
be_t<u64> package_size{ 0 };
u8 qa_digest[24]{ 0 };
be_t<u64> unk_0x9{ 0 };
be_t<u64> unk_0xB{ 0 };
struct package_revision
{
struct package_revision_data
{
u8 make_package_npdrm_ver[2];
u8 version[2];
} data {};
u8 make_package_npdrm_ver[2]{ 0 };
u8 version[2]{ 0 };
} data{};
std::string make_package_npdrm_ver;
std::string version;
@ -133,11 +137,11 @@ public:
{
struct software_revision_data
{
u8 unk[1];
u8 firmware_version[3];
u8 version[2];
u8 app_version[2];
} data {};
u8 unk[1]{ 0 };
u8 firmware_version[3]{ 0 };
u8 version[2]{ 0 };
u8 app_version[2]{ 0 };
} data{};
std::string unk; // maybe hardware id
std::string firmware_version;
@ -153,12 +157,101 @@ public:
}
std::string to_string()
{
return fmt::format("unk: %s, firmware version: %s, version: %s, app version: %s", unk, firmware_version, version, app_version);
return fmt::format("unk: %s, firmware version: %s, version: %s, app version: %s",
unk, firmware_version, version, app_version);
}
} software_revision;
std::string title_id;
std::string install_dir;
// PSVita stuff
struct vita_item_info // size is 0x28 (40)
{
be_t<u32> offset{ 0 };
be_t<u32> size{ 0 };
u8 sha256[32]{ 0 };
std::string to_string()
{
return fmt::format("offset: 0x%x, size: 0x%x, sha256: 0x%x", offset, size, sha256);
}
} item_info;
struct vita_sfo_info // size is 0x38 (56)
{
be_t<u32> param_offset{ 0 };
be_t<u16> param_size{ 0 };
be_t<u32> unk_1{ 0 }; // seen values: 0x00000001-0x00000018, 0x0000001b-0x0000001c
be_t<u32> psp2_system_ver{ 0 }; // BCD encoded
u8 unk_2[8]{ 0 };
u8 param_digest[32]{ 0 }; // SHA256 of param_data. Called ParamDigest: This is sha256 digest of param.sfo.
std::string to_string()
{
return fmt::format("param_offset: 0x%x, param_size: 0x%x, unk_1: 0x%x, psp2_system_ver: 0x%x, unk_2: 0x%x, param_digest: 0x%x",
param_offset, param_size, unk_1, psp2_system_ver, unk_2, param_digest);
}
} sfo_info;
struct vita_unknown_data_info // size is 0x48 (72)
{
be_t<u32> unknown_data_offset{ 0 };
be_t<u16> unknown_data_size{ 0 }; // ex: 0x320
u8 unk[32]{ 0 };
u8 unknown_data_sha256[32]{ 0 };
std::string to_string()
{
return fmt::format("unknown_data_offset: 0x%x, unknown_data_size: 0x%x, unk: 0x%x, unknown_data_sha256: 0x%x",
unknown_data_offset, unknown_data_size, unk, unknown_data_sha256);
}
} unknown_data_info;
struct vita_entirety_info // size is 0x38 (56)
{
be_t<u32> entirety_data_offset{ 0 }; // located just before SFO
be_t<u32> entirety_data_size{ 0 }; // ex: 0xA0, C0, 0x100, 0x120, 0x160
be_t<u16> flags{ 0 }; // ex: EE 00, FE 10, FE 78, FE F8, FF 10, FF 90, FF D0, flags indicating which digests it embeds
be_t<u16> unk_1{ 0 }; // always 00 00
be_t<u32> unk_2{ 0 }; // ex: 1, 0
u8 unk_3[8]{ 0 };
u8 entirety_digest[32]{ 0 };
std::string to_string()
{
return fmt::format("entirety_data_offset: 0x%x, entirety_data_size: 0x%x, flags: 0x%x, unk_1: 0x%x, unk_2: 0x%x, unk_3: 0x%x, entirety_digest: 0x%x",
entirety_data_offset, entirety_data_size, flags, unk_1, unk_2, unk_3, entirety_digest);
}
} entirety_info;
struct vita_version_info // size is 0x28 (40)
{
be_t<u32> publishing_tools_version{ 0 };
be_t<u32> psf_builder_version{ 0 };
u8 padding[32]{ 0 };
std::string to_string()
{
return fmt::format("publishing_tools_version: 0x%x, psf_builder_version: 0x%x, padding: 0x%x",
publishing_tools_version, psf_builder_version, padding);
}
} version_info;
struct vita_self_info // size is 0x38 (56)
{
be_t<u32> self_info_offset{ 0 }; // offset to the first self_info_data_element
be_t<u32> self_info_size{ 0 }; // usually 0x10 or 0x20
u8 unk[16]{ 0 };
u8 self_sha256[32]{ 0 };
std::string to_string()
{
return fmt::format("self_info_offset: 0x%x, self_info_size: 0x%x, unk: 0x%x, self_sha256: 0x%x",
self_info_offset, self_info_size, unk, self_sha256);
}
} self_info;
};
bool pkg_install(const std::string& path, atomic_t<double>&);