summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2018-03-03 17:26:29 +0100
committerJason A. Donenfeld <Jason@zx2c4.com>2018-03-03 17:36:55 +0100
commit886dd8ccf1368d9820bd419520895e05a1557af3 (patch)
tree703c52eb05ec6b337dfeff4e384286e72f43772c
downloadcurve25519-precomp-fuzzer-886dd8ccf1368d9820bd419520895e05a1557af3.tar.xz
curve25519-precomp-fuzzer-886dd8ccf1368d9820bd419520895e05a1557af3.zip
Initial commit
-rw-r--r--.gitignore2
-rw-r--r--.gitmodules3
-rw-r--r--Makefile12
m---------WireGuard0
-rw-r--r--bogus-include/asm/cpufeature.h0
-rw-r--r--bogus-include/asm/processor.h0
-rw-r--r--fuzz.c85
7 files changed, 102 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9162c0c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+fuzz
+fuzz-*.log
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..6ed23ed
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "WireGuard"]
+ path = WireGuard
+ url = https://git.zx2c4.com/WireGuard
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..f6e11cd
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,12 @@
+CFLAGS ?= -O3 -march=native -fomit-frame-pointer
+fuzz: fuzz.c
+ clang -o $@ $(CFLAGS) -Ibogus-include -fsanitize=fuzzer $<
+
+NPROC := $(shell nproc)
+run: fuzz
+ ./fuzz -max_len=64 -workers=$(NPROC) -jobs=$(NPROC)
+
+clean:
+ rm -f fuzz fuzz-*.log
+
+.PHONY: clean run
diff --git a/WireGuard b/WireGuard
new file mode 160000
+Subproject 2759440dd8aa41e1a6d8a0d8f134b8e0a782876
diff --git a/bogus-include/asm/cpufeature.h b/bogus-include/asm/cpufeature.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/bogus-include/asm/cpufeature.h
diff --git a/bogus-include/asm/processor.h b/bogus-include/asm/processor.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/bogus-include/asm/processor.h
diff --git a/fuzz.c b/fuzz.c
new file mode 100644
index 0000000..719dd4d
--- /dev/null
+++ b/fuzz.c
@@ -0,0 +1,85 @@
+#include <stdbool.h>
+#include <string.h>
+#include <assert.h>
+#include <linux/types.h>
+typedef __u64 u64;
+typedef __u32 u32;
+typedef __u8 u8;
+typedef __s64 s64;
+#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+#define le64_to_cpup(a) __builtin_bswap64(*(a))
+#define le32_to_cpup(a) __builtin_bswap32(*(a))
+#define cpu_to_le64(a) __builtin_bswap64(a)
+#else
+#define le64_to_cpup(a) (*(a))
+#define le32_to_cpup(a) (*(a))
+#define cpu_to_le64(a) (a)
+#endif
+#ifndef __always_inline
+#define __always_inline __inline __attribute__((__always_inline__))
+#endif
+#ifndef noinline
+#define noinline __attribute__((noinline))
+#endif
+#ifndef __aligned
+#define __aligned(x) __attribute__((aligned(x)))
+#endif
+#ifndef __force
+#define __force
+#endif
+#ifndef memzero_explicit
+#define memzero_explicit(a, b)
+#endif
+#ifndef __ro_after_init
+#define __ro_after_init
+#endif
+#ifndef __init
+#define __init
+#endif
+#define boot_cpu_has(a) true
+
+enum curve25519_lengths {
+ CURVE25519_POINT_SIZE = 32,
+};
+
+static inline void normalize_secret(u8 secret[CURVE25519_POINT_SIZE])
+{
+ secret[0] &= 248;
+ secret[31] &= 127;
+ secret[31] |= 64;
+}
+
+#include "WireGuard/src/crypto/curve25519-hacl64.h"
+#include "WireGuard/src/crypto/curve25519-x86_64.h"
+
+static const u8 basepoint[32] = { 9 };
+
+int LLVMFuzzerTestOneInput(const u8 *input, unsigned long len)
+{
+ const u8 *private = input + 0;
+ const u8 *public = input + 32;
+ u8 shared1[32];
+ u8 shared2[32];
+ u8 shared3[32];
+ u8 pub1[32];
+ u8 pub2[32];
+ u8 pub3[32];
+
+ if (len != 64)
+ return 0;
+
+ curve25519_generic(shared1, private, public);
+ curve25519_adx(shared2, private, public);
+ assert(!memcmp(shared1, shared2, 32));
+ curve25519_bmi2(shared3, private, public);
+ assert(!memcmp(shared1, shared3, 32));
+
+ curve25519_generic(pub1, private, basepoint);
+ curve25519_adx_base(pub2, private);
+ assert(!memcmp(pub1, pub2, 32));
+ curve25519_bmi2_base(pub3, private);
+ assert(!memcmp(pub1, pub3, 32));
+
+ return 0;
+}
+