summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Suhren <suhren.stefan@fh-swf.de>2015-09-14 14:45:26 +0200
committerStefan Suhren <suhren.stefan@fh-swf.de>2015-09-15 13:12:40 +0200
commit0764b73f6a61160ad6765f17073110d8236b68d1 (patch)
tree6c94a0e280634c323766a1471fdc0be1b778a9c5
parentc529186d9c9f71054ea1cf92bfb4c25721d5cf78 (diff)
downloadsrc-0764b73f6a61160ad6765f17073110d8236b68d1.tar.gz
src-0764b73f6a61160ad6765f17073110d8236b68d1.zip
Importiere nur RSA Schlüssel
-rw-r--r--crypt/hybridcrypt.cpp33
-rw-r--r--crypt/hybridcrypt.h27
2 files changed, 47 insertions, 13 deletions
diff --git a/crypt/hybridcrypt.cpp b/crypt/hybridcrypt.cpp
index fbe6791..c408bf1 100644
--- a/crypt/hybridcrypt.cpp
+++ b/crypt/hybridcrypt.cpp
@@ -22,7 +22,7 @@ HybridCrypt::HybridCrypt()
HybridCrypt::~HybridCrypt()
{
// Räume Nutzerschlüssel auf
- freeKeyIfNotNull();
+ freeEvpKey(&userKeypair);
// Räume OpenSSL auf
// Entferne alle Hash- und Verschlüsselungsalgorithmen
@@ -55,7 +55,7 @@ void HybridCrypt::createKeypair()
if (isCsprngSeeded())
{
// Räume den alten Schlüssel vorher ab
- freeKeyIfNotNull();
+ freeEvpKey(&userKeypair);
// Lege Schlüsselkontextvariable an
EVP_PKEY_CTX *ctx = NULL;
@@ -92,7 +92,7 @@ void HybridCrypt::createKeypair()
void HybridCrypt::importUserKeypair(QString keyfileName, QString password)
{
// Räume den alten Schlüssel vorher ab
- freeKeyIfNotNull();
+ freeEvpKey(&userKeypair);
FILE *keyfile = fopen(keyfileName.toStdString().c_str(), "r");
@@ -114,6 +114,9 @@ void HybridCrypt::importUserKeypair(QString keyfileName, QString password)
{
throwOpenSslException();
}
+
+ // Wirf Exception, falls kein RSA Schlüssel importiert wurde
+ throwExceptionIfEvpKeyIsNotRsa(&userKeypair);
}
void HybridCrypt::exportUserKeypair(QString keyfileName, QString password)
@@ -171,11 +174,20 @@ void HybridCrypt::exportPublicUserKey(QString keyfileName)
}
}
+/*
+ * Private Funktionen
+ */
+
bool HybridCrypt::isCsprngSeeded()
{
return RAND_status() == 1;
}
+bool HybridCrypt::isKeyRsa(EVP_PKEY *key)
+{
+ return EVP_PKEY_type(key->type) == EVP_PKEY_RSA;
+}
+
void HybridCrypt::throwOpenSslException()
{
QString errorMsg("OpenSSL Fehler. Fehlermeldung: ");
@@ -183,12 +195,17 @@ void HybridCrypt::throwOpenSslException()
throw CryptException(errorMsg.toStdString(), 5);
}
-
-void HybridCrypt::freeKeyIfNotNull()
+void HybridCrypt::throwExceptionIfEvpKeyIsNotRsa(EVP_PKEY **key)
{
- if (userKeypair != NULL)
+ if (!isKeyRsa(*key))
{
- EVP_PKEY_free(userKeypair);
- userKeypair = NULL;
+ freeEvpKey(key);
+ throw CryptException("Nur RSA Schlüssel werden unterstüzt.", 6);
}
}
+
+void HybridCrypt::freeEvpKey(EVP_PKEY **key)
+{
+ EVP_PKEY_free(*key);
+ *key = NULL;
+}
diff --git a/crypt/hybridcrypt.h b/crypt/hybridcrypt.h
index 28f5dfb..602844e 100644
--- a/crypt/hybridcrypt.h
+++ b/crypt/hybridcrypt.h
@@ -4,10 +4,11 @@
#include <cstdio>
#include <QByteArray>
+#include <QDataStream>
+#include <QDebug>
#include <QFile>
#include <QString>
#include <QVector>
-#include <QDebug>
#include <openssl/conf.h>
#include <openssl/evp.h>
@@ -96,16 +97,32 @@ private:
bool isCsprngSeeded();
/**
+ * @brief isKeyRsa
+ * Überprüft, ob der Schlüssel vom Typ RSA ist.
+ * @param key Der Schlüssel, der überprüft wird.
+ * @return Gibt wahr zurück, falls Key vom Typ RSA ist, ansonsten flasch.
+ */
+ bool isKeyRsa(EVP_PKEY *key);
+
+ /**
* @brief throwOpenSslException
- * Wirft eine Exception mit dem OpenSSL Fehler.
+ * Wirft eine CryptException mit dem OpenSSL Fehler.
*/
void throwOpenSslException();
/**
- * @brief freeKeyIfNotNull
- * Gibt den Speicher vom Nutzerschlüssel frei, falls er existiert.
+ * @brief throwExceptionIfEvpKeyIsNotRsa
+ * Wirft eine CryptException, falls der Schlüssel nicht RSA ist.
+ * @param key Der Pointer, der auf NULL gesetzt wird, nachdem der Schlüssel abgräumt wurde.
+ */
+ void throwExceptionIfEvpKeyIsNotRsa(EVP_PKEY **key);
+
+ /**
+ * @brief freeEvpKey
+ * Räumt den Schlüssel hinter key ab.
+ * @param key Der Pointer, der auf NULL gesetzt wird.
*/
- void freeKeyIfNotNull();
+ void freeEvpKey(EVP_PKEY **key);
};
#endif // HYBRIDCRYPT_H