--- /dev/null
+#! /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