* 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.
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)
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 \
--- /dev/null
+#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];
+ }
+ }
+}