summaryrefslogtreecommitdiffstats
path: root/crypt/hybridcrypt.cpp
blob: 7376459fa5c5fb2c5b7a3f7e4acee287c8aa7afc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include "hybridcrypt.h"

HybridCrypt::HybridCrypt()
{
    // Initialisiere Nutzerschlüssel mit NULL
    privateUserkey = NULL;
    publicUserkey = NULL;

    // Lade die menschenlesbaren Fehlerstrings für LibCrypto
    ERR_load_crypto_strings();

    // Lade alle Hash- und  Verschlüsselungsalgorithmen
    OpenSSL_add_all_algorithms();

    // Lade Konfigurationsdatei und andere wichtige Initialisierungen
    OPENSSL_config(NULL);

    // Zeige ob der Zufallszahlengenerator initialisiert wurde
    qDebug() << "Zufallszahlengenerator erfolgreich initialisiert: " <<
             isCsprngSeeded();
}

HybridCrypt::~HybridCrypt()
{
    // Räume Nutzerschlüssel auf
    if (privateUserkey != NULL)
    {
        EVP_PKEY_free(privateUserkey);
    }

    if (publicUserkey != NULL)
    {
        EVP_PKEY_free(publicUserkey);
    }

    // Räume OpenSSL auf
    // Entferne alle Hash- und Verschlüsselungsalgorithmen
    EVP_cleanup();

    // Falls das nächste Ausgelassen wird, könnte ein Speicherleck auftreten,
    // wenn die BIO Api verwendet wurde (Base64 transformationen)
    CRYPTO_cleanup_all_ex_data();

    // Lösche den CSPRNG sicher
    RAND_cleanup();

    // Entferne Fehlerstrings
    ERR_free_strings();
}

void HybridCrypt::encrypt(QString infileName, QString outfileName,
                          QVector<QString> recipientKeyfileNames)
{

}

void HybridCrypt::decrypt(QString infileName, QString outfileName)
{

}

void HybridCrypt::createKeypair()
{
    if (isCsprngSeeded())
    {
        // Lege Schlüsselkontextvariable an
        EVP_PKEY_CTX *ctx = NULL;

        // Erzeuge den Schlüsselkontext
        if (!(ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL)))
        {
            throwOpenSslException();
        }

        // Initialisiere den Schlüsselgenerator
        if (EVP_PKEY_keygen_init(ctx) <= 0)
        {
            throwOpenSslException();
        }

        // Lege den Schlüssel mit 2048 Bit an
        if (EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, 2048) <= 0)
        {
            throwOpenSslException();
        }

        // Erzeuge den Schlüssel
        if (EVP_PKEY_keygen(ctx, &privateUserkey) <= 0)
        {
            throwOpenSslException();
        }

        // Räume den Schlüsselkontext ab
        EVP_PKEY_CTX_free(ctx);
    }
}

void HybridCrypt::importUserKeypair(QString keyfileName, QString password)
{

}

void HybridCrypt::exportUserKeypair(QString keyfileName, QString password)
{

}

void HybridCrypt::exportPublicUserKey(QString keyfileName)
{

}

bool HybridCrypt::isCsprngSeeded()
{
    return RAND_status() == 1;
}

void HybridCrypt::throwOpenSslException()
{
    QString errorMsg("OpenSSL Fehler. Fehlermeldung: ");
    errorMsg.append(ERR_error_string(ERR_get_error(), NULL));
    throw new CryptException(errorMsg.toStdString(), 5);
}