Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/master/ssl-init-openssl.c @ 9259:ea2eed32d59e HEAD
cache file: If offset isn't 32bit aligned, assume it's corrupted.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 26 Jul 2009 22:40:02 -0400 |
parents | b9faf4db2a9f |
children | 00cd9aacd03c |
rev | line source |
---|---|
8590
b9faf4db2a9f
Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1 /* Copyright (c) 2002-2009 Dovecot authors, see the included COPYING file */ |
622 | 2 |
3 #include "common.h" | |
3888
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
4 #include "write-full.h" |
622 | 5 #include "ssl-init.h" |
6 | |
1529
edffbb824d96
was missing #ifdef HAVE_OPENSSL
Timo Sirainen <tss@iki.fi>
parents:
1501
diff
changeset
|
7 #ifdef HAVE_OPENSSL |
edffbb824d96
was missing #ifdef HAVE_OPENSSL
Timo Sirainen <tss@iki.fi>
parents:
1501
diff
changeset
|
8 |
4298
2e4639fd3c7c
Give a nicer error message if i2d_DHparams() returns 0, which apparently it
Timo Sirainen <tss@iki.fi>
parents:
3888
diff
changeset
|
9 #include <openssl/err.h> |
3888
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
10 #include <openssl/ssl.h> |
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
11 |
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
12 /* 2 or 5. Haven't seen their difference explained anywhere, but 2 is the |
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
13 default.. */ |
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
14 #define DH_GENERATOR 2 |
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
15 |
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
16 static int dh_param_bitsizes[] = { 512, 1024 }; |
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
17 |
4299
dacf4dc615ec
Reversed last change. Instead handle DH_generate_parameters() call's failure.
Timo Sirainen <tss@iki.fi>
parents:
4298
diff
changeset
|
18 static const char *ssl_last_error(void) |
dacf4dc615ec
Reversed last change. Instead handle DH_generate_parameters() call's failure.
Timo Sirainen <tss@iki.fi>
parents:
4298
diff
changeset
|
19 { |
dacf4dc615ec
Reversed last change. Instead handle DH_generate_parameters() call's failure.
Timo Sirainen <tss@iki.fi>
parents:
4298
diff
changeset
|
20 unsigned long err; |
dacf4dc615ec
Reversed last change. Instead handle DH_generate_parameters() call's failure.
Timo Sirainen <tss@iki.fi>
parents:
4298
diff
changeset
|
21 char *buf; |
dacf4dc615ec
Reversed last change. Instead handle DH_generate_parameters() call's failure.
Timo Sirainen <tss@iki.fi>
parents:
4298
diff
changeset
|
22 size_t err_size = 256; |
dacf4dc615ec
Reversed last change. Instead handle DH_generate_parameters() call's failure.
Timo Sirainen <tss@iki.fi>
parents:
4298
diff
changeset
|
23 |
dacf4dc615ec
Reversed last change. Instead handle DH_generate_parameters() call's failure.
Timo Sirainen <tss@iki.fi>
parents:
4298
diff
changeset
|
24 err = ERR_get_error(); |
dacf4dc615ec
Reversed last change. Instead handle DH_generate_parameters() call's failure.
Timo Sirainen <tss@iki.fi>
parents:
4298
diff
changeset
|
25 if (err == 0) |
dacf4dc615ec
Reversed last change. Instead handle DH_generate_parameters() call's failure.
Timo Sirainen <tss@iki.fi>
parents:
4298
diff
changeset
|
26 return strerror(errno); |
dacf4dc615ec
Reversed last change. Instead handle DH_generate_parameters() call's failure.
Timo Sirainen <tss@iki.fi>
parents:
4298
diff
changeset
|
27 |
dacf4dc615ec
Reversed last change. Instead handle DH_generate_parameters() call's failure.
Timo Sirainen <tss@iki.fi>
parents:
4298
diff
changeset
|
28 buf = t_malloc(err_size); |
dacf4dc615ec
Reversed last change. Instead handle DH_generate_parameters() call's failure.
Timo Sirainen <tss@iki.fi>
parents:
4298
diff
changeset
|
29 buf[err_size-1] = '\0'; |
dacf4dc615ec
Reversed last change. Instead handle DH_generate_parameters() call's failure.
Timo Sirainen <tss@iki.fi>
parents:
4298
diff
changeset
|
30 ERR_error_string_n(err, buf, err_size-1); |
dacf4dc615ec
Reversed last change. Instead handle DH_generate_parameters() call's failure.
Timo Sirainen <tss@iki.fi>
parents:
4298
diff
changeset
|
31 return buf; |
dacf4dc615ec
Reversed last change. Instead handle DH_generate_parameters() call's failure.
Timo Sirainen <tss@iki.fi>
parents:
4298
diff
changeset
|
32 } |
dacf4dc615ec
Reversed last change. Instead handle DH_generate_parameters() call's failure.
Timo Sirainen <tss@iki.fi>
parents:
4298
diff
changeset
|
33 |
3888
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
34 static void generate_dh_parameters(int bitsize, int fd, const char *fname) |
622 | 35 { |
3888
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
36 DH *dh = DH_generate_parameters(bitsize, DH_GENERATOR, NULL, NULL); |
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
37 unsigned char *buf, *p; |
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
38 int len; |
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
39 |
4299
dacf4dc615ec
Reversed last change. Instead handle DH_generate_parameters() call's failure.
Timo Sirainen <tss@iki.fi>
parents:
4298
diff
changeset
|
40 if (dh == NULL) { |
dacf4dc615ec
Reversed last change. Instead handle DH_generate_parameters() call's failure.
Timo Sirainen <tss@iki.fi>
parents:
4298
diff
changeset
|
41 i_fatal("DH_generate_parameters(bits=%d, gen=%d) failed: %s", |
dacf4dc615ec
Reversed last change. Instead handle DH_generate_parameters() call's failure.
Timo Sirainen <tss@iki.fi>
parents:
4298
diff
changeset
|
42 bitsize, DH_GENERATOR, ssl_last_error()); |
dacf4dc615ec
Reversed last change. Instead handle DH_generate_parameters() call's failure.
Timo Sirainen <tss@iki.fi>
parents:
4298
diff
changeset
|
43 } |
dacf4dc615ec
Reversed last change. Instead handle DH_generate_parameters() call's failure.
Timo Sirainen <tss@iki.fi>
parents:
4298
diff
changeset
|
44 |
3888
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
45 len = i2d_DHparams(dh, NULL); |
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
46 if (len < 0) |
4299
dacf4dc615ec
Reversed last change. Instead handle DH_generate_parameters() call's failure.
Timo Sirainen <tss@iki.fi>
parents:
4298
diff
changeset
|
47 i_fatal("i2d_DHparams() failed: %s", ssl_last_error()); |
3888
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
48 |
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
49 buf = p = i_malloc(len); |
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
50 len = i2d_DHparams(dh, &p); |
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
51 |
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
52 if (write_full(fd, &bitsize, sizeof(bitsize)) < 0 || |
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
53 write_full(fd, &len, sizeof(len)) < 0 || |
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
54 write_full(fd, buf, len) < 0) |
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
55 i_fatal("write_full() failed for file %s: %m", fname); |
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
56 i_free(buf); |
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
57 } |
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
58 |
6418
46d9ee79f292
Removed _ prefix from all public APIs.
Timo Sirainen <tss@iki.fi>
parents:
5089
diff
changeset
|
59 void ssl_generate_parameters(int fd, const char *fname) |
3888
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
60 { |
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
61 unsigned int i; |
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
62 int bits; |
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
63 |
6494
59490181469e
Use N_ELEMENTS() macro instead of doing sizeof()/sizeof([0]) ourself.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
64 for (i = 0; i < N_ELEMENTS(dh_param_bitsizes); i++) |
3888
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
65 generate_dh_parameters(dh_param_bitsizes[i], fd, fname); |
650701d41cdf
Generate DH parameters and use them. Changed default regeneration time to 1
Timo Sirainen <tss@iki.fi>
parents:
1529
diff
changeset
|
66 bits = 0; |
5089 | 67 if (write_full(fd, &bits, sizeof(bits)) < 0) |
68 i_fatal("write_full() failed for file %s: %m", fname); | |
622 | 69 } |
1529
edffbb824d96
was missing #ifdef HAVE_OPENSSL
Timo Sirainen <tss@iki.fi>
parents:
1501
diff
changeset
|
70 |
edffbb824d96
was missing #ifdef HAVE_OPENSSL
Timo Sirainen <tss@iki.fi>
parents:
1501
diff
changeset
|
71 #endif |