From d39fd6a59884d1ccfe9c2400252f7d5056f47305 Mon Sep 17 00:00:00 2001 From: Martchus Date: Sun, 21 Jun 2015 21:44:07 +0200 Subject: [PATCH] added support for reading/writing an extended header which might be useful later --- io/passwordfile.cpp | 20 ++++++++++++++++---- io/passwordfile.h | 1 + 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/io/passwordfile.cpp b/io/passwordfile.cpp index ad68e16..14a74b7 100644 --- a/io/passwordfile.cpp +++ b/io/passwordfile.cpp @@ -135,7 +135,7 @@ void PasswordFile::load() } // check version and flags (used in version 0x3 only) uint32 version = m_freader.readUInt32LE(); - if(version != 0x0U && version != 0x1U && version != 0x2U && version != 0x3U && version != 0x4U) { + if(version != 0x0U && version != 0x1U && version != 0x2U && version != 0x3U && version != 0x4U && version != 0x5U) { throw ParsingException("Version is unknown."); } bool decrypterUsed; @@ -154,7 +154,7 @@ void PasswordFile::load() // skip extended header // the extended header might be used in further versions to // add additional information without breaking compatibility - if(version == 0x4U) { + if(version >= 0x4U) { uint16 extendedHeaderSize = m_freader.readUInt16BE(); m_extendedHeader = m_freader.readString(extendedHeaderSize); } @@ -235,6 +235,10 @@ void PasswordFile::load() buffstr.write(decbuff.data(), static_cast(size)); decbuff.resize(0); buffstr.seekg(0, ios_base::beg); + if(version >= 0x5u) { + uint16 extendedHeaderSize = m_freader.readUInt16BE(); + m_encryptedExtendedHeader = m_freader.readString(extendedHeaderSize); + } m_rootEntry.reset(new NodeEntry(buffstr)); } @@ -258,7 +262,8 @@ void PasswordFile::save(bool useEncryption, bool useCompression) m_file.open(m_path, ios_base::in | ios_base::out | ios_base::trunc | ios_base::binary); // write header m_fwriter.writeUInt32LE(0x7770616DU); // write magic number - m_fwriter.writeUInt32LE(m_extendedHeader.empty() ? 0x3U : 0x4U); // write version, extended header requires version 4 + // write version, extended header requires version 4, encrypted extended header required version 5 + m_fwriter.writeUInt32LE(m_extendedHeader.empty() && m_encryptedExtendedHeader.empty() ? 0x3U : (m_encryptedExtendedHeader.empty() ? 0x4U : 0x5U)); byte flags = 0x00; if(useEncryption) { flags |= 0x80 | 0x40; @@ -275,6 +280,11 @@ void PasswordFile::save(bool useEncryption, bool useCompression) // serialize root entry and descendants stringstream buffstr(stringstream::in | stringstream::out | stringstream::binary); buffstr.exceptions(ios_base::failbit | ios_base::badbit); + // write encrypted extened header + if(!m_encryptedExtendedHeader.empty()) { + m_fwriter.writeUInt16BE(m_encryptedExtendedHeader.size()); + m_fwriter.writeString(m_encryptedExtendedHeader); + } m_rootEntry->make(buffstr); buffstr.seekp(0, ios_base::end); stringstream::pos_type size = buffstr.tellp(); @@ -347,7 +357,7 @@ void PasswordFile::clearEntries() } /*! - * \brief Closes the file if opened. Removes path, password and entries. + * \brief Closes the file if opened. Removes path, password and entries and additional information. */ void PasswordFile::clear() { @@ -355,6 +365,8 @@ void PasswordFile::clear() clearPath(); clearPassword(); clearEntries(); + m_extendedHeader.clear(); + m_encryptedExtendedHeader.clear(); } /*! diff --git a/io/passwordfile.h b/io/passwordfile.h index 32eb61e..8676e21 100644 --- a/io/passwordfile.h +++ b/io/passwordfile.h @@ -47,6 +47,7 @@ private: char m_password[32]; std::unique_ptr m_rootEntry; std::string m_extendedHeader; + std::string m_encryptedExtendedHeader; std::fstream m_file; IoUtilities::BinaryReader m_freader; IoUtilities::BinaryWriter m_fwriter;