Merge fix for DSA on 64bit platforms.

CVS patchset: 6888
CVS date: 2003/06/03 15:48:50
This commit is contained in:
jbj 2003-06-03 15:48:50 +00:00
parent e1e73e6430
commit 92dc678a0e
6 changed files with 45 additions and 67 deletions

View File

@ -77,14 +77,14 @@ int dsasign(const mpbarrett* p, const mpbarrett* q, const mpnumber* g, randomGen
mpnfree(r);
mpnsize(r, qsize);
/* get a random k, invertible modulo q */
/* get a random k, invertible modulo q; store k @ qtemp, inv(k) @ qtemp+qsize */
mpbrndinv_w(q, rgc, qtemp, qtemp+qsize, qwksp);
/* g^k mod p */
mpbpowmod_w(p, g->size, g->data, qsize, qtemp, ptemp, pwksp);
/* (g^k mod p) mod q - simple modulo */
mpnmod(qtemp+2*qsize, psize, ptemp, qsize, q->modl, pwksp);
mpmod(qtemp+2*qsize, psize, ptemp, qsize, q->modl, pwksp);
mpcopy(qsize, r->data, qtemp+psize+qsize);
/* allocate s */
@ -201,7 +201,7 @@ if (_debug)
fprintf(stderr, "\t multiply mod p: "), mpfprintln(stderr, psize, ptemp);
/* modulo q */
mpnmod(ptemp+psize, psize, ptemp, qsize, q->modl, pwksp);
mpmod(ptemp+psize, psize, ptemp, qsize, q->modl, pwksp);
if (_debug)
fprintf(stderr, "\tr : "), mpfprintln(stderr, r->size, r->data);

View File

@ -409,3 +409,11 @@ LOCAL(mpaddsqrtrc_loop):
popl %edi
ret
C_FUNCTION_END(mpaddsqrtrc)
C_FUNCTION_BEGIN(mppndiv)
movl 4(%esp),%edx
movl 8(%esp),%eax
divl 12(%esp)
ret
C_FUNCTION_END(mppndiv)

View File

@ -822,7 +822,7 @@ void mpsqr(mpw* result, size_t size, const mpw* data)
*(--result) = 0;
(void) mpmultwo(size*2, result);
(void) mpmultwo(size << 1, result);
(void) mpaddsqrtrc(size, result, data);
}
@ -1243,7 +1243,7 @@ mpw mppndiv(mpw xhi, mpw xlo, mpw y)
if (((unsigned)carry) | (unsigned)(xhi >= y))
{
xhi -= y;
result |= 1;
result++;
}
carry = (xhi >> (MP_WBITS-1));
xhi <<= 1;
@ -1254,78 +1254,51 @@ mpw mppndiv(mpw xhi, mpw xlo, mpw y)
if (((unsigned)carry) | (unsigned)(xhi >= y))
{
xhi -= y;
result |= 1;
result++;
}
return result;
}
#endif
#ifndef ASM_MPNMODW
mpw mpnmodw(mpw* result, size_t xsize, const mpw* xdata, mpw y, mpw* workspace)
#ifndef ASM_MPMOD
void mpmod(mpw* result, size_t xsize, const mpw* xdata, size_t ysize, const mpw* ydata, mpw* workspace)
{
/* result size xsize, workspace size xsize+1 */
register mpw q;
mpw qsize = xsize-1;
/* result size xsize, workspace size 2*ysize+1 */
mpw q, msw;
mpw* rdata = result;
mpw* ynorm = workspace+ysize+1;
size_t shift, qsize = xsize-ysize;
mpcopy(ysize, ynorm, ydata);
shift = mpnorm(ysize, ynorm);
msw = *ynorm;
mpcopy(xsize, rdata, xdata);
/*
if (*rdata >= y)
*rdata -= y;
*/
if (mpge(1, rdata, &y))
(void) mpsub(1, rdata, &y);
while (qsize--)
{
q = mppndiv(rdata[0], rdata[1], y);
/*@-evalorder@*/
*workspace = mpsetmul(1, workspace+1, &y, q);
/*@=evalorder@*/
while (mplt(2, rdata, workspace))
{
(void) mpsubx(2, workspace, 1, &y);
/* q--; */
}
(void) mpsub(2, rdata, workspace);
rdata++;
}
return *rdata;
}
#endif
#ifndef ASM_MPNMOD
void mpnmod(mpw* result, size_t xsize, const mpw* xdata, size_t ysize, const mpw* ydata, mpw* workspace)
{
/* result size xsize, workspace size xsize+1 */
mpw q;
mpw msw = *ydata;
mpw qsize = xsize-ysize;
mpw* rdata = result;
mpcopy(xsize, rdata, xdata);
if (mpge(ysize, rdata, ydata))
(void) mpsub(ysize, rdata, ydata);
if (mpge(ysize, rdata, ynorm))
(void) mpsub(ysize, rdata, ynorm);
while (qsize--)
{
q = mppndiv(rdata[0], rdata[1], msw);
/*@-evalorder@*/
*workspace = mpsetmul(ysize, workspace+1, ydata, q);
*workspace = mpsetmul(ysize, workspace+1, ynorm, q);
/*@=evalorder@*/
while (mplt(ysize+1, rdata, workspace))
{
(void) mpsubx(ysize+1, workspace, ysize, ydata);
(void) mpsubx(ysize+1, workspace, ysize, ynorm);
q--;
}
(void) mpsub(ysize+1, rdata, workspace);
rdata++;
}
/* de-normalization steps */
while (shift--)
{
mpdivtwo(ysize, ynorm);
if (mpge(ysize, rdata, ynorm))
mpsub(ysize, rdata, ynorm);
}
}
#endif
@ -1378,10 +1351,11 @@ void mpprintln(size_t size, const mpw* data)
void mpfprint(FILE * f, size_t size, const mpw* data)
{
if (data == NULL)
if (data == (mpw*) 0)
return;
if (f == NULL)
if (f == (FILE*) 0)
f = stderr;
while (size--)
{
#if (MP_WBITS == 32)
@ -1398,16 +1372,16 @@ void mpfprint(FILE * f, size_t size, const mpw* data)
# error
#endif
}
fprintf(f, "\n");
(void) fflush(f);
}
void mpfprintln(FILE * f, size_t size, const mpw* data)
{
if (data == NULL)
if (data == (mpw*) 0)
return;
if (f == NULL)
if (f == (FILE*) 0)
f = stderr;
while (size--)
{
#if (MP_WBITS == 32)

View File

@ -662,13 +662,7 @@ mpw mppndiv(mpw xhi, mpw xlo, mpw y)
/**
*/
BEECRYPTAPI /*@unused@*/
mpw mpnmodw(/*@out@*/ mpw* result, size_t xsize, const mpw* xdata, mpw y, /*@out@*/ mpw* workspace)
/*@modifies result, workspace @*/;
/**
*/
BEECRYPTAPI
void mpnmod(/*@out@*/ mpw* result, size_t xsize, const mpw* xdata, size_t ysize, const mpw* ydata, /*@out@*/ mpw* workspace)
void mpmod(/*@out@*/ mpw* result, size_t xsize, const mpw* xdata, size_t ysize, const mpw* ydata, /*@out@*/ mpw* workspace)
/*@modifies result, workspace @*/;
/**

View File

@ -80,6 +80,7 @@
# define ASM_MPSETMUL
# define ASM_MPADDMUL
# define ASM_MPADDSQRTRC
# define ASM_MPPNDIV
# elif defined(OPTIMIZE_IA64)
# define ASM_MPZERO
# define ASM_MPCOPY
@ -157,6 +158,7 @@
# define ASM_MPSETMUL
# define ASM_MPADDMUL
# define ASM_MPADDSQRTRC
# define ASM_MPPNDIV
# endif
#endif

View File

@ -1470,9 +1470,9 @@ fprintf(stderr, "sub ++: borrow\n");
zsize = asize;
zdata = alloca(zsize * sizeof(*zdata));
zsign = x->ob_size * m->ob_size;
wksp = alloca((bsize+1) * sizeof(*wksp));
wksp = alloca((2*bsize+1) * sizeof(*wksp));
mpnmod(zdata, asize, adata, bsize, bdata, wksp);
mpmod(zdata, asize, adata, bsize, bdata, wksp);
if (zsign < 0) {
if (m->ob_size < 0) {