diff options
Diffstat (limited to 'crypt/hybridcrypt.cpp')
| -rw-r--r-- | crypt/hybridcrypt.cpp | 47 |
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; + } } |
