summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt16
-rw-r--r--src/fastd.c6
-rw-r--r--src/method_curve25519_fhmqvc_xsalsa20_poly1305.c102
-rw-r--r--src/method_null.c1
4 files changed, 122 insertions, 3 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 044ec80..ca32e30 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,2 +1,14 @@
-add_executable(fastd fastd.c handshake.c method_null.c peer.c printf.c queue.c task.c)
-target_link_libraries(fastd rt)
+set(METHODS method_null.c)
+set(FASTD_INCLUDES ${FASTD_BINARY_DIR})
+set(FASTD_LIBS "")
+
+if(WITH_CFXP)
+ set(METHODS ${METHODS} method_curve25519_fhmqvc_xsalsa20_poly1305.c)
+ set(FASTD_INCLUDES ${FASTD_INCLUDES} ${NACL_INCLUDE_DIR})
+ set(FASTD_LIBS ${FASTD_LIBS} ${NACL_LIBRARY})
+endif(WITH_CFXP)
+
+include_directories(${FASTD_INCLUDES})
+
+add_executable(fastd fastd.c handshake.c peer.c printf.c queue.c task.c ${METHODS})
+target_link_libraries(fastd rt ${FASTD_LIBS})
diff --git a/src/fastd.c b/src/fastd.c
index dd6d2fa..5dcec14 100644
--- a/src/fastd.c
+++ b/src/fastd.c
@@ -30,6 +30,8 @@
#include "peer.h"
#include "task.h"
+#include <config.h>
+
#include <arpa/inet.h>
#include <fcntl.h>
#include <getopt.h>
@@ -45,6 +47,10 @@
extern fastd_method fastd_method_null;
+#ifdef WITH_CFXP
+extern fastd_method fastd_method_curve25519_fhmqvc_xsalsa20_poly1305;
+#endif
+
static void init_tuntap(fastd_context *ctx) {
struct ifreq ifr;
diff --git a/src/method_curve25519_fhmqvc_xsalsa20_poly1305.c b/src/method_curve25519_fhmqvc_xsalsa20_poly1305.c
new file mode 100644
index 0000000..9551ad9
--- /dev/null
+++ b/src/method_curve25519_fhmqvc_xsalsa20_poly1305.c
@@ -0,0 +1,102 @@
+/*
+ Copyright (c) 2012, Matthias Schiffer <mschiffer@universe-factory.net>
+ Partly based on QuickTun Copyright (c) 2010, Ivo Smits <Ivo@UCIS.nl>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#define _GNU_SOURCE
+
+#include "fastd.h"
+#include "peer.h"
+
+#include <arpa/inet.h>
+
+#include <crypto_secretbox_xsalsa20poly1305.h>
+
+
+static bool method_check_config(fastd_context *ctx, const fastd_config *conf) {
+ return true;
+}
+
+static size_t method_max_packet_size(fastd_context *ctx) {
+ return (fastd_max_packet_size(ctx) - crypto_secretbox_xsalsa20poly1305_NONCEBYTES);
+}
+
+static char* method_peer_str(const fastd_context *ctx, const fastd_peer *peer) {
+ char addr_buf[INET6_ADDRSTRLEN] = "";
+ char *ret;
+
+ const char *temp = fastd_peer_is_temporary(peer) ? " (temporary)" : "";
+
+ switch (peer->address.sa.sa_family) {
+ case AF_UNSPEC:
+ if (asprintf(&ret, "<floating>%s", temp) > 0)
+ return ret;
+ break;
+
+ case AF_INET:
+ if (inet_ntop(AF_INET, &peer->address.in.sin_addr, addr_buf, sizeof(addr_buf))) {
+ if (asprintf(&ret, "%s:%u%s", addr_buf, ntohs(peer->address.in.sin_port), temp) > 0)
+ return ret;
+ }
+ break;
+
+ case AF_INET6:
+ if (inet_ntop(AF_INET6, &peer->address.in6.sin6_addr, addr_buf, sizeof(addr_buf))) {
+ if (asprintf(&ret, "[%s]:%u%s", addr_buf, ntohs(peer->address.in6.sin6_port), temp) > 0)
+ return ret;
+ }
+ break;
+
+ default:
+ exit_bug(ctx, "unsupported address family");
+ }
+
+ return NULL;
+}
+
+static void method_init(fastd_context *ctx, fastd_peer *peer) {
+}
+
+static void method_handle_recv(fastd_context *ctx, fastd_peer *peer, fastd_buffer buffer) {
+ fastd_buffer_free(buffer);
+}
+
+static void method_send(fastd_context *ctx, fastd_peer *peer, fastd_buffer buffer) {
+ fastd_buffer_free(buffer);
+}
+
+const fastd_method fastd_method_curve25519_fhmqvc_xsalsa20_poly1305 = {
+ .name = "curve25519-fhmqvc-xsalsa20-poly1305",
+
+ .check_config = method_check_config,
+
+ .max_packet_size = method_max_packet_size,
+
+ .peer_str = method_peer_str,
+
+ .init = method_init,
+ .handle_recv = method_handle_recv,
+ .send = method_send,
+};
diff --git a/src/method_null.c b/src/method_null.c
index eb9ff64..e8d8f58 100644
--- a/src/method_null.c
+++ b/src/method_null.c
@@ -34,7 +34,6 @@
#include <arpa/inet.h>
-
static bool method_check_config(fastd_context *ctx, const fastd_config *conf) {
if (conf->n_floating > 1) {
pr_error(ctx, "with method `null' use can't define more than one floating peer");