df8245adef7454d9cd9d66cccb6a522e57cc1147
[public/misc-sysadmin.git] / mkpwd
1 #!/usr/bin/python
2
3 # Copyright 2012, Svenne Krap
4 # svenne@krap.dk
5 #
6 # Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
7 #
8 # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
9
10
11 import sys
12 import random
13 from  math import log
14 ok = True
15 strength = 0
16 if len(sys.argv) != 2: ok = False
17
18 if not ok:
19     print ("mkpasswd  <spec>")
20     print (" - spec = <num><type>")
21     print ("     -num = length of password" )
22     print ("     -type = charset to use:")
23     print ("         - c(ase) insensitive")
24     print ("         - n(ormal) ")
25     print ("         - e(xtended) charset")
26     print ("         - i(nteger) charset")
27     print (" - example: mkpasswd 24e")
28     sys.exit()
29
30 def ngetchar():
31     global strength
32     strength = 60
33     x = random.randint(0,59)
34     if x < 10:
35         return str(x)
36     elif x >= 10 and x < 35:
37         return chr(ord('a') + (x - 10))
38     elif x >= 35 and x < 60:
39         return chr(ord('A') + (x - 35))
40     else:
41         print ("ERR : " + str(x))
42         return "!"
43
44 def cgetchar():
45     global strength
46     strength = 34
47     x = random.randint(0,33)
48     if x < 10:
49         return str(x)
50     elif x >= 10 and x < 35:
51         return chr(ord('a') + (x - 10))
52     else:
53         print ("ERR : " + str(x))
54         return "!"
55
56 def egetchar():
57     global strength
58     strength = 95
59     x = random.randint(0,94)
60     return chr(32 + x)
61
62 def hgetchar():
63     global strength
64     strength = 16
65     x = random.randint(0,15)
66     if x < 10:
67         return str(x)
68     elif x >= 10 and x < 16:
69         return chr(ord('a') + (x -10) )
70     else:
71         print ("ERR : " + str(x))
72         return "!"
73
74 def igetchar():
75     global strength
76     strength = 10
77     x = random.randint(0,9)
78     if x < 10:
79         return str(x)
80     else:
81         print ("ERR : " + str(x))
82         return "!"
83
84 generators = {}
85 generators["c"] = cgetchar
86 generators["n"] = ngetchar
87 generators["e"] = egetchar
88 generators["i"] = igetchar
89 generators["h"] = hgetchar
90
91 if sys.argv[1]=="-":
92     mode = "20n"
93 elif sys.argv[1]==".":
94     mode = "20e"
95 elif sys.argv[1]=="!":
96     mode = "40e"
97 else:
98     mode = sys.argv[1]
99
100 cs = mode[-1:]
101 if not cs in generators:
102     print ( "Error" + cs + " is a unknown generator")
103     sys.exit()
104
105 len = mode[:-1]
106 if not len.isdigit():
107     print( "Error" + len +  " is not a number")
108     sys.exit()
109
110 res = str()
111 for i in range(int(len)):
112     c = generators[cs]()
113     res += c
114
115 strengthres = int(log(strength  ** int(len))  / log(2))
116 print ("Password id \""  + res + "\"\n\nStrength is estimated to " + str( strengthres ) + " bits.")