#! /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