diff options
| -rw-r--r-- | crypt/hybridcrypt.cpp | 47 | ||||
| -rw-r--r-- | crypt/hybridcrypt.h | 15 |
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 |
