Crypto: interpret metadata versions

This commit is contained in:
Megamouse 2020-04-18 15:56:02 +02:00
parent 1762324702
commit 22d01e4d05
2 changed files with 81 additions and 8 deletions

View File

@ -276,10 +276,11 @@ bool pkg_install(const std::string& path, atomic_t<double>& sync)
}
case 0x5:
{
if (packet.size == sizeof(metadata.package_revision))
if (packet.size == sizeof(metadata.package_revision.data))
{
archive_read(&metadata.package_revision, sizeof(metadata.package_revision));
pkg_log.notice("Metadata: Package Revision = 0x%x", metadata.package_revision, metadata.package_revision);
archive_read(&metadata.package_revision.data, sizeof(metadata.package_revision.data));
metadata.package_revision.interpret_data();
pkg_log.notice("Metadata: Package Revision = %s", metadata.package_revision.to_string());
continue;
}
else
@ -312,10 +313,11 @@ bool pkg_install(const std::string& path, atomic_t<double>& sync)
}
case 0x8:
{
if (packet.size == sizeof(metadata.software_revision))
if (packet.size == sizeof(metadata.software_revision.data))
{
archive_read(&metadata.software_revision, sizeof(metadata.software_revision));
pkg_log.notice("Metadata: Software Revision = 0x%x", metadata.software_revision, metadata.software_revision);
archive_read(&metadata.software_revision.data, sizeof(metadata.software_revision.data));
metadata.software_revision.interpret_data();
pkg_log.notice("Metadata: Software Revision = %s", metadata.software_revision.to_string());
continue;
}
else

View File

@ -1,6 +1,8 @@
#pragma once
#include "Utilities/BEType.h"
#include <sstream>
#include <iomanip>
// Constants
enum
@ -80,12 +82,81 @@ struct PKGEntry
// https://www.psdevwiki.com/ps3/PKG_files#PKG_Metadata
struct PKGMetaData
{
private:
static std::string to_hex_string(u8 buf[], size_t size)
{
std::stringstream sstream;
for (size_t i = 0; i < size; i++)
{
sstream << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(buf[i]);
}
return sstream.str();
}
static std::string to_hex_string(u8 buf[], size_t size, size_t dotpos)
{
std::string result = to_hex_string(buf, size);
if (result.size() > dotpos)
{
result.insert(dotpos, 1, '.');
}
return result;
}
public:
be_t<u32> drm_type{ 0 };
be_t<u32> content_type{ 0 };
be_t<u32> package_type{ 0 };
be_t<u64> package_size{ 0 };
be_t<u32> package_revision{ 0 };
be_t<u64> software_revision{ 0 };
struct package_revision
{
struct package_revision_data
{
u8 make_package_npdrm_ver[2];
u8 version[2];
} data {};
std::string make_package_npdrm_ver;
std::string version;
void interpret_data()
{
make_package_npdrm_ver = to_hex_string(data.make_package_npdrm_ver, sizeof(data.make_package_npdrm_ver));
version = to_hex_string(data.version, sizeof(data.version), 2);
}
std::string to_string()
{
return fmt::format("make package npdrm version: %s, version: %s", make_package_npdrm_ver, version);
}
} package_revision;
struct software_revision
{
struct software_revision_data
{
u8 unk[1];
u8 firmware_version[3];
u8 version[2];
u8 app_version[2];
} data {};
std::string unk; // maybe hardware id
std::string firmware_version;
std::string version;
std::string app_version;
void interpret_data()
{
unk = to_hex_string(data.unk, sizeof(data.unk));
firmware_version = to_hex_string(data.firmware_version, sizeof(data.firmware_version), 2);
version = to_hex_string(data.version, sizeof(data.version), 2);
app_version = to_hex_string(data.app_version, sizeof(data.app_version), 2);
}
std::string to_string()
{
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;
};