1
0
mirror of git://git.gnupg.org/gnupg.git synced 2025-05-24 16:43:28 +02:00

mpi: Simplify mpi_powm.

* mpi/mpi-pow.c (_gcry_mpi_powm): Simplify the loop.

--

(backport of libgcrypt master commit:
 719468e53133d3bdf12156c5bfdea2bf15f9f6f1)

Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
This commit is contained in:
NIIBE Yutaka 2017-07-07 14:26:39 +09:00
parent 782f804765
commit b38f4489f7

View File

@ -564,12 +564,8 @@ mpi_powm (MPI res, MPI base, MPI expo, MPI mod)
if (e == 0) if (e == 0)
{ {
j += c; j += c;
i--; if ( --i < 0 )
if ( i < 0 )
{
c = 0;
break; break;
}
e = ep[i]; e = ep[i];
c = BITS_PER_MPI_LIMB; c = BITS_PER_MPI_LIMB;
@ -584,38 +580,33 @@ mpi_powm (MPI res, MPI base, MPI expo, MPI mod)
c -= c0; c -= c0;
j += c0; j += c0;
if (c >= W)
{
e0 = (e >> (BITS_PER_MPI_LIMB - W)); e0 = (e >> (BITS_PER_MPI_LIMB - W));
e = (e << W); if (c >= W)
c -= W; c0 =0;
else
{
if ( --i < 0 )
{
e0 = (e >> (BITS_PER_MPI_LIMB - c));
j += c - W;
goto last_step;
} }
else else
{ {
i--;
if ( i < 0 )
{
e = (e >> (BITS_PER_MPI_LIMB - c));
break;
}
c0 = c; c0 = c;
e0 = (e >> (BITS_PER_MPI_LIMB - W)) e = ep[i];
| (ep[i] >> (BITS_PER_MPI_LIMB - W + c0)); c = BITS_PER_MPI_LIMB;
e = (ep[i] << (W - c0)); e0 |= (e >> (BITS_PER_MPI_LIMB - (W - c0)));
c = BITS_PER_MPI_LIMB - W + c0; }
} }
e = e << (W - c0);
c -= (W - c0);
last_step:
count_trailing_zeros (c0, e0); count_trailing_zeros (c0, e0);
e0 = (e0 >> c0) >> 1; e0 = (e0 >> c0) >> 1;
for (j += W - c0; j; j--)
{
mul_mod (xp, &xsize, rp, rsize, rp, rsize, mp, msize, &karactx);
tp = rp; rp = xp; xp = tp;
rsize = xsize;
}
/* /*
* base_u <= precomp[e0] * base_u <= precomp[e0]
* base_u_size <= precomp_size[e0]; * base_u_size <= precomp_size[e0];
@ -634,22 +625,20 @@ mpi_powm (MPI res, MPI base, MPI expo, MPI mod)
u.d = precomp[k]; u.d = precomp[k];
mpi_set_cond (&w, &u, k == e0); mpi_set_cond (&w, &u, k == e0);
base_u_size |= (precomp_size[k] & ((mpi_size_t)0 - (k == e0)) ); base_u_size |= ( precomp_size[k] & ((mpi_size_t)0 - (k == e0)) );
} }
mul_mod (xp, &xsize, rp, rsize, base_u, base_u_size, for (j += W - c0; j >= 0; j--)
{
mul_mod (xp, &xsize, rp, rsize,
j == 0 ? base_u : rp, j == 0 ? base_u_size : rsize,
mp, msize, &karactx); mp, msize, &karactx);
tp = rp; rp = xp; xp = tp; tp = rp; rp = xp; xp = tp;
rsize = xsize; rsize = xsize;
j = c0;
} }
if (c != 0) j = c0;
{ if ( i < 0 )
j += c; break;
count_trailing_zeros (c, e);
e = (e >> c);
j -= c;
} }
while (j--) while (j--)
@ -659,38 +648,6 @@ mpi_powm (MPI res, MPI base, MPI expo, MPI mod)
rsize = xsize; rsize = xsize;
} }
if (e != 0)
{
base_u_size = 0;
for (k = 0; k < (1<< (W - 1)); k++)
{
struct gcry_mpi w, u;
w.alloced = w.nlimbs = precomp_size[k];
u.alloced = u.nlimbs = precomp_size[k];
w.nbits = w.nlimbs * BITS_PER_MPI_LIMB;
u.nbits = u.nlimbs * BITS_PER_MPI_LIMB;
w.sign = u.sign = 0;
w.flags = u.flags = 0;
w.d = base_u;
u.d = precomp[k];
mpi_set_cond (&w, &u, k == (e>>1));
base_u_size |= (precomp_size[k] & ((mpi_size_t)0 - (k == (e>>1))) );
}
mul_mod (xp, &xsize, rp, rsize, base_u, base_u_size,
mp, msize, &karactx);
tp = rp; rp = xp; xp = tp;
rsize = xsize;
for (; c; c--)
{
mul_mod (xp, &xsize, rp, rsize, rp, rsize, mp, msize, &karactx);
tp = rp; rp = xp; xp = tp;
rsize = xsize;
}
}
/* We shifted MOD, the modulo reduction argument, left /* We shifted MOD, the modulo reduction argument, left
MOD_SHIFT_CNT steps. Adjust the result by reducing it with the MOD_SHIFT_CNT steps. Adjust the result by reducing it with the
original MOD. original MOD.