#include "system.h"
#include "mp32barrett.h"
#include "mp32.h"
+#include "popt.h"
#include "debug.h"
-static int _debug = 1;
+static int _debug = 0;
-static int Xmp32binv_w(const mp32barrett* b, uint32 xsize, const uint32* xdata, uint32* result, uint32* wksp)
+static int Zmp32binv_w(const mp32barrett* b, uint32 xsize, const uint32* xdata, uint32* result, uint32* wksp)
{
- uint32 size = b->size;
- uint32* bmodl = b->modl;
+ uint32 ysize = b->size+1;
+ int ubits, vbits;
+ int k = 0;
+
+ uint32* u = wksp;
+ uint32* v = u+ysize;
+ uint32* A = v+ysize;
+ uint32* B = A+ysize;
+ uint32* C = B+ysize;
+ uint32* D = C+ysize;
+
+ mp32setx(ysize, u, xsize, xdata);
+ mp32setx(ysize, v, b->size, b->modl);
+ mp32setw(ysize, A, 1);
+ mp32zero(ysize, B);
+ mp32zero(ysize, C);
+ mp32setw(ysize, D, 1);
+
+#ifdef NOTYET
+ for (k = 0; mp32even(ysize, u) && mp32even(ysize, v); k++) {
+ mp32divtwo(ysize, u);
+ mp32divtwo(ysize, v);
+ }
+
+ if (mp32even(ysize, u))
+ (void) mp32add(ysize, u, v);
+#endif
+
+if (_debug)
+fprintf(stderr, " u: "), mp32println(stderr, ysize, u);
+if (_debug)
+fprintf(stderr, " v: "), mp32println(stderr, ysize, v);
+if (_debug)
+fprintf(stderr, " A: "), mp32println(stderr, ysize, A);
+if (_debug)
+fprintf(stderr, " B: "), mp32println(stderr, ysize, B);
+if (_debug)
+fprintf(stderr, " C: "), mp32println(stderr, ysize, C);
+if (_debug)
+fprintf(stderr, " D: "), mp32println(stderr, ysize, D);
+
+ ubits = vbits = 32 * (ysize);
+
+ do {
+ while (mp32even(ysize, v)) {
+ mp32sdivtwo(ysize, v);
+ vbits -= 1;
+ if (mp32odd(ysize, C)) {
+ (void) mp32addx(ysize, C, b->size, b->modl);
+ (void) mp32subx(ysize, D, xsize, xdata);
+ }
+ mp32sdivtwo(ysize, C);
+ mp32sdivtwo(ysize, D);
+if (_debug)
+fprintf(stderr, "-->> v: "), mp32println(stderr, ysize, v);
+ }
+
+ if (ubits >= vbits) {
+ uint32* swapu;
+ uint32 swapi;
+
+if (_debug)
+fprintf(stderr, "--> (swap u <-> v)\n");
+ swapu = u; u = v; v = swapu;
+ swapi = ubits; ubits = vbits; vbits = swapi;
+ swapu = A; A = C; C = swapu;
+ swapu = B; B = D; D = swapu;
+ }
+
+ if (!((u[ysize-1] + v[ysize-1]) & 0x3)) {
+if (_debug)
+fprintf(stderr, "--> (even parity)\n");
+ mp32add(ysize, v, u);
+ mp32add(ysize, C, A);
+ mp32add(ysize, D, B);
+ } else {
+if (_debug)
+fprintf(stderr, "--> (odd parity)\n");
+ mp32sub(ysize, v, u);
+ mp32sub(ysize, C, A);
+ mp32sub(ysize, D, B);
+ }
+if (_debug)
+fprintf(stderr, " v: "), mp32println(stderr, ysize, v);
+if (_debug)
+fprintf(stderr, " C: "), mp32println(stderr, ysize, C);
+if (_debug)
+fprintf(stderr, " D: "), mp32println(stderr, ysize, D);
+ vbits++;
+ } while (mp32nz(ysize, v));
+
+ if (result) {
+#ifdef NOTYET
+ /*@-usedef@*/
+ if (*A & 0x80000000)
+ (void) mp32neg(ysize, A);
+ /*@=usedef@*/
+ while (--k > 0)
+ mp32add(ysize, A, A);
+#endif
+ mp32setx(b->size, result, ysize, A);
+ }
+
+fprintf(stderr, "=== EXIT: "), mp32println(stderr, b->size, result);
+fprintf(stderr, " u: "), mp32println(stderr, ysize, u);
+fprintf(stderr, " v: "), mp32println(stderr, ysize, v);
+fprintf(stderr, " A: "), mp32println(stderr, ysize, A);
+fprintf(stderr, " B: "), mp32println(stderr, ysize, B);
+fprintf(stderr, " C: "), mp32println(stderr, ysize, C);
+fprintf(stderr, " D: "), mp32println(stderr, ysize, D);
+
+ return 1;
+}
+
+static int Ymp32binv_w(const mp32barrett* b, uint32 xsize, const uint32* xdata, uint32* result, uint32* wksp)
+{
+ uint32 ysize = b->size+1;
int k;
uint32* u1 = wksp;
- uint32* u2 = u1+size+1;
- uint32* u3 = u2+size+1;
- uint32* v1 = u3+size+1;
- uint32* v2 = v1+size+1;
- uint32* v3 = v2+size+1;
- uint32* t1 = v3+size+1;
- uint32* t2 = t1+size+1;
- uint32* t3 = t2+size+1;
- uint32* u = t3+size+1;
- uint32* v = u+size+1;
-
- mp32setx(size+1, u, size, bmodl);
- mp32setx(size+1, v, xsize, xdata);
+ uint32* u2 = u1+ysize;
+ uint32* u3 = u2+ysize;
+ uint32* v1 = u3+ysize;
+ uint32* v2 = v1+ysize;
+ uint32* v3 = v2+ysize;
+ uint32* t1 = v3+ysize;
+ uint32* t2 = t1+ysize;
+ uint32* t3 = t2+ysize;
+ uint32* u = t3+ysize;
+ uint32* v = u+ysize;
+
+ mp32setx(ysize, u, xsize, xdata);
+ mp32setx(ysize, v, b->size, b->modl);
/* Y1. Find power of 2. */
- k = 0;
- while (mp32even(size+1, u) && mp32even(size+1, v)) {
- mp32divtwo(size+1, u);
- mp32divtwo(size+1, v);
- k++;
+ for (k = 0; mp32even(ysize, u) && mp32even(ysize, v); k++) {
+ mp32divtwo(ysize, u);
+ mp32divtwo(ysize, v);
}
+
if (_debug)
-fprintf(stderr, " u: "), mp32println(stderr, size+1, u);
+fprintf(stderr, " u: "), mp32println(stderr, ysize, u);
if (_debug)
-fprintf(stderr, " v: "), mp32println(stderr, size+1, v);
+fprintf(stderr, " v: "), mp32println(stderr, ysize, v);
/* Y2. Initialize. */
- mp32setw(size+1, u1, 1);
+ mp32setw(ysize, u1, 1);
if (_debug)
-fprintf(stderr, " u1: "), mp32println(stderr, size+1, u1);
- mp32zero(size+1, u2);
+fprintf(stderr, " u1: "), mp32println(stderr, ysize, u1);
+ mp32zero(ysize, u2);
if (_debug)
-fprintf(stderr, " u2: "), mp32println(stderr, size+1, u2);
- mp32setx(size+1, u3, size+1, u);
+fprintf(stderr, " u2: "), mp32println(stderr, ysize, u2);
+ mp32setx(ysize, u3, ysize, u);
if (_debug)
-fprintf(stderr, " u3: "), mp32println(stderr, size+1, u3);
+fprintf(stderr, " u3: "), mp32println(stderr, ysize, u3);
- mp32setx(size+1, v1, size+1, v);
+ mp32setx(ysize, v1, ysize, v);
if (_debug)
-fprintf(stderr, " v1: "), mp32println(stderr, size+1, v1);
- mp32setw(size+1, v2, 1);
- (void) mp32sub(size+1, v2, u);
+fprintf(stderr, " v1: "), mp32println(stderr, ysize, v1);
+ mp32setw(ysize, v2, 1);
+ (void) mp32sub(ysize, v2, u);
if (_debug)
-fprintf(stderr, " v2: "), mp32println(stderr, size+1, v2);
- mp32setx(size+1, v3, size+1, v);
+fprintf(stderr, " v2: "), mp32println(stderr, ysize, v2);
+ mp32setx(ysize, v3, ysize, v);
if (_debug)
-fprintf(stderr, " v3: "), mp32println(stderr, size+1, v3);
+fprintf(stderr, " v3: "), mp32println(stderr, ysize, v3);
- if (mp32odd(size+1, u)) {
- mp32zero(size+1, t1);
+ if (mp32odd(ysize, u)) {
+ mp32zero(ysize, t1);
if (_debug)
-fprintf(stderr, " t1: "), mp32println(stderr, size+1, t1);
- mp32zero(size+1, t2);
- mp32subw(size+1, t2, 1);
+fprintf(stderr, " t1: "), mp32println(stderr, ysize, t1);
+ mp32zero(ysize, t2);
+ mp32subw(ysize, t2, 1);
if (_debug)
-fprintf(stderr, " t2: "), mp32println(stderr, size+1, t2);
- mp32zero(size+1, t3);
- mp32sub(size+1, t3, v);
+fprintf(stderr, " t2: "), mp32println(stderr, ysize, t2);
+ mp32zero(ysize, t3);
+ mp32sub(ysize, t3, v);
if (_debug)
-fprintf(stderr, " t3: "), mp32println(stderr, size+1, t3);
+fprintf(stderr, " t3: "), mp32println(stderr, ysize, t3);
goto Y4;
} else {
- mp32setw(size+1, t1, 1);
+ mp32setw(ysize, t1, 1);
if (_debug)
-fprintf(stderr, " t1: "), mp32println(stderr, size+1, t1);
- mp32zero(size+1, t2);
+fprintf(stderr, " t1: "), mp32println(stderr, ysize, t1);
+ mp32zero(ysize, t2);
if (_debug)
-fprintf(stderr, " t2: "), mp32println(stderr, size+1, t2);
- mp32setx(size+1, t3, size+1, u);
+fprintf(stderr, " t2: "), mp32println(stderr, ysize, t2);
+ mp32setx(ysize, t3, ysize, u);
if (_debug)
-fprintf(stderr, " t3: "), mp32println(stderr, size+1, t3);
+fprintf(stderr, " t3: "), mp32println(stderr, ysize, t3);
}
do {
do {
- if (!(mp32even(size+1, t1) && mp32even(size+1, t2))) {
- mp32add(size+1, t1, v);
- mp32sub(size+1, t2, u);
+ if (mp32odd(ysize, t1) || mp32odd(ysize, t2)) {
+ mp32add(ysize, t1, v);
+ mp32sub(ysize, t2, u);
}
- mp32sdivtwo(size+1, t1);
- mp32sdivtwo(size+1, t2);
- mp32sdivtwo(size+1, t3);
+ mp32sdivtwo(ysize, t1);
+ mp32sdivtwo(ysize, t2);
+ mp32sdivtwo(ysize, t3);
Y4:
if (_debug)
-fprintf(stderr, " Y4 t3: "), mp32println(stderr, size+1, t3);
- } while (mp32even(size+1, t3));
+fprintf(stderr, " Y4 t3: "), mp32println(stderr, ysize, t3);
+ } while (mp32even(ysize, t3));
/* Y5. Reset max(u3,v3). */
- if (!mp32msbset(size+1, t3)) {
+ if (!(*t3 & 0x80000000)) {
if (_debug)
fprintf(stderr, "--> Y5 (t3 > 0)\n");
- mp32setx(size+1, u1, size+1, t1);
+ mp32setx(ysize, u1, ysize, t1);
if (_debug)
-fprintf(stderr, " u1: "), mp32println(stderr, size+1, u1);
- mp32setx(size+1, u2, size+1, t2);
+fprintf(stderr, " u1: "), mp32println(stderr, ysize, u1);
+ mp32setx(ysize, u2, ysize, t2);
if (_debug)
-fprintf(stderr, " u2: "), mp32println(stderr, size+1, u2);
- mp32setx(size+1, u3, size+1, t3);
+fprintf(stderr, " u2: "), mp32println(stderr, ysize, u2);
+ mp32setx(ysize, u3, ysize, t3);
if (_debug)
-fprintf(stderr, " u3: "), mp32println(stderr, size+1, u3);
+fprintf(stderr, " u3: "), mp32println(stderr, ysize, u3);
} else {
if (_debug)
fprintf(stderr, "--> Y5 (t3 <= 0)\n");
- mp32setx(size+1, v1, size+1, v);
- mp32sub(size+1, v1, t1);
+ mp32setx(ysize, v1, ysize, v);
+ mp32sub(ysize, v1, t1);
if (_debug)
-fprintf(stderr, " v1: "), mp32println(stderr, size+1, v1);
- mp32setx(size+1, v2, size+1, u);
- mp32neg(size+1, v2);
- mp32sub(size+1, v2, t2);
+fprintf(stderr, " v1: "), mp32println(stderr, ysize, v1);
+ mp32setx(ysize, v2, ysize, u);
+ mp32neg(ysize, v2);
+ mp32sub(ysize, v2, t2);
if (_debug)
-fprintf(stderr, " v2: "), mp32println(stderr, size+1, v2);
- mp32zero(size+1, v3);
- mp32sub(size+1, v3, t3);
+fprintf(stderr, " v2: "), mp32println(stderr, ysize, v2);
+ mp32zero(ysize, v3);
+ mp32sub(ysize, v3, t3);
if (_debug)
-fprintf(stderr, " v3: "), mp32println(stderr, size+1, v3);
+fprintf(stderr, " v3: "), mp32println(stderr, ysize, v3);
}
/* Y6. Subtract. */
- mp32setx(size+1, t1, size+1, u1);
- mp32sub(size+1, t1, v1);
- mp32setx(size+1, t2, size+1, u2);
- mp32sub(size+1, t2, v2);
- mp32setx(size+1, t3, size+1, u3);
- mp32sub(size+1, t3, v3);
+ mp32setx(ysize, t1, ysize, u1);
+ mp32sub(ysize, t1, v1);
+ mp32setx(ysize, t2, ysize, u2);
+ mp32sub(ysize, t2, v2);
+ mp32setx(ysize, t3, ysize, u3);
+ mp32sub(ysize, t3, v3);
if (*t1 & 0x80000000) {
- mp32add(size+1, t1, v);
- mp32sub(size+1, t2, u);
+ mp32add(ysize, t1, v);
+ mp32sub(ysize, t2, u);
}
if (_debug)
-fprintf(stderr, "-->Y6 t1: "), mp32println(stderr, size+1, t1);
+fprintf(stderr, "-->Y6 t1: "), mp32println(stderr, ysize, t1);
if (_debug)
-fprintf(stderr, " t2: "), mp32println(stderr, size+1, t2);
+fprintf(stderr, " t2: "), mp32println(stderr, ysize, t2);
if (_debug)
-fprintf(stderr, " t3: "), mp32println(stderr, size+1, t3);
-
- } while (mp32nz(size+1, t3));
+fprintf(stderr, " t3: "), mp32println(stderr, ysize, t3);
-fprintf(stderr, "==== EXIT\n");
-fprintf(stderr, " u1: "); mp32println(stderr, size+1, u1);
-fprintf(stderr, " u2: "); mp32println(stderr, size+1, u2);
-fprintf(stderr, " u3: "); mp32println(stderr, size+1, u3);
-fprintf(stderr, " v1: "); mp32println(stderr, size+1, v1);
-fprintf(stderr, " v2: "); mp32println(stderr, size+1, v2);
-fprintf(stderr, " v3: "); mp32println(stderr, size+1, v3);
-fprintf(stderr, " t1: "); mp32println(stderr, size+1, t1);
-fprintf(stderr, " t2: "); mp32println(stderr, size+1, t2);
-fprintf(stderr, " t3: "); mp32println(stderr, size+1, t3);
+ } while (mp32nz(ysize, t3));
if (result) {
- mp32setx(size, result, size+1, u2);
while (--k > 0)
- mp32add(size, result, result);
+ mp32add(ysize, u1, u1);
+ mp32setx(b->size, result, ysize, u1);
}
+fprintf(stderr, "=== EXIT: "), mp32println(stderr, b->size, result);
+fprintf(stderr, " u1: "), mp32println(stderr, ysize, u1);
+fprintf(stderr, " u2: "), mp32println(stderr, ysize, u2);
+fprintf(stderr, " u3: "), mp32println(stderr, ysize, u3);
+fprintf(stderr, " v1: "), mp32println(stderr, ysize, v1);
+fprintf(stderr, " v2: "), mp32println(stderr, ysize, v2);
+fprintf(stderr, " v3: "), mp32println(stderr, ysize, v3);
+fprintf(stderr, " t1: "), mp32println(stderr, ysize, t1);
+fprintf(stderr, " t2: "), mp32println(stderr, ysize, t2);
+fprintf(stderr, " t3: "), mp32println(stderr, ysize, t3);
+
return 1;
}
* needs workspace of (6*size+6) words
* @note xdata and result cannot point to the same area
*/
-static int mp32binv_w(const mp32barrett* b, uint32 xsize, const uint32* xdata, uint32* result, uint32* wksp)
+static int Xmp32binv_w(const mp32barrett* b, uint32 xsize, const uint32* xdata, uint32* result, uint32* wksp)
{
/*
* Fact: if a element of Zn, then a is invertible if and only if gcd(a,n) = 1
* The calling routine must guarantee this condition.
*/
- register uint32 size = b->size;
- uint32* bmodl = b->modl;
+ uint32 ysize = b->size+1;
- uint32* udata = wksp;
- uint32* vdata = udata+size+1;
- uint32* adata = vdata+size+1;
- uint32* bdata = adata+size+1;
- uint32* cdata = bdata+size+1;
- uint32* ddata = cdata+size+1;
+ uint32* u = wksp;
+ uint32* v = u+ysize;
+ uint32* A = v+ysize;
+ uint32* B = A+ysize;
+ uint32* C = B+ysize;
+ uint32* D = C+ysize;
- mp32setx(size+1, udata, size, bmodl);
- mp32setx(size+1, vdata, xsize, xdata);
- mp32zero(size+1, bdata);
- mp32setw(size+1, ddata, 1);
+ mp32setx(ysize, u, b->size, b->modl);
+ mp32setx(ysize, v, xsize, xdata);
+ mp32setw(ysize, A, 1);
+ mp32zero(ysize, B);
+ mp32zero(ysize, C);
+ mp32setw(ysize, D, 1);
+
+if (_debug)
+fprintf(stderr, " u: "), mp32println(stderr, ysize, u);
+if (_debug)
+fprintf(stderr, " v: "), mp32println(stderr, ysize, v);
+if (_debug)
+fprintf(stderr, " A: "), mp32println(stderr, ysize, A);
+if (_debug)
+fprintf(stderr, " B: "), mp32println(stderr, ysize, B);
+if (_debug)
+fprintf(stderr, " C: "), mp32println(stderr, ysize, C);
+if (_debug)
+fprintf(stderr, " D: "), mp32println(stderr, ysize, D);
- if (mp32odd(size, bmodl) && mp32even(xsize, xdata))
+#ifdef NOTNOW
+ if (mp32odd(b->size, b->modl) && mp32even(xsize, xdata))
{
/* use simplified binary extended gcd algorithm */
while (1)
{
- while (mp32even(size+1, udata))
+ while (mp32even(ysize, u))
{
- mp32divtwo(size+1, udata);
+ mp32divtwo(ysize, u);
- if (mp32odd(size+1, bdata))
- (void) mp32subx(size+1, bdata, size, bmodl);
+ if (mp32odd(ysize, B))
+ (void) mp32subx(ysize, B, b->size, b->modl);
- mp32sdivtwo(size+1, bdata);
+ mp32sdivtwo(ysize, B);
}
- while (mp32even(size+1, vdata))
+ while (mp32even(ysize, v))
{
- mp32divtwo(size+1, vdata);
+ mp32divtwo(ysize, v);
- if (mp32odd(size+1, ddata))
- (void) mp32subx(size+1, ddata, size, bmodl);
+ if (mp32odd(ysize, D))
+ (void) mp32subx(ysize, D, b->size, b->modl);
- mp32sdivtwo(size+1, ddata);
+ mp32sdivtwo(ysize, D);
}
- if (mp32ge(size+1, udata, vdata))
+ if (mp32ge(ysize, u, v))
{
- (void) mp32sub(size+1, udata, vdata);
- (void) mp32sub(size+1, bdata, ddata);
+ (void) mp32sub(ysize, u, v);
+ (void) mp32sub(ysize, B, D);
}
else
{
- (void) mp32sub(size+1, vdata, udata);
- (void) mp32sub(size+1, ddata, bdata);
+ (void) mp32sub(ysize, v, u);
+ (void) mp32sub(ysize, D, B);
}
- if (mp32z(size+1, udata))
+ if (mp32z(ysize, u))
{
- if (mp32isone(size+1, vdata))
+ if (mp32isone(ysize, v))
{
if (result)
{
- mp32setx(size, result, size+1, ddata);
+ mp32setx(size, result, ysize, D);
/*@-usedef@*/
- if (*ddata & 0x80000000)
- (void) mp32add(size, result, bmodl);
+ if (*D & 0x80000000)
+ (void) mp32add(b->size, result, b->modl);
/*@=usedef@*/
}
return 1;
}
}
else
+#endif
{
/* use full binary extended gcd algorithm */
- mp32setw(size+1, adata, 1);
- mp32zero(size+1, cdata);
while (1)
{
- while (mp32even(size+1, udata))
+ while (mp32even(ysize, u))
{
- mp32divtwo(size+1, udata);
+ mp32divtwo(ysize, u);
- if (mp32odd(size+1, adata) || mp32odd(size+1, bdata))
+ if (mp32odd(ysize, A) || mp32odd(ysize, B))
{
- (void) mp32addx(size+1, adata, xsize, xdata);
- (void) mp32subx(size+1, bdata, size, bmodl);
+ (void) mp32addx(ysize, A, xsize, xdata);
+ (void) mp32subx(ysize, B, b->size, b->modl);
}
- mp32sdivtwo(size+1, adata);
- mp32sdivtwo(size+1, bdata);
+ mp32sdivtwo(ysize, A);
+ mp32sdivtwo(ysize, B);
}
- while (mp32even(size+1, vdata))
+ while (mp32even(ysize, v))
{
- mp32divtwo(size+1, vdata);
+ mp32divtwo(ysize, v);
- if (mp32odd(size+1, cdata) || mp32odd(size+1, ddata))
+ if (mp32odd(ysize, C) || mp32odd(ysize, D))
{
- (void) mp32addx(size+1, cdata, xsize, xdata);
- (void) mp32subx(size+1, ddata, size, bmodl);
+ (void) mp32addx(ysize, C, xsize, xdata);
+ (void) mp32subx(ysize, D, b->size, b->modl);
}
- mp32sdivtwo(size+1, cdata);
- mp32sdivtwo(size+1, ddata);
+ mp32sdivtwo(ysize, C);
+ mp32sdivtwo(ysize, D);
}
- if (mp32ge(size+1, udata, vdata))
+ if (mp32ge(ysize, u, v))
{
- (void) mp32sub(size+1, udata, vdata);
- (void) mp32sub(size+1, adata, cdata);
- (void) mp32sub(size+1, bdata, ddata);
+if (_debug)
+fprintf(stderr, "--> 5 (u >= v)\n");
+ (void) mp32sub(ysize, u, v);
+ (void) mp32sub(ysize, A, C);
+ (void) mp32sub(ysize, B, D);
+if (_debug)
+fprintf(stderr, " u: "), mp32println(stderr, ysize, u);
+if (_debug)
+fprintf(stderr, " A: "), mp32println(stderr, ysize, A);
+if (_debug)
+fprintf(stderr, " B: "), mp32println(stderr, ysize, B);
}
else
{
- (void) mp32sub(size+1, vdata, udata);
- (void) mp32sub(size+1, cdata, adata);
- (void) mp32sub(size+1, ddata, bdata);
+if (_debug)
+fprintf(stderr, "--> 5 (u < v)\n");
+ (void) mp32sub(ysize, v, u);
+ (void) mp32sub(ysize, C, A);
+ (void) mp32sub(ysize, D, B);
+if (_debug)
+fprintf(stderr, " v: "), mp32println(stderr, ysize, v);
+if (_debug)
+fprintf(stderr, " C: "), mp32println(stderr, ysize, C);
+if (_debug)
+fprintf(stderr, " D: "), mp32println(stderr, ysize, D);
}
- if (mp32z(size+1, udata))
+ if (mp32z(ysize, u))
{
- if (mp32isone(size+1, vdata))
+ if (mp32isone(ysize, v))
{
if (result)
{
- mp32setx(size, result, size+1, ddata);
+ mp32setx(b->size, result, ysize, D);
/*@-usedef@*/
- if (*ddata & 0x80000000)
- (void) mp32add(size, result, bmodl);
+ if (*D & 0x80000000)
+ (void) mp32add(b->size, result, b->modl);
/*@=usedef@*/
}
+fprintf(stderr, "=== EXIT: "), mp32println(stderr, b->size, result);
+fprintf(stderr, " u: "), mp32println(stderr, ysize, u);
+fprintf(stderr, " v: "), mp32println(stderr, ysize, v);
+fprintf(stderr, " A: "), mp32println(stderr, ysize, A);
+fprintf(stderr, " B: "), mp32println(stderr, ysize, B);
+fprintf(stderr, " C: "), mp32println(stderr, ysize, C);
+fprintf(stderr, " D: "), mp32println(stderr, ysize, D);
return 1;
}
return 0;
}
static const char * dsa_q = "a1b35510319a59825c721e73e41d687ffe351bc9";
-static const char * dsa_s = "259e4859e65c2528d3c35eaf2717d8963c834e94";
-
-#if 1
-static const char * dsa_w_good = "6d1eaa6c78ad945a1de7bc369f7992e9df3735d9";
-static const char * dsa_w_bad = "cb6b555c47133ad7c1759dc2bb5c2a69e1021a10";
-#endif
-
-#if 0
-static const char * dsa_w_good = "79dc6adee7817e7dc248cfeb4b358e933af6de01";
-static const char * dsa_w_bad = "d82915ceb5e724fb65d6b177671826133cc1c238";
-#endif
+static const char * dsa_s[] = {
+ "0a73e678141aea7b4e5195afb7db3e9ec00f9f85", /* time-1.7-14.i386.rpm */
+ "259e4859e65c2528d3c35eaf2717d8963c834e94", /* libxml2-2.4.2-1.i386.rpm */
+ NULL
+};
+
+static const char * dsa_w_good[]= {
+ "2659140a40cb05e85c536a299327addb0a762b8a", /* time-1.7-14.i386.rpm */
+ "6d1eaa6c78ad945a1de7bc369f7992e9df3735d9", /* libxml2-2.4.2-1.i386.rpm */
+ NULL
+};
+
+static const char * dsa_w_bad[] = {
+ "2659140a40cb05e85c536a299327addb0a762b8a", /* time-1.7-14.i386.rpm */
+ "cb6b555c47133ad7c1759dc2bb5c2a69e1021a10", /* libxml2-2.4.2-1.i386.rpm */
+ NULL
+};
+
+static struct poptOption optionsTable[] = {
+ { "debug", 'd', POPT_ARG_VAL, &_debug, -1, NULL, NULL },
+ POPT_AUTOHELP
+ POPT_TABLEEND
+};
int
main(int argc, const char * argv[])
{
+ poptContext optCon = poptGetContext(argv[0], argc, argv, optionsTable, 0);
mp32barrett q;
mp32number s;
uint32 qsize;
uint32* qtemp;
uint32* qwksp;
int rc;
+ int i;
+
+ while ((rc = poptGetNextOpt(optCon)) > 0) {
+ switch (rc) {
+ default:
+ /*@switchbreak@*/ break;
+ }
+ }
mp32bzero(&q); mp32bsethex(&q, dsa_q);
- mp32nzero(&s); mp32nsethex(&s, dsa_s);
qsize = q.size;
-
- qtemp = malloc((11*qsize+11) * sizeof(*qtemp));
+ qtemp = malloc((13*qsize+13) * sizeof(*qtemp));
qwksp = qtemp+2*qsize;
- fprintf(stderr, " q: %s\n", dsa_q);
- fprintf(stderr, " s: %s\n", dsa_s);
- fprintf(stderr, " GOOD: %s\n", dsa_w_good);
- fprintf(stderr, " BAD: %s\n", dsa_w_bad);
+ for (i = 0; i < 1; i++) {
+fprintf(stderr, "====================================\n");
+ fprintf(stderr, " s: %s\n", dsa_s[i]);
+ mp32nzero(&s); mp32nsethex(&s, dsa_s[i]);
+
+fprintf(stderr, "------------------------------------\n");
+ rc = Xmp32binv_w(&q, s.size, s.data, qtemp, qwksp);
+ fprintf(stderr, "beecrypt: "); mp32println(stderr, qsize, qtemp);
+
+#if 0
+fprintf(stderr, "------------------------------------\n");
+ rc = Ymp32binv_w(&q, s.size, s.data, qtemp, qwksp);
+ fprintf(stderr, " Knuth: "); mp32println(stderr, qsize, qtemp);
+#endif
- rc = mp32binv_w(&q, s.size, s.data, qtemp, qwksp);
- fprintf(stderr, "beecrypt: "); mp32println(stderr, qsize, qtemp);
+fprintf(stderr, "------------------------------------\n");
+ rc = Zmp32binv_w(&q, s.size, s.data, qtemp, qwksp);
+ fprintf(stderr, " Brent: "); mp32println(stderr, qsize, qtemp);
- rc = Xmp32binv_w(&q, s.size, s.data, qtemp, qwksp);
- fprintf(stderr, " Knuth: "); mp32println(stderr, qsize, qtemp);
+fprintf(stderr, "------------------------------------\n");
+ fprintf(stderr, " q: %s\n", dsa_q);
+ fprintf(stderr, " s: %s\n", dsa_s[i]);
+ fprintf(stderr, " GOOD: %s\n", dsa_w_good[i]);
+ fprintf(stderr, " BAD: %s\n", dsa_w_bad[i]);
+ }
return 0;