blob: bdd524e64174b96c26d92f613e42bc2fa57cea67 [file] [log] [blame]
#! 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 <db>"
print " createsharedkey <db>"
print ""
print " add <db> <user> <pass> [<bits>]"
print " del <db> <user>"
print " check <db> <user> [<pass>]"
print " list <db>"
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