diff options
| author | Stefan Suhren <suhren.stefan@fh-swf.de> | 2015-09-08 21:12:57 +0200 |
|---|---|---|
| committer | Stefan Suhren <suhren.stefan@fh-swf.de> | 2015-09-08 22:01:52 +0200 |
| commit | 4a1df49ff88ed854d7e9863764ebdb2946527a09 (patch) | |
| tree | 29b69bea776a605874886595ce99cfbd5c2456ec /crypt/hybridcrypt.cpp | |
| parent | 446fa96040485c700e23e2511c4fa6922aa3f7a5 (diff) | |
| download | src-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.
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; + } } |
