From 0764b73f6a61160ad6765f17073110d8236b68d1 Mon Sep 17 00:00:00 2001 From: Stefan Suhren Date: Mon, 14 Sep 2015 14:45:26 +0200 Subject: Importiere nur RSA Schlüssel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crypt/hybridcrypt.cpp | 33 +++++++++++++++++++++++++-------- crypt/hybridcrypt.h | 27 ++++++++++++++++++++++----- 2 files changed, 47 insertions(+), 13 deletions(-) (limited to 'crypt') diff --git a/crypt/hybridcrypt.cpp b/crypt/hybridcrypt.cpp index fbe6791..c408bf1 100644 --- a/crypt/hybridcrypt.cpp +++ b/crypt/hybridcrypt.cpp @@ -22,7 +22,7 @@ HybridCrypt::HybridCrypt() HybridCrypt::~HybridCrypt() { // Räume Nutzerschlüssel auf - freeKeyIfNotNull(); + freeEvpKey(&userKeypair); // Räume OpenSSL auf // Entferne alle Hash- und Verschlüsselungsalgorithmen @@ -55,7 +55,7 @@ void HybridCrypt::createKeypair() if (isCsprngSeeded()) { // Räume den alten Schlüssel vorher ab - freeKeyIfNotNull(); + freeEvpKey(&userKeypair); // Lege Schlüsselkontextvariable an EVP_PKEY_CTX *ctx = NULL; @@ -92,7 +92,7 @@ void HybridCrypt::createKeypair() void HybridCrypt::importUserKeypair(QString keyfileName, QString password) { // Räume den alten Schlüssel vorher ab - freeKeyIfNotNull(); + freeEvpKey(&userKeypair); FILE *keyfile = fopen(keyfileName.toStdString().c_str(), "r"); @@ -114,6 +114,9 @@ void HybridCrypt::importUserKeypair(QString keyfileName, QString password) { throwOpenSslException(); } + + // Wirf Exception, falls kein RSA Schlüssel importiert wurde + throwExceptionIfEvpKeyIsNotRsa(&userKeypair); } void HybridCrypt::exportUserKeypair(QString keyfileName, QString password) @@ -171,11 +174,20 @@ void HybridCrypt::exportPublicUserKey(QString keyfileName) } } +/* + * Private Funktionen + */ + bool HybridCrypt::isCsprngSeeded() { return RAND_status() == 1; } +bool HybridCrypt::isKeyRsa(EVP_PKEY *key) +{ + return EVP_PKEY_type(key->type) == EVP_PKEY_RSA; +} + void HybridCrypt::throwOpenSslException() { QString errorMsg("OpenSSL Fehler. Fehlermeldung: "); @@ -183,12 +195,17 @@ void HybridCrypt::throwOpenSslException() throw CryptException(errorMsg.toStdString(), 5); } - -void HybridCrypt::freeKeyIfNotNull() +void HybridCrypt::throwExceptionIfEvpKeyIsNotRsa(EVP_PKEY **key) { - if (userKeypair != NULL) + if (!isKeyRsa(*key)) { - EVP_PKEY_free(userKeypair); - userKeypair = NULL; + freeEvpKey(key); + throw CryptException("Nur RSA Schlüssel werden unterstüzt.", 6); } } + +void HybridCrypt::freeEvpKey(EVP_PKEY **key) +{ + EVP_PKEY_free(*key); + *key = NULL; +} diff --git a/crypt/hybridcrypt.h b/crypt/hybridcrypt.h index 28f5dfb..602844e 100644 --- a/crypt/hybridcrypt.h +++ b/crypt/hybridcrypt.h @@ -4,10 +4,11 @@ #include #include +#include +#include #include #include #include -#include #include #include @@ -95,17 +96,33 @@ private: */ bool isCsprngSeeded(); + /** + * @brief isKeyRsa + * Überprüft, ob der Schlüssel vom Typ RSA ist. + * @param key Der Schlüssel, der überprüft wird. + * @return Gibt wahr zurück, falls Key vom Typ RSA ist, ansonsten flasch. + */ + bool isKeyRsa(EVP_PKEY *key); + /** * @brief throwOpenSslException - * Wirft eine Exception mit dem OpenSSL Fehler. + * Wirft eine CryptException mit dem OpenSSL Fehler. */ void throwOpenSslException(); /** - * @brief freeKeyIfNotNull - * Gibt den Speicher vom Nutzerschlüssel frei, falls er existiert. + * @brief throwExceptionIfEvpKeyIsNotRsa + * Wirft eine CryptException, falls der Schlüssel nicht RSA ist. + * @param key Der Pointer, der auf NULL gesetzt wird, nachdem der Schlüssel abgräumt wurde. + */ + void throwExceptionIfEvpKeyIsNotRsa(EVP_PKEY **key); + + /** + * @brief freeEvpKey + * Räumt den Schlüssel hinter key ab. + * @param key Der Pointer, der auf NULL gesetzt wird. */ - void freeKeyIfNotNull(); + void freeEvpKey(EVP_PKEY **key); }; #endif // HYBRIDCRYPT_H -- cgit v1.2.3-70-g09d2