summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Suhren <suhren.stefan@fh-swf.de>2015-09-08 21:12:57 +0200
committerStefan Suhren <suhren.stefan@fh-swf.de>2015-09-08 22:01:52 +0200
commit4a1df49ff88ed854d7e9863764ebdb2946527a09 (patch)
tree29b69bea776a605874886595ce99cfbd5c2456ec
parent446fa96040485c700e23e2511c4fa6922aa3f7a5 (diff)
downloadsrc-4a1df49ff88ed854d7e9863764ebdb2946527a09.tar.gz
src-4a1df49ff88ed854d7e9863764ebdb2946527a09.zip
Implementiere Teile von exportUserKeypair und update Kommentare
Die Funktion exportUserKeypair kann momentan nur den privaten Schlüssel exportieren. Die Kommentare machen es nun klarer, dass die angegebenen Dateien überschrieben werden. Eine Methode zum Speicherfreimachen wurde hinzugefügt um Duplizierung zu vermeiden. Und throw sollte kein new Enthalten, da wir nicht in Java sind.
-rw-r--r--crypt/hybridcrypt.cpp47
-rw-r--r--crypt/hybridcrypt.h15
2 files changed, 54 insertions, 8 deletions
diff --git a/crypt/hybridcrypt.cpp b/crypt/hybridcrypt.cpp
index 66b8b6b..9c0e437 100644
--- a/crypt/hybridcrypt.cpp
+++ b/crypt/hybridcrypt.cpp
@@ -22,10 +22,7 @@ HybridCrypt::HybridCrypt()
HybridCrypt::~HybridCrypt()
{
// Räume Nutzerschlüssel auf
- if (userKeypair != NULL)
- {
- EVP_PKEY_free(userKeypair);
- }
+ freeKeyIfNotNull();
// Räume OpenSSL auf
// Entferne alle Hash- und Verschlüsselungsalgorithmen
@@ -57,6 +54,9 @@ void HybridCrypt::createKeypair()
{
if (isCsprngSeeded())
{
+ // Räume den alten Schlüssel vorher ab
+ freeKeyIfNotNull();
+
// Lege Schlüsselkontextvariable an
EVP_PKEY_CTX *ctx = NULL;
@@ -96,7 +96,34 @@ void HybridCrypt::importUserKeypair(QString keyfileName, QString password)
void HybridCrypt::exportUserKeypair(QString keyfileName, QString password)
{
+ if (userKeypair != NULL && isCsprngSeeded())
+ {
+ FILE *keyfile = fopen(keyfileName.toStdString().c_str(), "w+");
+
+ // Teste ob die Datei zum Schreiben geöffnet werden konnte
+ if (keyfile == NULL)
+ {
+ throw CryptException("Konnte Datei nicht schreiben: " +
+ keyfileName.toStdString(), 1);
+ }
+
+ // Wird benutzt um die OpenSSL Fehler aufzufangen
+ int opensslReturnError = 0;
+
+ // Wenn password ein Leerstring ist, verschlüssele den privaten Schlüssel nicht
+ opensslReturnError = PEM_write_PKCS8PrivateKey(keyfile, userKeypair,
+ (password == "") ? NULL : EVP_aes_256_cbc(), NULL, 0, NULL,
+ (void *) password.toStdString().c_str());
+
+ // Räume die Ressourcen auf
+ fclose(keyfile);
+ // Wirf einen Fehler, falls OpenSSL ein Problem hatte
+ if (!opensslReturnError)
+ {
+ throwOpenSslException();
+ }
+ }
}
void HybridCrypt::exportPublicUserKey(QString keyfileName)
@@ -113,5 +140,15 @@ void HybridCrypt::throwOpenSslException()
{
QString errorMsg("OpenSSL Fehler. Fehlermeldung: ");
errorMsg.append(ERR_error_string(ERR_get_error(), NULL));
- throw new CryptException(errorMsg.toStdString(), 5);
+ throw CryptException(errorMsg.toStdString(), 5);
+}
+
+
+void HybridCrypt::freeKeyIfNotNull()
+{
+ if (userKeypair != NULL)
+ {
+ EVP_PKEY_free(userKeypair);
+ userKeypair = NULL;
+ }
}
diff --git a/crypt/hybridcrypt.h b/crypt/hybridcrypt.h
index ed691d2..8b1e022 100644
--- a/crypt/hybridcrypt.h
+++ b/crypt/hybridcrypt.h
@@ -1,6 +1,8 @@
#ifndef HYBRIDCRYPT_H
#define HYBRIDCRYPT_H
+#include <cstdio>
+
#include <QByteArray>
#include <QFile>
#include <QString>
@@ -10,6 +12,7 @@
#include <openssl/conf.h>
#include <openssl/evp.h>
#include <openssl/err.h>
+#include <openssl/pem.h>
#include <openssl/rand.h>
#include <openssl/rsa.h>
@@ -67,7 +70,7 @@ public:
/**
* @brief HybridCrypt::exportUserKeypair
* Exportiert das Schlüsselpaar des Nutzers im (PEM|DER|NET|ASC) Format.
- * @param keyfileName Der Name der Datei in die das Schlüsselpaar exportiert wird.
+ * @param keyfileName Der Name der Datei in die das Schlüsselpaar exportiert wird (wird angelegt/überschrieben).
* @param password Das Password mit dem der private Schlüssel des Nutzers verschlüsselt wird.
*/
void exportUserKeypair(QString keyfileName, QString password);
@@ -76,12 +79,12 @@ public:
/**
* @brief HybridCrypt::exportPublicUserKey
* Exportiert den öffentlichen Schlüssel des Nutzers im (PEM|DER|NET|ASC) Format.
- * @param keyfileName Der Name der Datei in den der öffentliche Schlüssel exportiert wird.
+ * @param keyfileName Der Name der Datei in den der öffentliche Schlüssel exportiert wird (wird angelegt/überschrieben).
*/
void exportPublicUserKey(QString keyfileName);
private:
- EVP_PKEY *userKeypair;
+ EVP_PKEY *userKeypair; // Enthält nur den privaten Schlüssel, da OpenSSL nicht mehr braucht.
/**
* @brief isCsprngSeeded
@@ -95,6 +98,12 @@ private:
* Wirft eine Exception mit dem OpenSSL Fehler.
*/
void throwOpenSslException();
+
+ /**
+ * @brief freeKeyIfNotNull
+ * Gibt den Speicher vom Nutzerschlüssel frei, falls er existiert.
+ */
+ void freeKeyIfNotNull();
};
#endif // HYBRIDCRYPT_H