added support for reading/writing an extended header which might be

useful later
This commit is contained in:
Martchus 2015-06-21 21:44:07 +02:00
parent d82492720e
commit d39fd6a598
2 changed files with 17 additions and 4 deletions

View File

@ -135,7 +135,7 @@ void PasswordFile::load()
} }
// check version and flags (used in version 0x3 only) // check version and flags (used in version 0x3 only)
uint32 version = m_freader.readUInt32LE(); 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."); throw ParsingException("Version is unknown.");
} }
bool decrypterUsed; bool decrypterUsed;
@ -154,7 +154,7 @@ void PasswordFile::load()
// skip extended header // skip extended header
// the extended header might be used in further versions to // the extended header might be used in further versions to
// add additional information without breaking compatibility // add additional information without breaking compatibility
if(version == 0x4U) { if(version >= 0x4U) {
uint16 extendedHeaderSize = m_freader.readUInt16BE(); uint16 extendedHeaderSize = m_freader.readUInt16BE();
m_extendedHeader = m_freader.readString(extendedHeaderSize); m_extendedHeader = m_freader.readString(extendedHeaderSize);
} }
@ -235,6 +235,10 @@ void PasswordFile::load()
buffstr.write(decbuff.data(), static_cast<streamsize>(size)); buffstr.write(decbuff.data(), static_cast<streamsize>(size));
decbuff.resize(0); decbuff.resize(0);
buffstr.seekg(0, ios_base::beg); 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)); 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); m_file.open(m_path, ios_base::in | ios_base::out | ios_base::trunc | ios_base::binary);
// write header // write header
m_fwriter.writeUInt32LE(0x7770616DU); // write magic number 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; byte flags = 0x00;
if(useEncryption) { if(useEncryption) {
flags |= 0x80 | 0x40; flags |= 0x80 | 0x40;
@ -275,6 +280,11 @@ void PasswordFile::save(bool useEncryption, bool useCompression)
// serialize root entry and descendants // serialize root entry and descendants
stringstream buffstr(stringstream::in | stringstream::out | stringstream::binary); stringstream buffstr(stringstream::in | stringstream::out | stringstream::binary);
buffstr.exceptions(ios_base::failbit | ios_base::badbit); 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); m_rootEntry->make(buffstr);
buffstr.seekp(0, ios_base::end); buffstr.seekp(0, ios_base::end);
stringstream::pos_type size = buffstr.tellp(); 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() void PasswordFile::clear()
{ {
@ -355,6 +365,8 @@ void PasswordFile::clear()
clearPath(); clearPath();
clearPassword(); clearPassword();
clearEntries(); clearEntries();
m_extendedHeader.clear();
m_encryptedExtendedHeader.clear();
} }
/*! /*!

View File

@ -47,6 +47,7 @@ private:
char m_password[32]; char m_password[32];
std::unique_ptr<NodeEntry> m_rootEntry; std::unique_ptr<NodeEntry> m_rootEntry;
std::string m_extendedHeader; std::string m_extendedHeader;
std::string m_encryptedExtendedHeader;
std::fstream m_file; std::fstream m_file;
IoUtilities::BinaryReader m_freader; IoUtilities::BinaryReader m_freader;
IoUtilities::BinaryWriter m_fwriter; IoUtilities::BinaryWriter m_fwriter;