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 ) break;
{
c = 0;
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;
e0 = (e >> (BITS_PER_MPI_LIMB - W));
if (c >= W) if (c >= W)
{ c0 =0;
e0 = (e >> (BITS_PER_MPI_LIMB - W));
e = (e << W);
c -= W;
}
else else
{ {
i--; if ( --i < 0 )
if ( i < 0 )
{ {
e = (e >> (BITS_PER_MPI_LIMB - c)); e0 = (e >> (BITS_PER_MPI_LIMB - c));
break; j += c - W;
goto last_step;
} }
else
c0 = c; {
e0 = (e >> (BITS_PER_MPI_LIMB - W)) c0 = c;
| (ep[i] >> (BITS_PER_MPI_LIMB - W + c0)); e = ep[i];
e = (ep[i] << (W - c0)); c = BITS_PER_MPI_LIMB;
c = BITS_PER_MPI_LIMB - W + c0; e0 |= (e >> (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,24 +625,22 @@ 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)) );
}
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);
tp = rp; rp = xp; xp = tp;
rsize = xsize;
} }
mul_mod (xp, &xsize, rp, rsize, base_u, base_u_size,
mp, msize, &karactx);
tp = rp; rp = xp; xp = tp;
rsize = xsize;
j = c0; j = c0;
if ( i < 0 )
break;
} }
if (c != 0)
{
j += c;
count_trailing_zeros (c, e);
e = (e >> c);
j -= c;
}
while (j--) while (j--)
{ {
mul_mod (xp, &xsize, rp, rsize, rp, rsize, mp, msize, &karactx); mul_mod (xp, &xsize, rp, rsize, rp, rsize, mp, msize, &karactx);
@ -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.