From 1f5f71b0155a3da3a4fd51374c5d1f009e71e6b8 Mon Sep 17 00:00:00 2001 From: Frank Denis Date: Sun, 2 Aug 2020 19:59:22 +0200 Subject: [PATCH] Simplify 128<->64 bit casts --- .../sodium/private/ed25519_ref10_fe_51.h | 193 +++++++----------- 1 file changed, 72 insertions(+), 121 deletions(-) diff --git a/src/libsodium/include/sodium/private/ed25519_ref10_fe_51.h b/src/libsodium/include/sodium/private/ed25519_ref10_fe_51.h index d91c2201..61a8a240 100644 --- a/src/libsodium/include/sodium/private/ed25519_ref10_fe_51.h +++ b/src/libsodium/include/sodium/private/ed25519_ref10_fe_51.h @@ -273,80 +273,57 @@ static void fe25519_mul(fe25519 h, const fe25519 f, const fe25519 g) { const uint64_t mask = 0x7ffffffffffffULL; - uint128_t r0, r1, r2, r3, r4, carry; - uint64_t f0, f1, f2, f3, f4; - uint64_t f1_19, f2_19, f3_19, f4_19; - uint64_t g0, g1, g2, g3, g4; + uint128_t r0, r1, r2, r3, r4; + uint128_t f0, f1, f2, f3, f4; + uint128_t f1_19, f2_19, f3_19, f4_19; + uint128_t g0, g1, g2, g3, g4; uint64_t r00, r01, r02, r03, r04; + uint64_t carry; - f0 = f[0]; - f1 = f[1]; - f2 = f[2]; - f3 = f[3]; - f4 = f[4]; + f0 = (uint128_t) f[0]; + f1 = (uint128_t) f[1]; + f2 = (uint128_t) f[2]; + f3 = (uint128_t) f[3]; + f4 = (uint128_t) f[4]; - g0 = g[0]; - g1 = g[1]; - g2 = g[2]; - g3 = g[3]; - g4 = g[4]; + g0 = (uint128_t) g[0]; + g1 = (uint128_t) g[1]; + g2 = (uint128_t) g[2]; + g3 = (uint128_t) g[3]; + g4 = (uint128_t) g[4]; f1_19 = 19ULL * f1; f2_19 = 19ULL * f2; f3_19 = 19ULL * f3; f4_19 = 19ULL * f4; - r0 = ((uint128_t) f0 ) * ((uint128_t) g0); - r0 += ((uint128_t) f1_19) * ((uint128_t) g4); - r0 += ((uint128_t) f2_19) * ((uint128_t) g3); - r0 += ((uint128_t) f3_19) * ((uint128_t) g2); - r0 += ((uint128_t) f4_19) * ((uint128_t) g1); - - r1 = ((uint128_t) f0 ) * ((uint128_t) g1); - r1 += ((uint128_t) f1 ) * ((uint128_t) g0); - r1 += ((uint128_t) f2_19) * ((uint128_t) g4); - r1 += ((uint128_t) f3_19) * ((uint128_t) g3); - r1 += ((uint128_t) f4_19) * ((uint128_t) g2); - - r2 = ((uint128_t) f0 ) * ((uint128_t) g2); - r2 += ((uint128_t) f1 ) * ((uint128_t) g1); - r2 += ((uint128_t) f2 ) * ((uint128_t) g0); - r2 += ((uint128_t) f3_19) * ((uint128_t) g4); - r2 += ((uint128_t) f4_19) * ((uint128_t) g3); - - r3 = ((uint128_t) f0 ) * ((uint128_t) g3); - r3 += ((uint128_t) f1 ) * ((uint128_t) g2); - r3 += ((uint128_t) f2 ) * ((uint128_t) g1); - r3 += ((uint128_t) f3 ) * ((uint128_t) g0); - r3 += ((uint128_t) f4_19) * ((uint128_t) g4); - - r4 = ((uint128_t) f0 ) * ((uint128_t) g4); - r4 += ((uint128_t) f1 ) * ((uint128_t) g3); - r4 += ((uint128_t) f2 ) * ((uint128_t) g2); - r4 += ((uint128_t) f3 ) * ((uint128_t) g1); - r4 += ((uint128_t) f4 ) * ((uint128_t) g0); + r0 = f0 * g0 + f1_19 * g4 + f2_19 * g3 + f3_19 * g2 + f4_19 * g1; + r1 = f0 * g1 + f1 * g0 + f2_19 * g4 + f3_19 * g3 + f4_19 * g2; + r2 = f0 * g2 + f1 * g1 + f2 * g0 + f3_19 * g4 + f4_19 * g3; + r3 = f0 * g3 + f1 * g2 + f2 * g1 + f3 * g0 + f4_19 * g4; + r4 = f0 * g4 + f1 * g3 + f2 * g2 + f3 * g1 + f4 * g0; r00 = ((uint64_t) r0) & mask; - carry = r0 >> 51; + carry = (uint64_t) (r0 >> 51); r1 += carry; r01 = ((uint64_t) r1) & mask; - carry = r1 >> 51; + carry = (uint64_t) (r1 >> 51); r2 += carry; r02 = ((uint64_t) r2) & mask; - carry = r2 >> 51; + carry = (uint64_t) (r2 >> 51); r3 += carry; r03 = ((uint64_t) r3) & mask; - carry = r3 >> 51; + carry = (uint64_t) (r3 >> 51); r4 += carry; r04 = ((uint64_t) r4) & mask; - carry = r4 >> 51; - r00 += 19ULL * (uint64_t) carry; + carry = (uint64_t) (r4 >> 51); + r00 += 19ULL * carry; carry = r00 >> 51; r00 &= mask; - r01 += (uint64_t) carry; + r01 += carry; carry = r01 >> 51; r01 &= mask; - r02 += (uint64_t) carry; + r02 += carry; h[0] = r00; h[1] = r01; @@ -364,16 +341,17 @@ static void fe25519_sq(fe25519 h, const fe25519 f) { const uint64_t mask = 0x7ffffffffffffULL; - uint128_t r0, r1, r2, r3, r4, carry; - uint64_t f0, f1, f2, f3, f4; - uint64_t f0_2, f1_2, f1_38, f2_38, f3_38, f3_19, f4_19; + uint128_t r0, r1, r2, r3, r4; + uint128_t f0, f1, f2, f3, f4; + uint128_t f0_2, f1_2, f1_38, f2_38, f3_38, f3_19, f4_19; uint64_t r00, r01, r02, r03, r04; + uint64_t carry; - f0 = f[0]; - f1 = f[1]; - f2 = f[2]; - f3 = f[3]; - f4 = f[4]; + f0 = (uint128_t) f[0]; + f1 = (uint128_t) f[1]; + f2 = (uint128_t) f[2]; + f3 = (uint128_t) f[3]; + f4 = (uint128_t) f[4]; f0_2 = f0 << 1; f1_2 = f1 << 1; @@ -385,47 +363,33 @@ fe25519_sq(fe25519 h, const fe25519 f) f3_19 = 19ULL * f3; f4_19 = 19ULL * f4; - r0 = ((uint128_t) f0 ) * ((uint128_t) f0); - r0 += ((uint128_t) f1_38) * ((uint128_t) f4); - r0 += ((uint128_t) f2_38) * ((uint128_t) f3); - - r1 = ((uint128_t) f0_2 ) * ((uint128_t) f1); - r1 += ((uint128_t) f2_38) * ((uint128_t) f4); - r1 += ((uint128_t) f3_19) * ((uint128_t) f3); - - r2 = ((uint128_t) f0_2 ) * ((uint128_t) f2); - r2 += ((uint128_t) f1 ) * ((uint128_t) f1); - r2 += ((uint128_t) f3_38) * ((uint128_t) f4); - - r3 = ((uint128_t) f0_2 ) * ((uint128_t) f3); - r3 += ((uint128_t) f1_2 ) * ((uint128_t) f2); - r3 += ((uint128_t) f4_19) * ((uint128_t) f4); - - r4 = ((uint128_t) f0_2 ) * ((uint128_t) f4); - r4 += ((uint128_t) f1_2 ) * ((uint128_t) f3); - r4 += ((uint128_t) f2 ) * ((uint128_t) f2); + r0 = f0 * f0 + f1_38 * f4 + f2_38 * f3; + r1 = f0_2 * f1 + f2_38 * f4 + f3_19 * f3; + r2 = f0_2 * f2 + f1 * f1 + f3_38 * f4; + r3 = f0_2 * f3 + f1_2 * f2 + f4_19 * f4; + r4 = f0_2 * f4 + f1_2 * f3 + f2 * f2; r00 = ((uint64_t) r0) & mask; - carry = r0 >> 51; + carry = (uint64_t) (r0 >> 51); r1 += carry; r01 = ((uint64_t) r1) & mask; - carry = r1 >> 51; + carry = (uint64_t) (r1 >> 51); r2 += carry; r02 = ((uint64_t) r2) & mask; - carry = r2 >> 51; + carry = (uint64_t) (r2 >> 51); r3 += carry; r03 = ((uint64_t) r3) & mask; - carry = r3 >> 51; + carry = (uint64_t) (r3 >> 51); r4 += carry; r04 = ((uint64_t) r4) & mask; - carry = r4 >> 51; - r00 += 19ULL * (uint64_t) carry; + carry = (uint64_t) (r4 >> 51); + r00 += 19ULL * carry; carry = r00 >> 51; r00 &= mask; - r01 += (uint64_t) carry; + r01 += carry; carry = r01 >> 51; r01 &= mask; - r02 += (uint64_t) carry; + r02 += carry; h[0] = r00; h[1] = r01; @@ -443,16 +407,17 @@ static void fe25519_sq2(fe25519 h, const fe25519 f) { const uint64_t mask = 0x7ffffffffffffULL; - uint128_t r0, r1, r2, r3, r4, carry; - uint64_t f0, f1, f2, f3, f4; - uint64_t f0_2, f1_2, f1_38, f2_38, f3_38, f3_19, f4_19; + uint128_t r0, r1, r2, r3, r4; + uint128_t f0, f1, f2, f3, f4; + uint128_t f0_2, f1_2, f1_38, f2_38, f3_38, f3_19, f4_19; uint64_t r00, r01, r02, r03, r04; + uint64_t carry; - f0 = f[0]; - f1 = f[1]; - f2 = f[2]; - f3 = f[3]; - f4 = f[4]; + f0 = (uint128_t) f[0]; + f1 = (uint128_t) f[1]; + f2 = (uint128_t) f[2]; + f3 = (uint128_t) f[3]; + f4 = (uint128_t) f[4]; f0_2 = f0 << 1; f1_2 = f1 << 1; @@ -464,25 +429,11 @@ fe25519_sq2(fe25519 h, const fe25519 f) f3_19 = 19ULL * f3; f4_19 = 19ULL * f4; - r0 = ((uint128_t) f0 ) * ((uint128_t) f0); - r0 += ((uint128_t) f1_38) * ((uint128_t) f4); - r0 += ((uint128_t) f2_38) * ((uint128_t) f3); - - r1 = ((uint128_t) f0_2 ) * ((uint128_t) f1); - r1 += ((uint128_t) f2_38) * ((uint128_t) f4); - r1 += ((uint128_t) f3_19) * ((uint128_t) f3); - - r2 = ((uint128_t) f0_2 ) * ((uint128_t) f2); - r2 += ((uint128_t) f1 ) * ((uint128_t) f1); - r2 += ((uint128_t) f3_38) * ((uint128_t) f4); - - r3 = ((uint128_t) f0_2 ) * ((uint128_t) f3); - r3 += ((uint128_t) f1_2 ) * ((uint128_t) f2); - r3 += ((uint128_t) f4_19) * ((uint128_t) f4); - - r4 = ((uint128_t) f0_2 ) * ((uint128_t) f4); - r4 += ((uint128_t) f1_2 ) * ((uint128_t) f3); - r4 += ((uint128_t) f2 ) * ((uint128_t) f2); + r0 = f0 * f0 + f1_38 * f4 + f2_38 * f3; + r1 = f0_2 * f1 + f2_38 * f4 + f3_19 * f3; + r2 = f0_2 * f2 + f1 * f1 + f3_38 * f4; + r3 = f0_2 * f3 + f1_2 * f2 + f4_19 * f4; + r4 = f0_2 * f4 + f1_2 * f3 + f2 * f2; r0 <<= 1; r1 <<= 1; @@ -491,26 +442,26 @@ fe25519_sq2(fe25519 h, const fe25519 f) r4 <<= 1; r00 = ((uint64_t) r0) & mask; - carry = r0 >> 51; + carry = (uint64_t) (r0 >> 51); r1 += carry; r01 = ((uint64_t) r1) & mask; - carry = r1 >> 51; + carry = (uint64_t) (r1 >> 51); r2 += carry; r02 = ((uint64_t) r2) & mask; - carry = r2 >> 51; + carry = (uint64_t) (r2 >> 51); r3 += carry; r03 = ((uint64_t) r3) & mask; - carry = r3 >> 51; + carry = (uint64_t) (r3 >> 51); r4 += carry; r04 = ((uint64_t) r4) & mask; - carry = r4 >> 51; - r00 += 19ULL * (uint64_t) carry; + carry = (uint64_t) (r4 >> 51); + r00 += 19ULL * carry; carry = r00 >> 51; r00 &= mask; - r01 += (uint64_t) carry; + r01 += carry; carry = r01 >> 51; r01 &= mask; - r02 += (uint64_t) carry; + r02 += carry; h[0] = r00; h[1] = r01;