diff --git a/src/libsodium/crypto_scalarmult/ed25519/ref10/scalarmult_ed25519_ref10.c b/src/libsodium/crypto_scalarmult/ed25519/ref10/scalarmult_ed25519_ref10.c index 57c06a58..0e317cf7 100644 --- a/src/libsodium/crypto_scalarmult/ed25519/ref10/scalarmult_ed25519_ref10.c +++ b/src/libsodium/crypto_scalarmult/ed25519/ref10/scalarmult_ed25519_ref10.c @@ -47,8 +47,8 @@ crypto_scalarmult_ed25519(unsigned char *q, const unsigned char *n, _crypto_scalarmult_ed25519_clamp(t); ge25519_scalarmult(&Q, t, &P); ge25519_p3_tobytes(q, &Q); - if (_crypto_scalarmult_ed25519_is_inf(q) != 0) { - return -1; /* LCOV_EXCL_LINE */ + if (_crypto_scalarmult_ed25519_is_inf(q) != 0 || sodium_is_zero(n, 32)) { + return -1; } return 0; } diff --git a/test/default/scalarmult_ed25519.c b/test/default/scalarmult_ed25519.c index b1cf2ffd..3ad4bd09 100644 --- a/test/default/scalarmult_ed25519.c +++ b/test/default/scalarmult_ed25519.c @@ -43,10 +43,18 @@ main(void) memset(n, 0, crypto_scalarmult_ed25519_SCALARBYTES); if (crypto_scalarmult_ed25519_base(q, n) != -1) { + printf("crypto_scalarmult_ed25519_base(0) failed\n"); + } + if (crypto_scalarmult_ed25519(q2, n, p) != -1) { + printf("crypto_scalarmult_ed25519(0) passed\n"); + } + + n[0] = 1; + if (crypto_scalarmult_ed25519_base(q, n) != 0) { printf("crypto_scalarmult_ed25519_base() failed\n"); } if (crypto_scalarmult_ed25519(q2, n, p) != 0) { - printf("crypto_scalarmult_ed25519() failed\n"); + printf("crypto_scalarmult_ed25519() passed\n"); } if (crypto_scalarmult_ed25519(q, n, non_canonical_p) != -1) {