From 5a2ad9afef706b33e5ca6e118510f6116491e264 Mon Sep 17 00:00:00 2001 From: sniperbeamer Date: Sat, 10 May 2008 09:00:47 +0000 Subject: [PATCH] Don't use /dev/random anymore Display help if parsing arguments fails git-svn-id: https://svn.code.sf.net/p/keepassx/code/trunk@197 b624d157-de02-0410-bad0-e51aec6abb33 --- src/crypto/yarrow.cpp | 7 ++- src/keepassx.h | 6 +-- src/lib/SecString.cpp | 100 +++++++++++++++++++++--------------------- src/lib/random.cpp | 74 ++++++++++++------------------- src/lib/random.h | 37 ++-------------- src/main.cpp | 42 +++++++++++------- src/src.pro | 2 +- 7 files changed, 115 insertions(+), 153 deletions(-) diff --git a/src/crypto/yarrow.cpp b/src/crypto/yarrow.cpp index 0dd36bb..1e87990 100644 --- a/src/crypto/yarrow.cpp +++ b/src/crypto/yarrow.cpp @@ -400,7 +400,12 @@ struct yarrow_source StrongSrc[2]; void initYarrow(){ yarrow256_init(&WeakCtx,2,WeakSrc); yarrow256_init(&StrongCtx,2,StrongSrc); - new RandomSource(); + + quint8 buffer[100]; + for (int i=0; i<2; i++){ + Random::getEntropy(buffer,100); + yarrowUpdateWeak(i,100*8,100,buffer); + } } void yarrowUpdateWeak(unsigned source, unsigned entropy, unsigned length, const quint8 *data){ diff --git a/src/keepassx.h b/src/keepassx.h index 54e85a4..305f458 100644 --- a/src/keepassx.h +++ b/src/keepassx.h @@ -37,9 +37,9 @@ #include #include -#include -#include -#include +#include +#include +#include #include #include diff --git a/src/lib/SecString.cpp b/src/lib/SecString.cpp index 9fd1688..7af6b71 100644 --- a/src/lib/SecString.cpp +++ b/src/lib/SecString.cpp @@ -24,82 +24,80 @@ using namespace std; CArcFour SecString::RC4; SecString::operator QString(){ -return string(); + return string(); } SecString::SecString(){ -locked=true; + locked=true; } int SecString::length(){ -return crypt.size(); + return crypt.size(); } SecString::~SecString(){ -lock(); + lock(); } void SecString::lock(){ -locked=true; -overwrite(plain); -plain=QString(); + locked=true; + overwrite(plain); + plain=QString(); } void SecString::unlock(){ -locked=false; -plain=QString(); -if(!crypt.length()){return;} -const unsigned char* buffer=new unsigned char[crypt.length()]; -SecString::RC4.decrypt((byte*)crypt.data(),(unsigned char*)buffer,crypt.length()); -plain=QString::fromUtf8((const char*)buffer,crypt.size()); -overwrite((unsigned char*)buffer,crypt.size()); -delete [] buffer; + locked = false; + plain = QString(); + if(!crypt.length()) + return; + const unsigned char* buffer = new unsigned char[crypt.length()]; + SecString::RC4.decrypt( (byte*)crypt.data(), (unsigned char*)buffer, crypt.length() ); + plain = QString::fromUtf8((const char*)buffer, crypt.size()); + overwrite((unsigned char*)buffer, crypt.size()); + delete [] buffer; } - const QString& SecString::string(){ -if(locked){ - printf("Error in function SecString::string(): string is locked\n"); - return QString(">SEC_STRING_ERROR<"); -} -return plain; + Q_ASSERT_X(!locked, "SecString::string()", "string is locked"); + return plain; } - -void SecString::setString(QString& str,bool DeleteSource){ -QByteArray StrData=str.toUtf8(); -int len=StrData.size(); -unsigned char* buffer=new unsigned char[len]; -SecString::RC4.encrypt((const unsigned char*)StrData.data(),buffer,len); -crypt=QByteArray((const char*)buffer,len); -overwrite(buffer,len); -overwrite((unsigned char*)StrData.data(),len); -delete [] buffer; -if(DeleteSource){ - overwrite(str); - str=QString();} -lock(); +void SecString::setString(QString& str, bool DeleteSource){ + QByteArray StrData = str.toUtf8(); + int len = StrData.size(); + unsigned char* buffer = new unsigned char[len]; + SecString::RC4.encrypt((const unsigned char*)StrData.data(), buffer, len); + crypt = QByteArray((const char*)buffer, len); + overwrite(buffer, len); + overwrite((unsigned char*)StrData.data(), len); + delete [] buffer; + if(DeleteSource){ + overwrite(str); + str=QString(); + } + lock(); } -void SecString::overwrite(unsigned char* str,int strlen){ -if(strlen==0 || str==NULL)return; -for(int i=0; i +#elif defined(Q_WS_WIN) #include #include #endif -RandomSource::RandomSource(){ - quint8 buffer[100]; - for (int i=0; i<2; i++){ - getRandomWeak(buffer,100); - yarrowUpdateWeak(i,100*8,100,buffer); - } - -#ifdef HAS_DEV_RANDOM - if (QFile::exists("/dev/random")){ - DevRandom* devRandom = new DevRandom(this); - connect(devRandom, SIGNAL(randomAvailable(int,QByteArray,int)), SLOT(seedStrong(int,QByteArray,int))); - connect(devRandom, SIGNAL(finished()), SLOT(deleteLater())); - devRandom->start(); - } - else{ - deleteLater(); - } -#else - deleteLater(); -#endif -} +#include +#include +#include -void RandomSource::getRandomWeak(quint8* buffer, int length){ -#if defined(HAS_DEV_RANDOM) +void Random::getEntropy(quint8* buffer, int length){ +#if defined(Q_WS_X11) || defined(Q_WS_MAC) QFile dev_urandom("/dev/urandom"); if (dev_urandom.open(QIODevice::ReadOnly|QIODevice::Unbuffered) && dev_urandom.read((char*)buffer,length)==length) return; @@ -69,30 +54,27 @@ void RandomSource::getRandomWeak(quint8* buffer, int length){ } #endif - srand(time(NULL)); + initStdRand(); for(int i=0;i -#if defined(Q_WS_X11) || defined(Q_WS_MAC) -#define HAS_DEV_RANDOM -#include -#endif - -class RandomSource : public QObject { - Q_OBJECT - - public: - RandomSource(); - - private: - static void getRandomWeak(quint8* buffer, int length); - -#ifdef HAS_DEV_RANDOM - private slots: - void seedStrong(int source, QByteArray buffer, int length); -#endif +namespace Random { + void getEntropy(quint8* buffer, int length); + void initStdRand(); }; -#ifdef HAS_DEV_RANDOM -class DevRandom : public QThread { - Q_OBJECT - - public: - DevRandom(QObject* parent = 0); - void run(); - - signals: - void randomAvailable(int source, QByteArray buffer, int length); - - private: - static bool getRandomStrong(quint8* buffer, int length); -}; -#endif - #endif diff --git a/src/main.cpp b/src/main.cpp index 2fba6ad..d89c006 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -55,7 +55,8 @@ int main(int argc, char **argv) initAppPaths(argc,argv); CmdLineArgs args; if(!args.preparse(argc,argv)){ // searches only for the -cfg parameter - qCritical(CSTR(args.error())); + qCritical(CSTR( args.error().append("\n") )); + args.printHelp(); return 1; } @@ -127,8 +128,15 @@ int main(int argc, char **argv) app = new QApplication(argc,argv); #endif } - args.parse(QApplication::arguments()); - + if ( !args.parse(QApplication::arguments()) ){ + qCritical(CSTR( args.error().append("\n") )); + args.printHelp(); + return 1; + } + if (args.help()){ + args.printHelp(); + return 1; + } //Internationalization QLocale loc; @@ -233,7 +241,7 @@ CmdLineArgs::CmdLineArgs(){ bool CmdLineArgs::parse(const QStringList& argv){ for(int i=1;i Use specified file for loading/saving the configuration." << endl; - cout << " -min Start minimized." << endl; - cout << " -lock Start locked." << endl; - cout << " -lang Use specified language instead of systems default." << endl; - cout << " is the ISO-639 language code with or without ISO-3166 country code" << endl; - cout << " Examples: de German" << endl; - cout << " de_CH German(Switzerland)"< Use specified file for loading/saving the configuration." << endl; + cerr << " -min Start minimized." << endl; + cerr << " -lock Start locked." << endl; + cerr << " -lang Use specified language instead of systems default." << endl; + cerr << " is the ISO-639 language code with or without ISO-3166 country code" << endl; + cerr << " Examples: de German" << endl; + cerr << " de_CH German(Switzerland)" << endl; + cerr << " pt_BR Portuguese(Brazil)" << endl; } diff --git a/src/src.pro b/src/src.pro index ea6316e..0788c99 100644 --- a/src/src.pro +++ b/src/src.pro @@ -173,7 +173,7 @@ HEADERS += lib/UrlLabel.h \ dialogs/CalendarDlg.h \ dialogs/ExpiredEntriesDlg.h \ # dialogs/TrashCanDlg.h \ - lib/random.h \ +# lib/random.h \ Database.h \ lib/AutoType.h \ lib/FileDialogs.h \