summaryrefslogtreecommitdiffstats
path: root/crypt
diff options
context:
space:
mode:
Diffstat (limited to 'crypt')
-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