]> Git Repo - secp256k1.git/commitdiff
Remove unnecessary sign variable from wnaf_const
authorJonas Nick <[email protected]>
Fri, 17 Apr 2020 18:06:47 +0000 (18:06 +0000)
committerJonas Nick <[email protected]>
Wed, 29 Apr 2020 12:38:23 +0000 (12:38 +0000)
src/ecmult_const_impl.h

index d0d963182464a548bd4da91a53dc3249f9661ca2..0c26b1e767e2cab84df74dfd147ec1d848974abe 100644 (file)
@@ -101,16 +101,22 @@ static int secp256k1_wnaf_const(int *wnaf, const secp256k1_scalar *scalar, int w
     /* 4 */
     u_last = secp256k1_scalar_shr_int(&s, w);
     do {
-        int sign;
         int even;
 
         /* 4.1 4.4 */
         u = secp256k1_scalar_shr_int(&s, w);
         /* 4.2 */
         even = ((u & 1) == 0);
-        sign = 2 * (u_last > 0) - 1;
-        u += sign * even;
-        u_last -= sign * even * (1 << w);
+        /* In contrast to the original algorithm, u_last is always > 0 and
+         * therefore we do not need to check its sign. In particular, it's easy
+         * to see that u_last is never < 0 because u is never < 0. Moreover,
+         * u_last is never = 0 because u is never even after a loop
+         * iteration. The same holds analogously for the initial value of
+         * u_last (in the first loop iteration). */
+        VERIFY_CHECK(u_last > 0);
+        VERIFY_CHECK((u_last & 1) == 1);
+        u += even;
+        u_last -= even * (1 << w);
 
         /* 4.3, adapted for global sign change */
         wnaf[word++] = u_last * global_sign;
This page took 0.026575 seconds and 4 git commands to generate.