| 1 | #! /usr/bin/python |
| 2 | |
| 3 | import mLib as M |
| 4 | import catacomb as C |
| 5 | from sys import argv |
| 6 | from os import environ |
| 7 | |
| 8 | _, name, plen, qlen, seed = argv |
| 9 | plen = int(plen) |
| 10 | qlen = int(qlen) |
| 11 | |
| 12 | if seed == '!': |
| 13 | seed = C.rmd160().hash(name).done() |
| 14 | else: |
| 15 | seed = M.base64_decode(seed) |
| 16 | rng = C.rmd160_mgfrand(seed) |
| 17 | |
| 18 | dhi, ff = C.DHInfo.genlimlee(plen, qlen, rng = rng) |
| 19 | |
| 20 | kf = C.KeyFile(environ.get('TMPDIR', '/tmp') + 'keyring', C.KOPEN_WRITE) |
| 21 | id = C.ReadBuffer(seed).getu32() |
| 22 | k = kf.newkey(id, 'dh-param') |
| 23 | k.data = C.KeyDataStructured({'p': C.KeyDataMP(dhi.p, 'shared'), |
| 24 | 'q': C.KeyDataMP(dhi.r, 'shared'), |
| 25 | 'g': C.KeyDataMP(dhi.g, 'shared')}) |
| 26 | k.attr['factor'] = ', '.join([str(f) for f in ff]) |
| 27 | k.attr['genseed'] = M.base64_encode(seed) |
| 28 | k.attr['seedalg'] = 'rmd160-mgf' |
| 29 | |
| 30 | def words(buf): |
| 31 | buf = C.ReadBuffer(buf) |
| 32 | while not buf.endp: |
| 33 | yield buf.getu32() |
| 34 | h = C.rmd160() |
| 35 | k.fingerprint(h) |
| 36 | fprhex = '-'.join(['%x' % w for w in words(h.done())]) |
| 37 | |
| 38 | print '# --- %s ---' % name |
| 39 | print '#' |
| 40 | print '# keyid = %x' % id |
| 41 | print '# seed = %s' % M.base64_encode(seed) |
| 42 | print '# fingerprint = %s' % fprhex |
| 43 | print '' |
| 44 | print 'group %s' % name |
| 45 | print ' p %s' % dhi.p |
| 46 | print ' q %s' % dhi.r |
| 47 | print ' g %s' % dhi.g |
| 48 | for f in ff: print '#:factor %s' % f |
| 49 | print |