From 16b15162d53217fc2a01ba25c8fc1389a309803f Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Tue, 16 Sep 2025 08:39:19 -0700 Subject: [PATCH] add decrypt_pr1_data --- src/PSOEncryption.hh | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/PSOEncryption.hh b/src/PSOEncryption.hh index acaf9697..d4ba34a6 100644 --- a/src/PSOEncryption.hh +++ b/src/PSOEncryption.hh @@ -356,6 +356,36 @@ inline std::string decrypt_v2_registry_value(const std::string& s) { return decrypt_v2_registry_value(s.data(), s.size()); } +template +std::string decrypt_pr1_data(const void* data, size_t size) { + if (size < 4) { + throw std::runtime_error("not enough data for PR1 footer"); + } + phosg::StringReader r(data, size); + std::string ret = r.read(size - 4); + PSOV2Encryption crypt(r.get>()); + if constexpr (BE) { + crypt.encrypt_big_endian(ret.data(), ret.size()); + } else { + crypt.decrypt(ret.data(), ret.size()); + } + return ret; +} + +template +std::string encrypt_pr1_data(const void* data, size_t size, uint32_t seed) { + phosg::StringWriter w; + w.write(data, size); + w.put>(seed); + PSOV2Encryption crypt(seed); + if constexpr (BE) { + crypt.encrypt_big_endian(w.str().data(), size); + } else { + crypt.encrypt(w.str().data(), size); + } + return std::move(w.str()); +} + struct DecryptedPR2 { std::string compressed_data; size_t decompressed_size;