From 3f65a212128e371e3cc45a4e07e00dfb68be72ee Mon Sep 17 00:00:00 2001 From: Chris Fogelklou Date: Tue, 4 Apr 2017 06:00:36 +0200 Subject: [PATCH] Fix ref10 slide on PPC-VLE (#525) * Use intermediate variables in slide() which removes ambiguity for the compiler and fixes a crash in the PPC_VLE build with -O1 flag (added bonus: smaller compiled code.) * Fix formatting in slide() loop counter to match the previously just-formatted version. --- .../curve25519/ref10/curve25519_ref10.c | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c b/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c index ad06bee4..a33a4187 100644 --- a/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c +++ b/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c @@ -1359,6 +1359,8 @@ slide(signed char *r, const unsigned char *a) int i; int b; int k; + int ribs; + int cmp; for (i = 0; i < 256; ++i) { r[i] = 1 & (a[i >> 3] >> (i & 7)); @@ -1367,20 +1369,25 @@ slide(signed char *r, const unsigned char *a) if (r[i]) { for (b = 1; b <= 6 && i + b < 256; ++b) { if (r[i + b]) { - if (r[i] + (r[i + b] << b) <= 15) { - r[i] += r[i + b] << b; + ribs = r[i + b] << b; + cmp = r[i] + ribs; + if (cmp <= 15) { + r[i] = cmp; r[i + b] = 0; - } else if (r[i] - (r[i + b] << b) >= -15) { - r[i] -= r[i + b] << b; - for (k = i + b; k < 256; ++k) { - if (!r[k]) { - r[k] = 1; - break; - } - r[k] = 0; - } } else { - break; + cmp = r[i] - ribs; + if (cmp >= -15) { + r[i] = cmp; + for (k = i + b; k < 256; ++k) { + if (!r[k]) { + r[k] = 1; + break; + } + r[k] = 0; + } + } else { + break; + } } } }