Fixed bug that prevented opening db with keyfile and password
git-svn-id: https://svn.code.sf.net/p/keepassx/code/trunk@256 b624d157-de02-0410-bad0-e51aec6abb33
This commit is contained in:
parent
13b3ab3cae
commit
2434e9111f
|
@ -885,7 +885,7 @@ bool Kdb3Database::setFileKey(const QString& filename){
|
||||||
error=decodeFileError(file.error());
|
error=decodeFileError(file.error());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
unsigned long FileSize=file.size();
|
qint64 FileSize=file.size();
|
||||||
if(FileSize == 0){
|
if(FileSize == 0){
|
||||||
error=tr("Key file is empty.");
|
error=tr("Key file is empty.");
|
||||||
return false;
|
return false;
|
||||||
|
@ -913,33 +913,32 @@ bool Kdb3Database::setFileKey(const QString& filename){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SHA256 sha;
|
SHA256 sha;
|
||||||
unsigned char* buffer = new unsigned char[2048];
|
unsigned char* buffer[2048];
|
||||||
while(1)
|
unsigned long read;
|
||||||
{
|
do {
|
||||||
unsigned long read=file.read((char*)buffer,2048);
|
read = file.read((char*)buffer,2048);
|
||||||
if(read == 0) break;
|
if (read != 0)
|
||||||
sha.update(buffer,read);
|
sha.update(buffer,read);
|
||||||
if(read != 2048) break;
|
} while (read == 2048);
|
||||||
}
|
|
||||||
sha.finish(*RawMasterKey);
|
sha.finish(*RawMasterKey);
|
||||||
RawMasterKey.lock();
|
RawMasterKey.lock();
|
||||||
delete [] buffer;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Kdb3Database::setCompositeKey(const QString& Password,const QString& filename){
|
bool Kdb3Database::setCompositeKey(const QString& Password,const QString& filename){
|
||||||
SHA256 sha;
|
SHA256 sha;
|
||||||
|
|
||||||
if(!setFileKey(filename))return false;
|
setPasswordKey(Password);
|
||||||
RawMasterKey.unlock();
|
RawMasterKey.unlock();
|
||||||
sha.update(*RawMasterKey,32);
|
sha.update(*RawMasterKey,32);
|
||||||
RawMasterKey.lock();
|
RawMasterKey.lock();
|
||||||
|
|
||||||
setPasswordKey(Password);
|
if(!setFileKey(filename))return false;
|
||||||
RawMasterKey.unlock();
|
RawMasterKey.unlock();
|
||||||
sha.update(*RawMasterKey,32);
|
sha.update(*RawMasterKey,32);
|
||||||
sha.finish(*RawMasterKey);
|
sha.finish(*RawMasterKey);
|
||||||
RawMasterKey.lock();
|
RawMasterKey.lock();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,20 @@ void SHA256::hashBuffer(const void* input, void* digest, quint32 length){
|
||||||
sha256_starts(&ctx);
|
sha256_starts(&ctx);
|
||||||
sha256_update(&ctx,(quint8*)input,length);
|
sha256_update(&ctx,(quint8*)input,length);
|
||||||
sha256_finish(&ctx,(quint8*)digest);
|
sha256_finish(&ctx,(quint8*)digest);
|
||||||
|
overwriteCtx(&ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHA256::overwriteCtx(sha256_context* ctx) {
|
||||||
|
ctx->total[0] = 0;
|
||||||
|
ctx->total[1] = 0;
|
||||||
|
|
||||||
|
for (int i=0; i<8; i++) {
|
||||||
|
ctx->state[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i=0; i<8; i++) {
|
||||||
|
ctx->buffer[i] = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void sha256_starts( sha256_context *ctx )
|
void sha256_starts( sha256_context *ctx )
|
||||||
|
|
|
@ -37,10 +37,12 @@ extern void sha256_finish( sha256_context *ctx, quint8 digest[32] );
|
||||||
class SHA256{
|
class SHA256{
|
||||||
public:
|
public:
|
||||||
SHA256(){sha256_starts(&ctx);}
|
SHA256(){sha256_starts(&ctx);}
|
||||||
|
~SHA256(){overwriteCtx(&ctx);};
|
||||||
void update(void* input,quint32 length){sha256_update(&ctx,(quint8*)input,length);}
|
void update(void* input,quint32 length){sha256_update(&ctx,(quint8*)input,length);}
|
||||||
void finish(void* digest){sha256_finish(&ctx,(quint8*)digest);}
|
void finish(void* digest){sha256_finish(&ctx,(quint8*)digest);}
|
||||||
static void hashBuffer(const void* input, void* digest,quint32 length);
|
static void hashBuffer(const void* input, void* digest,quint32 length);
|
||||||
private:
|
private:
|
||||||
|
static void overwriteCtx(sha256_context* ctx);
|
||||||
sha256_context ctx;
|
sha256_context ctx;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -287,7 +287,7 @@ void PasswordDialog::OnOK(){
|
||||||
config->setLastKeyLocation(QString());
|
config->setLastKeyLocation(QString());
|
||||||
}
|
}
|
||||||
else if(Check_KeyFile->isChecked()){
|
else if(Check_KeyFile->isChecked()){
|
||||||
config->setLastKeyType(PASSWORD);
|
config->setLastKeyType(KEYFILE);
|
||||||
config->setLastKeyLocation(Combo_KeyFile->currentText());
|
config->setLastKeyLocation(Combo_KeyFile->currentText());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue