home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / pyth_os2.zip / python-1.0.2 / Demo / rsa / rsa.py < prev    next >
Text File  |  1994-01-07  |  4KB  |  177 lines

  1. #! /usr/local/bin/python
  2.  
  3. # RSA cryptographic key maintenance
  4.  
  5. # (0) All numers are stored in text files as Python Long constants
  6. # (1) Your own secret key is in $HOME/.rsa_secret_key (this file has mode 0600)
  7. # (2) Your public key is in $HOME/.rsa_public_key
  8. # (3) The public key of any user on your system can be read from their $HOME
  9. # (4) In addition, other public keys can be read from the private file
  10. #     $HOME/.rsa_database, where each line contains a name (no whitespace),
  11. #     some whitespace, and that user's public key
  12.  
  13. # Usage:
  14. # rsa            print your own public key
  15. # rsa user ...   print the public key for the given user(s)
  16. # rsa -a         print the public keys for all users in your database
  17. # rsa -c         create a new public key; prompts for a random seed
  18. # rsa -s         print your secret key
  19.  
  20. # XXX (4) is not yet implemented; rsa -a lists the keys of all local users
  21.  
  22. NBITS = 512
  23.  
  24. import sys
  25. import getopt
  26. import os
  27. import string
  28.  
  29. PKEYFILE = '.rsa_public_key'
  30. SKEYFILE = '.rsa_secret_key'
  31.  
  32. sys.path.append('/ufs/guido/src/python/new/Demo/rsa')
  33.  
  34. from rsakeys import makersaset, default_pk
  35. from simplerandom import simplerandom
  36. from mpz import powm, mpz
  37.  
  38. def main():
  39.     try:
  40.         opts, args = getopt.getopt(sys.argv[1:], 'acs')
  41.     except getopt.error, msg:
  42.         sys.stderr.write(str(msg) + '\n')
  43.         usage()
  44.         sys.exit(2)
  45.     all = 0
  46.     create = 0
  47.     secret = 0
  48.     for opt, arg in opts:
  49.         if opt == '-a': all = 1
  50.         if opt == '-c': create = 1
  51.         if opt == '-s': secret = 1
  52.     if create: createskey()
  53.     if secret: listskey()
  54.     if all: listallskeys()
  55.     if args:
  56.         for user in args: listpkey(user)
  57.     elif not create and not secret and not all and not args:
  58.         listpkey('')
  59.  
  60. def usage():
  61.     sys.stdout = sys.stderr
  62.     print 'usage:'
  63.     print 'rsa\t\tlists your own public key'
  64.     print 'rsa -s\t\tlists your own secret key'
  65.     print 'rsa -n\t\tcreates a new secret key for you'
  66.     print 'rsa user ...\tlists the public key for user(s)'
  67.  
  68. def listskey():
  69.     try:
  70.         key = getskey()
  71.     except KeyError, msg:
  72.         sys.stderr.write('Can\'t get secret key (' + str(msg) + ')\n')
  73.         return
  74.     print key
  75.  
  76. def listpkey(user):
  77.     try:
  78.         key = getpkey(user)
  79.     except KeyError, msg:
  80.         if not user:
  81.             try:
  82.                 user = os.path.basename(findhome(user))
  83.             except:
  84.                 user = '???'
  85.         sys.stderr.write( \
  86.           'Can\'t get private key for ' + user + ' (' + msg + ')\n')
  87.         return
  88.     if user: print user + ':',
  89.     print key
  90.  
  91. def listallkeys():
  92.     import pwd
  93.     for entry in pwd.getpwall():
  94.         user = entry[0]
  95.         try:
  96.             key = getkey(user)
  97.         except KeyError:
  98.             continue
  99.         print user + ':', key
  100.  
  101. def createskey():
  102.     home = findhome('')
  103.     pkeyfile = os.path.join(home, PKEYFILE)
  104.     skeyfile = os.path.join(home, SKEYFILE)
  105.     print 'Creating new secret/public key pair for', os.path.basename(home)
  106.     while 1:
  107.         seed = raw_input('Please enter a random seed string: ')
  108.         seed = string.strip(seed)
  109.         if len(seed) > 5: break
  110.         print 'Please try something a bit longer!'
  111.     rf = simplerandom(seed).random
  112.     print 'Calculating...'
  113.     n, sk = makersaset(NBITS, rf)
  114.     if os.path.exists(skeyfile) or os.path.exists(pkeyfile):
  115.         print 'Backing up old files...'
  116.         try:
  117.             os.rename(skeyfile, skeyfile + '~')
  118.         except os.error:
  119.             pass
  120.         try:
  121.             os.rename(pkeyfile, pkeyfile + '~')
  122.         except os.error:
  123.             pass
  124.     print 'Writing ' + pkeyfile + ' (mode -rw-r--r--)'
  125.     save_umask = None
  126.     try:
  127.         save_umask = os.umask(022)
  128.         f = open(pkeyfile, 'w')
  129.         f.write(str(long(n)) + '\n')
  130.         f.close()
  131.         dummy_umask = os.umask(077)
  132.         print 'Writing ' + skeyfile + ' (mode -rw-------)'
  133.         f = open(skeyfile, 'w')
  134.         f.write(str(long(sk)) + '\n')
  135.         f.close()
  136.     finally:
  137.         if save_umask <> None:
  138.             dummy_umask = os.umask(save_umask)
  139.     print 'Done.'
  140.  
  141. def getpkey(*args):
  142.     if args:
  143.         if len(args) > 1: raise TypeError, 'too many args'
  144.         user = args[0]
  145.     else:
  146.         user = ''
  147.     home = findhome(user)
  148.     file = os.path.join(home, PKEYFILE)
  149.     try:
  150.         f = open(file, 'r')
  151.     except IOError:
  152.         raise KeyError, 'file open error'
  153.     try:
  154.         return long(eval(string.strip(f.read())))
  155.     except:
  156.         raise KeyError, 'bad data in file'
  157.  
  158. def getskey():
  159.     home = os.path.expanduser('~')
  160.     skeyfile = os.path.join(home, SKEYFILE)
  161.     try:
  162.         f = open(skeyfile, 'r')
  163.     except IOError:
  164.         raise KeyError, 'can\'t open file'
  165.     try:
  166.         sk = long(eval(string.strip(f.read())))
  167.     except:
  168.         raise Keyerror, 'bad data in file'
  169.     return sk
  170.  
  171. def findhome(user):
  172.     return os.path.expanduser('~' + user)
  173.  
  174. if os.path.basename(sys.argv[0]) in ('rsa', 'rsa.py'):
  175.     main()
  176.  
  177.