Commit f1215c675853ddf876f69cc40f955810fcb42af4
1 parent
4893b417
closes #19: first integration of OpenSSL...this makes leak testing with valgrind…
… a pain so i will think about some conditional to activate and deactivate it. Additionally it seems that some memory will be left over somewhere, maybe i missed somed cleanup function i have to call and finally the integration really needs error handling.
Showing
9 changed files
with
123 additions
and
12 deletions
certs/server.crt
0 → 100644
1 | +-----BEGIN CERTIFICATE----- | |
2 | +MIICrzCCAhgCCQDgHe3rh23alDANBgkqhkiG9w0BAQUFADCBmzELMAkGA1UEBhMC | |
3 | +REUxEDAOBgNVBAgMB0hhbWJ1cmcxEDAOBgNVBAcMB0hhbWJ1cmcxGjAYBgNVBAoM | |
4 | +EVdlaXJkIFdlYiBXb3JrZXJzMRQwEgYDVQQLDAtkZXZlbG9wbWVudDETMBEGA1UE | |
5 | +AwwKR2VvcmcgSG9wcDEhMB8GCSqGSIb3DQEJARYSZ2VvcmdAc3RlZmZlcnMub3Jn | |
6 | +MB4XDTEyMDMwOTExMjUxOVoXDTEzMDMwOTExMjUxOVowgZsxCzAJBgNVBAYTAkRF | |
7 | +MRAwDgYDVQQIDAdIYW1idXJnMRAwDgYDVQQHDAdIYW1idXJnMRowGAYDVQQKDBFX | |
8 | +ZWlyZCBXZWIgV29ya2VyczEUMBIGA1UECwwLZGV2ZWxvcG1lbnQxEzARBgNVBAMM | |
9 | +Ckdlb3JnIEhvcHAxITAfBgkqhkiG9w0BCQEWEmdlb3JnQHN0ZWZmZXJzLm9yZzCB | |
10 | +nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAt5ntW8UUwImTL0s3l7Jm2AkMqBvk | |
11 | ++XCDjkO3g89dxfYyRaYjluANnUqeg/ilF2ZcxI/8GVlCBTDbsJeQXFtlRFr94S2d | |
12 | +i1358dZkjGIQAutmtwf8L1nbYi6mtvS6wBWJhtE9baPfj6HDRePnAC/YtKunKfz9 | |
13 | +5TbOj+/2vjj//I8CAwEAATANBgkqhkiG9w0BAQUFAAOBgQCWVZuqshFdOC3Vmf/7 | |
14 | +CKrtA8/da2tgOIFB60LwGwcWicM3m/VIS6RPf3Ui/sUDFMempkmtkUYflr58T901 | |
15 | +SAV5YubjNV3oaOySqDozsvfLsAxb7EUXk4VqY/g5VkK+pUxVAfE1biqf6LhPHzRd | |
16 | +KJrq5muIGeVx3YX1G9A1gdI0YQ== | |
17 | +-----END CERTIFICATE----- | ... | ... |
certs/server.key
0 → 100644
1 | +-----BEGIN RSA PRIVATE KEY----- | |
2 | +MIICXgIBAAKBgQC3me1bxRTAiZMvSzeXsmbYCQyoG+T5cIOOQ7eDz13F9jJFpiOW | |
3 | +4A2dSp6D+KUXZlzEj/wZWUIFMNuwl5BcW2VEWv3hLZ2LXfnx1mSMYhAC62a3B/wv | |
4 | +WdtiLqa29LrAFYmG0T1to9+PocNF4+cAL9i0q6cp/P3lNs6P7/a+OP/8jwIDAQAB | |
5 | +AoGAMbOEkpwmQvy7EElvUixkNMU2XOe4M2Im6sMgEZl4DBfaggo4hiY+6T6C7LzJ | |
6 | +jC0Unc1QdFg6TAdu4T4WQToojkODjEXWd/QRltxJjkCz2vrDp68JldzfTovE2HDn | |
7 | +k5MQvUZCrH1jFnvzwC1Ak+X4ON5hlsu67u2EYNTfdEeTI6ECQQDwm6DNNjsGynGy | |
8 | +W+zCCGTPjuwYHG7zjaGQw9Ng7g+SyYHkg0zSsxcVpwKwI3m3Iuju1O85pgcl/Bj9 | |
9 | +UDuPdtLxAkEAw1i3ZyGxW/CHmk8mG4w31eC7loyjFgN51lSJE7DrZ3VtKnzRwUrk | |
10 | +EEUgQMh1RxWKTc5F8QvmMpkWJha2+FTHfwJBALDtwBEnD8CunWzKrA8CnR8DuhkA | |
11 | +z5XJUEVjusxMQqduBlZDNvq5NwB1D0T20UoaIa9+ZWu+6wLDnpynoySb/AECQQDB | |
12 | +EDY63EbQqfkrHdx4z20DmZdsZFRuVkMc+/F6H5mYZ6rbmf8ofR7HoboNrNCTz4sf | |
13 | ++KSRZgQ9r6T/QeXVqtx7AkEApiC8VAYhH0Dz+Y6QSRqwjOww0kDBCnFlrdn+oyG4 | |
14 | +kAC34PCOFHzvSsJ3tjcAwNJgcaN/qw49DRnHBlwti6gyBg== | |
15 | +-----END RSA PRIVATE KEY----- | ... | ... |
... | ... | @@ -29,6 +29,8 @@ |
29 | 29 | #include <stdio.h> // for printf() and fprintf() |
30 | 30 | #include <poll.h> // for poll system call and related |
31 | 31 | |
32 | +#include <openssl/ssl.h> | |
33 | + | |
32 | 34 | #include "class.h" |
33 | 35 | #include "socket.h" |
34 | 36 | #include "logger.h" |
... | ... | @@ -43,6 +45,8 @@ struct conns { |
43 | 45 | CLASS(Server) { |
44 | 46 | Logger logger; |
45 | 47 | Sock sock; |
48 | + Sock sockSSL; | |
49 | + SSL_CTX * ctx; | |
46 | 50 | void * worker; |
47 | 51 | |
48 | 52 | nfds_t nfds; | ... | ... |
... | ... | @@ -24,6 +24,9 @@ |
24 | 24 | #include <unistd.h> |
25 | 25 | #include <stdlib.h> |
26 | 26 | |
27 | +#include <openssl/ssl.h> | |
28 | +#include <openssl/err.h> | |
29 | + | |
27 | 30 | #include "class.h" |
28 | 31 | #include "server.h" |
29 | 32 | #include "socket.h" |
... | ... | @@ -57,16 +60,36 @@ serverCtor(void * _this, va_list * params) |
57 | 60 | |
58 | 61 | this->fds = calloc(sizeof(struct pollfd), this->max_fds); |
59 | 62 | this->conns = calloc(sizeof(struct conns), this->max_fds); |
60 | - this->sock = new(Sock, this->logger, port); | |
61 | 63 | |
64 | + this->sock = new(Sock, this->logger, port); | |
62 | 65 | flags = fcntl(this->sock->handle, F_GETFL, 0); |
63 | 66 | fcntl(this->sock->handle, F_SETFL, flags | O_NONBLOCK); |
64 | 67 | |
68 | + this->sockSSL = new(Sock, this->logger, port+1); | |
69 | + flags = fcntl(this->sockSSL->handle, F_GETFL, 0); | |
70 | + fcntl(this->sockSSL->handle, F_SETFL, flags | O_NONBLOCK); | |
71 | + | |
72 | + SSL_library_init(); | |
73 | + SSL_load_error_strings(); | |
74 | + this->ctx = SSL_CTX_new(SSLv23_server_method()); | |
75 | + SSL_CTX_use_certificate_file( | |
76 | + this->ctx, | |
77 | + "./certs/server.crt", | |
78 | + SSL_FILETYPE_PEM); | |
79 | + | |
80 | + SSL_CTX_use_RSAPrivateKey_file( | |
81 | + this->ctx, | |
82 | + "./certs/server.key", | |
83 | + SSL_FILETYPE_PEM); | |
84 | + | |
65 | 85 | socketListen(this->sock, backlog); |
86 | + socketListen(this->sockSSL, backlog); | |
66 | 87 | |
67 | 88 | (this->fds)[0].fd = this->sock->handle; |
68 | 89 | (this->fds)[0].events = POLLIN; |
69 | - this->nfds = 1; | |
90 | + (this->fds)[1].fd = this->sockSSL->handle; | |
91 | + (this->fds)[1].events = POLLIN; | |
92 | + this->nfds = 2; | |
70 | 93 | |
71 | 94 | return 0; |
72 | 95 | } |
... | ... | @@ -80,8 +103,16 @@ serverDtor(void * _this) |
80 | 103 | |
81 | 104 | for (i=0; i<this->nfds; i++) { |
82 | 105 | if (this->sock->handle != (this->fds)[i].fd) { |
106 | + Stream st = (this->conns[(this->fds)[i].fd]).stream; | |
107 | + | |
83 | 108 | delete((this->conns[(this->fds)[i].fd]).sock); |
84 | 109 | delete((this->conns[(this->fds)[i].fd]).worker); |
110 | + | |
111 | + if (NULL != st && STREAM_SSL == st->type) { | |
112 | + SSL_shutdown((st->handle).ssl); | |
113 | + SSL_free((st->handle).ssl); | |
114 | + } | |
115 | + | |
85 | 116 | delete((this->conns[(this->fds)[i].fd]).stream); |
86 | 117 | } |
87 | 118 | } |
... | ... | @@ -90,6 +121,9 @@ serverDtor(void * _this) |
90 | 121 | FREE(this->conns); |
91 | 122 | |
92 | 123 | delete(this->sock); |
124 | + delete(this->sockSSL); | |
125 | + SSL_CTX_free(this->ctx); | |
126 | + ERR_free_strings(); | |
93 | 127 | } |
94 | 128 | |
95 | 129 | INIT_IFACE(Class, serverCtor, serverDtor, NULL); | ... | ... |
... | ... | @@ -25,14 +25,21 @@ |
25 | 25 | |
26 | 26 | #include "server.h" |
27 | 27 | #include "interface/class.h" |
28 | +#include "stream.h" | |
28 | 29 | |
29 | 30 | void |
30 | 31 | serverCloseConn(Server this, unsigned int i) |
31 | 32 | { |
32 | - int fd = (this->fds)[i].fd; | |
33 | + int fd = (this->fds)[i].fd; | |
34 | + Stream st = (this->conns[(this->fds)[i].fd]).stream; | |
33 | 35 | |
34 | 36 | delete((this->conns)[fd].sock); |
35 | 37 | delete((this->conns)[fd].worker); |
38 | + | |
39 | + if (NULL != st && STREAM_SSL == st->type) { | |
40 | + SSL_shutdown((st->handle).ssl); | |
41 | + } | |
42 | + | |
36 | 43 | delete((this->conns)[fd].stream); |
37 | 44 | |
38 | 45 | memset(&(this->fds[i]), 0, sizeof(struct pollfd)); | ... | ... |
... | ... | @@ -24,6 +24,8 @@ |
24 | 24 | #include <stdio.h> |
25 | 25 | #include <stdlib.h> |
26 | 26 | |
27 | +#include <openssl/ssl.h> | |
28 | + | |
27 | 29 | #include "http/worker.h" |
28 | 30 | #include "server.h" |
29 | 31 | #include "interface/class.h" |
... | ... | @@ -31,16 +33,37 @@ |
31 | 33 | #include "stream.h" |
32 | 34 | |
33 | 35 | int |
34 | -serverHandleAccept(Server this) | |
36 | +serverHandleAccept(Server this, unsigned int i) | |
35 | 37 | { |
36 | - char remoteAddr[16] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; | |
37 | - Sock acc = NULL; | |
38 | + char remoteAddr[16] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; | |
39 | + Sock acc = NULL; | |
40 | + Stream st; | |
38 | 41 | |
39 | 42 | if (this->nfds >= this->max_fds) { |
40 | 43 | return -1; |
41 | 44 | } |
42 | 45 | |
43 | - acc = socketAccept(this->sock, &remoteAddr); | |
46 | + switch(i) { | |
47 | + case 0: | |
48 | + // no SSL | |
49 | + acc = socketAccept(this->sock, &remoteAddr); | |
50 | + st = new(Stream, STREAM_FD, acc->handle); | |
51 | + break; | |
52 | + | |
53 | + case 1: | |
54 | + // SSL | |
55 | + { | |
56 | + SSL * ssl = SSL_new(this->ctx); | |
57 | + acc = socketAccept(this->sockSSL, &remoteAddr); | |
58 | + SSL_set_fd(ssl, acc->handle); | |
59 | + SSL_accept(ssl); | |
60 | + st = new(Stream, STREAM_SSL, ssl); | |
61 | + } | |
62 | + break; | |
63 | + | |
64 | + default: | |
65 | + break; | |
66 | + } | |
44 | 67 | |
45 | 68 | if (-1 != acc->handle) { |
46 | 69 | // save the socket handle |
... | ... | @@ -48,7 +71,7 @@ serverHandleAccept(Server this) |
48 | 71 | |
49 | 72 | // clone worker |
50 | 73 | (this->conns)[acc->handle].worker = clone(this->worker); |
51 | - (this->conns)[acc->handle].stream = new(Stream, STREAM_FD, acc->handle); | |
74 | + (this->conns)[acc->handle].stream = st; | |
52 | 75 | |
53 | 76 | (this->fds)[this->nfds].fd = acc->handle; |
54 | 77 | (this->fds)[this->nfds].events = POLLIN; | ... | ... |
... | ... | @@ -38,7 +38,7 @@ serverPoll(Server this) { |
38 | 38 | /** |
39 | 39 | * put all closed fds to end of array in O(this->nfds) |
40 | 40 | */ |
41 | - struct pollfd * fda = &(this->fds[1]); | |
41 | + struct pollfd * fda = &(this->fds[2]); | |
42 | 42 | struct pollfd * fdb = &(this->fds[this->nfds-1]); |
43 | 43 | |
44 | 44 | while (fda <= fdb) { | ... | ... |
... | ... | @@ -26,7 +26,7 @@ |
26 | 26 | #include "utils/signalHandling.h" |
27 | 27 | |
28 | 28 | int serverPoll(Server); |
29 | -int serverHandleAccept(Server); | |
29 | +int serverHandleAccept(Server, unsigned int); | |
30 | 30 | void serverCloseConn(Server, unsigned int); |
31 | 31 | ssize_t serverRead(Server, unsigned int); |
32 | 32 | ssize_t serverWrite(Server, unsigned int); |
... | ... | @@ -50,12 +50,22 @@ serverRun(Server this) |
50 | 50 | */ |
51 | 51 | if (0 != ((this->fds)[0].revents & POLLIN)) { |
52 | 52 | events--; |
53 | - while(-1 != serverHandleAccept(this) && 0 < naccs) { | |
53 | + while(-1 != serverHandleAccept(this, 0) && 0 < naccs) { | |
54 | 54 | naccs--; |
55 | 55 | } |
56 | 56 | } |
57 | 57 | |
58 | - for (i=1; i < this->nfds; i++) { | |
58 | + /** | |
59 | + * handle accept SSL | |
60 | + */ | |
61 | + if (0 != ((this->fds)[1].revents & POLLIN)) { | |
62 | + events--; | |
63 | + while(-1 != serverHandleAccept(this, 1) && 0 < naccs) { | |
64 | + naccs--; | |
65 | + } | |
66 | + } | |
67 | + | |
68 | + for (i=2; i < this->nfds; i++) { | |
59 | 69 | int nreads = 10, nwrites = 10; |
60 | 70 | |
61 | 71 | /** | ... | ... |
Please
register
or
login
to post a comment