#! python import sys import os import socket import thread import math try: import cryptoIDlib cryptoIDlibLoaded = True except: cryptoIDlibLoaded = False if __name__ != "__main__": raise "This must be run as a command, not used as a module!" from tlslite.api import * if len(sys.argv) == 1 or (len(sys.argv)==2 and sys.argv[1].lower().endswith("help")): print "" print "Version: 0.3.8" print "" print "RNG: %s" % prngName print "" print "Modules:" if cryptlibpyLoaded: print " cryptlib_py : Loaded" else: print " cryptlib_py : Not Loaded" if m2cryptoLoaded: print " M2Crypto : Loaded" else: print " M2Crypto : Not Loaded" if pycryptoLoaded: print " pycrypto : Loaded" else: print " pycrypto : Not Loaded" if gmpyLoaded: print " GMPY : Loaded" else: print " GMPY : Not Loaded" if cryptoIDlibLoaded: print " cryptoIDlib : Loaded" else: print " cryptoIDlib : Not Loaded" print "" print "Commands:" print "" print " createsrp " print " createsharedkey " print "" print " add []" print " del " print " check []" print " list " sys.exit() cmd = sys.argv[1].lower() class Args: def __init__(self, argv): self.argv = argv def get(self, index): if len(self.argv)<=index: raise SyntaxError("Not enough arguments") return self.argv[index] def getLast(self, index): if len(self.argv)>index+1: raise SyntaxError("Too many arguments") return self.get(index) args = Args(sys.argv) def reformatDocString(s): lines = s.splitlines() newLines = [] for line in lines: newLines.append(" " + line.strip()) return "\n".join(newLines) try: if cmd == "help": command = args.getLast(2).lower() if command == "valid": print "" else: print "Bad command: '%s'" % command elif cmd == "createsrp": dbName = args.get(2) db = VerifierDB(dbName) db.create() elif cmd == "createsharedkey": dbName = args.getLast(2) db = SharedKeyDB(dbName) db.create() elif cmd == "add": dbName = args.get(2) username = args.get(3) password = args.get(4) try: db = VerifierDB(dbName) db.open() if username in db: print "User already in database!" sys.exit() bits = int(args.getLast(5)) N, g, salt, verifier = VerifierDB.makeVerifier(username, password, bits) db[username] = N, g, salt, verifier except ValueError: db = SharedKeyDB(dbName) db.open() if username in db: print "User already in database!" sys.exit() args.getLast(4) db[username] = password elif cmd == "del": dbName = args.get(2) username = args.getLast(3) try: db = VerifierDB(dbName) db.open() except ValueError: db = SharedKeyDB(dbName) db.open() del(db[username]) elif cmd == "check": dbName = args.get(2) username = args.get(3) if len(sys.argv)>=5: password = args.getLast(4) else: password = None try: db = VerifierDB(dbName) db.open() except ValueError: db = SharedKeyDB(dbName) db.open() try: db[username] print "Username exists" if password: if db.check(username, password): print "Password is correct" else: print "Password is wrong" except KeyError: print "Username does not exist" sys.exit() elif cmd == "list": dbName = args.get(2) try: db = VerifierDB(dbName) db.open() except ValueError: db = SharedKeyDB(dbName) db.open() if isinstance(db, VerifierDB): print "Verifier Database" def numBits(n): if n==0: return 0 return int(math.floor(math.log(n, 2))+1) for username in db.keys(): N, g, s, v = db[username] print numBits(N), username else: print "Shared Key Database" for username in db.keys(): print username else: print "Bad command: '%s'" % cmd except: raise