diff options
author | NIIBE Yutaka <gniibe@fsij.org> | 2019-06-12 12:17:50 +0900 |
---|---|---|
committer | NIIBE Yutaka <gniibe@fsij.org> | 2019-06-12 12:17:50 +0900 |
commit | c7cb409f66f2d90d5c169201b96667f6feb2f744 (patch) | |
tree | d8ebffc5d30ff23eeedc6e9905e3a25d4efaec87 | |
parent | 233a0e69042382947444c59f39bba3a05297340a (diff) | |
download | libgcrypt-gniibe/4293.tar.gz |
ecc: X448 also work on 32-bit machine.gniibe/4293
Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
-rw-r--r-- | mpi/ec.c | 85 |
1 files changed, 45 insertions, 40 deletions
@@ -538,6 +538,9 @@ ec_mulm_448 (gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v, mpi_ec_t ctx) mpi_limb_t b1[LIMB_SIZE_HALF_448]; mpi_limb_t cy; int i; +#if (LIMB_SIZE_HALF_448 > LIMB_SIZE_448/2) + mpi_limb_t b1_rest, a3_rest; +#endif if (w->nlimbs != wsize || u->nlimbs != wsize || v->nlimbs != wsize) log_bug ("mulm_448: different sizes\n"); @@ -556,63 +559,65 @@ ec_mulm_448 (gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v, mpi_ec_t ctx) a3[i] = n[i+wsize+wsize/2]; } - if (LIMB_SIZE_HALF_448 > LIMB_SIZE_448/2) - { - mpi_limb_t b1_rest, a3_rest; - - b0[LIMB_SIZE_HALF_448-1] &= (1UL<<32)-1; - a2[LIMB_SIZE_HALF_448-1] &= (1UL<<32)-1; +#if (LIMB_SIZE_HALF_448 > LIMB_SIZE_448/2) + b0[LIMB_SIZE_HALF_448-1] &= (1UL<<32)-1; + a2[LIMB_SIZE_HALF_448-1] &= (1UL<<32)-1; - b1_rest = 0; - a3_rest = 0; + b1_rest = 0; + a3_rest = 0; - for (i = (wsize + 1)/ 2 -1; i >= 0; i--) - { - mpi_limb_t b1v, a3v; - b1v = b1[i]; - a3v = a3[i]; - b1[i] = (b1_rest<<32) | (b1v >> 32); - a3[i] = (a3_rest<<32) | (a3v >> 32); - b1_rest = b1v & ((1UL <<32)-1); - a3_rest = a3v & ((1UL <<32)-1); - } + for (i = (wsize + 1)/ 2 -1; i >= 0; i--) + { + mpi_limb_t b1v, a3v; + b1v = b1[i]; + a3v = a3[i]; + b1[i] = (b1_rest<<32) | (b1v >> 32); + a3[i] = (a3_rest<<32) | (a3v >> 32); + b1_rest = b1v & ((1UL <<32)-1); + a3_rest = a3v & ((1UL <<32)-1); } +#endif cy = _gcry_mpih_add_n (b0, b0, a2, LIMB_SIZE_HALF_448); cy += _gcry_mpih_add_n (b0, b0, a3, LIMB_SIZE_HALF_448); for (i = 0; i < (wsize + 1)/ 2; i++) wp[i] = b0[i]; - if (LIMB_SIZE_HALF_448 > LIMB_SIZE_448/2) - wp[LIMB_SIZE_HALF_448-1] &= ((1UL <<32)-1); +#if (LIMB_SIZE_HALF_448 > LIMB_SIZE_448/2) + wp[LIMB_SIZE_HALF_448-1] &= ((1UL <<32)-1); +#endif + +#if (LIMB_SIZE_HALF_448 > LIMB_SIZE_448/2) + cy = b0[LIMB_SIZE_HALF_448-1] >> 32; +#endif - if (LIMB_SIZE_HALF_448 > LIMB_SIZE_448/2) - cy = b0[LIMB_SIZE_HALF_448-1] >> 32; cy = _gcry_mpih_add_1 (b1, b1, LIMB_SIZE_HALF_448, cy); cy += _gcry_mpih_add_n (b1, b1, a2, LIMB_SIZE_HALF_448); cy += _gcry_mpih_add_n (b1, b1, a3, LIMB_SIZE_HALF_448); cy += _gcry_mpih_add_n (b1, b1, a3, LIMB_SIZE_HALF_448); - if (LIMB_SIZE_HALF_448 > LIMB_SIZE_448/2) +#if (LIMB_SIZE_HALF_448 > LIMB_SIZE_448/2) + b1_rest = 0; + for (i = (wsize + 1)/ 2 -1; i >= 0; i--) { - mpi_limb_t b1_rest = 0; - - for (i = (wsize + 1)/ 2 -1; i >= 0; i--) - { - mpi_limb_t b1v = b1[i]; - b1[i] = (b1_rest<<32) | (b1v >> 32); - b1_rest = b1v & ((1UL <<32)-1); - } - wp[LIMB_SIZE_HALF_448-1] |= (b1_rest << 32); - for (i = 0; i < wsize / 2; i++) - wp[i+(wsize + 1) / 2] = b1[i]; + mpi_limb_t b1v = b1[i]; + b1[i] = (b1_rest<<32) | (b1v >> 32); + b1_rest = b1v & ((1UL <<32)-1); } + wp[LIMB_SIZE_HALF_448-1] |= (b1_rest << 32); +#endif + for (i = 0; i < wsize / 2; i++) + wp[i+(wsize + 1) / 2] = b1[i]; + +#if (LIMB_SIZE_HALF_448 > LIMB_SIZE_448/2) + cy = b1[LIMB_SIZE_HALF_448-1]; +#endif - if (LIMB_SIZE_HALF_448 > LIMB_SIZE_448/2) - cy = b1[LIMB_SIZE_HALF_448-1]; memset (n, 0, wsize * BYTES_PER_MPI_LIMB); - if (LIMB_SIZE_HALF_448 > LIMB_SIZE_448/2) - n[LIMB_SIZE_HALF_448-1] = cy << 32; - else - n[LIMB_SIZE_HALF_448] = cy; + +#if (LIMB_SIZE_HALF_448 > LIMB_SIZE_448/2) + n[LIMB_SIZE_HALF_448-1] = cy << 32; +#else + n[LIMB_SIZE_HALF_448] = cy; +#endif n[0] = cy; _gcry_mpih_add_n (wp, wp, n, wsize); |