From d90fc2a543caa646e53edf7c18a890c4f0bbfac0 Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Sun, 1 Oct 2023 21:40:44 -0700 Subject: [PATCH] make encryption objects serializable --- src/PSOEncryption.cc | 24 ++++++++++++++++++++++++ src/PSOEncryption.hh | 8 +++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/PSOEncryption.cc b/src/PSOEncryption.cc index f2444be3..ff5baae0 100644 --- a/src/PSOEncryption.cc +++ b/src/PSOEncryption.cc @@ -25,6 +25,30 @@ PSOLFGEncryption::PSOLFGEncryption( end_offset(end_offset), seed(seed) {} +PSOLFGEncryption::PSOLFGEncryption(const std::string& serialized) { + StringReader r(serialized); + this->offset = r.get_u32l(); + this->end_offset = r.get_u32l(); + this->seed = r.get_u32l(); + size_t num_entries = r.get_u32l(); + this->stream.reserve(num_entries); + while (this->stream.size() < num_entries) { + this->stream.emplace_back(r.get_u32l()); + } +} + +std::string PSOLFGEncryption::serialize() const { + StringWriter w; + w.put_u32l(this->offset); + w.put_u32l(this->end_offset); + w.put_u32l(this->seed); + w.put_u32l(this->stream.size()); + for (uint32_t x : this->stream) { + w.put_u32l(x); + } + return std::move(w.str()); +} + uint32_t PSOLFGEncryption::next(bool advance) { if (this->offset == this->end_offset) { this->update_stream(); diff --git a/src/PSOEncryption.hh b/src/PSOEncryption.hh index fcadc9be..91046148 100644 --- a/src/PSOEncryption.hh +++ b/src/PSOEncryption.hh @@ -39,6 +39,8 @@ protected: class PSOLFGEncryption : public PSOEncryption { public: + explicit PSOLFGEncryption(const std::string& serialized); + virtual void encrypt(void* data, size_t size, bool advance = true); void encrypt_big_endian(void* data, size_t size, bool advance = true); void encrypt_minus(void* data, size_t size, bool advance = true); @@ -52,8 +54,10 @@ public: uint32_t next(bool advance = true); + virtual std::string serialize() const; + protected: - explicit PSOLFGEncryption(uint32_t seed, size_t stream_length, size_t end_offset); + PSOLFGEncryption(uint32_t seed, size_t stream_length, size_t end_offset); virtual void update_stream() = 0; @@ -66,7 +70,6 @@ protected: class PSOV2Encryption : public PSOLFGEncryption { public: explicit PSOV2Encryption(uint32_t seed); - virtual Type type() const; protected: @@ -78,7 +81,6 @@ protected: class PSOV3Encryption : public PSOLFGEncryption { public: explicit PSOV3Encryption(uint32_t key); - virtual Type type() const; protected: