diff src/proto.nacl0.c @ 0:65c01f57bdce V2.1.2

Initial commit
author ivo <ivo@UFO-Net.nl>
date Thu, 07 Oct 2010 15:53:01 +0200
parents
children cf9b44b46be5
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/proto.nacl0.c	Thu Oct 07 15:53:01 2010 +0200
@@ -0,0 +1,101 @@
+/* Copyright 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 ``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 AUTHORS 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.
+
+   The views and conclusions contained in the software and documentation are those of the
+   authors and should not be interpreted as representing official policies, either expressed
+   or implied, of Ivo Smits.*/
+
+#include "common.c"
+#include "crypto_box.h"
+
+struct qt_proto_data_nacl0 {
+	unsigned char cnonce[crypto_box_NONCEBYTES], cbefore[crypto_box_BEFORENMBYTES];
+};
+
+/*static unsigned char cnonce[crypto_box_NONCEBYTES], cbefore[crypto_box_BEFORENMBYTES];
+static unsigned char buffer1[MAX_PACKET_LEN+crypto_box_ZEROBYTES], buffer2[MAX_PACKET_LEN+crypto_box_ZEROBYTES];
+static const unsigned char* buffer1offset = buffer1 + crypto_box_ZEROBYTES;
+static const unsigned char* buffer2offset = buffer2 + crypto_box_BOXZEROBYTES;
+static const int overhead                 = crypto_box_BOXZEROBYTES;*/
+
+static int encode(struct qtsession* sess, char* raw, char* enc, int len) {
+	struct qt_proto_data_nacl0* d = (struct qt_proto_data_nacl0*)sess->protocol_data;
+	memset(raw, 0, crypto_box_ZEROBYTES);
+	if (crypto_box_afternm(enc, raw, len+crypto_box_ZEROBYTES, d->cnonce, d->cbefore)) return errorexit("Crypto failed");
+	return len + crypto_box_BOXZEROBYTES;
+}
+
+static int decode(struct qtsession* sess, char* enc, char* raw, int len) {
+	struct qt_proto_data_nacl0* d = (struct qt_proto_data_nacl0*)sess->protocol_data;
+	int i;
+	if (len < crypto_box_BOXZEROBYTES) {
+		fprintf(stderr, "Short packet received: %d\n", len);
+		return 0;
+	}
+	len -= crypto_box_BOXZEROBYTES;
+	memset(enc, 0, crypto_box_BOXZEROBYTES);
+	if (i = crypto_box_open_afternm(raw, enc, len+crypto_box_ZEROBYTES, d->cnonce, d->cbefore)) {
+		fprintf(stderr, "Decryption failed len=%d result=%d\n", len, i);
+		return 0;
+	}
+	return len;
+}
+
+static int init(struct qtsession* sess) {
+	char* envval;
+	struct qt_proto_data_nacl0* d = (struct qt_proto_data_nacl0*)sess->protocol_data;
+	printf("Initializing cryptography...\n");
+	memset(d->cnonce, 0, crypto_box_NONCEBYTES);
+	unsigned char cpublickey[crypto_box_PUBLICKEYBYTES], csecretkey[crypto_box_SECRETKEYBYTES];
+	if (!(envval = getconf("PUBLIC_KEY"))) return errorexit("Missing PUBLIC_KEY");
+	if (strlen(envval) != 2*crypto_box_PUBLICKEYBYTES) return errorexit("PUBLIC_KEY length");
+	hex2bin(cpublickey, envval, crypto_box_PUBLICKEYBYTES);
+	if (!(envval = getconf("PRIVATE_KEY"))) return errorexit("Missing PRIVATE_KEY");
+	if (strlen(envval) != 2*crypto_box_PUBLICKEYBYTES) return errorexit("PRIVATE_KEY length");
+	hex2bin(csecretkey, envval, crypto_box_SECRETKEYBYTES);
+	crypto_box_beforenm(d->cbefore, cpublickey, csecretkey);
+}
+
+#ifdef COMBINED_BINARY
+	int tunmain_nacl0() {
+#else
+	int tunmain() {
+#endif
+	struct qtproto p = {
+		1,
+		MAX_PACKET_LEN + crypto_box_ZEROBYTES,
+		MAX_PACKET_LEN + crypto_box_BOXZEROBYTES + crypto_box_BOXZEROBYTES,
+		crypto_box_ZEROBYTES,
+		crypto_box_BOXZEROBYTES,
+		encode,
+		decode,
+		init,
+		sizeof(struct qt_proto_data_nacl0),
+	};
+	return qtrun(&p);
+}
+
+#ifndef COMBINED_BINARY
+int main() {
+	print_header();
+	return tunmain();
+}
+#endif