From 81e4bc63773ec3817d4b60c2a921088a03acd510 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=B6ller?= <nisse@lysator.liu.se> Date: Wed, 15 Nov 2023 12:59:07 +0100 Subject: [PATCH] Add sidechannel tests for ed25519 and ed448. --- ChangeLog | 10 +++++++++- ecc-curve25519.c | 4 ++-- eddsa-hash.c | 4 ++-- eddsa-sign.c | 4 ++-- testsuite/Makefile.in | 3 ++- testsuite/ed25519-test.c | 9 +++++++++ testsuite/ed448-test.c | 9 +++++++++ testsuite/sc-ed25519-test | 6 ++++++ testsuite/sc-ed448-test | 6 ++++++ 9 files changed, 47 insertions(+), 8 deletions(-) create mode 100755 testsuite/sc-ed25519-test create mode 100755 testsuite/sc-ed448-test diff --git a/ChangeLog b/ChangeLog index ca7d7bf7..623c60bb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,9 @@ * ecc-mod-arith.c (ecc_mod_addmul_1): Use assert_maybe. * ecc-curve448.c (ecc_curve448_modp): Likewise. + * ecc-curve25519.c (ecc_curve25519_modq): Likewise. + * eddsa-hash.c (_eddsa_hash): Likewise. + * eddsa-sign.c (_eddsa_sign): Likewise. * testsuite/curve25519-dh-test.c (test_g): Add calls to mark_bytes_undefined and mark_bytes_defined. @@ -9,11 +12,16 @@ (test_main): Skip side-channel tests in builds with mini-gmp or extra asserts enabled. * testsuite/curve448-dh-test.c: Analogous changes. + * testsuite/ed448-test.c (test_one): Analogous changes. + * testsuite/ed25519-test.c: Analogous changes. * testsuite/Makefile.in (TS_SC_HOGWEED): New make variable. Added - sc-curve25519-dh-test and sc-curve448-dh-test to list. + sc-curve25519-dh-test, sc-curve448-dh-test, sc-ed25519-test, and + sc-ed448-test to list. * testsuite/sc-curve25519-dh-test: New testcase. * testsuite/sc-curve448-dh-test: New testcase. + * testsuite/sc-ed448-test: New testcase. + * testsuite/sc-ed25519-test: New testcase. 2023-11-14 Niels Möller <nisse@lysator.liu.se> diff --git a/ecc-curve25519.c b/ecc-curve25519.c index 539bff22..db301252 100644 --- a/ecc-curve25519.c +++ b/ecc-curve25519.c @@ -89,13 +89,13 @@ ecc_curve25519_modq (const struct ecc_modulo *q, mp_limb_t *rp, mp_limb_t *xp) q->B_shifted, ECC_LIMB_SIZE, xp[n + ECC_LIMB_SIZE]); /* Top limb of mBmodq_shifted is zero, so we get cy == 0 or 1 */ - assert (cy < 2); + assert_maybe (cy < 2); mpn_cnd_add_n (cy, xp+n, xp+n, q->m, ECC_LIMB_SIZE); } cy = mpn_submul_1 (xp, q->m, ECC_LIMB_SIZE, xp[ECC_LIMB_SIZE-1] >> (GMP_NUMB_BITS - QHIGH_BITS)); - assert (cy < 2); + assert_maybe (cy < 2); mpn_cnd_add_n (cy, rp, xp, q->m, ECC_LIMB_SIZE); } diff --git a/eddsa-hash.c b/eddsa-hash.c index 6ebbe977..f14c16c8 100644 --- a/eddsa-hash.c +++ b/eddsa-hash.c @@ -71,9 +71,9 @@ _eddsa_hash (const struct ecc_modulo *m, assert (nlimbs == 2*m->size + 1); hi = mpn_addmul_1 (rp + m->size, m->B, m->size, hi); - assert (hi <= 1); + assert_maybe (hi <= 1); hi = mpn_cnd_add_n (hi, rp + m->size, rp + m->size, m->B, m->size); - assert (hi == 0); + assert_maybe (hi == 0); } m->mod (m, rp + m->size , rp); /* Ensure canonical reduction. */ diff --git a/eddsa-sign.c b/eddsa-sign.c index f5dda6f0..007b2af9 100644 --- a/eddsa-sign.c +++ b/eddsa-sign.c @@ -116,9 +116,9 @@ _eddsa_sign (const struct ecc_curve *ecc, } cy = mpn_submul_1 (sp, ecc->q.m, ecc->p.size, q); - assert (cy < 2); + assert_maybe (cy < 2); cy -= mpn_cnd_add_n (cy, sp, sp, ecc->q.m, ecc->p.size); - assert (cy == 0); + assert_maybe (cy == 0); mpn_get_base256_le (signature + nbytes, nbytes, sp, ecc->q.size); #undef rp diff --git a/testsuite/Makefile.in b/testsuite/Makefile.in index cf3d962c..8fc416df 100644 --- a/testsuite/Makefile.in +++ b/testsuite/Makefile.in @@ -67,7 +67,8 @@ TS_C = $(TS_NETTLE) @IF_HOGWEED@ $(TS_HOGWEED) TS_CXX = @IF_CXX@ $(CXX_SOURCES:.cxx=$(EXEEXT)) TARGETS = $(TS_C) $(TS_CXX) TS_SC_HOGWEED = sc-pkcs1-sec-decrypt-test sc-rsa-sec-decrypt-test \ - sc-ecdsa-sign-test sc-curve25519-dh-test sc-curve448-dh-test + sc-ecdsa-sign-test sc-curve25519-dh-test sc-curve448-dh-test \ + sc-ed25519-test sc-ed448-test TS_SC = sc-cnd-memcpy-test sc-gcm-test sc-memeql-test \ @IF_HOGWEED@ $(TS_SC_HOGWEED) diff --git a/testsuite/ed25519-test.c b/testsuite/ed25519-test.c index abcef34e..7e13881c 100644 --- a/testsuite/ed25519-test.c +++ b/testsuite/ed25519-test.c @@ -92,10 +92,15 @@ test_one (const char *line) decode_hex (msg_size, msg, mp); + mark_bytes_undefined (ED25519_KEY_SIZE, sk); ed25519_sha512_public_key (t, sk); + mark_bytes_defined (ED25519_KEY_SIZE, t); + ASSERT (MEMEQ(ED25519_KEY_SIZE, t, pk)); ed25519_sha512_sign (pk, sk, msg_size, msg, s2); + mark_bytes_defined (ED25519_SIGNATURE_SIZE, s2); + ASSERT (MEMEQ (ED25519_SIGNATURE_SIZE, s, s2)); ASSERT (ed25519_sha512_verify (pk, msg_size, msg, s)); @@ -158,6 +163,10 @@ getline(char **lineptr, size_t *n, FILE *f) void test_main(void) { +#if NETTLE_USE_MINI_GMP || WITH_EXTRA_ASSERTS + if (test_side_channel) + SKIP(); +#endif const char *input = getenv ("ED25519_SIGN_INPUT"); if (input) { diff --git a/testsuite/ed448-test.c b/testsuite/ed448-test.c index a46b85c6..7ea2da4f 100644 --- a/testsuite/ed448-test.c +++ b/testsuite/ed448-test.c @@ -93,10 +93,15 @@ test_one (const char *line) decode_hex (msg_size, msg, mp); + mark_bytes_undefined (ED448_KEY_SIZE, sk); ed448_shake256_public_key (t, sk); + mark_bytes_defined (ED448_KEY_SIZE, t); + ASSERT (MEMEQ(ED448_KEY_SIZE, t, pk)); ed448_shake256_sign (pk, sk, msg_size, msg, s2); + mark_bytes_defined (ED448_SIGNATURE_SIZE, s2); + ASSERT (MEMEQ (ED448_SIGNATURE_SIZE, s, s2)); ASSERT (ed448_shake256_verify (pk, msg_size, msg, s)); @@ -159,6 +164,10 @@ getline(char **lineptr, size_t *n, FILE *f) void test_main(void) { +#if NETTLE_USE_MINI_GMP || WITH_EXTRA_ASSERTS + if (test_side_channel) + SKIP(); +#endif const char *input = getenv ("ED448_SIGN_INPUT"); if (input) { diff --git a/testsuite/sc-ed25519-test b/testsuite/sc-ed25519-test new file mode 100755 index 00000000..81be04e9 --- /dev/null +++ b/testsuite/sc-ed25519-test @@ -0,0 +1,6 @@ +#! /bin/sh + +srcdir=`dirname $0` +. "${srcdir}/sc-valgrind.sh" + +with_valgrind ./ed25519-test diff --git a/testsuite/sc-ed448-test b/testsuite/sc-ed448-test new file mode 100755 index 00000000..d0efdbaf --- /dev/null +++ b/testsuite/sc-ed448-test @@ -0,0 +1,6 @@ +#! /bin/sh + +srcdir=`dirname $0` +. "${srcdir}/sc-valgrind.sh" + +with_valgrind ./ed448-test -- GitLab