summaryrefslogtreecommitdiffstats
path: root/crypt/hybridcrypt.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'crypt/hybridcrypt.cpp')
-rw-r--r--crypt/hybridcrypt.cpp118
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;