Commit f1215c675853ddf876f69cc40f955810fcb42af4

Authored by Georg Hopp
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.
  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-----
... ...
  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 /**
... ...
... ... @@ -40,6 +40,7 @@
40 40 #include "http/worker.h"
41 41
42 42 #include "interface/class.h"
  43 +#include "interface/logger.h"
43 44
44 45 #include "utils/signalHandling.h"
45 46
... ...
Please register or login to post a comment