1#!/usr/bin/env python
2
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
9from __future__ import print_function
10import sys
11import os
12import socket
13import math
14
15if __name__ != "__main__":
16    raise "This must be run as a command, not used as a module!"
17
18
19from tlslite import *
20from tlslite import __version__
21
22if len(sys.argv) == 1 or (len(sys.argv)==2 and sys.argv[1].lower().endswith("help")):
23    print("")
24    print("Version: %s" % __version__)
25    print("")
26    print("RNG: %s" % prngName)
27    print("")
28    print("Modules:")
29    if m2cryptoLoaded:
30        print("  M2Crypto    : Loaded")
31    else:
32        print("  M2Crypto    : Not Loaded")
33    if pycryptoLoaded:
34        print("  pycrypto    : Loaded")
35    else:
36        print("  pycrypto    : Not Loaded")
37    if gmpyLoaded:
38        print("  GMPY        : Loaded")
39    else:
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>")
50    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":
79            print("")
80        else:
81            print("Bad command: '%s'" % command)
82
83    elif cmd == "createsrp":
84        dbName = args.get(2)
85
86        db = VerifierDB(dbName)
87        db.create()
88
89    elif cmd == "add":
90        dbName = args.get(2)
91        username = args.get(3)
92        password = args.get(4)
93
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
102
103    elif cmd == "del":
104        dbName = args.get(2)
105        username = args.getLast(3)
106        db = VerifierDB(dbName)
107        db.open()
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
118        db = VerifierDB(dbName)
119        db.open()
120
121        try:
122            db[username]
123            print("Username exists")
124
125            if password:
126                if db.check(username, password):
127                    print("Password is correct")
128                else:
129                    print("Password is wrong")
130        except KeyError:
131            print("Username does not exist")
132            sys.exit()
133
134    elif cmd == "list":
135        dbName = args.get(2)
136        db = VerifierDB(dbName)
137        db.open()
138
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)
147    else:
148        print("Bad command: '%s'" % cmd)
149except:
150    raise
151