1 /***************************************************************************
2 * Copyright (C) 2005-2007 by Tarek Saidi *
3 * tarek.saidi@arcor.de *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; version 2 of the License. *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, write to the *
16 * Free Software Foundation, Inc., *
17 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
18 ***************************************************************************/
20 #ifndef _STD_DATABASE_H_
21 #define _STD_DATABASE_H_
25 #define DB_HEADER_SIZE 124
26 #define PWM_DBSIG_1 0x9AA2D903
27 #define PWM_DBSIG_2 0xB54BFB65
28 #define PWM_DBVER_DW 0x00030002
29 #define PWM_FLAG_SHA2 1
30 #define PWM_FLAG_RIJNDAEL 2
31 #define PWM_FLAG_ARCFOUR 4
32 #define PWM_FLAG_TWOFISH 8
33 #define PWM_STD_KEYENCROUNDS 6000
35 void memcpyFromLEnd32(quint32* dst,const char* src);
36 void memcpyFromLEnd16(quint16* dst,const char* src);
37 void memcpyToLEnd32(char* src,const quint32* dst);
38 void memcpyToLEnd16(char* src,const quint16* dst);
40 //! Implementation of the standard KeePassX database.
41 class Kdb3Database:public ICustomIcons,public IDatabase, public IKdbSettings{
46 class EntryHandle:public IEntryHandle{
48 friend class Kdb3Database;
50 EntryHandle(Kdb3Database* db);
51 virtual void setImage(const quint32& ImageID);
52 virtual void setTitle(const QString& Title);
53 virtual void setUrl(const QString& URL);
54 virtual void setUsername(const QString& Username);
55 virtual void setPassword(const SecString& Password);
56 virtual void setComment(const QString& Comment);
57 virtual void setBinaryDesc(const QString& BinaryDesc);
58 virtual void setCreation(const KpxDateTime& Creation);
59 virtual void setLastMod(const KpxDateTime& LastMod);
60 virtual void setLastAccess(const KpxDateTime& LastAccess);
61 virtual void setExpire(const KpxDateTime& Expire);
62 virtual void setBinary(const QByteArray& BinaryData);
63 virtual KpxUuid uuid()const;
64 virtual IGroupHandle* group()const;
65 virtual quint32 image()const;
66 virtual int visualIndex() const;
67 virtual void setVisualIndex(int i);
68 virtual void setVisualIndexDirectly(int i);
69 virtual QString title()const;
70 virtual QString url()const;
71 virtual QString username()const;
72 virtual SecString password()const;
73 virtual QString comment()const;
74 virtual QString binaryDesc()const;
75 virtual KpxDateTime creation()const;
76 virtual KpxDateTime lastMod()const;
77 virtual KpxDateTime lastAccess()const;
78 virtual KpxDateTime expire()const;
79 virtual QByteArray binary()const;
80 virtual quint32 binarySize()const;
81 virtual QString friendlySize()const;
82 virtual bool isValid() const;
83 virtual CEntry data()const;
85 void invalidate(){valid=false;}
92 class GroupHandle:public IGroupHandle{
93 friend class Kdb3Database;
94 GroupHandle(Kdb3Database* db);
96 virtual void setTitle(const QString& Title);
97 virtual void setImage(const quint32& ImageId);
98 virtual QString title();
99 virtual quint32 image();
100 virtual bool isValid();
101 virtual IGroupHandle* parent();
102 virtual QList<IGroupHandle*> children();
104 //virtual void setIndex(int index);
106 virtual bool expanded();
107 virtual void setExpanded(bool IsExpanded);
109 void invalidate(){valid=false;}
115 friend class EntryHandle;
116 friend class GroupHandle;
118 class StdEntry:public CEntry{
126 class StdGroup:public CGroup{
129 StdGroup(const CGroup&);
133 QList<StdGroup*> Children;
134 QList<StdEntry*> Entries;
138 virtual ~Kdb3Database(){};
139 virtual bool load(QString identifier, bool readOnly);
141 virtual bool saveFileTransactional(char* buffer, int size);
142 virtual bool close();
143 virtual void create();
144 virtual int numEntries();
145 virtual int numGroups();
146 virtual QString getError();
147 virtual bool isKeyError();
148 virtual void cleanUpHandles();
149 virtual QPixmap& icon(int index);
150 virtual int numIcons();
151 virtual void addIcon(const QPixmap& icon);
152 virtual void removeIcon(int index);
153 virtual void replaceIcon(int index,const QPixmap& icon);
154 virtual int builtinIcons(){return BUILTIN_ICONS;};
155 virtual QList<IEntryHandle*> search(IGroupHandle* Group,const QString& SearchString, bool CaseSensitve, bool RegExp,bool Recursive,bool* Fields);
156 virtual QFile* file(){return File;}
157 virtual bool changeFile(const QString& filename);
158 virtual void setCryptAlgorithm(CryptAlgorithm algo){Algorithm=algo;}
159 virtual CryptAlgorithm cryptAlgorithm(){return Algorithm;}
160 virtual unsigned int keyTransfRounds(){return KeyTransfRounds;}
161 virtual void setKeyTransfRounds(unsigned int rounds){KeyTransfRounds=rounds;}
162 virtual bool setKey(const QString& password, const QString& keyfile);
163 virtual bool setPasswordKey(const QString& password);
164 virtual bool setFileKey(const QString& filename);
165 virtual bool setCompositeKey(const QString& password,const QString& filename);
167 virtual QList<IEntryHandle*> entries();
168 virtual QList<IEntryHandle*> entries(IGroupHandle* Group);
169 virtual QList<IEntryHandle*> entriesSortedStd(IGroupHandle* Group);
170 virtual QList<IEntryHandle*> expiredEntries();
172 virtual IEntryHandle* cloneEntry(const IEntryHandle* entry);
173 virtual void deleteEntry(IEntryHandle* entry);
174 virtual void deleteEntries(QList<IEntryHandle*> entries);
175 virtual IEntryHandle* newEntry(IGroupHandle* group);
176 virtual IEntryHandle* addEntry(const CEntry* NewEntry, IGroupHandle* group);
177 virtual void moveEntry(IEntryHandle* entry, IGroupHandle* group);
178 virtual void deleteLastEntry();
181 virtual QList<IGroupHandle*> groups();
182 virtual QList<IGroupHandle*> sortedGroups();
183 virtual void deleteGroup(IGroupHandle* group);
184 virtual void moveGroup(IGroupHandle* Group,IGroupHandle* NewParent,int Position);
185 virtual IGroupHandle* addGroup(const CGroup* Group,IGroupHandle* Parent);
186 virtual IGroupHandle* backupGroup(bool create=false);
187 virtual bool isParent(IGroupHandle* parent, IGroupHandle* child);
189 virtual void generateMasterKey();
190 //virtual IDatabase* groupToNewDb(IGroupHandle* group);
192 inline bool hasPasswordEncodingChanged() { return passwordEncodingChanged; };
195 bool loadReal(QString filename, bool readOnly, bool differentEncoding);
196 QDateTime dateFromPackedStruct5(const unsigned char* pBytes);
197 void dateToPackedStruct5(const QDateTime& datetime, unsigned char* dst);
198 bool isMetaStream(StdEntry& Entry);
199 bool parseMetaStream(const StdEntry& Entry);
200 void parseCustomIconsMetaStream(const QByteArray& data);
201 void parseCustomIconsMetaStreamV3(const QByteArray& data);
202 void parseGroupTreeStateMetaStream(const QByteArray& data);
203 void createCustomIconsMetaStream(StdEntry* e);
204 void createGroupTreeStateMetaStream(StdEntry* e);
205 bool readEntryField(StdEntry* entry, quint16 FieldType, quint32 FieldSize, quint8 *pData);
206 bool readGroupField(StdGroup* group,QList<quint32>& Levels,quint16 FieldType, quint8 *pData);
207 bool createGroupTree(QList<quint32>& Levels);
208 void createHandles();
209 void invalidateHandle(StdEntry* entry);
210 bool convHexToBinaryKey(char* HexKey, char* dst);
211 quint32 getNewGroupId();
212 void serializeEntries(QList<StdEntry>& EntryList,char* buffer,unsigned int& pos);
213 void serializeGroups(char* buffer,unsigned int& pos);
214 void appendChildrenToGroupList(QList<StdGroup*>& list,StdGroup& group);
215 void appendChildrenToGroupList(QList<IGroupHandle*>& list,StdGroup& group);
216 bool searchStringContains(const QString& search, const QString& string,bool Cs, bool RegExp);
217 void getEntriesRecursive(IGroupHandle* Group, QList<IEntryHandle*>& EntryList);
218 void rebuildIndices(QList<StdGroup*>& list);
219 void restoreGroupTreeState();
220 //void copyTree(Kdb3Database* db, GroupHandle* orgGroup, IGroupHandle* parent);
221 static bool EntryHandleLessThan(const IEntryHandle* This,const IEntryHandle* Other);
222 static bool EntryHandleLessThanStd(const IEntryHandle* This,const IEntryHandle* Other);
223 static bool StdEntryLessThan(const Kdb3Database::StdEntry& This,const Kdb3Database::StdEntry& Other);
225 StdEntry* getEntry(const KpxUuid& uuid);
226 StdEntry* getEntry(EntryHandle* handle);
227 int getEntryListIndex(EntryHandle* handle);
228 EntryHandle* getHandle(StdEntry* entry);
230 StdGroup* getGroup(quint32 Id);
231 void deleteGroup(StdGroup* group);
233 QList<EntryHandle> EntryHandles;
234 QList<GroupHandle> GroupHandles;
235 QList<StdEntry> Entries;
236 QList<StdGroup> Groups;
238 QList<QPixmap>CustomIcons;
243 bool PotentialEncodingIssueLatin1;
244 bool PotentialEncodingIssueUTF8;
245 QList<StdEntry> UnknownMetaStreams;
246 QMap<quint32,bool> TreeStateMetaStream;
247 unsigned int KeyTransfRounds;
248 CryptAlgorithm Algorithm;
249 SecData RawMasterKey;
250 SecData RawMasterKey_CP1252;
251 SecData RawMasterKey_Latin1;
252 SecData RawMasterKey_UTF8;
254 quint8 TransfRandomSeed[32];
255 bool hasV4IconMetaStream;
256 bool passwordEncodingChanged;
259 class KeyTransform : public QThread{
263 static void transform(quint8* src, quint8* dst, quint8* KeySeed, int rounds);
266 KeyTransform(quint8* pSrc, quint8* pDst, quint8* pKeySeed, int pRounds);
276 class KeyTransformBenchmark : public QThread{
280 static int benchmark(int pMSecs);
283 KeyTransformBenchmark(int pMSecs);