Merge branch 'fixes'
authorMark Wooding <mdw@distorted.org.uk>
Tue, 16 Jan 2007 22:20:15 +0000 (22:20 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Tue, 16 Jan 2007 22:20:15 +0000 (22:20 +0000)
* fixes:
  mpint: Fix misbehaviour on larger-than-mpw integer types.
  Fix various assumptions about mpw sizes.
  utils/mpreducetests.py: Tool to generate unpleasant mpreduce tests.
  mpreduce: Don't crash if we've accumulated no instructions.
  mpreduce: Don't stop bit scanner too early.
  mpreduce: Debug decomposition corrupts initial state for code generator.
  factorial: Fix usage message to fit in with conventions.
  cleanup: Various aesthetic fiddlings of little consequence.

23 files changed:
.gitignore
Makefile.m4
catcrypt.1
catcrypt.c
catsign.1
catsign.c
cc-kem.c
cc-sig.c
cc.h
dh-param.c
keyutil.c
mkpgroups [new file with mode: 0755]
noise.c
ptab.in
rijndael-base.c
rijndael-base.h
rijndael-mktab.c
rijndael.h
rijndael192.h
rijndael256.h
tests/group
utils/genpgroup [new file with mode: 0755]
utils/genpgroups [new file with mode: 0755]

index 6eb0d04..00edf95 100644 (file)
@@ -313,3 +313,7 @@ mkinstalldirs
 depcomp
 compile
 debug
+prof
+tinymp
+*.kr
+*.kr.old
index 0025dc6..a1a6730 100644 (file)
@@ -334,13 +334,20 @@ man_MANS = \
        key.1 dsig.1 cookie.1 catcrypt.1 catsign.1 hashsum.1 mkphrase.1 \
        keyring.5 pixie.1
 
+## --- Prime group keyring ---
+
+pkgdata_DATA = pgroups.kr
+
+$(srcdir)/pgroups.kr: ptab.in mkpgroups
+       cd $(srcdir) && rm -f pgroups.kr && ./mkpgroups <ptab.in
+
 ## --- Other handy definitions ---
 
 EXTRA_DIST = \
        Makefile.m4 genmodes gengctab $(man_MANS) xpixie \
        group-test.c rsa-test.c \
        ectab.in ec-gentab.awk \
-       ptab.in p-gentab.awk \
+       ptab.in p-gentab.awk mkpgroups pgroups.kr \
        bintab.in bin-gentab.awk \
        README.cipher README.hash README.random README.mp \
        debian/rules debian/copyright debian/control debian/changelog \
@@ -432,7 +439,7 @@ CTESTRIG(rho)
 TESTS = serpent-check bittest testprogs
 
 CLEANFILES = \
-       *.t$(EXEEXT) *.to \
+       *.t$(EXEEXT) *.to *.kr.old \
        mptypes.h primetab.c primetab.h ectab.c ptab.c bintab.c \
        addsuffix(`gen_tables', `-tab.h')
 
@@ -447,6 +454,7 @@ DISTCLEANFILES = libtool
 MAINTAINERCLEANFILES = \
        $(srcdir)/Makefile.am \
        $(srcdir)/getdate.c getdate.c \
+       $(srcdir)/pgroups.kr \
        $(MODES) modes-stamp $(srcdir)/modes-stamp
 
 ##----- That's all, folks ---------------------------------------------------
index d4ef3e1..61da7f9 100644 (file)
@@ -184,6 +184,16 @@ Use the
 algorithm of the
 .BR key (1))
 command to generate the key.
+.TP
+.B symm
+This is a simple symmetric encapsulation scheme.  It works by hashing a
+binary key with a randomly-generated salt.  Use the
+.B binary
+algorithm of the
+.B key add
+command (see
+.BR key (1))
+to generate the key.
 .PP
 As well as the KEM itself, a number of supporting algorithms are used.
 These are taken from appropriately named attributes on the key or,
@@ -335,6 +345,21 @@ algorithm of the
 command (see
 .BR key (1))
 to generate the key.
+.TP
+.B mac
+This uses a symmetric message-authentication algorithm rather than a
+digital signature.  The precise message-authentication scheme used is
+determined by the
+.B mac
+attribute on the key, which defaults to
+.IB hash -hmac
+if unspecified.  Use the
+.B binary
+algorithm of the
+.B key add
+command (see
+.BR key (1))
+to generate the key.
 .PP
 As well as the signature algorithm itself, a hash function is used.
 This is taken from the
index 8468552..cbbf694 100644 (file)
@@ -138,7 +138,7 @@ static int encrypt(int argc, char *argv[])
   octet *tag, *ct;
   buf b;
   size_t seq;
-  char bb[16384];
+  char bb[65536];
   unsigned f = 0;
   key_file kf;
   key *k;
index e762712..3f1cd5e 100644 (file)
--- a/catsign.1
+++ b/catsign.1
@@ -243,6 +243,21 @@ algorithm of the
 command (see
 .BR key (1))
 to generate the key.
+.TP
+.B mac
+This uses a symmetric message-authentication algorithm rather than a
+digital signature.  The precise message-authentication scheme used is
+determined by the
+.B mac
+attribute on the key, which defaults to
+.IB hash -hmac
+if unspecified.  Use the
+.B binary
+algorithm of the
+.B key add
+command (see
+.BR key (1))
+to generate the key.
 .PP
 As well as the signature algorithm itself, a hash function is used.
 This is taken from the
index 93f3236..727c980 100644 (file)
--- a/catsign.c
+++ b/catsign.c
@@ -367,7 +367,7 @@ static void keyhash(key *k, sig *s, dstr *d)
   ghash *h;
   key_filter kf;
 
-  h = GH_INIT(GH_CLASS(s->h));
+  h = GH_INIT(s->ch);
   kf.f = KCAT_PUB;
   kf.m = KF_CATMASK;
   key_fingerprint(k, h, &kf);
index aaa21bd..1766c8e 100644 (file)
--- a/cc-kem.c
+++ b/cc-kem.c
@@ -269,6 +269,7 @@ static void dh_encdestroy(kem *k)
   G_DESTROY(de->g, de->y);
   mp_drop(de->x);
   G_DESTROYGROUP(de->g);
+  DESTROY(de);
 }
 
 static const kemops dh_encops = {
@@ -349,6 +350,67 @@ static const kemops ec_decops = {
   ec_decinit, dh_decdoit, dh_enccheck, dh_encdestroy
 };
 
+/* --- Symmetric --- */
+
+typedef struct symm_ctx {
+  kem k;
+  key_packdef kp;
+  key_bin kb;
+} symm_ctx;
+
+static kem *symm_init(key *k, void *kd)
+{
+  symm_ctx *s;
+  dstr d = DSTR_INIT;
+  int err;
+
+  s = CREATE(symm_ctx);
+
+  key_fulltag(k, &d);
+  s->kp.e = KENC_BINARY;
+  s->kp.p = &s->kb;
+  s->kp.kd = 0;
+
+  if ((err = key_unpack(&s->kp, kd, &d)) != 0) {
+    die(EXIT_FAILURE, "failed to unpack symmetric key `%s': %s",
+       d.buf, key_strerror(err));
+  }
+  dstr_destroy(&d);
+  return (&s->k);
+}
+
+static int symm_decdoit(kem *k, dstr *d, ghash *h)
+{
+  symm_ctx *s = (symm_ctx *)k;
+
+  GH_HASH(h, s->kb.k, s->kb.sz);
+  GH_HASH(h, d->buf, d->len);
+  return (0);
+}
+
+static int symm_encdoit(kem *k, dstr *d, ghash *h)
+{
+  dstr_ensure(d, h->ops->c->hashsz);
+  d->len += h->ops->c->hashsz;
+  rand_get(RAND_GLOBAL, d->buf, d->len);
+  return (symm_decdoit(k, d, h));
+}
+
+static const char *symm_check(kem *k) { return (0); }
+
+static void symm_destroy(kem *k)
+  { symm_ctx *s = (symm_ctx *)k; key_unpackdone(&s->kp); }
+
+static const kemops symm_encops = {
+  0, 0,
+  symm_init, symm_encdoit, symm_check, symm_destroy
+};
+
+static const kemops symm_decops = {
+  0, 0,
+  symm_init, symm_decdoit, symm_check, symm_destroy
+};
+
 /* --- The switch table --- */
 
 const struct kemtab kemtab[] = {
@@ -356,6 +418,7 @@ const struct kemtab kemtab[] = {
   { "dh",      &dh_encops,     &dh_decops },
   { "bindh",   &bindh_encops,  &bindh_decops },
   { "ec",      &ec_encops,     &ec_decops },
+  { "symm",    &symm_encops,   &symm_decops },
   { 0,         0,              0 }
 };
 
@@ -436,10 +499,17 @@ kem *getkem(key *k, const char *app, int wantpriv)
       kalg, t.buf);
 k_found:;
   ko = wantpriv ? kt->decops : kt->encops;
-  kd = xmalloc(ko->kdsz);
-  kp = key_fetchinit(ko->kf, 0, kd);
-  if ((e = key_fetch(kp, k)) != 0)
-    die(EXIT_FAILURE, "error fetching key `%s': %s", t.buf, key_strerror(e));
+  if (!ko->kf) {
+    kd = k->k;
+    key_incref(kd);
+  } else {
+    kd = xmalloc(ko->kdsz);
+    kp = key_fetchinit(ko->kf, 0, kd);
+    if ((e = key_fetch(kp, k)) != 0) {
+      die(EXIT_FAILURE, "error fetching key `%s': %s",
+         t.buf, key_strerror(e));
+    }
+  }
   kk = ko->init(k, kd);
   kk->kp = kp;
   kk->ops = ko;
@@ -544,8 +614,12 @@ done:
 
 void freekem(kem *k)
 {
-  key_fetchdone(k->kp);
-  xfree(k->kd);
+  if (!k->ops->kf)
+    key_drop(k->kd);
+  else {
+    key_fetchdone(k->kp);
+    xfree(k->kd);
+  }
   k->ops->destroy(k);
 }
 
index 45679ce..dbcf902 100644 (file)
--- a/cc-sig.c
+++ b/cc-sig.c
@@ -570,6 +570,93 @@ static const sigops eckcdsa_vrf = {
   eckcdsa_vrfinit, kcdsa_vrfdoit, dsa_sigcheck, dsa_sigdestroy
 };
 
+/* --- Symmetric message authentication --- */
+
+typedef struct mac_ctx {
+  sig s;
+  const gcmac *mc;
+  gmac *m;
+  key_packdef kp;
+  key_bin kb;
+} mac_ctx;
+
+static sig *mac_init(key *k, void *kd, const gchash *hc)
+{
+  mac_ctx *m;
+  dstr d = DSTR_INIT;
+  int err;
+  const char *mm;
+
+  m = CREATE(mac_ctx);
+
+  key_fulltag(k, &d);
+  m->kp.e = KENC_BINARY;
+  m->kp.p = &m->kb;
+  m->kp.kd = 0;
+
+  if ((mm = key_getattr(0 /*yik*/, k, "mac")) == 0) {
+    dstr_putf(&d, "%s-hmac", hc->name);
+    mm = d.buf;
+  }
+  if ((m->mc = gmac_byname(mm)) == 0)
+    die(EXIT_FAILURE, "unknown message authentication scheme `%s'", mm);
+  dstr_reset(&d);
+
+  if ((err = key_unpack(&m->kp, kd, &d)) != 0) {
+    die(EXIT_FAILURE, "failed to unpack symmetric key `%s': %s",
+       d.buf, key_strerror(err));
+  }
+  dstr_destroy(&d);
+
+  if (keysz(m->kb.sz, m->mc->keysz) != m->kb.sz) {
+    die(EXIT_FAILURE, "bad key size %lu for `%s'",
+       (unsigned long)m->kb.sz, m->mc->name);
+  }
+  m->m = GM_KEY(m->mc, m->kb.k, m->kb.sz);
+  m->s.h = GM_INIT(m->m);
+  return (&m->s);
+}
+
+static int mac_sigdoit(sig *s, dstr *d)
+{
+  mac_ctx *m = (mac_ctx *)s;
+
+  dstr_ensure(d, m->mc->hashsz);
+  GH_DONE(m->s.h, d->buf);
+  d->len += m->mc->hashsz;
+  return (0);
+}
+
+static int mac_vrfdoit(sig *s, dstr *d)
+{
+  mac_ctx *m = (mac_ctx *)s;
+  const octet *t;
+
+  t = GH_DONE(m->s.h, 0);
+  if (d->len != m->mc->hashsz || memcmp(d->buf, t, d->len) != 0)
+    return (-1);
+  return (0);
+}
+
+static const char *mac_check(sig *s) { return (0); }
+
+static void mac_destroy(sig *s)
+{
+  mac_ctx *m = (mac_ctx *)s;
+  GM_DESTROY(m->m);
+  key_unpackdone(&m->kp);
+}
+
+static const sigops mac_sig = {
+  0, 0,
+  mac_init, mac_sigdoit, mac_check, mac_destroy
+};
+
+static const sigops mac_vrf = {
+  0, 0,
+  mac_init, mac_vrfdoit, mac_check, mac_destroy
+};
+
 /* --- The switch table --- */
 
 const struct sigtab sigtab[] = {
@@ -581,6 +668,7 @@ const struct sigtab sigtab[] = {
   { "kcdsa",   &kcdsa_sig,     &kcdsa_vrf,     &has160 },
   { "binkcdsa",        &binkcdsa_sig,  &binkcdsa_vrf,  &has160 },
   { "eckcdsa", &eckcdsa_sig,   &eckcdsa_vrf,   &has160 },
+  { "mac",     &mac_sig,       &mac_vrf,       &rmd160 },
   { 0,         0,              0 }
 };
 
@@ -665,16 +753,24 @@ s_found:;
 
   /* --- Load the key --- */
 
-  kd = xmalloc(so->kdsz);
-  kp = key_fetchinit(so->kf, 0, kd);
-  if ((e = key_fetch(kp, k)) != 0)
-    die(EXIT_FAILURE, "error fetching key `%s': %s", t.buf, key_strerror(e));
+  if (!so->kf) {
+    kd = k->k;
+    key_incref(kd);
+  } else {
+    kd = xmalloc(so->kdsz);
+    kp = key_fetchinit(so->kf, 0, kd);
+    if ((e = key_fetch(kp, k)) != 0) {
+      die(EXIT_FAILURE, "error fetching key `%s': %s",
+         t.buf, key_strerror(e));
+    }
+  }
   s = so->init(k, kd, ch);
   if (!s->h)
     s->h = GH_INIT(ch);
   s->kp = kp;
   s->ops = so;
   s->kd = kd;
+  s->ch = ch;
 
   /* --- Free stuff up --- */
 
@@ -695,8 +791,12 @@ s_found:;
 void freesig(sig *s)
 {
   GH_DESTROY(s->h);
-  key_fetchdone(s->kp);
-  xfree(s->kd);
+  if (!s->ops->kf)
+    key_drop(s->kd);
+  else {    
+    key_fetchdone(s->kp);
+    xfree(s->kd);
+  }
   s->ops->destroy(s);
 }
 
diff --git a/cc.h b/cc.h
index 5574e9e..4124b82 100644 (file)
--- a/cc.h
+++ b/cc.h
@@ -82,6 +82,7 @@ typedef struct sig {
   const struct sigops *ops;
   key_packdef *kp;
   void *kd;
+  gchash *ch;
   ghash *h;
 } sig;
 
index fcce31f..26ee000 100644 (file)
@@ -128,7 +128,7 @@ int main(int argc, char *argv[])
     group *g;
     dh_infofromdata(&dp, pe->data);
     g = group_prime(&dp);
-    if (mp_bits(dp.q) > 2048 &&
+    if (mp_bits(dp.p) > 2048 &&
        (!argv[1] || strcmp(argv[1], "keen") != 0)) {
       printf(" [%s skipped]", pe->name);
       fflush(stdout);
index 1adb840..9bfc6bc 100644 (file)
--- a/keyutil.c
+++ b/keyutil.c
@@ -941,6 +941,7 @@ static int cmd_add(int argc, char *argv[])
 {
   key_file f;
   time_t exp = KEXP_EXPIRE;
+  uint32 kid = rand_global.ops->word(&rand_global);
   const char *tag = 0, *ptag = 0;
   const char *c = 0;
   keyalg *alg = algtab;
@@ -962,6 +963,7 @@ static int cmd_add(int argc, char *argv[])
       { "comment",     OPTF_ARGREQ,    0,      'c' },
       { "tag",         OPTF_ARGREQ,    0,      't' },
       { "rand-id",     OPTF_ARGREQ,    0,      'R' },
+      { "key-id",      OPTF_ARGREQ,    0,      'I' },
       { "curve",       OPTF_ARGREQ,    0,      'C' },
       { "seedalg",     OPTF_ARGREQ,    0,      'A' },
       { "seed",                OPTF_ARGREQ,    0,      's' },
@@ -973,7 +975,7 @@ static int cmd_add(int argc, char *argv[])
       { "kcdsa",       0,              0,      'K' },
       { 0,             0,              0,      0 }
     };
-    int i = mdwopt(argc, argv, "+a:b:B:p:e:c:t:R:C:A:s:n:lqrLKS",
+    int i = mdwopt(argc, argv, "+a:b:B:p:e:c:t:R:I:C:A:s:n:lqrLKS",
                   opt, 0, 0, 0);
     if (i < 0)
       break;
@@ -1118,6 +1120,19 @@ static int cmd_add(int argc, char *argv[])
        seed = d.buf;
        k.r = sa->gen(p, n);
       } break;
+
+      /* --- Key id --- */
+
+      case 'I': {
+       char *p;
+       unsigned long id;
+
+       errno = 0;
+       id = strtoul(optarg, &p, 16);
+       if (errno || *p || id > MASK32)
+         die(EXIT_FAILURE, "bad key-id `%s'", optarg);
+       kid = id;
+      } break;
        
       /* --- Other flags --- */
 
@@ -1175,9 +1190,8 @@ static int cmd_add(int argc, char *argv[])
   keyrand(&f, rtag);
 
   for (;;) {
-    uint32 id = rand_global.ops->word(&rand_global);
     int err;
-    if ((err = key_new(&f, id, argv[optind], exp, &k.k)) == 0)
+    if ((err = key_new(&f, kid, argv[optind], exp, &k.k)) == 0)
       break;
     else if (err != KERR_DUPID)
       die(EXIT_FAILURE, "error adding new key: %s", key_strerror(err));
@@ -2126,7 +2140,7 @@ Options:\n\
   { "add", cmd_add,
     "add [-OPTIONS] TYPE [ATTR...]\n\
        Options: [-lqrLKS] [-a ALG] [-bB BITS] [-p PARAM] [-R TAG]\n\
-                [-A SEEDALG] [-s SEED] [-n BITS]\n\
+                [-A SEEDALG] [-s SEED] [-n BITS] [-I KEYID]\n\
                 [-e EXPIRE] [-t TAG] [-c COMMENT]", "\
 Options:\n\
 \n\
@@ -2146,6 +2160,7 @@ Options:\n\
 -t, --tag=TAG          Tag the key with the name TAG.\n\
 -r, --retag            Untag any key currently with that tag.\n\
 -R, --rand-id=TAG      Use key named TAG for the random number generator.\n\
+-I, --key-id=ID                Force the key-id for the new key.\n\
 -l, --lock             Lock the generated key with a passphrase.\n\
 -q, --quiet            Don't give progress indicators while working.\n\
 -L, --lim-lee          Generate Lim-Lee primes for Diffie-Hellman groups.\n\
diff --git a/mkpgroups b/mkpgroups
new file mode 100755 (executable)
index 0000000..3b3874f
--- /dev/null
+++ b/mkpgroups
@@ -0,0 +1,42 @@
+#! /usr/bin/python
+
+import catacomb as C
+import mLib as M
+from sys import stdin
+
+kf = C.KeyFile('pgroups.kr', C.KOPEN_WRITE)
+
+for line in stdin:
+  line = line.strip()
+  if line == '' or (line.startswith('#') and not line.startswith('#:')):
+    continue
+  F = line.split()
+  if F[0] == 'group':
+    name = F[1]
+    if not name.startswith('catacomb'):
+      continue
+    def snarf(what):
+      F = stdin.next().split()
+      assert F[0] == what
+      return F[1]
+    p = C.MP(snarf('p'))
+    q = C.MP(snarf('q'))
+    g = C.MP(snarf('g'))
+    ff = []
+    while True:
+      F = stdin.next().split()
+      if not F or F[0] != '#:factor':
+        break
+      ff.append(C.MP(F[1]))
+    seed = C.rmd160().hash(name).done()
+    k = kf.newkey(C.ReadBuffer(seed).getu32(), 'dh-param')
+    k.tag = name
+    k.data = C.KeyDataStructured({
+      'p': C.KeyDataMP(p, 'shared'),
+      'q': C.KeyDataMP(q, 'shared'),
+      'g': C.KeyDataMP(g, 'shared')
+    })
+    k.attr['factor'] = ', '.join([f.tostring() for f in ff])
+    k.attr['genseed'] = M.base64_encode(seed)
+    k.attr['seedalg'] = 'rmd160-mgf'
+kf.save()
diff --git a/noise.c b/noise.c
index 9088930..c122506 100644 (file)
--- a/noise.c
+++ b/noise.c
@@ -390,7 +390,8 @@ int noise_freewheel(rand_pool *r)
 
 done:
   signal(SIGALRM, sigal);
-  TV_SUB(&oitv.it_value, &oitv.it_value, &itv.it_value);
+  if (oitv.it_value.tv_sec || oitv.it_value.tv_usec)
+    TV_SUB(&oitv.it_value, &oitv.it_value, &itv.it_value);
   setitimer(ITIMER_REAL, &oitv, 0);
   return (rc);
 }
diff --git a/ptab.in b/ptab.in
index dfcf63b..24151f9 100644 (file)
--- a/ptab.in
+++ b/ptab.in
@@ -48,86 +48,172 @@ group oakley8192
 
 #----- Lim-Lee groups generated by hand -------------------------------------
 #
-# I generated each of these using the `key' command, as follows:
+# I generated these using utils/genpgroups.  It took a rather long time.
+
+# --- catacomb-ll-128-512 ---
 #
-#   ./key add -adh-param -LS -b$b -B$B -Armd160-mgf -n160 -tg$b dhp
+# keyid = 3db35e07
+# seed = PbNeB774QFw0xJvLDEn3bUx6hJw=
+# fingerprint = fb47344e-9bfcd0e-e986c772-48edc231-861cb5fb
+
+group catacomb-ll-128-512
+  p 9749248307666198278625282069621029423614285873414870747628872221551255623823205551438908261067675576856742534707535779666498916029617598868013496631088223
+  q 271499434142083095503643289076442321059
+  g 572938290446952786361356734705597783874760982871814854106633812061613480394314443743197177265739535298268868306029572450131746639710824513310586144336987
+#:factor 271499434142083095503643289076442321059
+#:factor 251174382438405784142034780246853570853
+#:factor 259658226261043076610234546745792177763
+#:factor 275292752516630714214627215608643381611
+
+# --- catacomb-ll-160-1024 ---
 #
-# The seeds are printed so that they can be verified, for example by saying
+# keyid = 98f62cc8
+# seed = mPYsyKXF6PoNTkl5uZE64gKEf20=
+# fingerprint = 6ab1f087-5614561c-5d388443-b1f02eac-38248fe6
+
+group catacomb-ll-160-1024
+  p 69775951038073580217048751187698556149910661999359201823421066000439190288124938297116840422332973903349265313226189724474672148172906743149961449018143681316055777549225333684417216672046201528908637006946721694566251047975893301628540057123962444434130461052652526277961662241061299058137499738575071867183
+  q 741802303617786660769426556982216255271020758647
+  g 24031880137812767104513348688448999056754549625670167617628008814539123937598464069755252337842705625768270002772600104095116713027947418314704258588569425678035630653993833866258334547988915311887541947589468379164053328339235797437698686107421712042993209960764868024283667188725341401853595169622553906137
+#:factor 741802303617786660769426556982216255271020758647
+#:factor 1436145082693042410533997633791272917636904431479
+#:factor 1053371763883815722032496338163704236230178616951
+#:factor 1215995718665420681503927009463070333378310191827
+#:factor 1448192360714741582009673893725822727433041298541
+#:factor 17654251325616983743094122151298023764308424678047987263690296014551
+
+# --- catacomb-ll-192-1536 ---
 #
-#   for i in \
-#       512:128:V5DGdsaGc94mN9URH3I77nsNLIg= \
-#       1024:160:XRJk5bOOi3HLn4KjIzsR1lHYARk= \
-#       1536:192:xdavXXnfLHfzffaZUOpN4aJ4yUI= \
-#       2048:256:XaRFBJQ81wVVzq8qoBeIP3vqyuE; do
-#     set -- `echo $i | tr : " "`
-#     b=$1 B=$2 seed=$3
-#     key add -adh-param -LS -b$b -B$B -Armd160-mgf -s$seed -tg$b dhp
-#   done
-
-# --- catacomb-g512 ---
+# keyid = 7efe5c2c
+# seed = fv5cLMXgGO2voYGTQ5K525Xtf9E=
+# fingerprint = ae9d47b9-e303daa5-9677023d-764b338b-53f03c4e
+
+group catacomb-ll-192-1536
+  p 271163844483056215974969265313967454661676256266511940924304321373021958106999031565631233996938091358447023677706317722695337026864685384345663120704730255257202847527192911265950638087504732115876440997750045081880863038141607482083211725689822517898206821836185159703555104632867971994304356879518337226475272092974597967943366038800089283400183985773753490774687966167193456249452974119129018696293050595073100284829925638444204379135326678813960293114732959
+  q 3265942811645946563242629602041107481841853511350443184197
+  g 216185318413290469366405581500018842001794769819261149347277739848511992115259660705539911431188902360038442052949313200461450240469139278699145891151900315976816130082310914969548643710915174155521909660265659882527478738966654443422798664706090262812802264667406360583964285545011889176706871228354070760597031811706100156760441692822039947686308668974200473374152063439445019790248156400822413220452383963514887723177708643429977392740800552485785350546387634
+#:factor 3265942811645946563242629602041107481841853511350443184197
+#:factor 4203281750074745560664516895168522022509720946720609480259
+#:factor 5008750505930402098755083797499946811957880698185704286517
+#:factor 5437815993255342021982036827752826453901545498474314278259
+#:factor 3856915640937851719940744630159301063173277801391043813291
+#:factor 6054082443893470116716978196535076127652382149483455623509
+#:factor 4527580176039500642864307604310793340910014541817043735439
+#:factor 3430016280837410693307976287901159907499384818919106315351
+
+# --- catacomb-ll-224-2048 ---
 #
-# seed = V5DGdsaGc94mN9URH3I77nsNLIg=
-# fingerprint = f25bc8c6-617a09a1-754d2eaa-0522871a-760e610d
-
-group catacomb-g512
-  p 5118856347920954160378863232830631325889644197299799167911144300201784122094780184626197180489795089420405735367823610560615880134994605406941434667432423
-  q 305195864527308403703758000941688611143
-  g 3697266067523710036467093123816011201983155908266335624854330873142263159303630246637735938648226082958343061457343689503209448195311459584298640741102705
-#:factor 305195864527308403703758000941688611143
-#:factor 183466370120479092451878102554970138601
-#:factor 186700538408825324669801286998471418829
-#:factor 244828664101528731840410424550149964513
-
-# --- catacomb-g1024 ---
+# keyid = e2824699
+# seed = 4oJGmZFnxNgns4UExrPWJXJDQYY=
+# fingerprint = 5b3631f1-f388bca-554c1df1-3774fee9-cd46747c
+
+group catacomb-ll-224-2048
+  p 3113844893182469436423817481922802329154474934213986369565700235348098440269001480103560846535113493144522446351379349356211385191632945710341444495577638160076546999114567117877732507854868463110804063964212132228977417231690350182211790515961798314443291574015832300281633156990779527484905381392680532643288437519954295652416759988107781937077836044809781096660654460207183523575424301901443740349094152501352983589721328225459512044516684078781305909247963063040562914192132284695886353707336911126238203292592145886841905764429235683487108646920559740458905874135798982283901137307047131586817745416509850061963
+  q 18749474022970964965792505501868745784157349746475161167020805104727
+  g 1018599075350815414286530684646967825916370747779291600517646276513566802791874935821816063520500873842729343817973803895278528701892043836290994612088035311589900475691176610297248816678701309707300454643927577686742011376684351525767933769045470869869290385506108485669189456183746644562327923152628958690988304340204333382573235567919004822811151873260798098816157572583867825397056414990908538555039226503662448878536483457742053639607062687899859473980884756925814541061907505350254827583321961201313954703462583072253230646667723110441238195386606218014837851495231172030604130800244334912972408067680590879980
+#:factor 18749474022970964965792505501868745784157349746475161167020805104727
+#:factor 26459793266106143518700371316953986751950547842631163615799385478033
+#:factor 23385205652191135191327958583020476187937251160152256504448581299573
+#:factor 17287418736358368314036906794523064561326146990020019216549187737103
+#:factor 16800288948485454351848726052252844830400274721321174607061304165751
+#:factor 14817124042645057452868896146782513905071983176482538876644503596827
+#:factor 24089412810223523640445605527780074479098235298741910558499656689361
+#:factor 18919386933765812741111621380736732547216460099506859126765656541087
+#:factor 68423637472150676252123752731403397187923476268634988015857219241126016100451
+
+# --- catacomb-ll-256-3072 ---
 #
-# seed = XRJk5bOOi3HLn4KjIzsR1lHYARk=
-# fingerprint = 0dc1bdb6-538314cf-d7b87bff-b8bd7200-90605815
-
-group catacomb-g1024
-  p 78755935681003885419264728861345379637028906441022322413456415764939641783336851042588146268355482691146885408309655771050383114167622301018690564876497648546617048801723493306649269757534973720900588265521617407576647372939590696584279495709722074618640770310739210062851628263901598357589613375395797359959
-  q 1419054345488286019529284378621915381299017390711
-  g 58825919769364968331424947271593333019269386260261303735666667702229466489655563394667916806132064369818023847262687164133692606997345477915636979837490941743124378900249509898575176837060134280677725934918181696837395720729413369903126189903716658234076491410436114815588467963968699191062139234426829304874
-#:factor 1419054345488286019529284378621915381299017390711
-#:factor 808918575263122392359194885025533099598345595673
-#:factor 837447658428460194172640743162052526375779460247
-#:factor 1176506922641176986055037627440710388833031551637
-#:factor 1440893326598068230528326457570152914912523167631
-#:factor 24163813452665907844419927325562548942785722977403812563263504533577
-
-# --- catacomb-g1536 ---
+# keyid = e6a15ce1
+# seed = 5qFc4fL01gTjyvNMZH5BvwETZco=
+# fingerprint = 904df4e7-74941baa-40d589c8-fecad932-2b3b7c8d
+
+group catacomb-ll-256-3072
+  p 635937223373484887991140560420669529960468634418212194527199243018802509220923645480563049852948379631872315326364181219863391536284352632127476573990043945919830000350264391397346335414535975554209931971547284463207275833747975949070870172306582775948778222246682185331862354083029804303222690541851195763223409045953191584611635790362191424339883737168342809190665629632289528654983812904611647818546832860081714363504512892885600580448186423533085059295328609139522690627823102925150246378111221377628009667319528150747320084312110336288028683700603719073769314245952464113622780032073817850603131463761017417455806035107984621889773217138911836476354442521466189648565925624512100087534918369360007697883847802211797655614684090408428715299537509886614640500137409891381649298835563011151796284848165977247286439820050405175697064122759870661294968492275655767983096727976056361878300352234381528837008128941375285251387
+  q 89271282791461757245617785540129155142212959423277129581512553253419075634703
+  g 293025651734044707050351995205142657657141955131408425452312245943331353163428637443799381119408990271553007202915223601376791534187122912295000993316207089139736477148501917083144416322685925261624358336253378688806309805096283386698409139605996997308008266491782991490291726095895573563845937760385377670846794792328581579165150512160132493375389995617711312966986681865792948443127326586291576561351005982500369077653940283008076332825908419690031303502192009860824429031526378047535596212801179578879818504990773143072529887215206211778546705082334239130823956177702608427222251531070457604183947814624087379251368161182770323100074409926426428526795865215674068539423364010352920515052672366811052717283396264950182005583498061313136436293898863077084485762289185337928869086731032780517039420605615746259170222257438835029958473402842467194409561307509136616954789698181252705567549441508247668319257495617674881793988
+#:factor 89271282791461757245617785540129155142212959423277129581512553253419075634703
+#:factor 85831054040144766435760746678768685031101307134949905606966042252247846736739
+#:factor 106974241938861083915762659525277908624697359844432666343676471334975764276049
+#:factor 74188558205228235051388929541366735789893711666871143431413381703129034070571
+#:factor 64157908398727096384500697645883202842334928055247546726538359334678953374533
+#:factor 91888021786522811643506031866522514605588426773858897142365239694153824388723
+#:factor 86202112980065410413258705060295663522206392211838714986438313175672540034679
+#:factor 101718718485667336124248700072690338405530751717394437871691123315096947983183
+#:factor 86666452227843804499517643692692014159268339780015078349842908985056208435853
+#:factor 107755126504421076829573915729759110231793946298489260169446357640494497518059
+#:factor 106001951238340530179427922980522671485637210826387486585015951056665476348869
+#:factor 102183593360154313236939029184315018977616435836107396944951781361526011480879
+
+# --- catacomb-ll-384-7680 ---
 #
-# seed = xdavXXnfLHfzffaZUOpN4aJ4yUI=
-# fingerprint = 7c8395e0-30f0ba39-3fcf305f-8405e925-8f55ec8b
-
-group catacomb-g1536
-  p 383618801425631512639679010233494027298448169109547600059502705907371439271932758179471011100378234860612705323707696845632535293731854087134152787350527588865123205717061331587664013265527474950838320241277990361233998673285302400493519384019311459331115126650720227947194082175343397026404881513921942694130897583244878286078416071034663404900503607239216267234716848423157867865924627528541625976189517370222928416617890890711958913977705458641898019793137567
-  q 3275641213331577544956079882485798541293343355151947117267
-  g 75567102998973006819236434748343962916387173892100142148230797775334350230786915953451381035927889555810159538209392484334843275305619145381031766085998906461896047057459109982258943279745411432423432727058945662406099102428838108340486817276659663329224706868534013896950343046900915527691132454858703939255112356712430338179445362271271130771412736483434334076018336540519431066737658374108259585338553305483833520027492221617458503836640494191113432119200395
-#:factor 3275641213331577544956079882485798541293343355151947117267
-#:factor 5923907098009644577374814618329026695556706671262137178497
-#:factor 3844881227882828127330776567190990999774232184254041918229
-#:factor 5430347777844125846459785226421548800285951243451322854507
-#:factor 4579813319768104593696877908030851637284891613924119865649
-#:factor 5010386120883339072065025678004772865252492789176775057011
-#:factor 4450957002678134171264816926461631570727858852456021603561
-#:factor 4635348374228446290293078229669107374406520693763884412441
-
-# --- catacomb-g2048 ---
+# keyid = 5269085d
+# seed = UmkIXe0NUh9EHPOO8u8wF8mhLQE=
+# fingerprint = 79071929-98fc59d-90b7743e-c5c2b654-9bb79c2f
+
+group catacomb-ll-384-7680
+  p 216559231449171871041190135626382624797124950735238103903411263023444445882521628396323446917201544947387362748232352479621010825720892522010264595137021526116731147020276163999389935515909942333859243831227670403913428432731504427389273023004939424753052775358161721558889434984752937404659922107755872908503276779890720154023419646466364753857461405783464469564625360217138090672724105361675896756808274354930058114085554600822147968649870032508764648998263671769796991884663568970203225077040350146289614179408735323764473153776149414398483161820946251418283039309221276673125231280207218356527486085198155052448482264858753938528034551335541575510835605019724293894867922725429018142837363943168309374088743910487619039647758175469460668571266467909654776838430687432194443218576000354284573578578313918222270250431668826898042163427173702446261012188950489694384130788197898956349943432660613123480611964086340909829616693038723512697569973817087806925553170590595578662024721424212829104524679861074838515062614572669868082762235959143570965134389478420007029121452023331460602894158087970348076496609174310151629106271427215947168306439928345126945165118709319486831988505313790613950433545275492703644799196726129007271379101141097250063655345163597099147393517021524375283410477077887674889864364373504345856902602031627659096612965600880097793678105801528551273968273016116586602655943987294387646704481664853571904789295943497201543689680443816576374462034616478062083674538453821741357423160686683957869164976227205380757021506255070600142017516211729170052461889059117212201165174680435195480761191462787291840078314124775690821420091760461597315155088442641783854597704388729214697745034805817520117506496545607796864049406793174516710815917428415700817370248228453077064519820749224220930454265603643316849024708084260878037824529368824330161019279087245044637182254878850971615729695143996520927935652887799292993748602455597137301552603377186175439256163850872771856775561289081476860168359000521640192117573827877302113899996287468260783657370603418752653187994927154468272901154316379212588059218864942163650290968975838491996852452140839172227541162524444316754170785930872965059072588210184084993896704348797801907146398460530513820150529386362374102968643080903455218783795163739396580563
+  q 33126499307317576797871833023217004335728314922050873541842362900543256622519036793987373377351818708943025119171013
+  g 96859294361547047642162231787698695293269170366381491039992704638487946870512955047635144422727688206850890592577601738386271033615655069759857614095318767501569475658225621379418176050399654722867097565799361229947796756782330159878485797280010527792372818398073347477883450716624241650342576251700830368197267161507895940250335059430229713885285808307538641824823453590259949699610056770268667527819173674245700546468626735701216914339359142650715456068873883323510582206093162545301581421872580614739960541059105320799303366751068487975658774037067271201124075671594347915071804828018801863090776942278748696864666275555399479604564578677796647983816263014540144519577131864786690922226752900095101570448042330169808811588582992274222974333043374060077106932770817928804830739464113061207244668378493315384242428432594357567083170258903374723309088233501818385465347016865045003737737429798873421728939731524368763227995005635265743181878570394577251864081145075962862658667595276249717296728684048617249986325764929873684993115348889870151843083280953797610712542442651569528403369291638278579344023829005801861314384307223035852089456550106858884145475380292972702972023699980804060437666725813022897101316874650121913713231347979141680903702045096621935190730276560295174524297300767314797689155407477601193107232938299830541221417725759368288595613473097104008577963940594171976537149511040148774289702490489315160512871522386217608881824304091006999472822494018964857391111674528315676869116824677355671824612095554583261258648450847127015033139359148253652027620146044628375304786435643476708542206375787159378427699020092463186472971399347599749181816424274424067915825882710114752513444732397713670497772986582958901510359579133132479016445445133604454907255125008080844594331635493230874836372234145675198053154029087315214747182882002718722228763467363382722967777319004806095376893995711476881150741027724250087088999020456989167082293444606242846362570237792721708356293491203816603574491100293039203889820292140596922368098350519693304511861932465759110608906269402554390780611082681465359527185555358515709411662470414648813606479086286524570875988991968332315775966514438221552899748093614170849525785168229994381907745855683962639488177828929551456219770877454135407893035439949325975780350
+#:factor 33126499307317576797871833023217004335728314922050873541842362900543256622519036793987373377351818708943025119171013
+#:factor 39355538213779465581327905402419970362362827155309917911796788256581129259700838386618633466328785307910060598484089
+#:factor 24990988056514685939227489925894893740599480412356885556635114159485308445876939770393364881549529860169928180358751
+#:factor 29710393998736802825004025579677917729092552502321819764111039726208854433428942095508492913578932136133436765710137
+#:factor 30739990822741028562742164007270587796692423847729505877569973917995737943042778723217469119645159801429991709987411
+#:factor 38467104071408925475553899301420008676544897864238119086844380566779548268491996551153519861871328607592273248640063
+#:factor 26249202441547885968346939762119297860863007366370739789532392353072352597721946778221716140197625626869457398407943
+#:factor 35113510884533077462576668870689443131037411172656549819745724383911555364605887073198680214468558440325573744139273
+#:factor 22799521027155572453510717469170377645186972219918245680012037643676230864376926993221681405925996643835629140041553
+#:factor 35237903572957790995889936270089932531166269466107290813994448142778414605138387309936585467385466822473088271031989
+#:factor 27428052831286394078655137717030752972732374814011687175621160166365055343004612251793080304507732432129056200291727
+#:factor 20653805003557030567582482355924457431196786739428479408853799555350943953733271029133593962324338862058432369521581
+#:factor 20826184829221859923080357759745090302065026449606341016497732724141145977802307612276509411486570418197846062995143
+#:factor 26186565771074398017481590713676896769947111595943534554546789381717976098676902111563130714755073678247235508588839
+#:factor 25062273677906610062620640227124848504281876654137470308684277968100792708156285085199790540571827305085913619650939
+#:factor 28620246516918127020366359691491908359742867622666550018522929993024502416569436771205673472786682579926850748107811
+#:factor 37856943506407240881326721106883344091018942980536189030625919515240362253893275735656123073145875668656864714642553
+#:factor 22067087486134964177557541373312161142485654981859077450341811542291069526079170766664489890765256439946132722899891
+#:factor 23098926790257626751285008739153477597734517594763012574497649607286859624287080618144594023194033634778511868647877
+#:factor 29874082012645596638985309976826212131328113612069017684649166404247820505933961130580996098120522635385267888074961
+
+# --- catacomb-ll-512-15360 ---
 #
-# seed = XaRFBJQ81wVVzq8qoBeIP3vqyuE=
-# fingerprint = 83d4eccd-7ee749e0-08aa836d-f2db8476-8edd2936
-
-group catacomb-g2048
-  p 6566549572652120431689861127531558421330340455043793984482564709696337228812001308904952649568065583568587879772909497598656422677974007527961282502097075930845830281718567861929276323615100590300159375177078322480856459891862339310954032953912791719082743072006782706539621638332710884731210307201371592118143799018971643225573537115357866462994309593328388179007477192291502661723448576542875507556533074094050684884411874123801280281707321329428218433930422183253523330090184052067733393547530287435821953994285151790223917195811689888131012632526833728463264350844033754405413758744532430886373149124555575950119
-  q 85219291683194343311648709576647238772792814954178375461491931659867071278179
-  g 2712141723171795581488249576260576193761110477063764293591032009827968751431395523061136221268304777960574263879250629365586812866824369569874730255716068295729152411167722797556896531602052328323962128667798500023092663406604756526331182771005434060123484959167353575934888103970356821325588887453135264523934107731497158111619089910229366930643553779443872242586492810355327274464057143529561902987269668822923702637343147141226655673562552876847682549615031082304437898719857828585147298892788370396664494775578429846195466392714456810816881284814946617797677007757332068752054463579186298698714625622710684652210
-#:factor 85219291683194343311648709576647238772792814954178375461491931659867071278179
-#:factor 103405058914440135561022141060017648606740273177776645185302688502492969483241
-#:factor 113963865770422801273732150069066629221825734790590120001120039124679845832963
-#:factor 80265376580192980414321385617558188839311132409791112548764982795679972612671
-#:factor 85373177067927972620374408916798159155602932702094285590546968078635293574289
-#:factor 88343485680671092863800489383682034593775966659103995594051594606625920956031
-#:factor 66724081118319248356666248758604279507549823671133489207537165813489410099011
-#:factor 80938197596113813192367778019037224015451333736452277049313111439333946857553
+# keyid = eb8239f8
+# seed = 64I5+NMQg5J7WZeXPpo7dsXLiAs=
+# fingerprint = c9addb82-dd632399-3dc1de81-40bf1c07-8ca10f5f
+
+group catacomb-ll-512-15360
+  p 267737496760767722068079882470300794033605836807622482067410964171393411520919176256914869964612479175351332823409449521645606004586415623871847948375817498161847543702485018137658512658395575254789459353699345744602369381934625059696198589413369531883820496222659510755499199435844896264025524352060302680951373940575374076136832975200291005032514098640691398905405952695332479714616633295008654736506041813997134163987333741695846413097366684661344684616003601739167823328153896592432168889551779922529269033348086812310042261625165919052730860791202842844956446296689792441147970214424901342118997798159010536443797638756041327664696059380444566468860999953138675880647585649322318597258428498912095373426547986582540102395757192981849426353427220562438871461011279156327503538285028350335365137967747204548916792891345433172565689300894798309981237564346356082832141951952353587270953547648554401212070076679138112680602893278933373210074307452631417834131238872904464712762382727721405307974548332455937227001307804713345124421010621912271858653169426612004330651882144263970965845286327430353225544353979151213153918381850147302137013870443565447267408929820734324527586605299075224612369180273167439366180804630758969753426630886643792237194705165542753979443278245006454216061793688914453452033873682552924255069369382991399006219888447629091144761962816311838278453426744318329244891747907726689490072483441687762777514940810025483492250932938902924371182177616985098416863622505393245791898509271049937545780547703178646787153221220148776603371623990916784487761937997154509142207118563842540149656720890488789518041789234252783231203642923485126118874925205605743388337049290048102619379144553450612454492744292824661671019548713713568495220254740410669480812494122553523238166010275744321977341774600646768663036548131650974040647199495585196626323527740836162430085342052052727637724463434046775500298250476314587684591403987781101547180153540252142742428325763088665202774890061858211471865412555929191623058633649510807447665649697908545538433271811034260583364231115893882106660460362988412359863944207083315791203817813275002751650497247445133621959259165882426036642183903263726738720790482023621515505915532731458799675555130983697925269194130788271555917528320139537585237789448433361057472038619150612530155365282694361060208517945072413778375766282508764808188838406430261098030072276397680381934641479775177012533402001805227189560517281847643477431969193260714721511089510106902236389858739200666246366584470443084819740458839115330024642751710950508392249199171525940200641812690856715538273687610654143705053231753228288281925749573248819830807718047751291456635357252049651851428004843642993442708365926756086784864901619631645046021861362898457472437142021009316121209673296032419273205690055243737394068612057117222448137828274568145532165778912543711623225896980785464025683101674037519994362712933363700839222229325067956938417486554365785132752607665421070796369679950679278370647133471481601224482043380412158088958751348091674065435762606782309017939064656880665108380755999804750464216396676060064634049102602879726529064753147592949810279608808566906092860843406668537037778792512924649747927350781700804454803517161392276648064085521072720776995493746790698252658256127300427299712765912635964190588872362794322452414626926829451697570056145597909237733397993006318713907266282999209757835954408527578538863449022305050578740139814278853085620493082736691092281414370903171187358162080568284465302364244005694005210033241390491480461570699307912480038911233821105644446152512328525805707483171601688919032664561976430006629718308661207667153016502452884195148963125673969191706827403727809879672157011607257925720399770233625156155404482591336975116607711326594730647784392952199755924399936290034962258677008541859799419880022170446493041811273344503041707889648677394173861246482375736320283850849220544488123549088485079584855817373424359266678858651199243166073560382077730099987468377705636637242565948949985751205620857554830109239961545967537041510571588045286127240744618124771659845616409968497542978672000492769104999131872897737410994487787465125717465733543538344980281077012185860886320520255782307357238375948751409954873680258342250057671086544607706855079362474966284884466968233383764211808745671425930931575698296989086335739534025778159969392356967742191929914522690322438276604838230279525053780117636662663017876019549874233270026169569062088907790243918806941605480559016625665402398248013040463246716327424411605332836931485156524858341673845209004633198457099
+  q 10571951456907669779892620647342646690819262609396359690524502534177633120229168340667942575812279188027386527234551758107216468763903236115143427787743501
+  g 128598894907195188417229808251635947329739807715046258519185506584473330204570377688022234101083503575628247088869022751684161661116289139941422707052770784716284088672813457818076409289020116060576402861848262767893027233018967673188177319672220467630868456703363498829958429433052255385200803148036151824908127072135772477213206484282052574102804738136991255543544214210006836913841655431369354618035834267490750490209475650037611036969604510775085809840648347935149597993597050657382149424122551607765060905481452516927446598515527477247171478999535528834297030357374539135945862618225434749983777290822601640168801388457093291990583760394365529485898194260738109655976435021259260994433703250576566622543068851481307975157566559105117105696734982421364733215553702481282493676675415951561410801018648748202526310066348347675957920894052908634114299749835690825285958913309859395516637946391466247723186108045362984213928977339986546180336619120165000686737182828914686039307870836014970214762767616169050313307016785283407848979763838796901889533929991249262241241357085858440003100578599589303213283823231174826022087580289633445725655404503623057795603361275581688344479184031083934546255260431689248986625244613768138643274300512818504921212079442823382330541009102805040432664579664706843475903526712081265964789883073385412340566450530204050902742402634241295067292054198743776821135490852456571373786221834566840691504860631528594003016940806795952907191256706618335919348660172917691296581810487025804834121410117485699086165420315964836248122689453219355409068053887775439819365185836341867035959423656535221657069676936301160422526984733243805036094607065902991385803575050051402498313584896099087939918378394590246964040554542516556529955127714323667109459918696040305338316628605973670322139489914621903381403168134305230387553206034949296665589019458435333656497975595505186840554679289490725712215379119708936656398805481443817609780446044759428279250269061044353577054755809478942400511447476504959503019924384501854940670343756700595741830432409860516378561836547983052719529231317929703619794317736666240984610506873930809661048521360303804091987776920298335472932445807825891843426486417538296088228895526448505937443508396033850769937257926518277775854316505029339507246170910597358345642816471561799639718384521695469006324992746905242127842686811730217295508863843618253667094515294426385046337302700840651870607339402514793220932482394311605909804968180513732290422195401488734272875219573971965851758260974945420620612963750578280530090049561109078297429042230921153112538935821627493853510065306244811588574295137834903557863723543417221594934011392570967713979066781470665113263579679078346927299350593423807794432345965954214411279192997560913500420482135209761870894770590428753377060355446520714577823849327411455211803153798853005451969647921330963739815383804967938950844708859220970746343764387380686978388124365668599015606571832777646186264005031394838487124138566127931419400765659300590631175744824203747372760896426041038824093171455170878742081716134501047540584551546098074082811645710233649110893608312835114875022232159365133137870471783950558791394747886849817239478618258433146217414467845273035067690658728958244690182678308246002614307639728716544214919926387449699076757255860035522872191741413862595318802625699582434142963070125555096411118677017567085204173949296857347553686296332447084040218420742023614270285859547357310153777066869597179554114216347704995773693933927290606278271631839500986041846119745101489053876898923820486679517034985529967206488771012442386273647914758788794352696546007225147463040960836917540476556158171204978341050270842436674153236983839541594662370682859252061101201529771658391958638069866925173982823135401442054529882771497178435812973944610940759337374490667655762675502138898683030596178493879840530527200986100162672072577140966652435656059897085134772326082774218777784721364471952331014224241827859689552691557210912017591834455185827870287610792949837996937421382409243563221525985357912277040622211893182331275112628740300448802121194783069108322399073099060064264166221152635853834406853391568903009131371873111346754163371271208724745835028574196362705248110621990890004232459546556494832519339269358637289654972986665902221815201810894863582325166306449650465453223955176919686048223394344108072515484536428726902347665256053780647893633252440024422896973060032376625419596170725316577542832012274755089837231069989343909974684844834831911679673118788567527167638795212119760473587068197787346864147296908951760670987133395
+#:factor 10571951456907669779892620647342646690819262609396359690524502534177633120229168340667942575812279188027386527234551758107216468763903236115143427787743501
+#:factor 9012440645643314246834973626922261248430582884321541587438489180023988737512032104254581442848613136311423618140795155753411152808972231131191495364696113
+#:factor 11664407479888990184202139277551028676651013424643181979060212470678705307128063234525963058666093887020686441365922823734852909082402446828730382752979229
+#:factor 9087876611156307298284101521955646383324933273215705601366986444355710006473522774817841755272381080750837076062838195845188516807677339637355892566997161
+#:factor 7850875653648084112022472229380028253695299668265516016947697170686003077850514907765524197019907612330445487029463301633628025237963893050671557196181037
+#:factor 9811668747595937862696556986818901047696541620978343479470960055182987731849807766456487932153408355304918692734270804755894967739728440775732045253975867
+#:factor 6850528828310882434413759447618080765577150578105428774266564959349750426580886713871673166366380181300391220234049862529092166014652885149727426581950889
+#:factor 6821638102376526854453397172384749542254164092866952888824098621712040405559147454526516007481215285840029382069182522430838260284493396455708010177523951
+#:factor 9678671090017306504471193471606002503207329774194080688795341865275315066168913972420992866933767238945244749299859823721414058505077146271463652017042439
+#:factor 11393931156044806890317196442201195583808258792085050704419049073069764825659064050709401048990965128349659629815212528487569661791997378607235211682046767
+#:factor 9017010040179947675396805634091838536572796142622751259821087175550548949037522734269840576513891007984351108919567391192649737362028379518075599077332061
+#:factor 8471151817163912127252174076707115691748601873337141861143247343372659043906393812132481208054508793108003038614600545971718635646265794386795278691754067
+#:factor 13197493938382376428309109637837242582358905975783852842417135134626200360303237020546312789639222633029539785097700295596040150049781404432593082545583687
+#:factor 8575974070132361564362415034026161716899096825228901868850832979622821929082521380113628505749265007300639809003377137159593961387754096563405572654530453
+#:factor 10685309091824418682668636366538457951831463604934567645475353414106697701363236027779367582469465499678424648685247868794321185827903765405464064983847047
+#:factor 7832579167103862778682606390694147440819353518240318233355101493037014682039100415001767021498559727856779744520541030712369584582339760294936511514528613
+#:factor 11443136038500921044854720404653372565248054144656073888671297768218410197327711069816877279851418893039887799451033119855767890079711768713385653679344477
+#:factor 11688409215583921110956357044321797822832780718093563289058981511879157867538826225803418406379935887495839460956831051786990678735417867002006878510530001
+#:factor 8269373232168928931276034385529570570419130675409379232099124396037402056853784630410470739109999093193671624909979089535332341276117302614326085797220209
+#:factor 9186395703395988275207810642702730047142932136743815395858445937000755684133671310159954341948067614705752787518132853542049279332346920436340054839993081
+#:factor 6795425485592182949378541037739159131046423659599522629955532628051588695375698396588579193598504741404656736703919260744390720003440892800061391975968543
+#:factor 10396118888753141861444655191592919753341123585411878553552147287212817173935858961195926696707128865851883589958560492545922923504442555855283863684690883
+#:factor 9200414943820306382018413241324240995480578531923453792659897506893121059804164387167396258851931504929883516095987516319887977740512884087194394964391023
+#:factor 12530634260640146540037552613265173527563597551474945252217132553909981324169848692185513076985582524700624840690045385961239986165286808674599194021249909
+#:factor 11777196311833624813129143516165715650218942159782423895657055945748378658698548936802659687190537166673298770529607439929019151210938035218664232208577273
+#:factor 7348262210091125168844276092746402631926760996426639974638799774896265368458530624040379440531440039323922186709965290812433008147988187233036235954446539
+#:factor 7495895476596043082228459599736776072884975040533651752897223545444099013720437774241963953093854938504409948988231217421899198126781802901186687835439671
+#:factor 7552446094981741253426497231778914956993354256770700433779133501020398264257537810327407638749096379083785811976115762275583243733103646262540268854635459
+#:factor 11876032185719044257059947481606348236079583968867505900797840767914468036111126560459281957584518925180041310466390015937147792402479266081314053413722009
+#:factor 9583540052593144013269177059658457027998433819569867982260511279574493019496581755069425156501941108339618548765191994601041609651011729970172839875903479
 
 #----- That's all, folks ----------------------------------------------------
index b2480c8..34881e3 100644 (file)
@@ -90,7 +90,7 @@ void rijndael_setup(rijndael_ctx *k, unsigned nb, const void *buf, size_t sz)
 
   p = buf;
   for (i = 0; i < nk; i++) {
-    k->w[i] = LOAD32_L(p);
+    k->w[i] = LOAD32_B(p);
     p += 4;
   }
 
@@ -102,8 +102,8 @@ void rijndael_setup(rijndael_ctx *k, unsigned nb, const void *buf, size_t sz)
   for (; i < nw; i++) {
     uint32 w = k->w[i - nk];
     if (i % nk == 0) {
-      ww = ROR32(ww, 8);
-      w ^= SUB(S, ww, ww, ww, ww) ^ *p++;
+      ww = ROL32(ww, 8);
+      w ^= SUB(S, ww, ww, ww, ww) ^ (*p++ << 24);
     } else if (nk > 6 && i % nk == 4)
       w ^= SUB(S, ww, ww, ww, ww);
     else
index 684dadb..f88b2f7 100644 (file)
@@ -57,12 +57,12 @@ extern const octet rijndael_rcon[];
 /*----- Handy macros ------------------------------------------------------*/
 
 #define SUB(s, a, b, c, d)                                             \
-  (s[U8((a) >>  0)] <<  0 | s[U8((b) >>  8)] <<  8 |                   \
-   s[U8((c) >> 16)] << 16 | s[U8((d) >> 24)] << 24)
+  (s[U8((a) >> 24)] << 24 | s[U8((b) >> 16)] << 16 |                   \
+   s[U8((c) >>  8)] <<  8 | s[U8((d) >>  0)] <<  0)
 
 #define MIX(t, a, b, c, d)                                             \
-  (t[0][U8((a) >>  0)] ^ t[1][U8((b) >>  8)] ^                         \
-   t[2][U8((c) >> 16)] ^ t[3][U8((d) >> 24)])
+   (t[0][U8((a) >> 24)] ^ t[1][U8((b) >> 16)] ^                                \
+    t[2][U8((c) >>  8)] ^ t[3][U8((d) >>  0)])
 
 /*----- That's all, folks -------------------------------------------------*/
 
index 4360f20..1779709 100644 (file)
@@ -161,11 +161,11 @@ static void tbox(void)
     a = s[i];
     b = a << 1; if (b & 0x100) b ^= S_MOD;
     c = a ^ b;
-    w = (b << 0) | (a << 8) | (a << 16) | (c << 24);
+    w = (c << 0) | (a << 8) | (a << 16) | (b << 24);
     t[0][i] = w;
-    t[1][i] = ROL32(w, 8);
-    t[2][i] = ROL32(w, 16);
-    t[3][i] = ROL32(w, 24);
+    t[1][i] = ROR32(w, 8);
+    t[2][i] = ROR32(w, 16);
+    t[3][i] = ROR32(w, 24);
 
     /* --- Build a backwards t-box entry --- */
 
@@ -173,11 +173,11 @@ static void tbox(void)
     b = mul(si[i], 0x09, S_MOD);
     c = mul(si[i], 0x0d, S_MOD);
     d = mul(si[i], 0x0b, S_MOD);
-    w = (a << 0) | (b << 8) | (c << 16) | (d << 24);
+    w = (d << 0) | (c << 8) | (b << 16) | (a << 24);
     ti[0][i] = w;
-    ti[1][i] = ROL32(w, 8);
-    ti[2][i] = ROL32(w, 16);
-    ti[3][i] = ROL32(w, 24);
+    ti[1][i] = ROR32(w, 8);
+    ti[2][i] = ROR32(w, 16);
+    ti[3][i] = ROR32(w, 24);
   }
 }
 
@@ -197,11 +197,11 @@ static void ubox(void)
     b = mul(i, 0x09, S_MOD);
     c = mul(i, 0x0d, S_MOD);
     d = mul(i, 0x0b, S_MOD);
-    w = (a << 0) | (b << 8) | (c << 16) | (d << 24);
+    w = (d << 0) | (c << 8) | (b << 16) | (a << 24);
     u[0][i] = w;
-    u[1][i] = ROL32(w, 8);
-    u[2][i] = ROL32(w, 16);
-    u[3][i] = ROL32(w, 24);
+    u[1][i] = ROR32(w, 8);
+    u[2][i] = ROR32(w, 16);
+    u[3][i] = ROR32(w, 24);
   }
 }
 
index 6b772e2..8883be5 100644 (file)
@@ -54,7 +54,7 @@
 
 #define RIJNDAEL_BLKSZ 16
 #define RIJNDAEL_KEYSZ 32
-#define RIJNDAEL_CLASS (N, L, 128)
+#define RIJNDAEL_CLASS (N, B, 128)
 
 extern const octet rijndael_keysz[];
 
index 39f74c9..785aade 100644 (file)
@@ -44,7 +44,7 @@
 
 #define RIJNDAEL192_BLKSZ 24
 #define RIJNDAEL192_KEYSZ 32
-#define RIJNDAEL192_CLASS (N, L, 192)
+#define RIJNDAEL192_CLASS (N, B, 192)
 
 #define rijndael192_keysz rijndael_keysz
 
index add26be..ecc6123 100644 (file)
@@ -44,7 +44,7 @@
 
 #define RIJNDAEL256_BLKSZ 32
 #define RIJNDAEL256_KEYSZ 32
-#define RIJNDAEL256_CLASS (N, L, 256)
+#define RIJNDAEL256_CLASS (N, B, 256)
 
 #define rijndael256_keysz rijndael_keysz
 
index 2d61c1b..2ba7ca6 100644 (file)
@@ -10,7 +10,7 @@ check {
 
   "ec { secp224r1 }" "ok";
 
-  "prime { catacomb-g1024 }" "ok";
+  "prime { catacomb-ll-160-1024 }" "ok";
 
   "ec { 
      prime:
@@ -65,10 +65,10 @@ checkelt {
 mul {
   "prime { 29, 7, 16 }" 8 7 27;
 
-  "prime { catacomb-g512 }"
+  "prime { catacomb-ll-128-512 }"
     3344609493517948819439808013094817124423784439045485500527919676470975342917009634212031124646834193243018749323077268170586751415510015906107400678608590
     32459289443738057373904596685867555624839649360339363831766212033645755638497600605981483758068704145575847399920657057013890131443911836862688141735006
-    1926426135381827210395257472845875618319108487720857260583372274154852182951667715700282388176779441854588992736540698662997833538400244234146123792411051;
+    3947634573386515057215934636174241616115542585724861166389751782289048647501330677434616929656928819642658111077814577650964230037753641582364366136933940;
 
   "ec { nist-p192 }"
     "0x188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012,
@@ -82,9 +82,9 @@ mul {
 sqr {
   "prime { 29, 7, 16 }" 8 6;
 
-  "prime { catacomb-g512 }"
+  "prime { catacomb-ll-128-512 }"
     3344609493517948819439808013094817124423784439045485500527919676470975342917009634212031124646834193243018749323077268170586751415510015906107400678608590
-    4005285938812802884869056091732317348251189092239718246050415417461526884090403819686629744110427371766834314349639104763417430078158218519967583957470490;
+    1140714521254648115393410274780412972862841854751618635120376750594285456137894804866135103112174518443866054055338095672091997366768745026933347678925721;
 
   "ec { nist-p192 }"
     "0x188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012,
@@ -96,9 +96,9 @@ sqr {
 inv {
   "prime { 29, 7, 16 }" 9 13;
   
-  "prime { catacomb-g512 }"
+  "prime { catacomb-ll-128-512 }"
     3344609493517948819439808013094817124423784439045485500527919676470975342917009634212031124646834193243018749323077268170586751415510015906107400678608590
-    4681416433015777166273237967077695060929667390767517698895765893629657943327105422863170288075976922965513789634412273770969873436435698540384711636714478;
+    5876676858790113051879264634636727534122591023949326683791506203503263391580079717512212895466773363712551406785344528808275608153699681298608650332072384;
 
   "ec { nist-p192 }"
     "0x188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012,
@@ -110,10 +110,10 @@ inv {
 div {
   "prime { 29, 7, 16 }" 9 5 25;
 
-  "prime { catacomb-g512 }"
+  "prime { catacomb-ll-128-512 }"
     3344609493517948819439808013094817124423784439045485500527919676470975342917009634212031124646834193243018749323077268170586751415510015906107400678608590
     1926426135381827210395257472845875618319108487720857260583372274154852182951667715700282388176779441854588992736540698662997833538400244234146123792411051
-    4352638698811548340197747445538844858722300429607827242718336069934302793791666196485760252202755936738278388907467170248315316920551773058188278017435713;
+    24069337702503046127918930405335466791703796668849861281722901639361967869381088162761943434867448224639537469251486209856612215080111132649928233405085;
 
   "ec { nist-p192 }"
     "0x76e32a2557599e6edcd283201fb2b9aadfd0d359cbb263da,
@@ -129,15 +129,15 @@ exp {
 
   "prime { 29, 7, 16 }" 3 -12 20;
 
-  "prime { catacomb-g512 }"
+  "prime { catacomb-ll-128-512 }"
     3344609493517948819439808013094817124423784439045485500527919676470975342917009634212031124646834193243018749323077268170586751415510015906107400678608590
     147362842169670001895012880214773009850
-    2724858367444359999445242030177839616322236716074995568862882751673310120217819866527178352161554441906932468828696070184371718373894212895486594604883052;
+    5743039465765061017258257285641279669186626264432710496849307123351095219091264933384359874588390730293795471675184250790999035405886273905917889887366080;
 
-  "prime { catacomb-g512 }"
+  "prime { catacomb-ll-128-512 }"
     3344609493517948819439808013094817124423784439045485500527919676470975342917009634212031124646834193243018749323077268170586751415510015906107400678608590
     -147362842169670001895012880214773009850
-    1787060841912191849220487080420238350817474901097656088582267726968757275201342587344406900935515285588366012828182975089444331616359162696826008378664956;
+    3548613102603269389984811279864031309564549180885835723408511495891024326106890973751615845620404633717662823827170012116865930893524976817060348977482376;
 
   "ec { nist-p192 }"
     "0x188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012,
@@ -190,12 +190,12 @@ mexp-2 {
   "prime { 29, 7, 16 }" 3 12 8 2 9;
   "prime { 29, 7, 16 }" 3 -12 8 2 4;
 
-  "prime { catacomb-g512 }"
+  "prime { catacomb-ll-128-512 }"
    3344609493517948819439808013094817124423784439045485500527919676470975342917009634212031124646834193243018749323077268170586751415510015906107400678608590
    -147362842169670001895012880214773009850
    130340428707563070626027539288099297037336608388990593367322442443880297841210613523501678207607756678300142264348927299637006055881968995671289567513600
    91626412351157168611316239052073981423
-   1964042259347008051177500376636104488225042199152152977412099367647894431543835858678217073603604876847502133350210611462670145543437496436961938287223663;
+   1022777063245982511046303002728993765008184164346724419524981660559588777350492245381260023136750231183070065817596986237402046431653662723677455952067221;
 
   "ec { nist-p192 }"
     "0x188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012,
diff --git a/utils/genpgroup b/utils/genpgroup
new file mode 100755 (executable)
index 0000000..ed65303
--- /dev/null
@@ -0,0 +1,49 @@
+#! /usr/bin/python
+
+import mLib as M
+import catacomb as C
+from sys import argv
+from os import environ
+
+_, name, plen, qlen, seed = argv
+plen = int(plen)
+qlen = int(qlen)
+
+if seed == '!':
+  seed = C.rmd160().hash(name).done()
+else:
+  seed = M.base64_decode(seed)
+rng = C.rmd160_mgfrand(seed)
+
+dhi, ff = C.DHInfo.genlimlee(plen, qlen, rng = rng)
+
+kf = C.KeyFile(environ.get('TMPDIR', '/tmp') + 'keyring', C.KOPEN_WRITE)
+id = C.ReadBuffer(seed).getu32()
+k = kf.newkey(id, 'dh-param')
+k.data = C.KeyDataStructured({'p': C.KeyDataMP(dhi.p, 'shared'),
+                              'q': C.KeyDataMP(dhi.r, 'shared'),
+                              'g': C.KeyDataMP(dhi.g, 'shared')})
+k.attr['factor'] = ', '.join([str(f) for f in ff])
+k.attr['genseed'] = M.base64_encode(seed)
+k.attr['seedalg'] = 'rmd160-mgf'
+
+def words(buf):
+  buf = C.ReadBuffer(buf)
+  while not buf.endp:
+    yield buf.getu32()
+h = C.rmd160()
+k.fingerprint(h)
+fprhex = '-'.join(['%x' % w for w in words(h.done())])
+
+print '# --- %s ---' % name
+print '#'
+print '# keyid = %x' % id
+print '# seed = %s' % M.base64_encode(seed)
+print '# fingerprint = %s' % fprhex
+print ''
+print 'group %s' % name
+print '  p %s' % dhi.p
+print '  q %s' % dhi.r
+print '  g %s' % dhi.g
+for f in ff: print '#:factor %s' % f
+print
diff --git a/utils/genpgroups b/utils/genpgroups
new file mode 100755 (executable)
index 0000000..086cfd5
--- /dev/null
@@ -0,0 +1,15 @@
+#! /bin/sh
+
+set -e
+for i in \
+       512:128 \
+       1024:160 \
+       1536:192 \
+       2048:224 \
+       3072:256 \
+       7680:384 \
+       15360:512
+do 
+  set -- `echo $i | tr : " "`
+  utils/genpgroup catacomb-ll-$2-$1 $1 $2 !
+done