summaryrefslogtreecommitdiffstats
path: root/crypt/hybridcrypt.h
blob: ed691d28b38b8e690bd5f22e987b483ac025eb79 (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
#ifndef HYBRIDCRYPT_H
#define HYBRIDCRYPT_H

#include <QByteArray>
#include <QFile>
#include <QString>
#include <QVector>
#include <QDebug>

#include <openssl/conf.h>
#include <openssl/evp.h>
#include <openssl/err.h>
#include <openssl/rand.h>
#include <openssl/rsa.h>

#include "cryptexception.h"

class HybridCrypt
{
public:

    /**
     * @brief HybridCrypt::HybridCrypt
     * Initialisiert OpenSSL.
     */
    HybridCrypt();

    /**
     * @brief HybridCrypt::~HybridCrypt
     * Räumt OpenSSL auf.
     */
    ~HybridCrypt();

    /**
     * @brief HybridCrypt::encrypt
     * Ließt eine Datei ein und schreibt diese verschlüsselt
     * mit den übergebenen Schlüsseln und dem Nutzerschlüssel.
     * @param infileName Der Name der zu verschlüsselnde Datei.
     * @param outfileName Der Name der verschlüsselten Datei (wird angelegt/überschrieben).
     * @param recipientKeyfileNames Die Schlüssel der empfänger, mit denen die Datei verschlüsselt wird.
     */
    void encrypt(QString infileName, QString outfileName, QVector<QString> recipientKeyfileNames);

    /**
     * @brief HybridCrypt::decrypt
     * Entschlüsselt die übergeben Datei mit dem Nutzerschlüssel und schreibt diese entschlüsselt.
     * @param infileName Der Name der zu entschlüsselnden Datei.
     * @param outfileName Der Name der entschlüsselten Datei (wird angelegt/überschrieben).
     */
    void decrypt(QString infileName, QString outfileName);

    /**
     * @brief HybridCrypt::createKeypair
     * Erzeugt sicher ein neues RSA Schlüsselpaar zur Verwendung in #encrypt und #decrypt.
     * Sollte mittel #exportUserKeypair exportiert werden.
     */
    void createKeypair();

    /**
     * @brief HybridCrypt::importUserKeypair
     * Importiert das Schlüsselpaar des Nutzers zur Verwendung in #encrypt und #decrypt.
     * @param keyfileName Der Name der Schlüsseldatei im (PEM|DER|NET|ASC) Format, die importiert werden soll.
     * @param password Das Password mit dem der private Schlüssel in der Datei verschlüsselt ist.
     */
    void importUserKeypair(QString keyfileName, QString password);

    /**
     * @brief HybridCrypt::exportUserKeypair
     * Exportiert das Schlüsselpaar des Nutzers im (PEM|DER|NET|ASC) Format.
     * @param keyfileName Der Name der Datei in die das Schlüsselpaar exportiert wird.
     * @param password Das Password mit dem der private Schlüssel des Nutzers verschlüsselt wird.
     */
    void exportUserKeypair(QString keyfileName, QString password);


    /**
     * @brief HybridCrypt::exportPublicUserKey
     * Exportiert den öffentlichen Schlüssel des Nutzers im (PEM|DER|NET|ASC) Format.
     * @param keyfileName Der Name der Datei in den der öffentliche Schlüssel exportiert wird.
     */
    void exportPublicUserKey(QString keyfileName);

private:
    EVP_PKEY *userKeypair;

    /**
     * @brief isCsprngSeeded
     * Gibt an, ob der Zufallszahlengenerator von OpenSSL mit ausreichend Entropie initialisiert wurde.
     * @return Gibt wahr zurück wenn ausreichend intialisert wurde, ansonsten falsch.
     */
    bool isCsprngSeeded();

    /**
     * @brief throwOpenSslException
     * Wirft eine Exception mit dem OpenSSL Fehler.
     */
    void throwOpenSslException();
};

#endif // HYBRIDCRYPT_H