diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2018-03-03 17:26:29 +0100 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2018-03-03 17:36:55 +0100 |
commit | 886dd8ccf1368d9820bd419520895e05a1557af3 (patch) | |
tree | 703c52eb05ec6b337dfeff4e384286e72f43772c | |
download | curve25519-precomp-fuzzer-886dd8ccf1368d9820bd419520895e05a1557af3.tar.xz curve25519-precomp-fuzzer-886dd8ccf1368d9820bd419520895e05a1557af3.zip |
Initial commit
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | .gitmodules | 3 | ||||
-rw-r--r-- | Makefile | 12 | ||||
m--------- | WireGuard | 0 | ||||
-rw-r--r-- | bogus-include/asm/cpufeature.h | 0 | ||||
-rw-r--r-- | bogus-include/asm/processor.h | 0 | ||||
-rw-r--r-- | fuzz.c | 85 |
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 @@ -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; +} + |