1 /* vi: set sw=4 ts=4:
2  *
3  * Copyright (C) 2001 - 2012 Christian Hohnstaedt.
4  *
5  * All rights reserved.
6  */
7 
8 #ifndef __DHGEN_H
9 #define __DHGEN_H
10 
11 #include "lib/entropy.h"
12 #include "lib/exception.h"
13 #include "lib/xfile.h"
14 
15 #include <openssl/rand.h>
16 #include <openssl/dh.h>
17 
18 #include <QString>
19 #include <QThread>
20 
21 class DHgen: public QThread
22 {
23 	QString fname;
24 	int bits;
25 
26     public:
27 	errorEx error;
DHgen(const QString & n,int b)28 	DHgen(const QString &n, int b) : QThread()
29 	{
30 		fname = n;
31 		bits = b;
32 	}
filename()33 	const QString &filename() const
34 	{
35 		return fname;
36 	}
37     protected:
run()38 	void run()
39 	{
40 		DH *dh = NULL;
41 		try {
42 #if OPENSSL_VERSION_NUMBER >= 0x10100000L
43 			dh = DH_new();
44 			check_oom(dh);
45 			DH_generate_parameters_ex(dh, bits, 2, NULL);
46 #else
47 			dh = DH_generate_parameters(bits, 2, NULL, NULL);
48 			check_oom(dh);
49 #endif
50 			openssl_error();
51 
52 			XFile file(fname);
53 			file.open_write();
54 			PEM_write_DHparams(file.fp(), dh);
55 			openssl_error();
56 		} catch (errorEx &err) {
57 			error = err;
58 		}
59 		if (dh)
60 			DH_free(dh);
61 	}
62 };
63 #endif
64