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