[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r27765 - libmicrohttpd/src/microspdy
From: |
gnunet |
Subject: |
[GNUnet-SVN] r27765 - libmicrohttpd/src/microspdy |
Date: |
Fri, 5 Jul 2013 16:25:04 +0200 |
Author: andreyu
Date: 2013-07-05 16:25:04 +0200 (Fri, 05 Jul 2013)
New Revision: 27765
Added:
libmicrohttpd/src/microspdy/io_openssl.c
libmicrohttpd/src/microspdy/io_openssl.h
Removed:
libmicrohttpd/src/microspdy/tls.c
libmicrohttpd/src/microspdy/tls.h
Modified:
libmicrohttpd/src/microspdy/Makefile.am
libmicrohttpd/src/microspdy/applicationlayer.c
libmicrohttpd/src/microspdy/daemon.c
libmicrohttpd/src/microspdy/internal.h
libmicrohttpd/src/microspdy/io.h
libmicrohttpd/src/microspdy/session.c
libmicrohttpd/src/microspdy/structures.h
Log:
spdy: continue - previous one and rename tls to openssl
Modified: libmicrohttpd/src/microspdy/Makefile.am
===================================================================
--- libmicrohttpd/src/microspdy/Makefile.am 2013-07-05 14:04:26 UTC (rev
27764)
+++ libmicrohttpd/src/microspdy/Makefile.am 2013-07-05 14:25:04 UTC (rev
27765)
@@ -16,7 +16,7 @@
libmicrospdy_la_SOURCES = \
io.h \
- tls.h tls.c \
+ io_openssl.h io_openssl.c \
structures.h structures.c \
internal.h internal.c \
daemon.h daemon.c \
Modified: libmicrohttpd/src/microspdy/applicationlayer.c
===================================================================
--- libmicrohttpd/src/microspdy/applicationlayer.c 2013-07-05 14:04:26 UTC
(rev 27764)
+++ libmicrohttpd/src/microspdy/applicationlayer.c 2013-07-05 14:25:04 UTC
(rev 27765)
@@ -239,7 +239,7 @@
"Buffer size is less than max supported frame size!");
SPDYF_ASSERT(SPDY_MAX_SUPPORTED_FRAME_SIZE >= 32,
"Max supported frame size must be bigger than the minimal
value!");
- SPDYF_tls_global_init();
+ SPDYF_openssl_global_init();
return SPDY_YES;
}
@@ -248,8 +248,8 @@
SPDY_deinit ()
{
//currently nothing to be freed/deinited
- //SPDYF_tls_global_deinit doesn't do anything now
- //SPDYF_tls_global_deinit();
+ //SPDYF_openssl_global_deinit doesn't do anything now
+ //SPDYF_openssl_global_deinit();
}
Modified: libmicrohttpd/src/microspdy/daemon.c
===================================================================
--- libmicrohttpd/src/microspdy/daemon.c 2013-07-05 14:04:26 UTC (rev
27764)
+++ libmicrohttpd/src/microspdy/daemon.c 2013-07-05 14:25:04 UTC (rev
27765)
@@ -26,7 +26,7 @@
#include "structures.h"
#include "internal.h"
#include "session.h"
-#include "tls.h"
+#include "io.h"
/**
@@ -191,8 +191,8 @@
memset (daemon, 0, sizeof (struct SPDY_Daemon));
daemon->socket_fd = -1;
daemon->port = port;
- daemon->fio_init = &SPDYF_tls_init;
- daemon->fio_deinit = &SPDYF_tls_deinit;
+ daemon->fio_init = &SPDYF_openssl_init;
+ daemon->fio_deinit = &SPDYF_openssl_deinit;
if (NULL == (daemon->certfile = strdup (certfile)))
{
SPDYF_DEBUG("str");
Modified: libmicrohttpd/src/microspdy/internal.h
===================================================================
--- libmicrohttpd/src/microspdy/internal.h 2013-07-05 14:04:26 UTC (rev
27764)
+++ libmicrohttpd/src/microspdy/internal.h 2013-07-05 14:25:04 UTC (rev
27765)
@@ -27,7 +27,6 @@
#include "platform.h"
#include "microspdy.h"
-#include "tls.h"
/* size of read buffers for each connection
* must be at least the size of SPDY_MAX_SUPPORTED_FRAME_SIZE */
Modified: libmicrohttpd/src/microspdy/io.h
===================================================================
--- libmicrohttpd/src/microspdy/io.h 2013-07-05 14:04:26 UTC (rev 27764)
+++ libmicrohttpd/src/microspdy/io.h 2013-07-05 14:25:04 UTC (rev 27765)
@@ -26,6 +26,7 @@
#define IO_H
#include "platform.h"
+#include "io_openssl.h"
/**
Added: libmicrohttpd/src/microspdy/io_openssl.c
===================================================================
--- libmicrohttpd/src/microspdy/io_openssl.c (rev 0)
+++ libmicrohttpd/src/microspdy/io_openssl.c 2013-07-05 14:25:04 UTC (rev
27765)
@@ -0,0 +1,255 @@
+/*
+ This file is part of libmicrospdy
+ Copyright (C) 2012 Andrey Uzunov
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file io_openssl.c
+ * @brief TLS handling using libssl. The current code assumes that
+ * blocking I/O is in use.
+ * @author Andrey Uzunov
+ */
+
+#include "platform.h"
+#include "internal.h"
+#include "session.h"
+#include "io_openssl.h"
+
+
+/**
+ * Callback to advertise spdy ver. 3 in Next Protocol Negotiation
+ *
+ * @param ssl openssl context for a connection
+ * @param out must be set to the raw data that is advertised in NPN
+ * @param outlen must be set to size of out
+ * @param arg
+ * @return SSL_TLSEXT_ERR_OK to do advertising
+ */
+static int
+spdyf_next_protos_advertised_cb (SSL *ssl, const unsigned char **out, unsigned
int *outlen, void *arg)
+{
+ (void)ssl;
+ (void)arg;
+ static unsigned char npn_spdy3[] = {0x06, // length of "spdy/3"
+ 0x73,0x70,0x64,0x79,0x2f,0x33};// spdy/3
+
+ *out = npn_spdy3;
+ *outlen = 7; // total length of npn_spdy3
+ return SSL_TLSEXT_ERR_OK;
+}
+
+
+void
+SPDYF_openssl_global_init()
+{
+ //error strings are now not used by the lib
+ //SSL_load_error_strings();
+ //init libssl
+ SSL_library_init(); //always returns 1
+ //the table for looking up algos is not used now by the lib
+ //OpenSSL_add_all_algorithms();
+}
+
+
+void
+SPDYF_openssl_global_deinit()
+{
+ //if SSL_load_error_strings was called
+ //ERR_free_strings();
+ //if OpenSSL_add_all_algorithms was called
+ //EVP_cleanup();
+}
+
+
+int
+SPDYF_openssl_init(struct SPDY_Daemon *daemon)
+{
+ //create ssl context. TLSv1 used
+ if(NULL == (daemon->io_context = SSL_CTX_new(TLSv1_server_method())))
+ {
+ SPDYF_DEBUG("Couldn't create ssl context");
+ return SPDY_NO;
+ }
+ //set options for tls
+ //TODO DH is not enabled for easier debugging
+ //SSL_CTX_set_options(daemon->io_context, SSL_OP_SINGLE_DH_USE);
+
+ //TODO here session tickets are disabled for easier debuging with
+ //wireshark when using Chrome
+ //SSL_OP_NO_COMPRESSION disables TLS compression to avoid CRIME attack
+ SSL_CTX_set_options(daemon->io_context, SSL_OP_NO_TICKET |
SSL_OP_NO_COMPRESSION);
+ if(1 != SSL_CTX_use_certificate_file(daemon->io_context, daemon->certfile
, SSL_FILETYPE_PEM))
+ {
+ SPDYF_DEBUG("Couldn't load the cert file");
+ SSL_CTX_free(daemon->io_context);
+ return SPDY_NO;
+ }
+ if(1 != SSL_CTX_use_PrivateKey_file(daemon->io_context, daemon->keyfile,
SSL_FILETYPE_PEM))
+ {
+ SPDYF_DEBUG("Couldn't load the name file");
+ SSL_CTX_free(daemon->io_context);
+ return SPDY_NO;
+ }
+ SSL_CTX_set_next_protos_advertised_cb(daemon->io_context,
&spdyf_next_protos_advertised_cb, NULL);
+ //TODO only RC4-SHA is used to make it easy to debug with wireshark
+ if (1 != SSL_CTX_set_cipher_list(daemon->io_context, "RC4-SHA"))
+ {
+ SPDYF_DEBUG("Couldn't set the desired cipher list");
+ SSL_CTX_free(daemon->io_context);
+ return SPDY_NO;
+ }
+
+ return SPDY_YES;
+}
+
+
+void
+SPDYF_openssl_deinit(struct SPDY_Daemon *daemon)
+{
+ SSL_CTX_free(daemon->io_context);
+}
+
+
+int
+SPDYF_openssl_new_session(struct SPDY_Session *session)
+{
+ int ret;
+
+ if(NULL == (session->io_context = SSL_new(session->daemon->io_context)))
+ {
+ SPDYF_DEBUG("Couldn't create ssl structure");
+ return SPDY_NO;
+ }
+ if(1 != (ret = SSL_set_fd(session->io_context, session->socket_fd)))
+ {
+ SPDYF_DEBUG("SSL_set_fd %i",ret);
+ SSL_free(session->io_context);
+ session->io_context = NULL;
+ return SPDY_NO;
+ }
+
+ //for non-blocking I/O SSL_accept may return -1
+ //and this function won't work
+ if(1 != (ret = SSL_accept(session->io_context)))
+ {
+ SPDYF_DEBUG("SSL_accept %i",ret);
+ SSL_free(session->io_context);
+ session->io_context = NULL;
+ return SPDY_NO;
+ }
+ /* alternatively
+ SSL_set_accept_state(session->io_context);
+ * may be called and then the negotiation will be done on reading
+ */
+
+ return SPDY_YES;
+}
+
+
+void
+SPDYF_openssl_close_session(struct SPDY_Session *session)
+{
+ //SSL_shutdown sends TLS "close notify" as in TLS standard.
+ //The function may fail as it waits for the other party to also close
+ //the TLS session. The lib just sends it and will close the socket
+ //after that because the browsers don't seem to care much about
+ //"close notify"
+ SSL_shutdown(session->io_context);
+
+ SSL_free(session->io_context);
+}
+
+
+int
+SPDYF_openssl_recv(struct SPDY_Session *session,
+ void * buffer,
+ size_t size)
+{
+ int ret;
+ int n = SSL_read(session->io_context,
+ buffer,
+ size);
+ //if(n > 0) SPDYF_DEBUG("recvd: %i",n);
+ if (n <= 0)
+ {
+ ret = SSL_get_error(session->io_context, n);
+ switch(ret)
+ {
+ case SSL_ERROR_ZERO_RETURN:
+ return 0;
+
+ case SSL_ERROR_WANT_READ:
+ case SSL_ERROR_WANT_WRITE:
+ return SPDY_IO_ERROR_AGAIN;
+
+ case SSL_ERROR_SYSCALL:
+ if(EINTR == errno)
+ return SPDY_IO_ERROR_AGAIN;
+
+ default:
+ return SPDY_IO_ERROR_ERROR;
+ }
+ }
+
+ return n;
+}
+
+
+int
+SPDYF_openssl_send(struct SPDY_Session *session,
+ const void * buffer,
+ size_t size)
+{
+ int ret;
+
+ int n = SSL_write(session->io_context,
+ buffer,
+ size);
+ //if(n > 0) SPDYF_DEBUG("sent: %i",n);
+ if (n <= 0)
+ {
+ ret = SSL_get_error(session->io_context, n);
+ switch(ret)
+ {
+ case SSL_ERROR_ZERO_RETURN:
+ return 0;
+
+ case SSL_ERROR_WANT_READ:
+ case SSL_ERROR_WANT_WRITE:
+ return SPDY_IO_ERROR_AGAIN;
+
+ case SSL_ERROR_SYSCALL:
+ if(EINTR == errno)
+ return SPDY_IO_ERROR_AGAIN;
+
+ default:
+ return SPDY_IO_ERROR_ERROR;
+ }
+ }
+
+ return n;
+}
+
+
+int
+SPDYF_openssl_is_pending(struct SPDY_Session *session)
+{
+ /* From openssl docs:
+ * BUGS
+SSL_pending() takes into account only bytes from the TLS/SSL record that is
currently being processed (if any). If the SSL object's read_ahead flag is set,
additional protocol bytes may have been read containing more TLS/SSL records;
these are ignored by SSL_pending().
+ */
+ return SSL_pending(session->io_context) > 0 ? SPDY_YES : SPDY_NO;
+}
Added: libmicrohttpd/src/microspdy/io_openssl.h
===================================================================
--- libmicrohttpd/src/microspdy/io_openssl.h (rev 0)
+++ libmicrohttpd/src/microspdy/io_openssl.h 2013-07-05 14:25:04 UTC (rev
27765)
@@ -0,0 +1,142 @@
+/*
+ This file is part of libmicrospdy
+ Copyright (C) 2012 Andrey Uzunov
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file io_openssl.h
+ * @brief TLS handling. openssl with NPN is used, but as long as the
+ * functions conform to this interface file, other
libraries
+ * can be used.
+ * @author Andrey Uzunov
+ */
+
+#ifndef IO_OPENSSL_H
+#define IO_OPENSSL_H
+
+#include "platform.h"
+#include "io.h"
+#include <openssl/err.h>
+#include <openssl/ssl.h>
+#include <openssl/rand.h>
+
+
+/**
+ * Global initializing of openssl. Must be called only once in the program.
+ *
+ */
+void
+SPDYF_openssl_global_init();
+
+
+/**
+ * Global deinitializing of openssl for the whole program. Should be called
+ * at the end of the program.
+ *
+ */
+void
+SPDYF_openssl_global_deinit();
+
+
+/**
+ * Initializing of openssl for a specific daemon.
+ * Must be called when the daemon starts.
+ *
+ * @param daemon SPDY_Daemon for which openssl will be used. Daemon's
+ * certificate and key file are used.
+ * @return SPDY_YES on success or SPDY_NO on error
+ */
+int
+SPDYF_openssl_init(struct SPDY_Daemon *daemon);
+
+
+/**
+ * Deinitializing openssl for a daemon. Should be called
+ * when the deamon is stopped.
+ *
+ * @param daemon SPDY_Daemon which is being stopped
+ */
+void
+SPDYF_openssl_deinit(struct SPDY_Daemon *daemon);
+
+
+/**
+ * Initializing openssl for a specific connection. Must be called
+ * after the connection has been accepted.
+ *
+ * @param session SPDY_Session whose socket will be used by openssl
+ * @return SPDY_NO if some openssl funcs fail. SPDY_YES otherwise
+ */
+int
+SPDYF_openssl_new_session(struct SPDY_Session *session);
+
+
+/**
+ * Deinitializing openssl for a specific connection. Should be called
+ * closing session's socket.
+ *
+ * @param session SPDY_Session whose socket is used by openssl
+ */
+void
+SPDYF_openssl_close_session(struct SPDY_Session *session);
+
+
+/**
+ * Reading from a TLS socket. Reads available data and put it to the
+ * buffer.
+ *
+ * @param session for which data is received
+ * @param buffer where data from the socket will be written to
+ * @param size of the buffer
+ * @return number of bytes (at most size) read from the TLS connection
+ * 0 if the other party has closed the connection
+ * SPDY_IO_ERROR code on error
+ */
+int
+SPDYF_openssl_recv(struct SPDY_Session *session,
+ void * buffer,
+ size_t size);
+
+
+/**
+ * Writing to a TLS socket. Writes the data given into the buffer to the
+ * TLS socket.
+ *
+ * @param session whose context is used
+ * @param buffer from where data will be written to the socket
+ * @param size number of bytes to be taken from the buffer
+ * @return number of bytes (at most size) from the buffer that has been
+ * written to the TLS connection
+ * 0 if the other party has closed the connection
+ * SPDY_IO_ERROR code on error
+ */
+int
+SPDYF_openssl_send(struct SPDY_Session *session,
+ const void * buffer,
+ size_t size);
+
+
+/**
+ * Checks if there is data staying in the buffers of the underlying
+ * system that waits to be read.
+ *
+ * @param session which is checked
+ * @return SPDY_YES if data is pending or SPDY_NO otherwise
+ */
+int
+SPDYF_openssl_is_pending(struct SPDY_Session *session);
+
+#endif
Modified: libmicrohttpd/src/microspdy/session.c
===================================================================
--- libmicrohttpd/src/microspdy/session.c 2013-07-05 14:04:26 UTC (rev
27764)
+++ libmicrohttpd/src/microspdy/session.c 2013-07-05 14:25:04 UTC (rev
27765)
@@ -28,8 +28,8 @@
#include "internal.h"
#include "session.h"
#include "compression.h"
-#include "tls.h"
#include "stream.h"
+#include "io.h"
/**
@@ -826,7 +826,7 @@
switch(bytes_read)
{
- case SPDY_TLS_ERROR_CLOSED:
+ case SPDY_IO_ERROR_CLOSED:
//The TLS connection was closed by the other party,
clean
//or not
shutdown (session->socket_fd, SHUT_RD);
@@ -834,7 +834,7 @@
session->status = SPDY_SESSION_STATUS_CLOSING;
return SPDY_YES;
- case SPDY_TLS_ERROR_ERROR:
+ case SPDY_IO_ERROR_ERROR:
//any kind of error in the TLS subsystem
//try to prepare GOAWAY frame
SPDYF_prepare_goaway(session,
SPDY_GOAWAY_STATUS_INTERNAL_ERROR, false);
@@ -842,7 +842,7 @@
session->status = SPDY_SESSION_STATUS_FLUSHING;
return SPDY_YES;
- case SPDY_TLS_ERROR_AGAIN:
+ case SPDY_IO_ERROR_AGAIN:
//read or write should be called again; leave it for the
//next time
return SPDY_NO;
@@ -958,7 +958,7 @@
switch(bytes_written)
{
- case SPDY_TLS_ERROR_CLOSED:
+ case SPDY_IO_ERROR_CLOSED:
//The TLS connection was closed by the other
party, clean
//or not
shutdown (session->socket_fd, SHUT_RD);
@@ -966,13 +966,13 @@
session->status = SPDY_SESSION_STATUS_CLOSING;
return SPDY_YES;
- case SPDY_TLS_ERROR_ERROR:
+ case SPDY_IO_ERROR_ERROR:
//any kind of error in the TLS subsystem
//forbid more writing
session->status = SPDY_SESSION_STATUS_CLOSING;
return SPDY_YES;
- case SPDY_TLS_ERROR_AGAIN:
+ case SPDY_IO_ERROR_AGAIN:
//read or write should be called again; leave
it for the
//next time; return from the function as we do
not now
//whether reading or writing is needed
@@ -1306,11 +1306,11 @@
session->daemon = daemon;
session->socket_fd = new_socket_fd;
- session->fio_new_session = &SPDYF_tls_new_session;
- session->fio_close_session = &SPDYF_tls_close_session;
- session->fio_is_pending = &SPDYF_tls_is_pending;
- session->fio_recv = &SPDYF_tls_recv;
- session->fio_send = &SPDYF_tls_send;
+ session->fio_new_session = &SPDYF_openssl_new_session;
+ session->fio_close_session = &SPDYF_openssl_close_session;
+ session->fio_is_pending = &SPDYF_openssl_is_pending;
+ session->fio_recv = &SPDYF_openssl_recv;
+ session->fio_send = &SPDYF_openssl_send;
//init TLS context, handshake will be done
if(SPDY_YES != session->fio_new_session(session))
Modified: libmicrohttpd/src/microspdy/structures.h
===================================================================
--- libmicrohttpd/src/microspdy/structures.h 2013-07-05 14:04:26 UTC (rev
27764)
+++ libmicrohttpd/src/microspdy/structures.h 2013-07-05 14:25:04 UTC (rev
27765)
@@ -28,7 +28,6 @@
#include "platform.h"
#include "microspdy.h"
-#include "tls.h"
#include "io.h"
Deleted: libmicrohttpd/src/microspdy/tls.c
===================================================================
--- libmicrohttpd/src/microspdy/tls.c 2013-07-05 14:04:26 UTC (rev 27764)
+++ libmicrohttpd/src/microspdy/tls.c 2013-07-05 14:25:04 UTC (rev 27765)
@@ -1,255 +0,0 @@
-/*
- This file is part of libmicrospdy
- Copyright (C) 2012 Andrey Uzunov
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-/**
- * @file tls.c
- * @brief TLS handling using libssl. The current code assumes that
- * blocking I/O is in use.
- * @author Andrey Uzunov
- */
-
-#include "platform.h"
-#include "internal.h"
-#include "session.h"
-#include "tls.h"
-
-
-/**
- * Callback to advertise spdy ver. 3 in Next Protocol Negotiation
- *
- * @param ssl openssl context for a connection
- * @param out must be set to the raw data that is advertised in NPN
- * @param outlen must be set to size of out
- * @param arg
- * @return SSL_TLSEXT_ERR_OK to do advertising
- */
-static int
-spdyf_next_protos_advertised_cb (SSL *ssl, const unsigned char **out, unsigned
int *outlen, void *arg)
-{
- (void)ssl;
- (void)arg;
- static unsigned char npn_spdy3[] = {0x06, // length of "spdy/3"
- 0x73,0x70,0x64,0x79,0x2f,0x33};// spdy/3
-
- *out = npn_spdy3;
- *outlen = 7; // total length of npn_spdy3
- return SSL_TLSEXT_ERR_OK;
-}
-
-
-void
-SPDYF_tls_global_init()
-{
- //error strings are now not used by the lib
- //SSL_load_error_strings();
- //init libssl
- SSL_library_init(); //always returns 1
- //the table for looking up algos is not used now by the lib
- //OpenSSL_add_all_algorithms();
-}
-
-
-void
-SPDYF_tls_global_deinit()
-{
- //if SSL_load_error_strings was called
- //ERR_free_strings();
- //if OpenSSL_add_all_algorithms was called
- //EVP_cleanup();
-}
-
-
-int
-SPDYF_tls_init(struct SPDY_Daemon *daemon)
-{
- //create ssl context. TLSv1 used
- if(NULL == (daemon->io_context = SSL_CTX_new(TLSv1_server_method())))
- {
- SPDYF_DEBUG("Couldn't create ssl context");
- return SPDY_NO;
- }
- //set options for tls
- //TODO DH is not enabled for easier debugging
- //SSL_CTX_set_options(daemon->io_context, SSL_OP_SINGLE_DH_USE);
-
- //TODO here session tickets are disabled for easier debuging with
- //wireshark when using Chrome
- //SSL_OP_NO_COMPRESSION disables TLS compression to avoid CRIME attack
- SSL_CTX_set_options(daemon->io_context, SSL_OP_NO_TICKET |
SSL_OP_NO_COMPRESSION);
- if(1 != SSL_CTX_use_certificate_file(daemon->io_context, daemon->certfile
, SSL_FILETYPE_PEM))
- {
- SPDYF_DEBUG("Couldn't load the cert file");
- SSL_CTX_free(daemon->io_context);
- return SPDY_NO;
- }
- if(1 != SSL_CTX_use_PrivateKey_file(daemon->io_context, daemon->keyfile,
SSL_FILETYPE_PEM))
- {
- SPDYF_DEBUG("Couldn't load the name file");
- SSL_CTX_free(daemon->io_context);
- return SPDY_NO;
- }
- SSL_CTX_set_next_protos_advertised_cb(daemon->io_context,
&spdyf_next_protos_advertised_cb, NULL);
- //TODO only RC4-SHA is used to make it easy to debug with wireshark
- if (1 != SSL_CTX_set_cipher_list(daemon->io_context, "RC4-SHA"))
- {
- SPDYF_DEBUG("Couldn't set the desired cipher list");
- SSL_CTX_free(daemon->io_context);
- return SPDY_NO;
- }
-
- return SPDY_YES;
-}
-
-
-void
-SPDYF_tls_deinit(struct SPDY_Daemon *daemon)
-{
- SSL_CTX_free(daemon->io_context);
-}
-
-
-int
-SPDYF_tls_new_session(struct SPDY_Session *session)
-{
- int ret;
-
- if(NULL == (session->io_context = SSL_new(session->daemon->io_context)))
- {
- SPDYF_DEBUG("Couldn't create ssl structure");
- return SPDY_NO;
- }
- if(1 != (ret = SSL_set_fd(session->io_context, session->socket_fd)))
- {
- SPDYF_DEBUG("SSL_set_fd %i",ret);
- SSL_free(session->io_context);
- session->io_context = NULL;
- return SPDY_NO;
- }
-
- //for non-blocking I/O SSL_accept may return -1
- //and this function won't work
- if(1 != (ret = SSL_accept(session->io_context)))
- {
- SPDYF_DEBUG("SSL_accept %i",ret);
- SSL_free(session->io_context);
- session->io_context = NULL;
- return SPDY_NO;
- }
- /* alternatively
- SSL_set_accept_state(session->io_context);
- * may be called and then the negotiation will be done on reading
- */
-
- return SPDY_YES;
-}
-
-
-void
-SPDYF_tls_close_session(struct SPDY_Session *session)
-{
- //SSL_shutdown sends TLS "close notify" as in TLS standard.
- //The function may fail as it waits for the other party to also close
- //the TLS session. The lib just sends it and will close the socket
- //after that because the browsers don't seem to care much about
- //"close notify"
- SSL_shutdown(session->io_context);
-
- SSL_free(session->io_context);
-}
-
-
-int
-SPDYF_tls_recv(struct SPDY_Session *session,
- void * buffer,
- size_t size)
-{
- int ret;
- int n = SSL_read(session->io_context,
- buffer,
- size);
- //if(n > 0) SPDYF_DEBUG("recvd: %i",n);
- if (n <= 0)
- {
- ret = SSL_get_error(session->io_context, n);
- switch(ret)
- {
- case SSL_ERROR_ZERO_RETURN:
- return 0;
-
- case SSL_ERROR_WANT_READ:
- case SSL_ERROR_WANT_WRITE:
- return SPDY_TLS_ERROR_AGAIN;
-
- case SSL_ERROR_SYSCALL:
- if(EINTR == errno)
- return SPDY_TLS_ERROR_AGAIN;
-
- default:
- return SPDY_TLS_ERROR_ERROR;
- }
- }
-
- return n;
-}
-
-
-int
-SPDYF_tls_send(struct SPDY_Session *session,
- const void * buffer,
- size_t size)
-{
- int ret;
-
- int n = SSL_write(session->io_context,
- buffer,
- size);
- //if(n > 0) SPDYF_DEBUG("sent: %i",n);
- if (n <= 0)
- {
- ret = SSL_get_error(session->io_context, n);
- switch(ret)
- {
- case SSL_ERROR_ZERO_RETURN:
- return 0;
-
- case SSL_ERROR_WANT_READ:
- case SSL_ERROR_WANT_WRITE:
- return SPDY_TLS_ERROR_AGAIN;
-
- case SSL_ERROR_SYSCALL:
- if(EINTR == errno)
- return SPDY_TLS_ERROR_AGAIN;
-
- default:
- return SPDY_TLS_ERROR_ERROR;
- }
- }
-
- return n;
-}
-
-
-int
-SPDYF_tls_is_pending(struct SPDY_Session *session)
-{
- /* From openssl docs:
- * BUGS
-SSL_pending() takes into account only bytes from the TLS/SSL record that is
currently being processed (if any). If the SSL object's read_ahead flag is set,
additional protocol bytes may have been read containing more TLS/SSL records;
these are ignored by SSL_pending().
- */
- return SSL_pending(session->io_context) > 0 ? SPDY_YES : SPDY_NO;
-}
Deleted: libmicrohttpd/src/microspdy/tls.h
===================================================================
--- libmicrohttpd/src/microspdy/tls.h 2013-07-05 14:04:26 UTC (rev 27764)
+++ libmicrohttpd/src/microspdy/tls.h 2013-07-05 14:25:04 UTC (rev 27765)
@@ -1,171 +0,0 @@
-/*
- This file is part of libmicrospdy
- Copyright (C) 2012 Andrey Uzunov
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-/**
- * @file tls.h
- * @brief TLS handling. openssl with NPN is used, but as long as the
- * functions conform to this interface file, other
libraries
- * can be used.
- * @author Andrey Uzunov
- */
-
-#ifndef TLS_H
-#define TLS_H
-
-#include "platform.h"
-#include <openssl/err.h>
-#include <openssl/ssl.h>
-#include <openssl/rand.h>
-
-/* macros used in other files instead of types.
- * useful in case of changing openssl to something else */
-//#define SPDYF_TLS_SESSION_CONTEXT SSL
-//#define SPDYF_TLS_DAEMON_CONTEXT SSL_CTX
-
-
-/**
- * Used for return code when reading and writing to the TLS socket.
- */
-enum SPDY_TLS_ERROR
-{
- /**
- * The connection was closed by the other party.
- */
- SPDY_TLS_ERROR_CLOSED = 0,
-
- /**
- * Any kind of error ocurred. The session has to be closed.
- */
- SPDY_TLS_ERROR_ERROR = -2,
-
- /**
- * The function had to return without processing any data. The whole
- * cycle of events has to be called again (SPDY_run) as something
- * either has to be written or read or the the syscall was
- * interrupted by a signal.
- */
- SPDY_TLS_ERROR_AGAIN = -3,
-};
-
-
-/**
- * Global initializing of openssl. Must be called only once in the program.
- *
- */
-void
-SPDYF_tls_global_init();
-
-
-/**
- * Global deinitializing of openssl for the whole program. Should be called
- * at the end of the program.
- *
- */
-void
-SPDYF_tls_global_deinit();
-
-
-/**
- * Initializing of openssl for a specific daemon.
- * Must be called when the daemon starts.
- *
- * @param daemon SPDY_Daemon for which openssl will be used. Daemon's
- * certificate and key file are used.
- * @return SPDY_YES on success or SPDY_NO on error
- */
-int
-SPDYF_tls_init(struct SPDY_Daemon *daemon);
-
-
-/**
- * Deinitializing openssl for a daemon. Should be called
- * when the deamon is stopped.
- *
- * @param daemon SPDY_Daemon which is being stopped
- */
-void
-SPDYF_tls_deinit(struct SPDY_Daemon *daemon);
-
-
-/**
- * Initializing openssl for a specific connection. Must be called
- * after the connection has been accepted.
- *
- * @param session SPDY_Session whose socket will be used by openssl
- * @return SPDY_NO if some openssl funcs fail. SPDY_YES otherwise
- */
-int
-SPDYF_tls_new_session(struct SPDY_Session *session);
-
-
-/**
- * Deinitializing openssl for a specific connection. Should be called
- * closing session's socket.
- *
- * @param session SPDY_Session whose socket is used by openssl
- */
-void
-SPDYF_tls_close_session(struct SPDY_Session *session);
-
-
-/**
- * Reading from a TLS socket. Reads available data and put it to the
- * buffer.
- *
- * @param session for which data is received
- * @param buffer where data from the socket will be written to
- * @param size of the buffer
- * @return number of bytes (at most size) read from the TLS connection
- * 0 if the other party has closed the connection
- * SPDY_TLS_ERROR code on error
- */
-int
-SPDYF_tls_recv(struct SPDY_Session *session,
- void * buffer,
- size_t size);
-
-
-/**
- * Writing to a TLS socket. Writes the data given into the buffer to the
- * TLS socket.
- *
- * @param session whose context is used
- * @param buffer from where data will be written to the socket
- * @param size number of bytes to be taken from the buffer
- * @return number of bytes (at most size) from the buffer that has been
- * written to the TLS connection
- * 0 if the other party has closed the connection
- * SPDY_TLS_ERROR code on error
- */
-int
-SPDYF_tls_send(struct SPDY_Session *session,
- const void * buffer,
- size_t size);
-
-
-/**
- * Checks if there is data staying in the buffers of the underlying
- * system that waits to be read.
- *
- * @param session which is checked
- * @return SPDY_YES if data is pending or SPDY_NO otherwise
- */
-int
-SPDYF_tls_is_pending(struct SPDY_Session *session);
-
-#endif
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r27765 - libmicrohttpd/src/microspdy,
gnunet <=