• source navigation  • diff markup  • identifier search  • freetext search  • 

Sources/uhttpd/tls.c

  1 /*
  2  * uhttpd - Tiny single-threaded httpd
  3  *
  4  *   Copyright (C) 2010-2013 Jo-Philipp Wich <xm@subsignal.org>
  5  *   Copyright (C) 2013 Felix Fietkau <nbd@openwrt.org>
  6  *
  7  * Permission to use, copy, modify, and/or distribute this software for any
  8  * purpose with or without fee is hereby granted, provided that the above
  9  * copyright notice and this permission notice appear in all copies.
 10  *
 11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 18  */
 19 
 20 #include <dlfcn.h>
 21 #include "uhttpd.h"
 22 #include "tls.h"
 23 
 24 #ifdef __APPLE__
 25 #define LIB_EXT "dylib"
 26 #else
 27 #define LIB_EXT "so"
 28 #endif
 29 
 30 static struct ustream_ssl_ops *ops;
 31 static void *dlh;
 32 static void *ctx;
 33 
 34 int uh_tls_init(const char *key, const char *crt)
 35 {
 36         static bool _init = false;
 37 
 38         if (_init)
 39                 return 0;
 40 
 41         _init = true;
 42         dlh = dlopen("libustream-ssl." LIB_EXT, RTLD_LAZY | RTLD_LOCAL);
 43         if (!dlh) {
 44                 fprintf(stderr, "Failed to load ustream-ssl library: %s\n", dlerror());
 45                 return -ENOENT;
 46         }
 47 
 48         ops = dlsym(dlh, "ustream_ssl_ops");
 49         if (!ops) {
 50                 fprintf(stderr, "Could not find required symbol 'ustream_ssl_ops' in ustream-ssl library\n");
 51                 return -ENOENT;
 52         }
 53 
 54         ctx = ops->context_new(true);
 55         if (!ctx) {
 56                 fprintf(stderr, "Failed to initialize ustream-ssl\n");
 57                 return -EINVAL;
 58         }
 59 
 60         if (ops->context_set_crt_file(ctx, crt) ||
 61             ops->context_set_key_file(ctx, key)) {
 62                 fprintf(stderr, "Failed to load certificate/key files\n");
 63                 return -EINVAL;
 64         }
 65 
 66         return 0;
 67 }
 68 
 69 static void tls_ustream_read_cb(struct ustream *s, int bytes)
 70 {
 71         struct client *cl = container_of(s, struct client, ssl.stream);
 72 
 73         uh_client_read_cb(cl);
 74 }
 75 
 76 static void tls_ustream_write_cb(struct ustream *s, int bytes)
 77 {
 78         struct client *cl = container_of(s, struct client, ssl.stream);
 79 
 80         if (cl->dispatch.write_cb)
 81                 cl->dispatch.write_cb(cl);
 82 }
 83 
 84 static void tls_notify_state(struct ustream *s)
 85 {
 86         struct client *cl = container_of(s, struct client, ssl.stream);
 87 
 88         uh_client_notify_state(cl);
 89 }
 90 
 91 void uh_tls_client_attach(struct client *cl)
 92 {
 93         cl->us = &cl->ssl.stream;
 94         ops->init(&cl->ssl, &cl->sfd.stream, ctx, true);
 95         cl->us->notify_read = tls_ustream_read_cb;
 96         cl->us->notify_write = tls_ustream_write_cb;
 97         cl->us->notify_state = tls_notify_state;
 98 }
 99 
100 void uh_tls_client_detach(struct client *cl)
101 {
102         ustream_free(&cl->ssl.stream);
103 }
104 

This page was automatically generated by LXR 0.3.1.  •  OpenWrt