#!/usr/bin/env python # # Copyright (C) 2001-2007 Jason R. Mastaler # # This file is part of TMDA. # # TMDA is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. A copy of this license should # be included in the file COPYING. # # TMDA is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # # You should have received a copy of the GNU General Public License # along with TMDA; if not, write to the Free Software Foundation, Inc., # 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA from optparse import OptionParser, make_option import binascii import os import sys try: import paths except ImportError: # Prepend /usr/lib/python2.x/site-packages/TMDA/pythonlib sitedir = os.path.join(sys.prefix, 'lib', 'python'+sys.version[:3], 'site-packages', 'TMDA', 'pythonlib') sys.path.insert(0, sitedir) from TMDA import Version # option parsing opt_desc = "Generate a unique 160-bit hex key." opt_list = [ make_option("-d", "--device", default="/dev/urandom", dest="device", help=("""Draw random numbers from a random data source device other than /dev/urandom""")), make_option("-b", "--batch", action="store_true", default=False, dest="batch", help="Output only the CRYPT_KEY"), make_option("-V", action="store_true", default=False, dest="full_version", help="show full TMDA version information and exit"), ] parser = OptionParser(option_list=opt_list, description=opt_desc, version=Version.TMDA) (opts, args) = parser.parse_args() if opts.full_version: print Version.ALL sys.exit() def keygen(): # Use the kernel's random number generator. if os.path.exists(opts.device): key = open(opts.device,'rb').read(20) return binascii.hexlify(key) #elif sys.platform == 'win32': # The Windows equivalent of polling /dev/urandom is to call # the Windows Crypto/API function "CryptGenRandom" # (http://tinyurl.com/4z0q). At present there is no wrapper # for this in the Python standard library on Windows so we # can't utilize it. else: return None def main(): if not opts.batch: print "Generating a unique, 160-bit private key, please wait a moment.." print key = keygen() if key is None: # Use of a cryptographic random number generator is required. warning = ("key generation on a system without a " + opts.device + " device is not supported!") print "WARNING:" print '*' * len(warning) print warning print print "specify a different random number device with the '-d' option," print "or use http://tmda.net/cgi-bin/tmda-keygen if your system lacks one." print '*' * len(warning) print "exiting!" sys.exit() if len(key) <> 40: print "Oops, generated key is not 40-characters long, exiting!" sys.exit() print key if not opts.batch: print print "Now paste the above key into ~/.tmda/crypt_key" print "and make sure to keep your key secret! (chmod 600 ~/.tmda/crypt_key)" # This is the end my friend. if __name__ == '__main__': main()