ptab: Replace the Catacomb groups.
[u/mdw/catacomb] / utils / genpgroup
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