Try to use truly random data to initialize the random number generator
Fixed: crash when closing the PasswordDlg by clicking on the x Fixed: -cfg parameter not working Fixed: does not compile for Windows Fixed some compiler warnings git-svn-id: https://svn.code.sf.net/p/keepassx/code/trunk@176 b624d157-de02-0410-bad0-e51aec6abb33
This commit is contained in:
parent
e9a85f91fc
commit
b8f59f9f04
|
@ -20,8 +20,7 @@
|
|||
|
||||
|
||||
|
||||
KpxUuid::KpxUuid(){
|
||||
Data.fill(0,16);
|
||||
KpxUuid::KpxUuid() : Data(16,0){
|
||||
}
|
||||
|
||||
KpxUuid::KpxUuid(const void* src){
|
||||
|
@ -30,7 +29,7 @@ KpxUuid::KpxUuid(const void* src){
|
|||
|
||||
void KpxUuid::generate(){
|
||||
char uuid[16];
|
||||
getRandomBytes(uuid,16);
|
||||
randomize(uuid,16);
|
||||
quint32 Secs=QDateTime::currentDateTime().toTime_t();
|
||||
quint16 mSecs=QTime::currentTime().msec();
|
||||
mSecs=(mSecs & 0x3FF) | (*((quint16*)(uuid+4)) & 0xFC00); //msec has only 10 Bits, filling the rest with random data
|
||||
|
@ -61,7 +60,7 @@ void KpxUuid::toRaw(void* dst)const{
|
|||
}
|
||||
|
||||
void KpxUuid::fromRaw(const void* src){
|
||||
Data=QByteArray((char*)src,16);
|
||||
Data.replace(0,16,(char*)src);
|
||||
}
|
||||
|
||||
bool KpxUuid::operator==(const KpxUuid& other)const{
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
#define _ARCFOUR_H_
|
||||
|
||||
#ifndef byte
|
||||
#define byte unsigned char
|
||||
#define byte quint8
|
||||
#endif
|
||||
|
||||
class CArcFour{
|
||||
|
|
|
@ -37,7 +37,9 @@ using std::string;
|
|||
#define uint8_t quint8
|
||||
#define uint16_t quint16
|
||||
#define uint32_t quint32
|
||||
#ifndef byte
|
||||
#define byte quint8
|
||||
#endif
|
||||
|
||||
/** blowfish encryption algorithm.
|
||||
* Derived from libgcrypt-1.1.12
|
||||
|
|
|
@ -180,4 +180,4 @@ extern void Twofish_decrypt(
|
|||
Twofish_Byte p[16]
|
||||
);
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -400,12 +400,9 @@ void initYarrow(){
|
|||
yarrow256_init(&WeakCtx,2,WeakSrc);
|
||||
yarrow256_init(&StrongCtx,2,StrongSrc);
|
||||
quint8 buffer[100];
|
||||
srand(time(0));
|
||||
for(int i=0;i<100;i++)
|
||||
buffer[i]=rand()%256+1;
|
||||
getRandomBytes(buffer,100);
|
||||
yarrow256_update(&WeakCtx,0,800,100,buffer);
|
||||
for(int i=0;i<100;i++)
|
||||
buffer[i]=rand()%256+1;
|
||||
getRandomBytes(buffer,100);
|
||||
yarrow256_update(&WeakCtx,1,800,100,buffer);
|
||||
Q_ASSERT(yarrow256_is_seeded(&WeakCtx));
|
||||
}
|
||||
|
@ -429,8 +426,7 @@ void reseedStrongPool(quint8* buffer1,int l1,quint8* buffer2,int l2){
|
|||
buffer1=buffer1+100;
|
||||
l1=l1-100;
|
||||
}
|
||||
else
|
||||
{
|
||||
else{
|
||||
yarrow256_update(&StrongCtx,1,100,25,buffer2);
|
||||
buffer2=buffer2+25;
|
||||
l2=l2-25;
|
||||
|
|
|
@ -43,9 +43,9 @@ public:
|
|||
};
|
||||
|
||||
enum DlgExit {
|
||||
Exit_Ok,
|
||||
Exit_Cancel,
|
||||
Exit_Quit
|
||||
Exit_Ok=QDialog::Accepted,
|
||||
Exit_Cancel=QDialog::Rejected,
|
||||
Exit_Quit=3
|
||||
};
|
||||
|
||||
typedef bool (KeyFileGenProc)(const QString& filename,QString* error);
|
||||
|
|
|
@ -31,7 +31,7 @@ bool Import_PwManager::importDatabase(QWidget* GuiParent, IDatabase* db){
|
|||
char* buffer=NULL;
|
||||
int offset=0;
|
||||
int len=0;
|
||||
if(len=file->size()){
|
||||
if((len=file->size())){
|
||||
buffer=new char[len];
|
||||
}
|
||||
else {
|
||||
|
|
|
@ -34,60 +34,62 @@
|
|||
|
||||
#ifdef __cplusplus
|
||||
|
||||
#include <cstdlib>
|
||||
#include <iostream>
|
||||
|
||||
#include <assert.h>
|
||||
#include <math.h>
|
||||
#include <time.h>
|
||||
#include <assert.h>
|
||||
#include <cstdlib>
|
||||
#include <QHash>
|
||||
#include <QList>
|
||||
#include <QStringList>
|
||||
#include <QBitArray>
|
||||
#include <QByteArray>
|
||||
#include <QVarLengthArray>
|
||||
#include <QDataStream>
|
||||
#include <QString>
|
||||
#include <QFile>
|
||||
#include <QDir>
|
||||
#include <QIcon>
|
||||
#include <QPixmap>
|
||||
#include <QMessageBox>
|
||||
#include <QDialog>
|
||||
#include <QImage>
|
||||
#include <QPainter>
|
||||
#include <QBrush>
|
||||
#include <QColor>
|
||||
#include <QLineEdit>
|
||||
#include <QCheckBox>
|
||||
#include <QComboBox>
|
||||
#include <QSettings>
|
||||
#include <QLabel>
|
||||
#include <QDateTime>
|
||||
#include <QTreeWidget>
|
||||
#include <QTimer>
|
||||
#include <QApplication>
|
||||
#include <QPaintEvent>
|
||||
#include <QDomElement>
|
||||
#include <QPushButton>
|
||||
#include <QToolButton>
|
||||
#include <QMenu>
|
||||
#include <QUrl>
|
||||
|
||||
#include <QApplication>
|
||||
#include <QBitArray>
|
||||
#include <QBrush>
|
||||
#include <QByteArray>
|
||||
#include <QCheckBox>
|
||||
#include <QColor>
|
||||
#include <QComboBox>
|
||||
#include <QDataStream>
|
||||
#include <QDateTime>
|
||||
#include <QDialog>
|
||||
#include <QDir>
|
||||
#include <QDomElement>
|
||||
#include <QFile>
|
||||
#include <QHash>
|
||||
#include <QIcon>
|
||||
#include <QImage>
|
||||
#include <QLabel>
|
||||
#include <QLineEdit>
|
||||
#include <QList>
|
||||
#include <QMenu>
|
||||
#include <QMessageBox>
|
||||
#include <QPainter>
|
||||
#include <QPaintEvent>
|
||||
#include <QPixmap>
|
||||
#include <QPushButton>
|
||||
#include <QSettings>
|
||||
#include <QString>
|
||||
#include <QStringList>
|
||||
#include <QTimer>
|
||||
#include <QToolButton>
|
||||
#include <QTreeWidget>
|
||||
#include <QUrl>
|
||||
#include <QVarLengthArray>
|
||||
|
||||
#include "crypto/aescpp.h"
|
||||
#include "crypto/arcfour.h"
|
||||
#include "crypto/blowfish.h"
|
||||
#include "crypto/sha1.h"
|
||||
#include "crypto/twoclass.h"
|
||||
#include "crypto/aescpp.h"
|
||||
#include "crypto/sha256.h"
|
||||
#include "crypto/twoclass.h"
|
||||
#include "crypto/yarrow.h"
|
||||
#include "crypto/arcfour.h"
|
||||
#include "lib/bookmarks.h"
|
||||
#include "lib/FileDialogs.h"
|
||||
#include "lib/random.h"
|
||||
#include "lib/SecString.h"
|
||||
#include "lib/tools.h"
|
||||
#include "lib/FileDialogs.h"
|
||||
#include "lib/bookmarks.h"
|
||||
#include "lib/UrlLabel.h"
|
||||
#include "KpxConfig.h"
|
||||
#include "Database.h"
|
||||
#include "KpxConfig.h"
|
||||
|
||||
extern QString PluginLoadError;
|
||||
extern KpxConfig *config;
|
||||
|
@ -99,4 +101,4 @@ extern QString DetailViewTemplate;
|
|||
extern QPixmap *EntryIcons;
|
||||
|
||||
#endif //__cplusplus
|
||||
#endif //KEEPASS_X_
|
||||
#endif //KEEPASS_X_
|
||||
|
|
|
@ -19,29 +19,44 @@
|
|||
***************************************************************************/
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <QDateTime>
|
||||
#include <QObject>
|
||||
#include "random.h"
|
||||
|
||||
#if defined(Q_WS_WIN)
|
||||
#include <QSysInfo>
|
||||
#include <QMessageBox>
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
using namespace std;
|
||||
|
||||
void getRandomBytes(void* buffer,int NumBlocks,int BlockSize,bool Strong){
|
||||
FILE *dev_random;
|
||||
if(Strong){
|
||||
dev_random = fopen("/dev/random","r");}
|
||||
else{
|
||||
dev_random = fopen("/dev/urandom","r");}
|
||||
|
||||
if (dev_random==NULL){
|
||||
srand(QTime(0,0,0).secsTo(QTime::currentTime()));
|
||||
for(int i=0;i<NumBlocks*BlockSize;i++){
|
||||
quint8 rnd=rand()%256;
|
||||
((quint8*)buffer)[i]=rnd;
|
||||
void getRandomBytes(void* buffer,int NumBlocks){
|
||||
#if defined(Q_WS_WIN)
|
||||
// RtlGenRandom
|
||||
if (QSysInfo::WindowsVersion>=QSysInfo::WV_XP){
|
||||
bool success=false;
|
||||
HMODULE hLib=LoadLibraryA("ADVAPI32.DLL");
|
||||
if (hLib) {
|
||||
BOOLEAN (APIENTRY *pfn)(void*, ULONG) = (BOOLEAN (APIENTRY *)(void*,ULONG))GetProcAddress(hLib,"SystemFunction036");
|
||||
if (pfn && pfn(buffer,NumBlocks)) {
|
||||
success=true;
|
||||
}
|
||||
FreeLibrary(hLib);
|
||||
}
|
||||
if (success)
|
||||
return;
|
||||
}
|
||||
#else
|
||||
FILE* dev_random = fopen("/dev/random","r");
|
||||
if (dev_random){
|
||||
size_t bytesRead = fread(buffer,1,NumBlocks,dev_random);
|
||||
fclose(dev_random);
|
||||
if (bytesRead==NumBlocks)
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
srand(time(NULL));
|
||||
for(int i=0;i<NumBlocks;i++){
|
||||
((quint8*)buffer)[i] = (quint8) (rand()%256);
|
||||
}
|
||||
return;
|
||||
}
|
||||
else{
|
||||
fread(buffer,BlockSize,NumBlocks,dev_random);
|
||||
fclose(dev_random);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,7 +20,6 @@
|
|||
#ifndef RANDOM_H_
|
||||
#define RANDOM_H_
|
||||
|
||||
extern void getRandomBytes(void* buffer,int NumBlocks,int BlockSize=1,bool Strong=false);
|
||||
extern void getRandomBytes(void* buffer,int NumBlocks);
|
||||
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -234,7 +234,7 @@ bool CmdLineArgs::parse(const QStringList& argv){
|
|||
return false;
|
||||
}
|
||||
QFileInfo file(argv[i+1]);
|
||||
ConfigLocation=file.absolutePath();
|
||||
ConfigLocation=file.absoluteFilePath();
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
#include <windows.h>
|
||||
#include "main.h"
|
||||
|
||||
void initAppPaths(){
|
||||
void initAppPaths(int argc,char** argv){
|
||||
AppDir = QApplication::applicationDirPath();
|
||||
|
||||
HomeDir = QString::fromLocal8Bit(qgetenv("APPDATA").constData());
|
||||
|
|
Loading…
Reference in New Issue