Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/keepassxreboot/keepassxc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFelix Geyer <debfx@fobos.de>2010-09-11 21:49:30 +0400
committerFelix Geyer <debfx@fobos.de>2010-09-11 21:49:30 +0400
commit6a2034fa248385d1d1637d4c3444045e50e0c5f5 (patch)
tree7526ece1e918ea4daa1de072bab37e8d99489980 /src
parentf5dd24fdbecb94f07398bacbe8fd905b5c83f806 (diff)
Add crypto classes and tests. Link to libgcrypt.
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt6
-rw-r--r--src/crypto/Crypto.cpp80
-rw-r--r--src/crypto/Crypto.h32
-rw-r--r--src/crypto/CryptoHash.cpp88
-rw-r--r--src/crypto/CryptoHash.h46
-rw-r--r--src/crypto/Random.cpp39
-rw-r--r--src/crypto/Random.h33
-rw-r--r--src/crypto/SymmetricCipher.cpp125
-rw-r--r--src/crypto/SymmetricCipher.h56
9 files changed, 504 insertions, 1 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 606799fc7..0a1c0ba91 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -24,6 +24,10 @@ set(keepassx_SOURCES
core/Metadata.cpp
core/TimeInfo.cpp
core/Uuid.cpp
+ crypto/Crypto.cpp
+ crypto/CryptoHash.cpp
+ crypto/Random.cpp
+ crypto/SymmetricCipher.cpp
format/KeePass2XmlReader.cpp
format/KeePass2XmlWriter.cpp
gui/DatabaseWidget.cpp
@@ -36,4 +40,4 @@ set(keepassx_SOURCES
automoc4_add_library( keepassx_core STATIC ${keepassx_SOURCES} )
automoc4_add_executable( ${PROGNAME} WIN32 MACOSX_BUNDLE main.cpp )
-target_link_libraries( ${PROGNAME} keepassx_core ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} )
+target_link_libraries( ${PROGNAME} keepassx_core ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${LIBGCRYPT_LIBS} )
diff --git a/src/crypto/Crypto.cpp b/src/crypto/Crypto.cpp
new file mode 100644
index 000000000..8bba447c9
--- /dev/null
+++ b/src/crypto/Crypto.cpp
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2010 Felix Geyer <debfx@fobos.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 or (at your option)
+ * version 3 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "Crypto.h"
+
+#include <QtCore/QMutex>
+
+#include <gcrypt.h>
+
+bool Crypto::m_initiated(false);
+
+int gcry_qt_mutex_init(void** p_sys)
+{
+ *p_sys = new QMutex();
+ return 0;
+}
+
+int gcry_qt_mutex_destroy(void** p_sys)
+{
+ delete reinterpret_cast<QMutex*>(*p_sys);
+ return 0;
+}
+
+int gcry_qt_mutex_lock(void** p_sys)
+{
+ reinterpret_cast<QMutex*>(*p_sys)->lock();
+ return 0;
+}
+
+int gcry_qt_mutex_unlock(void** p_sys)
+{
+ reinterpret_cast<QMutex*>(*p_sys)->unlock();
+ return 0;
+}
+
+static const struct gcry_thread_cbs gcry_threads_qt =
+{
+ GCRY_THREAD_OPTION_USER,
+ NULL,
+ gcry_qt_mutex_init,
+ gcry_qt_mutex_destroy,
+ gcry_qt_mutex_lock,
+ gcry_qt_mutex_unlock
+};
+
+Crypto::Crypto()
+{
+}
+
+void Crypto::init()
+{
+ if (m_initiated) {
+ return;
+ }
+
+ gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_qt);
+ gcry_check_version(0);
+ gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0);
+
+ m_initiated = true;
+}
+
+bool Crypto::selfTest()
+{
+ return (gcry_control(GCRYCTL_SELFTEST) == 0);
+}
diff --git a/src/crypto/Crypto.h b/src/crypto/Crypto.h
new file mode 100644
index 000000000..fb2b0e75a
--- /dev/null
+++ b/src/crypto/Crypto.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2010 Felix Geyer <debfx@fobos.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 or (at your option)
+ * version 3 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef KEEPASSX_CRYPTO_H
+#define KEEPASSX_CRYPTO_H
+
+class Crypto
+{
+public:
+ static void init();
+ static bool selfTest();
+
+private:
+ Crypto();
+ static bool m_initiated;
+};
+
+#endif // KEEPASSX_CRYPTO_H
diff --git a/src/crypto/CryptoHash.cpp b/src/crypto/CryptoHash.cpp
new file mode 100644
index 000000000..9421e7f1e
--- /dev/null
+++ b/src/crypto/CryptoHash.cpp
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2010 Felix Geyer <debfx@fobos.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 or (at your option)
+ * version 3 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "CryptoHash.h"
+
+#include "gcrypt.h"
+
+class CryptoHashPrivate
+{
+public:
+ gcry_md_hd_t ctx;
+ int hashLen;
+};
+
+CryptoHash::CryptoHash(CryptoHash::Algorithm algo)
+ : d_ptr(new CryptoHashPrivate())
+{
+ Q_D(CryptoHash);
+
+ int algoGcrypt;
+
+ switch (algo) {
+ case CryptoHash::Sha256:
+ algoGcrypt = GCRY_MD_SHA256;
+ break;
+
+ default:
+ Q_ASSERT(false);
+ break;
+ }
+
+ gcry_md_open(&d->ctx, algoGcrypt, 0); // TODO error handling
+
+ d->hashLen = gcry_md_get_algo_dlen(algoGcrypt);
+}
+
+CryptoHash::~CryptoHash()
+{
+ Q_D(CryptoHash);
+
+ gcry_md_close(d->ctx);
+
+ delete d_ptr;
+}
+
+void CryptoHash::addData(const QByteArray& data)
+{
+ Q_D(CryptoHash);
+
+ gcry_md_write(d->ctx, data.constData(), data.size());
+}
+
+void CryptoHash::reset()
+{
+ Q_D(CryptoHash);
+
+ gcry_md_reset(d->ctx);
+}
+
+QByteArray CryptoHash::result() const
+{
+ Q_D(const CryptoHash);
+
+ const char* result = reinterpret_cast<const char*>(gcry_md_read(d->ctx, 0));
+ return QByteArray(result, d->hashLen);
+}
+
+QByteArray CryptoHash::hash(const QByteArray& data, CryptoHash::Algorithm algo)
+{
+ // replace with gcry_md_hash_buffer()?
+ CryptoHash cryptoHash(algo);
+ cryptoHash.addData(data);
+ return cryptoHash.result();
+}
diff --git a/src/crypto/CryptoHash.h b/src/crypto/CryptoHash.h
new file mode 100644
index 000000000..eafd7375f
--- /dev/null
+++ b/src/crypto/CryptoHash.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2010 Felix Geyer <debfx@fobos.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 or (at your option)
+ * version 3 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef KEEPASSX_CRYPTOHASH_H
+#define KEEPASSX_CRYPTOHASH_H
+
+#include <QtCore/QByteArray>
+
+class CryptoHashPrivate;
+
+class CryptoHash
+{
+public:
+ enum Algorithm
+ {
+ Sha256
+ };
+
+ CryptoHash(CryptoHash::Algorithm algo);
+ ~CryptoHash();
+ void addData(const QByteArray& data);
+ void reset();
+ QByteArray result() const;
+
+ static QByteArray hash(const QByteArray& data, CryptoHash::Algorithm algo);
+
+private:
+ CryptoHashPrivate* const d_ptr;
+ Q_DECLARE_PRIVATE(CryptoHash);
+};
+
+#endif // KEEPASSX_CRYPTOHASH_H
diff --git a/src/crypto/Random.cpp b/src/crypto/Random.cpp
new file mode 100644
index 000000000..0d6d77168
--- /dev/null
+++ b/src/crypto/Random.cpp
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2010 Felix Geyer <debfx@fobos.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 or (at your option)
+ * version 3 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "Random.h"
+
+#include <gcrypt.h>
+
+void Random::randomize(QByteArray& ba)
+{
+ gcry_randomize(ba.data(), ba.size(), GCRY_STRONG_RANDOM);
+}
+
+QByteArray Random::randomArray(int len)
+{
+ QByteArray ba;
+ ba.resize(len);
+
+ randomize(ba);
+
+ return ba;
+}
+
+Random::Random()
+{
+}
diff --git a/src/crypto/Random.h b/src/crypto/Random.h
new file mode 100644
index 000000000..a93f5a3c7
--- /dev/null
+++ b/src/crypto/Random.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2010 Felix Geyer <debfx@fobos.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 or (at your option)
+ * version 3 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef KEEPASSX_RANDOM_H
+#define KEEPASSX_RANDOM_H
+
+#include <QtCore/QByteArray>
+
+class Random
+{
+public:
+ static void randomize(QByteArray& ba);
+ static QByteArray randomArray(int len);
+
+private:
+ Random();
+};
+
+#endif // KEEPASSX_RANDOM_H
diff --git a/src/crypto/SymmetricCipher.cpp b/src/crypto/SymmetricCipher.cpp
new file mode 100644
index 000000000..bce17b475
--- /dev/null
+++ b/src/crypto/SymmetricCipher.cpp
@@ -0,0 +1,125 @@
+/*
+* Copyright (C) 2010 Felix Geyer <debfx@fobos.de>
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 2 or (at your option)
+* version 3 of the License.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "SymmetricCipher.h"
+
+#include <gcrypt.h>
+
+class SymmetricCipherPrivate
+{
+public:
+ gcry_cipher_hd_t ctx;
+ SymmetricCipher::Direction direction;
+ QByteArray key;
+};
+
+SymmetricCipher::SymmetricCipher(SymmetricCipher::Algorithm algo, SymmetricCipher::Mode mode,
+ SymmetricCipher::Direction direction, const QByteArray& key, const QByteArray& iv)
+ : d_ptr(new SymmetricCipherPrivate())
+{
+ Q_D(SymmetricCipher);
+
+ d->direction = direction;
+ d->key = key;
+
+ int algoGcrypt;
+
+ switch (algo) {
+ case SymmetricCipher::Aes256:
+ algoGcrypt = GCRY_CIPHER_AES256;
+ break;
+
+ default:
+ Q_ASSERT(false);
+ break;
+ }
+
+ int modeGcrypt;
+
+ switch (mode) {
+ case SymmetricCipher::Ecb:
+ modeGcrypt = GCRY_CIPHER_MODE_ECB;
+ break;
+
+ case SymmetricCipher::Cbc:
+ modeGcrypt = GCRY_CIPHER_MODE_CBC;
+ break;
+
+ default:
+ Q_ASSERT(false);
+ break;
+ }
+
+ gcry_error_t error;
+
+ error = gcry_cipher_open(&d->ctx, algoGcrypt, modeGcrypt, 0);
+ Q_ASSERT(error == 0); // TODO real error checking
+ error = gcry_cipher_setkey(d->ctx, d->key.constData(), d->key.size()); // TODO is key copied to gcrypt data structure?
+ Q_ASSERT(error == 0);
+ error = gcry_cipher_setiv(d->ctx, iv.constData(), iv.size());
+ Q_ASSERT(error == 0);
+}
+
+SymmetricCipher::~SymmetricCipher()
+{
+ Q_D(SymmetricCipher);
+
+ gcry_cipher_close(d->ctx);
+
+ delete d_ptr;
+}
+
+QByteArray SymmetricCipher::process(const QByteArray& data)
+{
+ Q_D(SymmetricCipher);
+
+ // TODO check block size
+
+ QByteArray result;
+ result.resize(data.size());
+
+ gcry_error_t error;
+
+ if (d->direction == SymmetricCipher::Decrypt) {
+ error = gcry_cipher_decrypt(d->ctx, result.data(), data.size(), data.constData(), data.size());
+ }
+ else {
+ error = gcry_cipher_encrypt(d->ctx, result.data(), data.size(), data.constData(), data.size());
+ }
+
+ Q_ASSERT(error == 0);
+
+ return result;
+}
+
+void SymmetricCipher::processInPlace(QByteArray& data)
+{
+ Q_D(SymmetricCipher);
+
+ // TODO check block size
+
+ gcry_error_t error;
+
+ if (d->direction == SymmetricCipher::Decrypt) {
+ error = gcry_cipher_decrypt(d->ctx, data.data(), data.size(), 0, 0);
+ }
+ else {
+ error = gcry_cipher_encrypt(d->ctx, data.data(), data.size(), 0, 0);
+ }
+
+ Q_ASSERT(error == 0);
+}
diff --git a/src/crypto/SymmetricCipher.h b/src/crypto/SymmetricCipher.h
new file mode 100644
index 000000000..43dde2478
--- /dev/null
+++ b/src/crypto/SymmetricCipher.h
@@ -0,0 +1,56 @@
+/*
+* Copyright (C) 2010 Felix Geyer <debfx@fobos.de>
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 2 or (at your option)
+* version 3 of the License.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef KEEPASSX_SYMMETRICCIPHER_H
+#define KEEPASSX_SYMMETRICCIPHER_H
+
+#include <QtCore/QByteArray>
+
+class SymmetricCipherPrivate;
+
+class SymmetricCipher
+{
+public:
+ enum Algorithm
+ {
+ Aes256
+ };
+
+ enum Mode
+ {
+ Cbc,
+ Ecb
+ };
+
+ enum Direction
+ {
+ Decrypt,
+ Encrypt
+ };
+
+ SymmetricCipher(SymmetricCipher::Algorithm algo, SymmetricCipher::Mode mode,
+ SymmetricCipher::Direction direction, const QByteArray& key, const QByteArray& iv);
+ ~SymmetricCipher();
+ QByteArray process(const QByteArray& data);
+ void processInPlace(QByteArray& data);
+
+private:
+ SymmetricCipherPrivate* const d_ptr;
+ Q_DECLARE_PRIVATE(SymmetricCipher);
+};
+
+#endif // KEEPASSX_SYMMETRICCIPHER_H