davidben@chromium.org | 9a59f36 | 2014-04-10 17:56:44 +0000 | [diff] [blame] | 1 | #!/usr/bin/env python |
initial.commit | 4c2903c | 2008-07-27 00:38:33 +0000 | [diff] [blame] | 2 | |
davidben@chromium.org | 9a59f36 | 2014-04-10 17:56:44 +0000 | [diff] [blame] | 3 | # Authors: |
| 4 | # Trevor Perrin |
| 5 | # Martin von Loewis - python 3 port |
| 6 | # |
| 7 | # See the LICENSE file for legal information regarding use of this file. |
| 8 | |
| 9 | from __future__ import print_function |
initial.commit | 4c2903c | 2008-07-27 00:38:33 +0000 | [diff] [blame] | 10 | import sys |
| 11 | import os |
| 12 | import socket |
initial.commit | 4c2903c | 2008-07-27 00:38:33 +0000 | [diff] [blame] | 13 | import math |
| 14 | |
initial.commit | 4c2903c | 2008-07-27 00:38:33 +0000 | [diff] [blame] | 15 | if __name__ != "__main__": |
| 16 | raise "This must be run as a command, not used as a module!" |
| 17 | |
| 18 | |
davidben@chromium.org | 9a59f36 | 2014-04-10 17:56:44 +0000 | [diff] [blame] | 19 | from tlslite import * |
| 20 | from tlslite import __version__ |
initial.commit | 4c2903c | 2008-07-27 00:38:33 +0000 | [diff] [blame] | 21 | |
| 22 | if len(sys.argv) == 1 or (len(sys.argv)==2 and sys.argv[1].lower().endswith("help")): |
davidben@chromium.org | 9a59f36 | 2014-04-10 17:56:44 +0000 | [diff] [blame] | 23 | print("") |
| 24 | print("Version: %s" % __version__) |
| 25 | print("") |
| 26 | print("RNG: %s" % prngName) |
| 27 | print("") |
| 28 | print("Modules:") |
initial.commit | 4c2903c | 2008-07-27 00:38:33 +0000 | [diff] [blame] | 29 | if m2cryptoLoaded: |
davidben@chromium.org | 9a59f36 | 2014-04-10 17:56:44 +0000 | [diff] [blame] | 30 | print(" M2Crypto : Loaded") |
initial.commit | 4c2903c | 2008-07-27 00:38:33 +0000 | [diff] [blame] | 31 | else: |
davidben@chromium.org | 9a59f36 | 2014-04-10 17:56:44 +0000 | [diff] [blame] | 32 | print(" M2Crypto : Not Loaded") |
initial.commit | 4c2903c | 2008-07-27 00:38:33 +0000 | [diff] [blame] | 33 | if pycryptoLoaded: |
davidben@chromium.org | 9a59f36 | 2014-04-10 17:56:44 +0000 | [diff] [blame] | 34 | print(" pycrypto : Loaded") |
initial.commit | 4c2903c | 2008-07-27 00:38:33 +0000 | [diff] [blame] | 35 | else: |
davidben@chromium.org | 9a59f36 | 2014-04-10 17:56:44 +0000 | [diff] [blame] | 36 | print(" pycrypto : Not Loaded") |
initial.commit | 4c2903c | 2008-07-27 00:38:33 +0000 | [diff] [blame] | 37 | if gmpyLoaded: |
davidben@chromium.org | 9a59f36 | 2014-04-10 17:56:44 +0000 | [diff] [blame] | 38 | print(" GMPY : Loaded") |
initial.commit | 4c2903c | 2008-07-27 00:38:33 +0000 | [diff] [blame] | 39 | else: |
davidben@chromium.org | 9a59f36 | 2014-04-10 17:56:44 +0000 | [diff] [blame] | 40 | print(" GMPY : Not Loaded") |
| 41 | print("") |
| 42 | print("Commands:") |
| 43 | print("") |
| 44 | print(" createsrp <db>") |
| 45 | print("") |
| 46 | print(" add <db> <user> <pass> [<bits>]") |
| 47 | print(" del <db> <user>") |
| 48 | print(" check <db> <user> [<pass>]") |
| 49 | print(" list <db>") |
initial.commit | 4c2903c | 2008-07-27 00:38:33 +0000 | [diff] [blame] | 50 | sys.exit() |
| 51 | |
| 52 | cmd = sys.argv[1].lower() |
| 53 | |
| 54 | class Args: |
| 55 | def __init__(self, argv): |
| 56 | self.argv = argv |
| 57 | def get(self, index): |
| 58 | if len(self.argv)<=index: |
| 59 | raise SyntaxError("Not enough arguments") |
| 60 | return self.argv[index] |
| 61 | def getLast(self, index): |
| 62 | if len(self.argv)>index+1: |
| 63 | raise SyntaxError("Too many arguments") |
| 64 | return self.get(index) |
| 65 | |
| 66 | args = Args(sys.argv) |
| 67 | |
| 68 | def reformatDocString(s): |
| 69 | lines = s.splitlines() |
| 70 | newLines = [] |
| 71 | for line in lines: |
| 72 | newLines.append(" " + line.strip()) |
| 73 | return "\n".join(newLines) |
| 74 | |
| 75 | try: |
| 76 | if cmd == "help": |
| 77 | command = args.getLast(2).lower() |
| 78 | if command == "valid": |
davidben@chromium.org | 9a59f36 | 2014-04-10 17:56:44 +0000 | [diff] [blame] | 79 | print("") |
initial.commit | 4c2903c | 2008-07-27 00:38:33 +0000 | [diff] [blame] | 80 | else: |
davidben@chromium.org | 9a59f36 | 2014-04-10 17:56:44 +0000 | [diff] [blame] | 81 | print("Bad command: '%s'" % command) |
initial.commit | 4c2903c | 2008-07-27 00:38:33 +0000 | [diff] [blame] | 82 | |
| 83 | elif cmd == "createsrp": |
| 84 | dbName = args.get(2) |
| 85 | |
| 86 | db = VerifierDB(dbName) |
| 87 | db.create() |
| 88 | |
initial.commit | 4c2903c | 2008-07-27 00:38:33 +0000 | [diff] [blame] | 89 | elif cmd == "add": |
| 90 | dbName = args.get(2) |
| 91 | username = args.get(3) |
| 92 | password = args.get(4) |
| 93 | |
davidben@chromium.org | 9a59f36 | 2014-04-10 17:56:44 +0000 | [diff] [blame] | 94 | db = VerifierDB(dbName) |
| 95 | db.open() |
| 96 | if username in db: |
| 97 | print("User already in database!") |
| 98 | sys.exit() |
| 99 | bits = int(args.getLast(5)) |
| 100 | N, g, salt, verifier = VerifierDB.makeVerifier(username, password, bits) |
| 101 | db[username] = N, g, salt, verifier |
initial.commit | 4c2903c | 2008-07-27 00:38:33 +0000 | [diff] [blame] | 102 | |
| 103 | elif cmd == "del": |
| 104 | dbName = args.get(2) |
| 105 | username = args.getLast(3) |
davidben@chromium.org | 9a59f36 | 2014-04-10 17:56:44 +0000 | [diff] [blame] | 106 | db = VerifierDB(dbName) |
| 107 | db.open() |
initial.commit | 4c2903c | 2008-07-27 00:38:33 +0000 | [diff] [blame] | 108 | del(db[username]) |
| 109 | |
| 110 | elif cmd == "check": |
| 111 | dbName = args.get(2) |
| 112 | username = args.get(3) |
| 113 | if len(sys.argv)>=5: |
| 114 | password = args.getLast(4) |
| 115 | else: |
| 116 | password = None |
| 117 | |
davidben@chromium.org | 9a59f36 | 2014-04-10 17:56:44 +0000 | [diff] [blame] | 118 | db = VerifierDB(dbName) |
| 119 | db.open() |
initial.commit | 4c2903c | 2008-07-27 00:38:33 +0000 | [diff] [blame] | 120 | |
| 121 | try: |
| 122 | db[username] |
davidben@chromium.org | 9a59f36 | 2014-04-10 17:56:44 +0000 | [diff] [blame] | 123 | print("Username exists") |
initial.commit | 4c2903c | 2008-07-27 00:38:33 +0000 | [diff] [blame] | 124 | |
| 125 | if password: |
| 126 | if db.check(username, password): |
davidben@chromium.org | 9a59f36 | 2014-04-10 17:56:44 +0000 | [diff] [blame] | 127 | print("Password is correct") |
initial.commit | 4c2903c | 2008-07-27 00:38:33 +0000 | [diff] [blame] | 128 | else: |
davidben@chromium.org | 9a59f36 | 2014-04-10 17:56:44 +0000 | [diff] [blame] | 129 | print("Password is wrong") |
initial.commit | 4c2903c | 2008-07-27 00:38:33 +0000 | [diff] [blame] | 130 | except KeyError: |
davidben@chromium.org | 9a59f36 | 2014-04-10 17:56:44 +0000 | [diff] [blame] | 131 | print("Username does not exist") |
initial.commit | 4c2903c | 2008-07-27 00:38:33 +0000 | [diff] [blame] | 132 | sys.exit() |
| 133 | |
| 134 | elif cmd == "list": |
| 135 | dbName = args.get(2) |
davidben@chromium.org | 9a59f36 | 2014-04-10 17:56:44 +0000 | [diff] [blame] | 136 | db = VerifierDB(dbName) |
| 137 | db.open() |
initial.commit | 4c2903c | 2008-07-27 00:38:33 +0000 | [diff] [blame] | 138 | |
davidben@chromium.org | 9a59f36 | 2014-04-10 17:56:44 +0000 | [diff] [blame] | 139 | print("Verifier Database") |
| 140 | def numBits(n): |
| 141 | if n==0: |
| 142 | return 0 |
| 143 | return int(math.floor(math.log(n, 2))+1) |
| 144 | for username in db.keys(): |
| 145 | N, g, s, v = db[username] |
| 146 | print(numBits(N), username) |
initial.commit | 4c2903c | 2008-07-27 00:38:33 +0000 | [diff] [blame] | 147 | else: |
davidben@chromium.org | 9a59f36 | 2014-04-10 17:56:44 +0000 | [diff] [blame] | 148 | print("Bad command: '%s'" % cmd) |
initial.commit | 4c2903c | 2008-07-27 00:38:33 +0000 | [diff] [blame] | 149 | except: |
| 150 | raise |