diff options
Diffstat (limited to 'crypt/hybridcrypt.cpp')
| -rw-r--r-- | crypt/hybridcrypt.cpp | 118 |
1 files changed, 93 insertions, 25 deletions
diff --git a/crypt/hybridcrypt.cpp b/crypt/hybridcrypt.cpp index a9b410d..05e9995 100644 --- a/crypt/hybridcrypt.cpp +++ b/crypt/hybridcrypt.cpp @@ -84,30 +84,10 @@ void HybridCrypt::encrypt(QString infileName, QString outfileName, EVP_PKEY *tmpKey; QByteArray tmpData; - FILE *tmpKeyfile; for (int i = 0; i < recipientKeyfileNames.length(); i++) { - tmpKeyfile = fopen(recipientKeyfileNames[i].toStdString().c_str(), "r"); - - // Datei existiert nicht - if (tmpKeyfile == NULL) - { - throw CryptException("Datei nicht gefunden: " + - recipientKeyfileNames[i].toStdString(), CryptException::FileNotFound); - } - - // Ließ den aktuellen Empfängerschlüssel ein - tmpKey = PEM_read_PUBKEY(tmpKeyfile, NULL, NULL, NULL); - - // Räume die Ressourcen auf - fclose(tmpKeyfile); - - // Wirf Fehler, falls der Schlüssel nicht gelesen werden konnte - if (tmpKey == NULL) - { - throwOpenSslException(); - } + tmpKey = readRecipientKey(recipientKeyfileNames[i]); // Schreibe den Header in die Datei tmpData = encryptAesData(tmpKey, aesKey + aesIv); @@ -341,9 +321,26 @@ void HybridCrypt::importUserKeypair(QString keyfileName, QString password) CryptException::FileNotFound); } - // Ließ den Schlüssel des Nutzers ein - userKeypair = PEM_read_PrivateKey(keyfile, NULL, NULL, - (void *) password.toStdString().c_str()); + // Ließ den Schlüssel des Nutzers anhand der Erweiterung ein + QString keyfileExtension = keyfileName.right(3).toLower(); + + if (keyfileExtension == "pem") + { + userKeypair = PEM_read_PrivateKey(keyfile, NULL, NULL, + (void *) password.toStdString().c_str()); + } + else if (keyfileExtension == "der") + { + userKeypair = d2i_PKCS8PrivateKey_fp(keyfile, NULL, NULL, + (void *) password.toStdString().c_str()); + } + else + { + // Räume die Ressourcen auf + fclose(keyfile); + throw CryptException("Dateiformat wird nicht unterstützt.", + CryptException::FormatNotSupported); + } // Räume die Ressourcen auf fclose(keyfile); @@ -374,6 +371,7 @@ void HybridCrypt::exportUserKeypair(QString keyfileName, QString password) } // Wenn password ein Leerstring ist, verschlüssele den privaten Schlüssel nicht + // Wird nur im PEM-Format exportiert int opensslReturnError = PEM_write_PKCS8PrivateKey(keyfile, userKeypair, (password.isEmpty()) ? NULL : EVP_aes_256_cbc(), NULL, 0, NULL, (void *) password.toStdString().c_str()); @@ -401,7 +399,26 @@ void HybridCrypt::exportPublicUserKey(QString keyfileName) keyfileName.toStdString(), CryptException::FileNotWritable); } - int opensslReturnError = PEM_write_PUBKEY(keyfile, userKeypair); + int opensslReturnError; + + // Wähle Funktion zum Schreiben des öffentlichen Schlüssels anhand der Dateierweiterung aus + QString keyfileExtension = keyfileName.right(3).toLower(); + + if (keyfileExtension == "pem") + { + opensslReturnError = PEM_write_PUBKEY(keyfile, userKeypair); + } + else if (keyfileExtension == "der") + { + opensslReturnError = i2d_PUBKEY_fp(keyfile, userKeypair); + } + else + { + // Räume die Ressourcen auf + fclose(keyfile); + throw CryptException("Dateiformat wird nicht unterstützt.", + CryptException::FormatNotSupported); + } // Räume die Ressourcen auf fclose(keyfile); @@ -413,6 +430,11 @@ void HybridCrypt::exportPublicUserKey(QString keyfileName) } } +bool HybridCrypt::isUserKeyInitialised() +{ + return userKeypair == NULL; +} + /* * Private Funktionen */ @@ -549,6 +571,52 @@ QByteArray HybridCrypt::decryptAesData(EVP_PKEY *pkey, QByteArray data) return out; } +EVP_PKEY *HybridCrypt::readRecipientKey(QString keyfileName) +{ + FILE *tmpKeyfile = fopen(keyfileName.toStdString().c_str(), "r"); + + // Datei existiert nicht + if (tmpKeyfile == NULL) + { + throw CryptException("Datei nicht gefunden: " + + keyfileName.toStdString(), CryptException::FileNotFound); + } + + EVP_PKEY *tmpKey; + + // Entscheide welche Funktion zu benutzen ist + QString keyfileExtension = keyfileName.right(3).toLower(); + + if (keyfileExtension == "pem") + { + tmpKey = PEM_read_PUBKEY(tmpKeyfile, NULL, NULL, NULL); + } + else if (keyfileExtension == "der") + { + tmpKey = d2i_PUBKEY_fp(tmpKeyfile, NULL); + } + else + { + // Räume die Ressourcen auf + fclose(tmpKeyfile); + throw CryptException("Dateiformat wird nicht unterstützt.", + CryptException::FormatNotSupported); + } + + // Räume die Ressourcen auf + fclose(tmpKeyfile); + + // Wirf Fehler, falls der Schlüssel nicht gelesen werden konnte + if (tmpKey == NULL) + { + throwOpenSslException(); + } + + throwExceptionIfEvpKeyIsNotRsa(&tmpKey); + + return tmpKey; +} + bool HybridCrypt::isCsprngSeeded() { return RAND_status() == 1; |
