From c529186d9c9f71054ea1cf92bfb4c25721d5cf78 Mon Sep 17 00:00:00 2001 From: Stefan Suhren Date: Wed, 9 Sep 2015 13:42:10 +0200 Subject: Implementiere exportPublicUserKey und kleiner Fixe --- crypt/hybridcrypt.cpp | 67 +++++++++++++++++++++++++++++++-------------------- crypt/hybridcrypt.h | 6 +++-- 2 files changed, 45 insertions(+), 28 deletions(-) (limited to 'crypt') diff --git a/crypt/hybridcrypt.cpp b/crypt/hybridcrypt.cpp index 6d0f202..fbe6791 100644 --- a/crypt/hybridcrypt.cpp +++ b/crypt/hybridcrypt.cpp @@ -91,59 +91,79 @@ void HybridCrypt::createKeypair() void HybridCrypt::importUserKeypair(QString keyfileName, QString password) { - if (isCsprngSeeded()) + // Räume den alten Schlüssel vorher ab + freeKeyIfNotNull(); + + FILE *keyfile = fopen(keyfileName.toStdString().c_str(), "r"); + + // Datei existiert nicht + if (keyfile == NULL) { - // Räume den alten Schlüssel vorher ab - freeKeyIfNotNull(); + throw CryptException("Datei nicht gefunden: " + keyfileName.toStdString(), 1); + } + + // Ließ den Schlüssel des Nutzers ein + userKeypair = PEM_read_PrivateKey(keyfile, NULL, NULL, + (void *) password.toStdString().c_str()); + + // Räume die Ressourcen auf + fclose(keyfile); - FILE *keyfile = fopen(keyfileName.toStdString().c_str(), "r"); + // Wirf einen Fehler, falls OpenSSL ein Problem hatte + if (userKeypair == NULL) + { + throwOpenSslException(); + } +} + +void HybridCrypt::exportUserKeypair(QString keyfileName, QString password) +{ + if (userKeypair != NULL && isCsprngSeeded()) + { + FILE *keyfile = fopen(keyfileName.toStdString().c_str(), "w+"); - // Datei existiert nicht + // Teste, ob die Datei zum Schreiben geöffnet werden konnte if (keyfile == NULL) { - throw CryptException("Datei nicht gefunden: " + keyfileName.toStdString(), 1); + throw CryptException("Konnte Datei nicht schreiben: " + + keyfileName.toStdString(), 1); } - // Ließ den Schlüssel des Nutzers ein - userKeypair = PEM_read_PrivateKey(keyfile, NULL, NULL, - (void *) password.toStdString().c_str()); + // Wenn password ein Leerstring ist, verschlüssele den privaten Schlüssel nicht + int opensslReturnError = PEM_write_PKCS8PrivateKey(keyfile, userKeypair, + (password.isEmpty()) ? 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 (userKeypair == NULL) + if (!opensslReturnError) { throwOpenSslException(); } } } -void HybridCrypt::exportUserKeypair(QString keyfileName, QString password) +void HybridCrypt::exportPublicUserKey(QString keyfileName) { - if (userKeypair != NULL && isCsprngSeeded()) + if (userKeypair != NULL) { FILE *keyfile = fopen(keyfileName.toStdString().c_str(), "w+"); - // Teste ob die Datei zum Schreiben geöffnet werden konnte + // 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.isEmpty()) ? NULL : EVP_aes_256_cbc(), NULL, 0, NULL, - (void *) password.toStdString().c_str()); + int opensslReturnError = PEM_write_PUBKEY(keyfile, userKeypair); // Räume die Ressourcen auf fclose(keyfile); - // Wirf einen Fehler, falls OpenSSL ein Problem hatte + // Wirft einen Fehler, falls OpenSSL ein Problem hatte if (!opensslReturnError) { throwOpenSslException(); @@ -151,11 +171,6 @@ void HybridCrypt::exportUserKeypair(QString keyfileName, QString password) } } -void HybridCrypt::exportPublicUserKey(QString keyfileName) -{ - -} - bool HybridCrypt::isCsprngSeeded() { return RAND_status() == 1; diff --git a/crypt/hybridcrypt.h b/crypt/hybridcrypt.h index 8b1e022..28f5dfb 100644 --- a/crypt/hybridcrypt.h +++ b/crypt/hybridcrypt.h @@ -40,9 +40,11 @@ public: * mit den übergebenen Schlüsseln und dem Nutzerschlüssel. * @param infileName Der Name der zu verschlüsselnde Datei. * @param outfileName Der Name der verschlüsselten Datei (wird angelegt/überschrieben). - * @param recipientKeyfileNames Die Schlüssel der empfänger, mit denen die Datei verschlüsselt wird. + * @param recipientKeyfileNames Die Schlüssel der Empfänger, + * mit denen die Datei verschlüsselt wird (Sollte nicht den Nutzerschlüssel enthalten). */ - void encrypt(QString infileName, QString outfileName, QVector recipientKeyfileNames); + void encrypt(QString infileName, QString outfileName, + QVector recipientKeyfileNames); /** * @brief HybridCrypt::decrypt -- cgit v1.2.3-70-g09d2