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,6 +29,8 @@ | ||
29 | #include <stdio.h> // for printf() and fprintf() | 29 | #include <stdio.h> // for printf() and fprintf() |
30 | #include <poll.h> // for poll system call and related | 30 | #include <poll.h> // for poll system call and related |
31 | 31 | ||
32 | +#include <openssl/ssl.h> | ||
33 | + | ||
32 | #include "class.h" | 34 | #include "class.h" |
33 | #include "socket.h" | 35 | #include "socket.h" |
34 | #include "logger.h" | 36 | #include "logger.h" |
@@ -43,6 +45,8 @@ struct conns { | @@ -43,6 +45,8 @@ struct conns { | ||
43 | CLASS(Server) { | 45 | CLASS(Server) { |
44 | Logger logger; | 46 | Logger logger; |
45 | Sock sock; | 47 | Sock sock; |
48 | + Sock sockSSL; | ||
49 | + SSL_CTX * ctx; | ||
46 | void * worker; | 50 | void * worker; |
47 | 51 | ||
48 | nfds_t nfds; | 52 | nfds_t nfds; |
@@ -24,6 +24,9 @@ | @@ -24,6 +24,9 @@ | ||
24 | #include <unistd.h> | 24 | #include <unistd.h> |
25 | #include <stdlib.h> | 25 | #include <stdlib.h> |
26 | 26 | ||
27 | +#include <openssl/ssl.h> | ||
28 | +#include <openssl/err.h> | ||
29 | + | ||
27 | #include "class.h" | 30 | #include "class.h" |
28 | #include "server.h" | 31 | #include "server.h" |
29 | #include "socket.h" | 32 | #include "socket.h" |
@@ -57,16 +60,36 @@ serverCtor(void * _this, va_list * params) | @@ -57,16 +60,36 @@ serverCtor(void * _this, va_list * params) | ||
57 | 60 | ||
58 | this->fds = calloc(sizeof(struct pollfd), this->max_fds); | 61 | this->fds = calloc(sizeof(struct pollfd), this->max_fds); |
59 | this->conns = calloc(sizeof(struct conns), this->max_fds); | 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 | flags = fcntl(this->sock->handle, F_GETFL, 0); | 65 | flags = fcntl(this->sock->handle, F_GETFL, 0); |
63 | fcntl(this->sock->handle, F_SETFL, flags | O_NONBLOCK); | 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 | socketListen(this->sock, backlog); | 85 | socketListen(this->sock, backlog); |
86 | + socketListen(this->sockSSL, backlog); | ||
66 | 87 | ||
67 | (this->fds)[0].fd = this->sock->handle; | 88 | (this->fds)[0].fd = this->sock->handle; |
68 | (this->fds)[0].events = POLLIN; | 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 | return 0; | 94 | return 0; |
72 | } | 95 | } |
@@ -80,8 +103,16 @@ serverDtor(void * _this) | @@ -80,8 +103,16 @@ serverDtor(void * _this) | ||
80 | 103 | ||
81 | for (i=0; i<this->nfds; i++) { | 104 | for (i=0; i<this->nfds; i++) { |
82 | if (this->sock->handle != (this->fds)[i].fd) { | 105 | if (this->sock->handle != (this->fds)[i].fd) { |
106 | + Stream st = (this->conns[(this->fds)[i].fd]).stream; | ||
107 | + | ||
83 | delete((this->conns[(this->fds)[i].fd]).sock); | 108 | delete((this->conns[(this->fds)[i].fd]).sock); |
84 | delete((this->conns[(this->fds)[i].fd]).worker); | 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 | delete((this->conns[(this->fds)[i].fd]).stream); | 116 | delete((this->conns[(this->fds)[i].fd]).stream); |
86 | } | 117 | } |
87 | } | 118 | } |
@@ -90,6 +121,9 @@ serverDtor(void * _this) | @@ -90,6 +121,9 @@ serverDtor(void * _this) | ||
90 | FREE(this->conns); | 121 | FREE(this->conns); |
91 | 122 | ||
92 | delete(this->sock); | 123 | delete(this->sock); |
124 | + delete(this->sockSSL); | ||
125 | + SSL_CTX_free(this->ctx); | ||
126 | + ERR_free_strings(); | ||
93 | } | 127 | } |
94 | 128 | ||
95 | INIT_IFACE(Class, serverCtor, serverDtor, NULL); | 129 | INIT_IFACE(Class, serverCtor, serverDtor, NULL); |
@@ -25,14 +25,21 @@ | @@ -25,14 +25,21 @@ | ||
25 | 25 | ||
26 | #include "server.h" | 26 | #include "server.h" |
27 | #include "interface/class.h" | 27 | #include "interface/class.h" |
28 | +#include "stream.h" | ||
28 | 29 | ||
29 | void | 30 | void |
30 | serverCloseConn(Server this, unsigned int i) | 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 | delete((this->conns)[fd].sock); | 36 | delete((this->conns)[fd].sock); |
35 | delete((this->conns)[fd].worker); | 37 | delete((this->conns)[fd].worker); |
38 | + | ||
39 | + if (NULL != st && STREAM_SSL == st->type) { | ||
40 | + SSL_shutdown((st->handle).ssl); | ||
41 | + } | ||
42 | + | ||
36 | delete((this->conns)[fd].stream); | 43 | delete((this->conns)[fd].stream); |
37 | 44 | ||
38 | memset(&(this->fds[i]), 0, sizeof(struct pollfd)); | 45 | memset(&(this->fds[i]), 0, sizeof(struct pollfd)); |
@@ -24,6 +24,8 @@ | @@ -24,6 +24,8 @@ | ||
24 | #include <stdio.h> | 24 | #include <stdio.h> |
25 | #include <stdlib.h> | 25 | #include <stdlib.h> |
26 | 26 | ||
27 | +#include <openssl/ssl.h> | ||
28 | + | ||
27 | #include "http/worker.h" | 29 | #include "http/worker.h" |
28 | #include "server.h" | 30 | #include "server.h" |
29 | #include "interface/class.h" | 31 | #include "interface/class.h" |
@@ -31,16 +33,37 @@ | @@ -31,16 +33,37 @@ | ||
31 | #include "stream.h" | 33 | #include "stream.h" |
32 | 34 | ||
33 | int | 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 | if (this->nfds >= this->max_fds) { | 42 | if (this->nfds >= this->max_fds) { |
40 | return -1; | 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 | if (-1 != acc->handle) { | 68 | if (-1 != acc->handle) { |
46 | // save the socket handle | 69 | // save the socket handle |
@@ -48,7 +71,7 @@ serverHandleAccept(Server this) | @@ -48,7 +71,7 @@ serverHandleAccept(Server this) | ||
48 | 71 | ||
49 | // clone worker | 72 | // clone worker |
50 | (this->conns)[acc->handle].worker = clone(this->worker); | 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 | (this->fds)[this->nfds].fd = acc->handle; | 76 | (this->fds)[this->nfds].fd = acc->handle; |
54 | (this->fds)[this->nfds].events = POLLIN; | 77 | (this->fds)[this->nfds].events = POLLIN; |
@@ -38,7 +38,7 @@ serverPoll(Server this) { | @@ -38,7 +38,7 @@ serverPoll(Server this) { | ||
38 | /** | 38 | /** |
39 | * put all closed fds to end of array in O(this->nfds) | 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 | struct pollfd * fdb = &(this->fds[this->nfds-1]); | 42 | struct pollfd * fdb = &(this->fds[this->nfds-1]); |
43 | 43 | ||
44 | while (fda <= fdb) { | 44 | while (fda <= fdb) { |
@@ -26,7 +26,7 @@ | @@ -26,7 +26,7 @@ | ||
26 | #include "utils/signalHandling.h" | 26 | #include "utils/signalHandling.h" |
27 | 27 | ||
28 | int serverPoll(Server); | 28 | int serverPoll(Server); |
29 | -int serverHandleAccept(Server); | 29 | +int serverHandleAccept(Server, unsigned int); |
30 | void serverCloseConn(Server, unsigned int); | 30 | void serverCloseConn(Server, unsigned int); |
31 | ssize_t serverRead(Server, unsigned int); | 31 | ssize_t serverRead(Server, unsigned int); |
32 | ssize_t serverWrite(Server, unsigned int); | 32 | ssize_t serverWrite(Server, unsigned int); |
@@ -50,12 +50,22 @@ serverRun(Server this) | @@ -50,12 +50,22 @@ serverRun(Server this) | ||
50 | */ | 50 | */ |
51 | if (0 != ((this->fds)[0].revents & POLLIN)) { | 51 | if (0 != ((this->fds)[0].revents & POLLIN)) { |
52 | events--; | 52 | events--; |
53 | - while(-1 != serverHandleAccept(this) && 0 < naccs) { | 53 | + while(-1 != serverHandleAccept(this, 0) && 0 < naccs) { |
54 | naccs--; | 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 | int nreads = 10, nwrites = 10; | 69 | int nreads = 10, nwrites = 10; |
60 | 70 | ||
61 | /** | 71 | /** |
Please
register
or
login
to post a comment