summaryrefslogtreecommitdiffstats
path: root/crypt/hybridcrypt.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'crypt/hybridcrypt.cpp')
-rw-r--r--crypt/hybridcrypt.cpp47
1 files changed, 42 insertions, 5 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;
+ }
}