From 22d01e4d05255b0009e215492222bbee3c21d1e7 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 18 Apr 2020 15:56:02 +0200 Subject: [PATCH] Crypto: interpret metadata versions --- rpcs3/Crypto/unpkg.cpp | 14 ++++---- rpcs3/Crypto/unpkg.h | 75 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 81 insertions(+), 8 deletions(-) diff --git a/rpcs3/Crypto/unpkg.cpp b/rpcs3/Crypto/unpkg.cpp index 84f5c2027e..0d1be3a057 100644 --- a/rpcs3/Crypto/unpkg.cpp +++ b/rpcs3/Crypto/unpkg.cpp @@ -276,10 +276,11 @@ bool pkg_install(const std::string& path, atomic_t& 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& 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 diff --git a/rpcs3/Crypto/unpkg.h b/rpcs3/Crypto/unpkg.h index a400050dfd..609f34725d 100644 --- a/rpcs3/Crypto/unpkg.h +++ b/rpcs3/Crypto/unpkg.h @@ -1,6 +1,8 @@ #pragma once #include "Utilities/BEType.h" +#include +#include // 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(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 drm_type{ 0 }; be_t content_type{ 0 }; be_t package_type{ 0 }; be_t package_size{ 0 }; - be_t package_revision{ 0 }; - be_t 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; };