X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/ba6e6b64033b1f9de49feccb5c9cd438354481f7..0f00dc4c8eb47e67bc0f148c2dd109f73a451e0a:/group-test.c diff --git a/group-test.c b/group-test.c deleted file mode 100644 index 5608ec0..0000000 --- a/group-test.c +++ /dev/null @@ -1,563 +0,0 @@ -/* -*-c-*- - * - * $Id: group-test.c,v 1.3 2004/04/08 01:36:15 mdw Exp $ - * - * Testing group operations - * - * (c) 2004 Straylight/Edgeware - */ - -/*----- Licensing notice --------------------------------------------------* - * - * This file is part of Catacomb. - * - * Catacomb is free software; you can redistribute it and/or modify - * it under the terms of the GNU Library General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * Catacomb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with Catacomb; if not, write to the Free - * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, - * MA 02111-1307, USA. - */ - -/*----- Header files ------------------------------------------------------*/ - -#include - -#include - -#include "group.h" -#include "fibrand.h" -#include "ec.h" -#include "ec-test.h" - -/*----- Main code ---------------------------------------------------------*/ - -static group *getgroup(const char *p) { - group *g; qd_parse qd; - qd.p = p; qd.e = 0; g = group_parse(&qd); - if (g && !qd_eofp(&qd)) { G_DESTROYGROUP(g); g = 0; qd.e = "junk at eof"; } - if (!g) { fprintf(stderr, "bad group string `%.*s|%s': %s\n", qd.p - p, - p, qd.p, qd.e); exit(1); } - return (g); -} - -static ge *getge(group *g, const char *p) { - ge *x = G_CREATE(g); - if (group_readstring(g, x, p, 0)) { - fprintf(stderr, "bad group element `%s'\n", p); - exit(1); - } - return (x); -} - -static void show(group *g, const char *p, ge *x) { - fprintf(stderr, "*** %s = ", p); group_writefile(g, x, stderr); - putc('\n', stderr); -} - -static void showec(const char *p, ec *q) { - fprintf(stderr, "*** %s = ", p); - if (EC_ATINF(q)) fprintf(stderr, "inf\n"); - else { - mp_writefile(q->x, stderr, 16); fputs(", ", stderr); - mp_writefile(q->x, stderr, 16); putchar('\n'); - } -} - -static void showmp(const char *p, mp *x, int r) { - fprintf(stderr, "*** %s = ", p); mp_writefile(x, stderr, r); - putc('\n', stderr); -} - -static int check(const char *op, const char *gd, group *g, - ge *r, ge *c, ...) { - va_list ap; - - if (G_EQ(g, r, c)) return (1); - fprintf(stderr, "\n*** %s failed\n", op); - fprintf(stderr, "*** group: %s\n", gd); - va_start(ap, c); - for (;;) { - const char *p; ge *x; - p = va_arg(ap, const char *); if (!p) break; - x = va_arg(ap, ge *); show(g, p, x); - } - show(g, "expected", r); - show(g, "computed", c); - return (0); -} - -/*----- Actual tests ------------------------------------------------------*/ - -static int vcheck(dstr *v) -{ - group *g = getgroup(v[0].buf); - grand *gr = fibrand_create(0); - const char *e = G_CHECK(g, gr); - int ok = 1; - gr->ops->destroy(gr); - if (!e) e = "ok"; - G_DESTROYGROUP(g); - if (strcmp(e, v[1].buf)) { - ok = 0; - fprintf(stderr, "*** check failed\n"); - fprintf(stderr, "*** group: %s\n", v[0].buf); - fprintf(stderr, "*** expected: %s\n", v[1].buf); - fprintf(stderr, "*** returned: %s\n", e); - } - assert(mparena_count(MPARENA_GLOBAL) == 0); - return (ok); -} - -static int vcheckelt(dstr *v) -{ - group *g = getgroup(v[0].buf); - ge *x = getge(g, v[1].buf); - int ir = *(int *)v[2].buf; - int ic = group_check(g, x); - int ok = 1; - if (ir != ic) { - ok = 0; - fprintf(stderr, "*** check failed\n"); - fprintf(stderr, "*** group: %s\n", v[0].buf); - show(g, "x", x); - fprintf(stderr, "*** expected %s\n", ir ? "failure" : "success"); - } - G_DESTROY(g, x); - G_DESTROYGROUP(g); - assert(mparena_count(MPARENA_GLOBAL) == 0); - return (ok); -} - -static int vmul(dstr *v) -{ - group *g = getgroup(v[0].buf); - ge *x = getge(g, v[1].buf); - ge *y = getge(g, v[2].buf); - ge *r = getge(g, v[3].buf); - ge *c = G_CREATE(g); - int ok = 1; - G_MUL(g, c, x, y); - ok &= check("mul", v[0].buf, g, r, c, "x", x, "y", y, (char *)0); - G_DESTROY(g, x); G_DESTROY(g, y); G_DESTROY(g, r); G_DESTROY(g, c); - G_DESTROYGROUP(g); - assert(mparena_count(MPARENA_GLOBAL) == 0); - return (ok); -} - -static int vsqr(dstr *v) -{ - group *g = getgroup(v[0].buf); - ge *x = getge(g, v[1].buf); - ge *r = getge(g, v[2].buf); - ge *c = G_CREATE(g); - int ok = 1; - G_SQR(g, c, x); - ok &= check("sqr", v[0].buf, g, r, c, "x", x, (char *)0); - G_DESTROY(g, x); G_DESTROY(g, r); G_DESTROY(g, c); - G_DESTROYGROUP(g); - assert(mparena_count(MPARENA_GLOBAL) == 0); - return (ok); -} - -static int vinv(dstr *v) -{ - group *g = getgroup(v[0].buf); - ge *x = getge(g, v[1].buf); - ge *r = getge(g, v[2].buf); - ge *c = G_CREATE(g); - int ok = 1; - G_INV(g, c, x); - ok &= check("inv", v[0].buf, g, r, c, "x", x, (char *)0); - G_DESTROY(g, x); G_DESTROY(g, r); G_DESTROY(g, c); - G_DESTROYGROUP(g); - assert(mparena_count(MPARENA_GLOBAL) == 0); - return (ok); -} - -static int vdiv(dstr *v) -{ - group *g = getgroup(v[0].buf); - ge *x = getge(g, v[1].buf); - ge *y = getge(g, v[2].buf); - ge *r = getge(g, v[3].buf); - ge *c = G_CREATE(g); - int ok = 1; - G_DIV(g, c, x, y); - ok &= check("div", v[0].buf, g, r, c, "x", x, "y", y, (char *)0); - group_stddiv(g, c, x, y); - ok &= check("stddiv", v[0].buf, g, r, c, "x", x, "y", y, (char *)0); - G_DESTROY(g, x); G_DESTROY(g, y); G_DESTROY(g, r); G_DESTROY(g, c); - G_DESTROYGROUP(g); - assert(mparena_count(MPARENA_GLOBAL) == 0); - return (ok); -} - -static int vexp(dstr *v) -{ - group *g = getgroup(v[0].buf); - ge *x = getge(g, v[1].buf); - mp *n = *(mp **)v[2].buf; - ge *r = getge(g, v[3].buf); - ge *c = G_CREATE(g); - int ok = 1; - G_EXP(g, c, x, n); - if (!G_EQ(g, r, c)) { - ok = 0; - fprintf(stderr, "\n*** exp failed\n"); - fprintf(stderr, "*** group: %s\n", v[0].buf); - show(g, "x", x); showmp("n", n, 10); - show(g, "expected", r); show(g, "computed", c); - } - group_stdexp(g, c, x, n); - if (!G_EQ(g, r, c)) { - ok = 0; - fprintf(stderr, "\n*** stdexp failed\n"); - fprintf(stderr, "*** group: %s\n", v[0].buf); - show(g, "x", x); showmp("n", n, 10); - show(g, "expected", r); show(g, "computed", c); - } - G_DESTROY(g, x); MP_DROP(n); G_DESTROY(g, r); G_DESTROY(g, c); - G_DESTROYGROUP(g); - assert(mparena_count(MPARENA_GLOBAL) == 0); - return (ok); -} - -static int vmexp(size_t n, dstr *v) -{ - group *g = getgroup(v[0].buf); - ge *c, *r; - group_expfactor *f = xmalloc(n * sizeof(group_expfactor)); - int ok = 1; - size_t i; - for (i = 0; i < n; i++) { - f[i].base = getge(g, v[1 + 2 * i].buf); - f[i].exp = *(mp **)v[2 + 2 * i].buf; - } - r = getge(g, v[1 + 2 * n].buf); - c = G_CREATE(g); - G_MEXP(g, c, f, n); - if (!G_EQ(g, r, c)) { - ok = 0; - fprintf(stderr, "\n*** mexp failed\n"); - fprintf(stderr, "*** group: %s\n", v[0].buf); - for (i = 0; i < n; i++) { - show(g, "base", f[i].base); - showmp("exp", f[i].exp, 10); - } - show(g, "expected", r); show(g, "computed", c); - } - group_stdmexp(g, c, f, n); - if (!G_EQ(g, r, c)) { - ok = 0; - fprintf(stderr, "\n*** stdmexp failed\n"); - fprintf(stderr, "*** group: %s\n", v[0].buf); - for (i = 0; i < n; i++) { - show(g, "base", f[i].base); - showmp("exp", f[i].exp, 10); - } - show(g, "expected", r); show(g, "computed", c); - } - for (i = 0; i < n; i++) { G_DESTROY(g, f[i].base); MP_DROP(f[i].exp); } - G_DESTROY(g, r); G_DESTROY(g, c); - G_DESTROYGROUP(g); - assert(mparena_count(MPARENA_GLOBAL) == 0); - return (ok); -} - -static int vmexp1(dstr *v) { return vmexp(1, v); } -static int vmexp2(dstr *v) { return vmexp(2, v); } -static int vmexp3(dstr *v) { return vmexp(3, v); } -static int vmexp4(dstr *v) { return vmexp(4, v); } - -static int vtoint(dstr *v) -{ - group *g = getgroup(v[0].buf); - ge *x = getge(g, v[1].buf); - int ir = *(int *)v[2].buf; - mp *r = *(mp **)v[3].buf; - mp *c; - int ic; - int ok = 1; - c = G_TOINT(g, MP_NEW, x); - ic = c ? 0 : -1; - if (ir != ic || (!ic && !MP_EQ(r, c))) { - ok = 0; - fprintf(stderr, "\n*** toint failed\n"); - fprintf(stderr, "*** group: %s\n", v[0].buf); - if (ir) fprintf(stderr, "*** expected failure\n"); - else { show(g, "x", x); showmp("expected", r, 16); - showmp("computed", c, 16); } - } - G_DESTROY(g, x); mp_drop(r); mp_drop(c); - G_DESTROYGROUP(g); - assert(mparena_count(MPARENA_GLOBAL) == 0); - return (ok); -} - -static int vfromint(dstr *v) -{ - group *g = getgroup(v[0].buf); - mp *x = *(mp **)v[1].buf; - int ir = *(int *)v[2].buf; - ge *r = getge(g, v[3].buf); - int ic; - ge *c = G_CREATE(g); - int ok = 1; - ic = G_FROMINT(g, c, x); - if (ir != ic || (!ic && !G_EQ(g, r, c))) { - ok = 0; - fprintf(stderr, "\n*** fromint failed\n"); - fprintf(stderr, "*** group: %s\n", v[0].buf); - showmp("x", x, 16); if (ir) fprintf(stderr, "*** should have failed\n"); - else { show(g, "expected", r); show(g, "computed", c); } - } - MP_DROP(x); G_DESTROY(g, r); G_DESTROY(g, c); - G_DESTROYGROUP(g); - assert(mparena_count(MPARENA_GLOBAL) == 0); - return (ok); -} - -static int vtoec(dstr *v) -{ - group *g = getgroup(v[0].buf); - ge *x = getge(g, v[1].buf); - int ir = *(int *)v[2].buf; - ec *r = (ec *)v[3].buf; - int ic; - ec c = EC_INIT; - int ok = 1; - ic = G_TOEC(g, &c, x); - if (ir != ic || (!ic && !EC_EQ(r, &c))) { - ok = 0; - fprintf(stderr, "\n*** toec failed\n"); - fprintf(stderr, "*** group: %s\n", v[0].buf); - show(g, "x", x); - if (ir) fprintf(stderr, "*** should have failed\n"); - else { showec("expected", r); showec("computed", &c); } - } - G_DESTROY(g, x); EC_DESTROY(&c); EC_DESTROY(r); - G_DESTROYGROUP(g); - assert(mparena_count(MPARENA_GLOBAL) == 0); - return (ok); -} - -static int vfromec(dstr *v) -{ - group *g = getgroup(v[0].buf); - ec *p = (ec *)v[1].buf; - int ir = *(int *)v[2].buf; - ge *r = getge(g, v[3].buf); - int ic; - ge *c = G_CREATE(g); - int ok = 1; - ic = G_FROMEC(g, c, p); - if (ir != ic || (!ic && !G_EQ(g, r, c))) { - ok = 0; - fprintf(stderr, "\n*** fromec failed\n"); - fprintf(stderr, "*** group: %s\n", v[0].buf); - showec("p", p); if (ir) fprintf(stderr, "*** should have failed\n"); - else { show(g, "expected", r); show(g, "computed", c); } - } - EC_DESTROY(p); G_DESTROY(g, r); G_DESTROY(g, c); - G_DESTROYGROUP(g); - assert(mparena_count(MPARENA_GLOBAL) == 0); - return (ok); -} - -static int vtobuf(dstr *v) -{ - group *g = getgroup(v[0].buf); - ge *x = getge(g, v[1].buf); - int ir = *(int *)v[2].buf; - dstr c = DSTR_INIT; - int ic; - buf b; - int ok = 1; - - dstr_ensure(&c, v[3].len); - buf_init(&b, c.buf, v[3].len); - ic = G_TOBUF(g, &b, x); - c.len = BLEN(&b); - if (ic != ir || (!ic && (c.len != v[3].len || - memcmp(c.buf, v[3].buf, c.len)))) { - ok = 0; - fprintf(stderr, "*** tobuf failed\n"); - fprintf(stderr, "*** group: %s\n", v[0].buf); - show(g, "x", x); - if (ir) fprintf(stderr, "*** expected failure\n"); - else { - fprintf(stderr, "*** expected: "); type_hex.dump(&v[3], stderr); - fprintf(stderr, "\n*** computed: "); type_hex.dump(&c, stderr); - fputc('\n', stderr); - } - } - G_DESTROY(g, x); dstr_destroy(&c); - G_DESTROYGROUP(g); - assert(mparena_count(MPARENA_GLOBAL) == 0); - return (ok); -} - -static int vfrombuf(dstr *v) -{ - group *g = getgroup(v[0].buf); - int ir = *(int *)v[2].buf; - ge *r = getge(g, v[3].buf); - int ic; - ge *c = G_CREATE(g); - buf b; - int ok = 1; - - buf_init(&b, v[1].buf, v[1].len); - ic = G_FROMBUF(g, &b, c); - if ((ic < 0) != (ir < 0) || (ir >= 0 && - (ir != BLEN(&b) || !G_EQ(g, r, c)))) { - ok = 0; - fprintf(stderr, "*** frombuf failed\n"); - fprintf(stderr, "*** group: %s\n", v[0].buf); - fprintf(stderr, "*** input string: "); type_hex.dump(&v[1], stderr); - fputc('\n', stderr); - if (ir < 0) fprintf(stderr, "*** expected failure\n"); - else { - show(g, "expected", r); show(g, "computed", c); - fprintf(stderr, "*** expected used = %d\n", ir); - fprintf(stderr, "*** computed used = %lu\n", (unsigned long)BLEN(&b)); - } - } - G_DESTROY(g, r); G_DESTROY(g, c); - G_DESTROYGROUP(g); - assert(mparena_count(MPARENA_GLOBAL) == 0); - return (ok); -} - -static int vtoraw(dstr *v) -{ - group *g = getgroup(v[0].buf); - ge *x = getge(g, v[1].buf); - int ir = *(int *)v[2].buf; - dstr c = DSTR_INIT; - int ic; - buf b; - int ok = 1; - - dstr_ensure(&c, v[3].len); - buf_init(&b, c.buf, v[3].len); - ic = G_TORAW(g, &b, x); - c.len = BLEN(&b); - if (ic != ir || (!ic && (c.len != v[3].len || - memcmp(c.buf, v[3].buf, c.len)))) { - ok = 0; - fprintf(stderr, "*** toraw failed\n"); - fprintf(stderr, "*** group: %s\n", v[0].buf); - show(g, "x", x); - if (ir) fprintf(stderr, "*** expected failure\n"); - else { - fprintf(stderr, "*** expected: "); type_hex.dump(&v[3], stderr); - fprintf(stderr, "\n*** computed: "); type_hex.dump(&c, stderr); - fputc('\n', stderr); - } - } - G_DESTROY(g, x); dstr_destroy(&c); - G_DESTROYGROUP(g); - assert(mparena_count(MPARENA_GLOBAL) == 0); - return (ok); -} - -static int vfromraw(dstr *v) -{ - group *g = getgroup(v[0].buf); - int ir = *(int *)v[2].buf; - ge *r = getge(g, v[3].buf); - int ic; - ge *c = G_CREATE(g); - buf b; - int ok = 1; - - buf_init(&b, v[1].buf, v[1].len); - ic = G_FROMRAW(g, &b, c); - if ((ic < 0) != (ir < 0) || (ir >= 0 && - (ir != BLEN(&b) || !G_EQ(g, r, c)))) { - ok = 0; - fprintf(stderr, "*** fromraw failed\n"); - fprintf(stderr, "*** group: %s\n", v[0].buf); - fprintf(stderr, "*** input string: "); type_hex.dump(&v[1], stderr); - fputc('\n', stderr); - if (ir < 0) fprintf(stderr, "*** expected failure\n"); - else { - show(g, "expected", r); show(g, "computed", c); - fprintf(stderr, "*** expected used = %d\n", ir); - fprintf(stderr, "*** computed used = %lu\n", (unsigned long)BLEN(&b)); - } - } - G_DESTROY(g, r); G_DESTROY(g, c); - G_DESTROYGROUP(g); - assert(mparena_count(MPARENA_GLOBAL) == 0); - return (ok); -} - -static const test_chunk tests[] = { - { "check", vcheck, { &type_string, &type_string } }, - { "checkelt", vcheckelt, { &type_string, &type_string, &type_int } }, - { "mul", vmul, { &type_string, &type_string, - &type_string, &type_string } }, - { "sqr", vsqr, { &type_string, &type_string, - &type_string } }, - { "inv", vinv, { &type_string, &type_string, - &type_string } }, - { "div", vdiv, { &type_string, &type_string, - &type_string, &type_string } }, - { "exp", vexp, { &type_string, &type_string, - &type_mp, &type_string } }, - { "mexp-1", vmexp1, { &type_string, - &type_string, &type_mp, - &type_string } }, - { "mexp-2", vmexp2, { &type_string, - &type_string, &type_mp, - &type_string, &type_mp, - &type_string } }, - { "mexp-3", vmexp3, { &type_string, - &type_string, &type_mp, - &type_string, &type_mp, - &type_string, &type_mp, - &type_string } }, - { "mexp-4", vmexp4, { &type_string, - &type_string, &type_mp, - &type_string, &type_mp, - &type_string, &type_mp, - &type_string, &type_mp, - &type_string } }, - { "toint", vtoint, { &type_string, &type_string, - &type_int, &type_mp } }, - { "fromint", vfromint, { &type_string, &type_mp, - &type_int, &type_string } }, - { "toec", vtoec, { &type_string, &type_string, - &type_int, &type_ec } }, - { "fromec", vfromec, { &type_string, &type_ec, - &type_int, &type_string } }, - { "tobuf", vtobuf, { &type_string, &type_string, - &type_int, &type_hex } }, - { "frombuf", vfrombuf, { &type_string, &type_hex, - &type_int, &type_string } }, - { "toraw", vtoraw, { &type_string, &type_string, - &type_int, &type_hex } }, - { "fromraw", vfromraw, { &type_string, &type_hex, - &type_int, &type_string } }, - { 0 } -}; - -int main(int argc, char *argv[]) -{ - sub_init(); - test_run(argc, argv, tests, SRCDIR "/tests/group"); - return (0); -} - -/*----- That's all, folks -------------------------------------------------*/