diff options
-rw-r--r-- | rpmio/Makefile.am | 4 | ||||
-rw-r--r-- | rpmio/tinv.c | 512 |
2 files changed, 0 insertions, 516 deletions
diff --git a/rpmio/Makefile.am b/rpmio/Makefile.am index 5b5a11a54..8878e7bde 100644 --- a/rpmio/Makefile.am +++ b/rpmio/Makefile.am @@ -51,10 +51,6 @@ check_PROGRAMS += tglob tglob_SOURCES = tglob.c rpmio_internal.h tglob_LDADD = librpmio.la @WITH_POPT_LIB@ -check_PROGRAMS += tinv -tinv_SOURCES = tinv.c -tinv_LDADD = librpmio.la @WITH_POPT_LIB@ - check_PROGRAMS += tkey tkey_SOURCES = tkey.c rpmio_internal.h tkey_LDADD = librpmio.la @WITH_POPT_LIB@ diff --git a/rpmio/tinv.c b/rpmio/tinv.c deleted file mode 100644 index 8e1723920..000000000 --- a/rpmio/tinv.c +++ /dev/null @@ -1,512 +0,0 @@ -#include "system.h" -#include <beecrypt/mpbarrett.h> -#include <beecrypt/mp.h> -#include <popt.h> -#include "debug.h" - -static int _debug = 0; - -static int Zmpbinv_w(const mpbarrett* b, size_t xsize, const mpw* xdata, mpw* result, mpw* wksp) -{ - size_t ysize = b->size+1; - size_t ubits, vbits; - int k = 0; - - mpw* u = wksp; - mpw* v = u+ysize; - mpw* A = v+ysize; - mpw* B = A+ysize; - mpw* C = B+ysize; - mpw* D = C+ysize; - - mpsetx(ysize, u, xsize, xdata); - mpsetx(ysize, v, b->size, b->modl); - mpsetw(ysize, A, 1); - mpzero(ysize, B); - mpzero(ysize, C); - mpsetw(ysize, D, 1); - - for (k = 0; mpeven(ysize, u) && mpeven(ysize, v); k++) { - mpdivtwo(ysize, u); - mpdivtwo(ysize, v); - } - - if (mpeven(ysize, u)) - (void) mpadd(ysize, u, v); - -if (_debug < 0) -fprintf(stderr, " u: "), mpfprintln(stderr, ysize, u); -if (_debug < 0) -fprintf(stderr, " v: "), mpfprintln(stderr, ysize, v); -if (_debug < 0) -fprintf(stderr, " A: "), mpfprintln(stderr, ysize, A); -if (_debug < 0) -fprintf(stderr, " B: "), mpfprintln(stderr, ysize, B); -if (_debug < 0) -fprintf(stderr, " C: "), mpfprintln(stderr, ysize, C); -if (_debug < 0) -fprintf(stderr, " D: "), mpfprintln(stderr, ysize, D); - - ubits = vbits = MP_WORDS_TO_BITS(ysize); - - do { - while (mpeven(ysize, v)) { - mpsdivtwo(ysize, v); - vbits -= 1; - if (mpodd(ysize, C)) { - (void) mpaddx(ysize, C, b->size, b->modl); - (void) mpsubx(ysize, D, xsize, xdata); - } - mpsdivtwo(ysize, C); - mpsdivtwo(ysize, D); -if (_debug < 0) -fprintf(stderr, "-->> v: "), mpfprintln(stderr, ysize, v); - } - - if (ubits >= vbits) { - mpw* swapu; - size_t swapi; - -if (_debug < 0) -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 < 0) -fprintf(stderr, "--> (even parity)\n"); - mpadd(ysize, v, u); - mpadd(ysize, C, A); - mpadd(ysize, D, B); - } else { -if (_debug < 0) -fprintf(stderr, "--> (odd parity)\n"); - mpsub(ysize, v, u); - mpsub(ysize, C, A); - mpsub(ysize, D, B); - } -if (_debug < 0) -fprintf(stderr, " v: "), mpfprintln(stderr, ysize, v); -if (_debug < 0) -fprintf(stderr, " C: "), mpfprintln(stderr, ysize, C); -if (_debug < 0) -fprintf(stderr, " D: "), mpfprintln(stderr, ysize, D); - vbits++; - } while (mpnz(ysize, v)); - -#ifdef NOTYET - if (!mpisone(ysize, u)) - return 0; -#endif - - if (result) { - mpsetx(b->size, result, ysize, A); - if (*A & 0x80000000) - (void) mpneg(b->size, result); - while (--k > 0) - mpadd(b->size, result, result); - } - -fprintf(stderr, "=== EXIT: "), mpfprintln(stderr, b->size, result); -fprintf(stderr, " u: "), mpfprintln(stderr, ysize, u); -fprintf(stderr, " v: "), mpfprintln(stderr, ysize, v); -fprintf(stderr, " A: "), mpfprintln(stderr, ysize, A); -fprintf(stderr, " B: "), mpfprintln(stderr, ysize, B); -fprintf(stderr, " C: "), mpfprintln(stderr, ysize, C); -fprintf(stderr, " D: "), mpfprintln(stderr, ysize, D); - - return 1; -} - -static int Ympbinv_w(const mpbarrett* b, size_t xsize, const mpw* xdata, mpw* result, mpw* wksp) -{ - size_t ysize = b->size+1; - int k; - mpw* u1 = wksp; - mpw* u2 = u1+ysize; - mpw* u3 = u2+ysize; - mpw* v1 = u3+ysize; - mpw* v2 = v1+ysize; - mpw* v3 = v2+ysize; - mpw* t1 = v3+ysize; - mpw* t2 = t1+ysize; - mpw* t3 = t2+ysize; - mpw* u = t3+ysize; - mpw* v = u+ysize; - - mpsetx(ysize, u, xsize, xdata); - mpsetx(ysize, v, b->size, b->modl); - - /* Y1. Find power of 2. */ - for (k = 0; mpeven(ysize, u) && mpeven(ysize, v); k++) { - mpdivtwo(ysize, u); - mpdivtwo(ysize, v); - } - -if (_debug < 0) -fprintf(stderr, " u: "), mpfprintln(stderr, ysize, u); -if (_debug < 0) -fprintf(stderr, " v: "), mpfprintln(stderr, ysize, v); - - /* Y2. Initialize. */ - mpsetw(ysize, u1, 1); -if (_debug < 0) -fprintf(stderr, " u1: "), mpfprintln(stderr, ysize, u1); - mpzero(ysize, u2); -if (_debug < 0) -fprintf(stderr, " u2: "), mpfprintln(stderr, ysize, u2); - mpsetx(ysize, u3, ysize, u); -if (_debug < 0) -fprintf(stderr, " u3: "), mpfprintln(stderr, ysize, u3); - - mpsetx(ysize, v1, ysize, v); -if (_debug < 0) -fprintf(stderr, " v1: "), mpfprintln(stderr, ysize, v1); - mpsetw(ysize, v2, 1); - (void) mpsub(ysize, v2, u); -if (_debug < 0) -fprintf(stderr, " v2: "), mpfprintln(stderr, ysize, v2); - mpsetx(ysize, v3, ysize, v); -if (_debug < 0) -fprintf(stderr, " v3: "), mpfprintln(stderr, ysize, v3); - - if (mpodd(ysize, u)) { - mpzero(ysize, t1); -if (_debug < 0) -fprintf(stderr, " t1: "), mpfprintln(stderr, ysize, t1); - mpzero(ysize, t2); - mpsubw(ysize, t2, 1); -if (_debug < 0) -fprintf(stderr, " t2: "), mpfprintln(stderr, ysize, t2); - mpzero(ysize, t3); - mpsub(ysize, t3, v); -if (_debug < 0) -fprintf(stderr, " t3: "), mpfprintln(stderr, ysize, t3); - goto Y4; - } else { - mpsetw(ysize, t1, 1); -if (_debug < 0) -fprintf(stderr, " t1: "), mpfprintln(stderr, ysize, t1); - mpzero(ysize, t2); -if (_debug < 0) -fprintf(stderr, " t2: "), mpfprintln(stderr, ysize, t2); - mpsetx(ysize, t3, ysize, u); -if (_debug < 0) -fprintf(stderr, " t3: "), mpfprintln(stderr, ysize, t3); - } - - do { - do { - if (mpodd(ysize, t1) || mpodd(ysize, t2)) { - mpadd(ysize, t1, v); - mpsub(ysize, t2, u); - } - mpsdivtwo(ysize, t1); - mpsdivtwo(ysize, t2); - mpsdivtwo(ysize, t3); -Y4: -if (_debug < 0) -fprintf(stderr, " Y4 t3: "), mpfprintln(stderr, ysize, t3); - } while (mpeven(ysize, t3)); - - /* Y5. Reset max(u3,v3). */ - if (!(*t3 & 0x80000000)) { -if (_debug < 0) -fprintf(stderr, "--> Y5 (t3 > 0)\n"); - mpsetx(ysize, u1, ysize, t1); -if (_debug < 0) -fprintf(stderr, " u1: "), mpfprintln(stderr, ysize, u1); - mpsetx(ysize, u2, ysize, t2); -if (_debug < 0) -fprintf(stderr, " u2: "), mpfprintln(stderr, ysize, u2); - mpsetx(ysize, u3, ysize, t3); -if (_debug < 0) -fprintf(stderr, " u3: "), mpfprintln(stderr, ysize, u3); - } else { -if (_debug < 0) -fprintf(stderr, "--> Y5 (t3 <= 0)\n"); - mpsetx(ysize, v1, ysize, v); - mpsub(ysize, v1, t1); -if (_debug < 0) -fprintf(stderr, " v1: "), mpfprintln(stderr, ysize, v1); - mpsetx(ysize, v2, ysize, u); - mpneg(ysize, v2); - mpsub(ysize, v2, t2); -if (_debug < 0) -fprintf(stderr, " v2: "), mpfprintln(stderr, ysize, v2); - mpzero(ysize, v3); - mpsub(ysize, v3, t3); -if (_debug < 0) -fprintf(stderr, " v3: "), mpfprintln(stderr, ysize, v3); - } - - /* Y6. Subtract. */ - mpsetx(ysize, t1, ysize, u1); - mpsub(ysize, t1, v1); - mpsetx(ysize, t2, ysize, u2); - mpsub(ysize, t2, v2); - mpsetx(ysize, t3, ysize, u3); - mpsub(ysize, t3, v3); - - if (*t1 & 0x80000000) { - mpadd(ysize, t1, v); - mpsub(ysize, t2, u); - } - -if (_debug < 0) -fprintf(stderr, "-->Y6 t1: "), mpfprintln(stderr, ysize, t1); -if (_debug < 0) -fprintf(stderr, " t2: "), mpfprintln(stderr, ysize, t2); -if (_debug < 0) -fprintf(stderr, " t3: "), mpfprintln(stderr, ysize, t3); - - } while (mpnz(ysize, t3)); - - if (!(mpisone(ysize, u3) && mpisone(ysize, v3))) - return 0; - - if (result) { - while (--k > 0) - mpadd(ysize, u1, u1); - mpsetx(b->size, result, ysize, u1); - } - -fprintf(stderr, "=== EXIT: "), mpfprintln(stderr, b->size, result); -fprintf(stderr, " u1: "), mpfprintln(stderr, ysize, u1); -fprintf(stderr, " u2: "), mpfprintln(stderr, ysize, u2); -fprintf(stderr, " u3: "), mpfprintln(stderr, ysize, u3); -fprintf(stderr, " v1: "), mpfprintln(stderr, ysize, v1); -fprintf(stderr, " v2: "), mpfprintln(stderr, ysize, v2); -fprintf(stderr, " v3: "), mpfprintln(stderr, ysize, v3); -fprintf(stderr, " t1: "), mpfprintln(stderr, ysize, t1); -fprintf(stderr, " t2: "), mpfprintln(stderr, ysize, t2); -fprintf(stderr, " t3: "), mpfprintln(stderr, ysize, t3); - - return 1; -} - -/** - * Computes the inverse (modulo b) of x, and returns 1 if x was invertible. - * needs workspace of (6*size+6) words - * @note xdata and result cannot point to the same area - */ -static int Xmpbinv_w(const mpbarrett* b, size_t xsize, const mpw* xdata, mpw* result, mpw* wksp) -{ - /* - * Fact: if a element of Zn, then a is invertible if and only if gcd(a,n) = 1 - * Hence: if b->modl is even, then x must be odd, otherwise the gcd(x,n) >= 2 - * - * The calling routine must guarantee this condition. - */ - - size_t ysize = b->size+1; - - mpw* u = wksp; - mpw* v = u+ysize; - mpw* A = v+ysize; - mpw* B = A+ysize; - mpw* C = B+ysize; - mpw* D = C+ysize; - - mpsetx(ysize, u, b->size, b->modl); - mpsetx(ysize, v, xsize, xdata); - mpsetw(ysize, A, 1); - mpzero(ysize, B); - mpzero(ysize, C); - mpsetw(ysize, D, 1); - -if (_debug < 0) -fprintf(stderr, " u: "), mpfprintln(stderr, ysize, u); -if (_debug < 0) -fprintf(stderr, " v: "), mpfprintln(stderr, ysize, v); -if (_debug < 0) -fprintf(stderr, " A: "), mpfprintln(stderr, ysize, A); -if (_debug < 0) -fprintf(stderr, " B: "), mpfprintln(stderr, ysize, B); -if (_debug < 0) -fprintf(stderr, " C: "), mpfprintln(stderr, ysize, C); -if (_debug < 0) -fprintf(stderr, " D: "), mpfprintln(stderr, ysize, D); - - do { - while (mpeven(ysize, u)) - { - mpdivtwo(ysize, u); - - if (mpodd(ysize, A) || mpodd(ysize, B)) - { - (void) mpaddx(ysize, A, xsize, xdata); - (void) mpsubx(ysize, B, b->size, b->modl); - } - - mpsdivtwo(ysize, A); - mpsdivtwo(ysize, B); - } - while (mpeven(ysize, v)) - { - mpdivtwo(ysize, v); - - if (mpodd(ysize, C) || mpodd(ysize, D)) - { - (void) mpaddx(ysize, C, xsize, xdata); - (void) mpsubx(ysize, D, b->size, b->modl); - } - - mpsdivtwo(ysize, C); - mpsdivtwo(ysize, D); - } - if (mpge(ysize, u, v)) - { -if (_debug < 0) -fprintf(stderr, "--> 5 (u >= v)\n"); - (void) mpsub(ysize, u, v); - (void) mpsub(ysize, A, C); - (void) mpsub(ysize, B, D); -if (_debug < 0) -fprintf(stderr, " u: "), mpfprintln(stderr, ysize, u); -if (_debug < 0) -fprintf(stderr, " A: "), mpfprintln(stderr, ysize, A); -if (_debug < 0) -fprintf(stderr, " B: "), mpfprintln(stderr, ysize, B); - } - else - { -if (_debug < 0) -fprintf(stderr, "--> 5 (u < v)\n"); - (void) mpsub(ysize, v, u); - (void) mpsub(ysize, C, A); - (void) mpsub(ysize, D, B); -if (_debug < 0) -fprintf(stderr, " v: "), mpfprintln(stderr, ysize, v); -if (_debug < 0) -fprintf(stderr, " C: "), mpfprintln(stderr, ysize, C); -if (_debug < 0) -fprintf(stderr, " D: "), mpfprintln(stderr, ysize, D); - } - - } while (mpnz(ysize, u)); - - if (!mpisone(ysize, v)) - return 0; - - if (result) - { - mpsetx(b->size, result, ysize, D); - if (*D & 0x80000000) - (void) mpadd(b->size, result, b->modl); - } - -fprintf(stderr, "=== EXIT: "), mpfprintln(stderr, b->size, result); -fprintf(stderr, " u: "), mpfprintln(stderr, ysize, u); -fprintf(stderr, " v: "), mpfprintln(stderr, ysize, v); -fprintf(stderr, " A: "), mpfprintln(stderr, ysize, A); -fprintf(stderr, " B: "), mpfprintln(stderr, ysize, B); -fprintf(stderr, " C: "), mpfprintln(stderr, ysize, C); -fprintf(stderr, " D: "), mpfprintln(stderr, ysize, D); - return 1; -} - -static const char * dsa_q = "a1b35510319a59825c721e73e41d687ffe351bc9"; -static const char * dsa_s[] = { - "22e917d8a47462c09748e00aebbab5fd93793495", /* samba-2.2.1a-4.i386.rpm */ - "0476b30eb86899c6785fad4f7a62e43d59481273", /* gtkhtml-devel-0.9.2-9.i386.rpm */ - "8adbca132a0e6a2d2ee5bb2cd837b350c9f8db42", /* lha-1.00-17.i386.rpm */ - - "026efa7a5a60d29921ec93f503b5c483d131d8c4", /* jed-0.99.14-2.i386.rpm */ - "2e4ec3c986b5a1f8f77b0b9f911d4e1b0ed8d869", /* ttfonts-zh_TW-2.11-5.noarch.rpm */ - - "259e4859e65c2528d3c35eaf2717d8963c834e94", /* libxml2-2.4.2-1.i386.rpm */ - "45462b3534c2ff7a13f232a4e6e4460c61b2e232", /* slang-1.4.4-4.i386.rpm */ - "0a73e678141aea7b4e5195afb7db3e9ec00f9f85", /* time-1.7-14.i386.rpm */ - NULL -}; - -static const char * dsa_w_good[]= { - "8b2eeda5fd34067c248bc3262e28f5668e64500b", /* samba-2.2.1a-4.i386.rpm */ - "98f6a05c5cc17c2e48faad178d2c21c0bcca694b", /* gtkhtml-devel-0.9.2-9.i386.rpm */ - "8ec91350f3237ee249ea009143f692d4cc2f8d2e", /* lha-1.00-17.i386.rpm */ - - "7db9e81c6f60fdd29243f67b70af7d1d14c9c703", /* jed-0.99.14-2.i386.rpm */ - "6bdc316aef981e45c47dabab904a31747d349eec", /* ttfonts-zh_TW-2.11-5.noarch.rpm */ - - "6d1eaa6c78ad945a1de7bc369f7992e9df3735d9", /* libxml2-2.4.2-1.i386.rpm */ - "79dc6adee7817e7dc248cfeb4b358e933af6de01", /* slang-1.4.4-4.i386.rpm */ - "2659140a40cb05e85c536a299327addb0a762b8a", /* time-1.7-14.i386.rpm */ - NULL -}; - -static const char * dsa_w_bad[] = { - "e97b9895cb99acf9c819a4b24a0b8ce6902f3442", /* samba-2.2.1a-4.i386.rpm */ - "f7434b4c2b2722abec888ea3a90eb940be954d82", /* gtkhtml-devel-0.9.2-9.i386.rpm */ - "ed15be40c189255fed77e21d5fd92a54cdfa7165", /* lha-1.00-17.i386.rpm */ - - "dc06930c3dc6a45035d1d8078c92149d1694ab3a", /* jed-0.99.14-2.i386.rpm */ - "ca28dc5abdfdc4c3680b8d37ac2cc8f47eff8323", /* ttfonts-zh_TW-2.11-5.noarch.rpm */ - - "cb6b555c47133ad7c1759dc2bb5c2a69e1021a10", /* libxml2-2.4.2-1.i386.rpm */ - "d82915ceb5e724fb65d6b177671826133cc1c238", /* slang-1.4.4-4.i386.rpm */ - "2659140a40cb05e85c536a299327addb0a762b8a", /* time-1.7-14.i386.rpm */ - NULL -}; - -static struct poptOption optionsTable[] = { - { "debug", 'd', POPT_ARG_VAL, &_debug, -1, NULL, NULL }, - POPT_AUTOHELP - POPT_TABLEEND -}; - -int -main(int argc, char *argv[]) -{ - poptContext optCon = poptGetContext(argv[0], argc, argv, optionsTable, 0); - mpbarrett q; - mpnumber s; - size_t qsize; - mpw* qtemp; - mpw* qwksp; - int rc; - int i; - - while ((rc = poptGetNextOpt(optCon)) > 0) { - switch (rc) { - default: - break; - } - } - - mpbzero(&q); mpbsethex(&q, dsa_q); - qsize = q.size; - qtemp = malloc((13*qsize+13) * sizeof(*qtemp)); - qwksp = qtemp+2*qsize; - - for (i = 0; i < 9; i++) { - if (dsa_s[i] == NULL) break; -fprintf(stderr, "================================================== %d\n", i); - fprintf(stderr, " s: %s\n", dsa_s[i]); - mpnzero(&s); mpnsethex(&s, dsa_s[i]); - -fprintf(stderr, "-------------------------------------------------- %d\n", i); - rc = Xmpbinv_w(&q, s.size, s.data, qtemp, qwksp); - fprintf(stderr, "beecrypt: "); mpfprintln(stderr, qsize, qtemp); - -fprintf(stderr, "-------------------------------------------------- %d\n", i); - rc = Ympbinv_w(&q, s.size, s.data, qtemp, qwksp); - fprintf(stderr, " Knuth: "); mpfprintln(stderr, qsize, qtemp); - -fprintf(stderr, "-------------------------------------------------- %d\n", i); - rc = Zmpbinv_w(&q, s.size, s.data, qtemp, qwksp); - fprintf(stderr, " Brent: "); mpfprintln(stderr, qsize, qtemp); - -fprintf(stderr, "-------------------------------------------------- %d\n", i); - 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; - -} |