blob: 476d61899f6272a9b2d91691d2db9834502a9a89 [file] [log] [blame]
davidben@chromium.org9a59f362014-04-10 17:56:44 +00001#!/usr/bin/env python
initial.commit4c2903c2008-07-27 00:38:33 +00002
davidben@chromium.org9a59f362014-04-10 17:56:44 +00003# 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
9from __future__ import print_function
initial.commit4c2903c2008-07-27 00:38:33 +000010import sys
11import os
12import socket
initial.commit4c2903c2008-07-27 00:38:33 +000013import math
14
initial.commit4c2903c2008-07-27 00:38:33 +000015if __name__ != "__main__":
16 raise "This must be run as a command, not used as a module!"
17
18
davidben@chromium.org9a59f362014-04-10 17:56:44 +000019from tlslite import *
20from tlslite import __version__
initial.commit4c2903c2008-07-27 00:38:33 +000021
22if len(sys.argv) == 1 or (len(sys.argv)==2 and sys.argv[1].lower().endswith("help")):
davidben@chromium.org9a59f362014-04-10 17:56:44 +000023 print("")
24 print("Version: %s" % __version__)
25 print("")
26 print("RNG: %s" % prngName)
27 print("")
28 print("Modules:")
initial.commit4c2903c2008-07-27 00:38:33 +000029 if m2cryptoLoaded:
davidben@chromium.org9a59f362014-04-10 17:56:44 +000030 print(" M2Crypto : Loaded")
initial.commit4c2903c2008-07-27 00:38:33 +000031 else:
davidben@chromium.org9a59f362014-04-10 17:56:44 +000032 print(" M2Crypto : Not Loaded")
initial.commit4c2903c2008-07-27 00:38:33 +000033 if pycryptoLoaded:
davidben@chromium.org9a59f362014-04-10 17:56:44 +000034 print(" pycrypto : Loaded")
initial.commit4c2903c2008-07-27 00:38:33 +000035 else:
davidben@chromium.org9a59f362014-04-10 17:56:44 +000036 print(" pycrypto : Not Loaded")
initial.commit4c2903c2008-07-27 00:38:33 +000037 if gmpyLoaded:
davidben@chromium.org9a59f362014-04-10 17:56:44 +000038 print(" GMPY : Loaded")
initial.commit4c2903c2008-07-27 00:38:33 +000039 else:
davidben@chromium.org9a59f362014-04-10 17:56:44 +000040 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.commit4c2903c2008-07-27 00:38:33 +000050 sys.exit()
51
52cmd = sys.argv[1].lower()
53
54class 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
66args = Args(sys.argv)
67
68def reformatDocString(s):
69 lines = s.splitlines()
70 newLines = []
71 for line in lines:
72 newLines.append(" " + line.strip())
73 return "\n".join(newLines)
74
75try:
76 if cmd == "help":
77 command = args.getLast(2).lower()
78 if command == "valid":
davidben@chromium.org9a59f362014-04-10 17:56:44 +000079 print("")
initial.commit4c2903c2008-07-27 00:38:33 +000080 else:
davidben@chromium.org9a59f362014-04-10 17:56:44 +000081 print("Bad command: '%s'" % command)
initial.commit4c2903c2008-07-27 00:38:33 +000082
83 elif cmd == "createsrp":
84 dbName = args.get(2)
85
86 db = VerifierDB(dbName)
87 db.create()
88
initial.commit4c2903c2008-07-27 00:38:33 +000089 elif cmd == "add":
90 dbName = args.get(2)
91 username = args.get(3)
92 password = args.get(4)
93
davidben@chromium.org9a59f362014-04-10 17:56:44 +000094 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.commit4c2903c2008-07-27 00:38:33 +0000102
103 elif cmd == "del":
104 dbName = args.get(2)
105 username = args.getLast(3)
davidben@chromium.org9a59f362014-04-10 17:56:44 +0000106 db = VerifierDB(dbName)
107 db.open()
initial.commit4c2903c2008-07-27 00:38:33 +0000108 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.org9a59f362014-04-10 17:56:44 +0000118 db = VerifierDB(dbName)
119 db.open()
initial.commit4c2903c2008-07-27 00:38:33 +0000120
121 try:
122 db[username]
davidben@chromium.org9a59f362014-04-10 17:56:44 +0000123 print("Username exists")
initial.commit4c2903c2008-07-27 00:38:33 +0000124
125 if password:
126 if db.check(username, password):
davidben@chromium.org9a59f362014-04-10 17:56:44 +0000127 print("Password is correct")
initial.commit4c2903c2008-07-27 00:38:33 +0000128 else:
davidben@chromium.org9a59f362014-04-10 17:56:44 +0000129 print("Password is wrong")
initial.commit4c2903c2008-07-27 00:38:33 +0000130 except KeyError:
davidben@chromium.org9a59f362014-04-10 17:56:44 +0000131 print("Username does not exist")
initial.commit4c2903c2008-07-27 00:38:33 +0000132 sys.exit()
133
134 elif cmd == "list":
135 dbName = args.get(2)
davidben@chromium.org9a59f362014-04-10 17:56:44 +0000136 db = VerifierDB(dbName)
137 db.open()
initial.commit4c2903c2008-07-27 00:38:33 +0000138
davidben@chromium.org9a59f362014-04-10 17:56:44 +0000139 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.commit4c2903c2008-07-27 00:38:33 +0000147 else:
davidben@chromium.org9a59f362014-04-10 17:56:44 +0000148 print("Bad command: '%s'" % cmd)
initial.commit4c2903c2008-07-27 00:38:33 +0000149except:
150 raise