From 21f197b94f09a8b6de66c56aa04111ef1724351c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niels=20M=C3=B6ller?= <nisse@lysator.liu.se>
Date: Sat, 3 Sep 2016 13:59:02 +0200
Subject: [PATCH] Test for memeql_sec.

---
 ChangeLog                  |  4 +++
 testsuite/.test-rules.make |  3 +++
 testsuite/Makefile.in      |  2 +-
 testsuite/memeql-test.c    | 53 ++++++++++++++++++++++++++++++++++++++
 4 files changed, 61 insertions(+), 1 deletion(-)
 create mode 100644 testsuite/memeql-test.c

diff --git a/ChangeLog b/ChangeLog
index 56e4b4b9..4784d19e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -51,6 +51,10 @@
 
 	* memops.h: New header file, generalizing memxor.h.
 
+	* testsuite/memeql-test.c (test_main): New test case.
+	(memeql_sec_for_test): Wrapper to get valgrind to check for
+	side-channel silence.
+
 2016-08-29  Niels Möller  <nisse@lysator.liu.se>
 
 	* sexp-format.c (strlen_u8): New helper function.
diff --git a/testsuite/.test-rules.make b/testsuite/.test-rules.make
index 3c74b88b..b263e1fd 100644
--- a/testsuite/.test-rules.make
+++ b/testsuite/.test-rules.make
@@ -46,6 +46,9 @@ md5-test$(EXEEXT): md5-test.$(OBJEXT)
 md5-compat-test$(EXEEXT): md5-compat-test.$(OBJEXT)
 	$(LINK) md5-compat-test.$(OBJEXT) $(TEST_OBJS) -o md5-compat-test$(EXEEXT)
 
+memeql-test$(EXEEXT): memeql-test.$(OBJEXT)
+	$(LINK) memeql-test.$(OBJEXT) $(TEST_OBJS) -o memeql-test$(EXEEXT)
+
 memxor-test$(EXEEXT): memxor-test.$(OBJEXT)
 	$(LINK) memxor-test.$(OBJEXT) $(TEST_OBJS) -o memxor-test$(EXEEXT)
 
diff --git a/testsuite/Makefile.in b/testsuite/Makefile.in
index 02c18fc8..689d4325 100644
--- a/testsuite/Makefile.in
+++ b/testsuite/Makefile.in
@@ -16,7 +16,7 @@ TS_NETTLE_SOURCES = aes-test.c arcfour-test.c arctwo-test.c \
 		    camellia-test.c chacha-test.c \
 		    des-test.c des3-test.c des-compat-test.c \
 		    md2-test.c md4-test.c md5-test.c md5-compat-test.c \
-		    memxor-test.c gosthash94-test.c \
+		    memeql-test.c memxor-test.c gosthash94-test.c \
 		    ripemd160-test.c \
 		    salsa20-test.c \
 		    sha1-test.c sha224-test.c sha256-test.c \
diff --git a/testsuite/memeql-test.c b/testsuite/memeql-test.c
new file mode 100644
index 00000000..356671d6
--- /dev/null
+++ b/testsuite/memeql-test.c
@@ -0,0 +1,53 @@
+#include "testutils.h"
+#include "knuth-lfib.h"
+#include "memops.h"
+
+#if HAVE_VALGRIND_MEMCHECK_H
+# include <valgrind/memcheck.h>
+static int
+memeql_sec_for_test(const void *a, const void *b, size_t n)
+{
+  int res;
+
+  /* Makes valgrind trigger on any branches depending on the input
+     data. */
+  VALGRIND_MAKE_MEM_UNDEFINED (a, n);
+  VALGRIND_MAKE_MEM_UNDEFINED (b, n);
+
+  res = memeql_sec (a, b, n);
+  VALGRIND_MAKE_MEM_DEFINED (&res, sizeof(res));
+  return res;
+}
+#else
+#define memeql_sec_for_test memeql_sec
+#endif
+
+#define MAX_SIZE 50
+void
+test_main(void)
+{
+  uint8_t orig[MAX_SIZE];
+  uint8_t a[MAX_SIZE];
+  uint8_t b[MAX_SIZE];
+  struct knuth_lfib_ctx random_ctx;
+
+  knuth_lfib_init (&random_ctx, 11);
+
+  size_t size;
+  for (size = 0; size < 50; size++)
+    {
+      size_t i;
+      uint8_t bit;
+      knuth_lfib_random (&random_ctx, size, orig);
+      memcpy (a, orig, size);
+      memcpy (b, orig, size);
+      ASSERT (memeql_sec_for_test (a, b, size));
+      for (i = 0; i < size; i++)
+	for (bit = 0x80; bit; bit >>= 1)
+	  {
+	    b[i] = orig[i] ^ bit;
+	    ASSERT (!memeql_sec_for_test (a, b, size));
+	    b[i] = orig[i];
+	  }
+    }
+}
-- 
GitLab