diff options
| author | Stefan Suhren <suhren.stefan@fh-swf.de> | 2015-09-21 20:38:56 +0200 |
|---|---|---|
| committer | Stefan Suhren <suhren.stefan@fh-swf.de> | 2015-09-21 20:44:17 +0200 |
| commit | f57cfd7285dca6dfd16ceec22332436cee3de9cd (patch) | |
| tree | af3362463c5dca7d8e5530a95534b7bc1924f056 /crypt/hybridcrypt.cpp | |
| parent | c69cbcc54549f1733eefd8c275d083c6fa44cc26 (diff) | |
| download | src-f57cfd7285dca6dfd16ceec22332436cee3de9cd.tar.gz src-f57cfd7285dca6dfd16ceec22332436cee3de9cd.zip | |
Nutze DER und zeige Nutzerschlüsselstatus
Der Im/Export von bzw. in DER funktioniert. Außerdem kann nun von außen
überprüft werden, ob ein Nutzerschlüssel angelegt bzw. importiert wurde.
Werfe einen Fehler, falls ein Nutzerschlüssel nicht vom Typ RSA ist.
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; |
