| #!/usr/bin/env python |
| |
| # Authors: |
| # Trevor Perrin |
| # Martin von Loewis - python 3 port |
| # |
| # See the LICENSE file for legal information regarding use of this file. |
| |
| from __future__ import print_function |
| import sys |
| import os |
| import socket |
| import math |
| |
| if __name__ != "__main__": |
| raise "This must be run as a command, not used as a module!" |
| |
| |
| from tlslite import * |
| from tlslite import __version__ |
| |
| if len(sys.argv) == 1 or (len(sys.argv)==2 and sys.argv[1].lower().endswith("help")): |
| print("") |
| print("Version: %s" % __version__) |
| print("") |
| print("RNG: %s" % prngName) |
| print("") |
| print("Modules:") |
| 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") |
| print("") |
| print("Commands:") |
| print("") |
| print(" createsrp <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 == "add": |
| dbName = args.get(2) |
| username = args.get(3) |
| password = args.get(4) |
| |
| 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 |
| |
| elif cmd == "del": |
| dbName = args.get(2) |
| username = args.getLast(3) |
| db = VerifierDB(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 |
| |
| db = VerifierDB(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) |
| db = VerifierDB(dbName) |
| db.open() |
| |
| 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("Bad command: '%s'" % cmd) |
| except: |
| raise |