📄 pwmanager.cpp
字号:
if(CryptoAlgorithmus == ALGO_AES) Flags |= PWM_FLAG_RIJNDAEL;else if(CryptoAlgorithmus == ALGO_TWOFISH) Flags |= PWM_FLAG_TWOFISH;Version = PWM_DBVER_DW;NumGroups = Groups.size();NumEntries = Entries.size()+MetaStreams.size();getRandomBytes(FinalRandomSeed,1,16,false);getRandomBytes(TrafoRandomSeed,1,32,false);getRandomBytes(EncryptionIV,1,16,false);quint16 FieldType;quint32 FieldSize;int pos=DB_HEADER_SIZE; // Skip the header, it will be written laterfor(int i=0; i < Groups.size(); i++){ FieldType = 0x0001; FieldSize = 4; memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; memcpyToLEnd32(buffer+pos, &Groups[i].ID); pos += 4; FieldType = 0x0002; FieldSize = Groups[i].Name.toUtf8().length() + 1; memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; memcpy(buffer+pos, Groups[i].Name.toUtf8(),FieldSize); pos += FieldSize; FieldType = 0x0003; FieldSize = 5; memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; dateToPackedStruct5(Groups[i].Creation,(unsigned char*)buffer+pos); pos += 5; FieldType = 0x0004; FieldSize = 5; memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; dateToPackedStruct5(Groups[i].LastMod,(unsigned char*)buffer+pos);pos += 5; FieldType = 0x0005; FieldSize = 5; memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; dateToPackedStruct5(Groups[i].LastAccess,(unsigned char*)buffer+pos);pos += 5; FieldType = 0x0006; FieldSize = 5; memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; dateToPackedStruct5(Groups[i].Expire,(unsigned char*)buffer+pos);pos += 5; FieldType = 0x0007; FieldSize = 4; memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; memcpyToLEnd32(buffer+pos, &Groups[i].OldImgID); pos += 4; FieldType = 0x0008; FieldSize = 2; memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; memcpyToLEnd16(buffer+pos, &Groups[i].Level); pos += 2; FieldType = 0x0009; FieldSize = 4; memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; memcpyToLEnd32(buffer+pos, &Groups[i].Flags); pos += 4; FieldType = 0xFFFF; FieldSize = 0; memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;}for(int i = 0; i < Entries.size(); i++){ FieldType = 0x0001; FieldSize = 16; memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; Entries[i].Uuid.toRaw(buffer+pos); pos += 16; FieldType = 0x0002; FieldSize = 4; memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; memcpyToLEnd32(buffer+pos, &Entries[i].GroupID); pos += 4; FieldType = 0x0003; FieldSize = 4; memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; memcpyToLEnd32(buffer+pos,&Entries[i].OldImgID); pos += 4; FieldType = 0x0004; FieldSize = Entries[i].Title.toUtf8().length() + 1; // Add terminating NULL character space memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; memcpy(buffer+pos, Entries[i].Title.toUtf8(),FieldSize); pos += FieldSize; FieldType = 0x0005; FieldSize = Entries[i].URL.toUtf8().length() + 1; // Add terminating NULL character space memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; memcpy(buffer+pos, Entries[i].URL.toUtf8(),FieldSize); pos += FieldSize; FieldType = 0x0006; FieldSize = Entries[i].UserName.toUtf8().length() + 1; // Add terminating NULL character space memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; memcpy(buffer+pos, Entries[i].UserName.toUtf8(),FieldSize); pos += FieldSize; FieldType = 0x0007; FieldSize = Entries[i].Password.length() + 1; // Add terminating NULL character space memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; Entries[i].Password.unlock(); memcpy(buffer+pos, Entries[i].Password.string().toUtf8(),FieldSize); pos += FieldSize; Entries[i].Password.lock(); FieldType = 0x0008; FieldSize = Entries[i].Additional.toUtf8().length() + 1; // Add terminating NULL character space memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; memcpy(buffer+pos, Entries[i].Additional.toUtf8(),FieldSize); pos += FieldSize; FieldType = 0x0009; FieldSize = 5; memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; dateToPackedStruct5(Entries[i].Creation,(unsigned char*)buffer+pos); pos+=5; FieldType = 0x000A; FieldSize = 5; memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; dateToPackedStruct5(Entries[i].LastMod,(unsigned char*)buffer+pos); pos+=5; FieldType = 0x000B; FieldSize = 5; memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; dateToPackedStruct5(Entries[i].LastAccess,(unsigned char*)buffer+pos); pos+=5; FieldType = 0x000C; FieldSize = 5; memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; dateToPackedStruct5(Entries[i].Expire,(unsigned char*)buffer+pos); pos+=5; FieldType = 0x000D; FieldSize = Entries[i].BinaryDesc.toUtf8().length() + 1; // Add terminating NULL character space memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; memcpy(buffer+pos, Entries[i].BinaryDesc.toUtf8(),FieldSize); pos += FieldSize; FieldType = 0x000E; FieldSize = Entries[i].BinaryData.length(); memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; if((!Entries[i].BinaryData.isNull()) && (FieldSize != 0)) memcpy(buffer+pos, Entries[i].BinaryData.data(), FieldSize); pos += FieldSize; FieldType = 0xFFFF; FieldSize = 0; memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;}for(int i = 0; i < MetaStreams.size(); i++){ FieldType = 0x0001; FieldSize = 16; memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; MetaStreams[i]->Uuid.toRaw(buffer+pos); pos += 16; FieldType = 0x0002; FieldSize = 4; memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; memcpyToLEnd32(buffer+pos, &MetaStreams[i]->GroupID); pos += 4; FieldType = 0x0003; FieldSize = 4; memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; memcpyToLEnd32(buffer+pos, &MetaStreams[i]->ImageID); pos += 4; FieldType = 0x0004; FieldSize = MetaStreams[i]->Title.toUtf8().length() + 1; // Add terminating NULL character space memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; memcpy(buffer+pos, MetaStreams[i]->Title.toUtf8(),FieldSize); pos += FieldSize; FieldType = 0x0005; FieldSize = MetaStreams[i]->URL.toUtf8().length() + 1; // Add terminating NULL character space memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; memcpy(buffer+pos, MetaStreams[i]->URL.toUtf8(),FieldSize); pos += FieldSize; FieldType = 0x0006; FieldSize = MetaStreams[i]->UserName.toUtf8().length() + 1; // Add terminating NULL character space memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; memcpy(buffer+pos, MetaStreams[i]->UserName.toUtf8(),FieldSize); pos += FieldSize; FieldType = 0x0007; FieldSize = MetaStreams[i]->Password.length() + 1; // Add terminating NULL character space memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; MetaStreams[i]->Password.unlock(); memcpy(buffer+pos, MetaStreams[i]->Password.string().toUtf8(),FieldSize); pos += FieldSize; MetaStreams[i]->Password.lock(); FieldType = 0x0008; FieldSize = MetaStreams[i]->Additional.toUtf8().length() + 1; // Add terminating NULL character space memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; memcpy(buffer+pos, MetaStreams[i]->Additional.toUtf8(),FieldSize); pos += FieldSize; FieldType = 0x0009; FieldSize = 5; memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; dateToPackedStruct5(MetaStreams[i]->Creation,(unsigned char*)buffer+pos); pos+=5; FieldType = 0x000A; FieldSize = 5; memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; dateToPackedStruct5(MetaStreams[i]->LastMod,(unsigned char*)buffer+pos); pos+=5; FieldType = 0x000B; FieldSize = 5; memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; dateToPackedStruct5(MetaStreams[i]->LastAccess,(unsigned char*)buffer+pos); pos+=5; FieldType = 0x000C; FieldSize = 5; memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; dateToPackedStruct5(MetaStreams[i]->Expire,(unsigned char*)buffer+pos); pos+=5; FieldType = 0x000D; FieldSize = MetaStreams[i]->BinaryDesc.toUtf8().length() + 1; // Add terminating NULL character space memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; memcpy(buffer+pos, MetaStreams[i]->BinaryDesc.toUtf8(),FieldSize); pos += FieldSize; FieldType = 0x000E; FieldSize = MetaStreams[i]->BinaryData.length(); memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; if((!MetaStreams[i]->BinaryData.isNull()) && (FieldSize != 0)) memcpy(buffer+pos, MetaStreams[i]->BinaryData.data(), FieldSize); pos += FieldSize; FieldType = 0xFFFF; FieldSize = 0; memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;}sha256_context context;sha256_starts(&context);sha256_update(&context,(unsigned char*)buffer+DB_HEADER_SIZE, pos - DB_HEADER_SIZE);sha256_finish(&context,(unsigned char*)ContentsHash);memcpyToLEnd32(buffer,&Signature1);memcpyToLEnd32(buffer+4,&Signature2);memcpyToLEnd32(buffer+8,&Flags);memcpyToLEnd32(buffer+12,&Version);memcpy(buffer+16,FinalRandomSeed,16);memcpy(buffer+32,EncryptionIV,16);memcpyToLEnd32(buffer+48,&NumGroups);memcpyToLEnd32(buffer+52,&NumEntries);memcpy(buffer+56,ContentsHash,32);memcpy(buffer+88,TrafoRandomSeed,32);memcpyToLEnd32(buffer+120,&KeyEncRounds);transformKey(MasterKey,TransformedMasterKey,TrafoRandomSeed,KeyEncRounds);quint8 FinalKey[32];sha256_starts(&context);sha256_update(&context,FinalRandomSeed, 16);sha256_update(&context,TransformedMasterKey, 32);sha256_finish(&context,FinalKey);unsigned long EncryptedPartSize;if(CryptoAlgorithmus == ALGO_AES){Rijndael aes;// Initialize Rijndael/AES if(aes.init(Rijndael::CBC, Rijndael::Encrypt, FinalKey,Rijndael::Key32Bytes, EncryptionIV) != RIJNDAEL_SUCCESS){ _ERROR delete [] buffer; return false;}EncryptedPartSize = (unsigned long)aes.padEncrypt((quint8*)buffer+DB_HEADER_SIZE, pos - DB_HEADER_SIZE, (quint8*)buffer+DB_HEADER_SIZE);}else if(CryptoAlgorithmus == ALGO_TWOFISH){CTwofish twofish;if(twofish.init(FinalKey, 32, EncryptionIV) == false){_ERRORdelete [] buffer;return false;}EncryptedPartSize = (unsigned long)twofish.padEncrypt((quint8*)buffer+DB_HEADER_SIZE, pos - DB_HEADER_SIZE, (quint8*)buffer+DB_HEADER_SIZE);}if((EncryptedPartSize > 2147483446) || (!EncryptedPartSize && Groups.size())){_ERRORdelete [] buffer;return false;}file->resize(0); //truncateif(file->write(buffer,EncryptedPartSize+DB_HEADER_SIZE)!=EncryptedPartSize+DB_HEADER_SIZE){delete [] buffer;return false;}file->flush();delete [] buffer;//if(SearchGroupID!=-1)Groups.push_back(SearchGroup);return true;}CGroup* PwDatabase::addGroup(CGroup* parent){CGroup group;if(parent)group.Level=parent->Level+1;group.ImageID=0;group.ID=getNewGroupId();if(!Groups.size() || !parent){ Groups << group; return &Groups.back();}else { int i=Groups.indexOf(*parent)+1; for(i;i<Groups.size();i++) if(Groups[i].Level<=parent->Level)break; Groups.insert(i,group); return &Groups[i];}}void PwDatabase::deleteGroup(unsigned long id){for(int i=0;i<Groups.size();i++){ if(Groups[i].ID==id) return deleteGroup(&Groups[i]);}}void PwDatabase::deleteGroup(CGroup* group){int GroupIndex=Groups.indexOf(*group);int NumChilds;int i;for(i=GroupIndex+1; i<Groups.size(); i++){ if(Groups[i].Level<=group->Level)break;}NumChilds=i-GroupIndex-1;//delete entriesfor(i=GroupIndex; i<=GroupIndex+NumChilds; i++){ for(int j=0; j<Entries.size();){ if(Entries[j].GroupID==Groups[i].ID) deleteEntry(&Entries[j]); else j++; }}for(i=NumChilds; i>=0; i--){ Groups.removeAt(GroupIndex+i);}}int PwDatabase::getGroupIndex(CGroup* g){return getGroupIndex(g->ID);}int PwDatabase::getGroupIndex(unsigned long ID){int i=0;for(i;i<Groups.size();i++){if(Groups[i].ID==ID)break;}return i;}void PwDatabase::merge(Database* db){for(int i=0;i<db->numGroups();i++){ int NewGroupID; if(isGroupIdInUse(db->group(i).ID)==true) NewGroupID=getNewGroupId(); else NewGroupID=db->group(i).ID; for(int j=0;j<db->numEntries();j++){ if(db->entry(j).GroupID==db->group(i).ID){ Entries.push_back(db->entry(j)); Entries.back().GroupID=NewGroupID; Entries.back().sID=getNewEntrySid();} } Groups.push_back(db->group(i)); Groups.back().ID=NewGroupID;}}bool PwDatabase::isGroupIdInUse(quint32 id){for(int i=0;i<Groups.size();i++) if(Groups[i].ID==id)return true;return false;}bool PwDatabase::isEntrySidInUse(quint32 sid){for(int i=0;i<Entries.size();i++) if(Entries[i].sID==sid)return true;return false;}bool PwDatabase::isParentGroup(CGroup* child, CGroup* parent){if(child==parent)return true; //maybe a bad ideaint ChildIndex=getGroupIndex(child->ID);int ParentIndex=getGroupIndex(parent->ID);if(ParentIndex > ChildIndex) return false;for(int i=ChildIndex; i>ParentIndex;i--){ if(Groups[i].Level<=parent->Level)return false;}return true;}quint32 PwDatabase::getNewGroupId(){quint32 id;bool used;while(1){used=false;getRandomBytes(&id,4,1,false);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -