comparison cutils/genpwd.py @ 248:4796e5da04ee

genpwd: Rename "--repertoire" to "--algorithm"
author Franz Glasner <fzglas.hg@dom66.de>
date Sat, 08 Feb 2025 12:57:14 +0100
parents 435687f4e071
children f161448d673e
comparison
equal deleted inserted replaced
247:435687f4e071 248:4796e5da04ee
72 fromfile_prefix_chars='@') 72 fromfile_prefix_chars='@')
73 aparser.add_argument( 73 aparser.add_argument(
74 "--version", "-v", action="version", 74 "--version", "-v", action="version",
75 version="%s (rv:%s)" % (__version__, __revision__)) 75 version="%s (rv:%s)" % (__version__, __revision__))
76 aparser.add_argument( 76 aparser.add_argument(
77 "-E", dest="use_bin_length", action="store_true", 77 "--algorithm", "-a",
78 help="For some repertoires make OUTPUT-LENGTH the number of bytes"
79 " that is to be read from random sources instead of output bytes")
80 aparser.add_argument(
81 "--repertoire", "--type", "-t",
82 choices=("web", "safe-web", "safe-web-2", 78 choices=("web", "safe-web", "safe-web-2",
83 "uri", "safe-uri", "safe-uri-2", 79 "uri", "safe-uri", "safe-uri-2",
84 "ascii", "safe-ascii", 80 "ascii", "safe-ascii",
85 "alnum", "safe-alnum", 81 "alnum", "safe-alnum",
86 "bin-base64", "bin-urlsafe-base64", "bin-base32", "bin-hex", 82 "bin-base64", "bin-urlsafe-base64", "bin-base32", "bin-hex",
87 "bin-ascii85",), 83 "bin-ascii85",),
88 default="safe-ascii", 84 default="safe-ascii",
89 help=""" 85 help="""
90 Select from a character repertoire. 86 Select an algorithm and (implicitly) a character repertoire.
91 All repertoires that start with "bin-" just encode the output of 87 All repertoires that start with `bin-' just encode the output of
92 "os.urandom()" with the selected encoder. 88 "os.urandom()" with the selected encoder.
89 All repertoires that end with `-safe' or `safe-2' do not contain visually
90 similar characters (currently `0O' or `Il1').
91 All repertoires that end with `-2' are variants with a bias to punctuation
92 characters.
93 Default: safe-ascii 93 Default: safe-ascii
94 """) 94 """)
95 aparser.add_argument(
96 "-E", dest="use_bin_length", action="store_true",
97 help="For some repertoires make OUTPUT-LENGTH the number of bytes"
98 " that is to be read from random sources instead of output bytes")
95 aparser.add_argument( 99 aparser.add_argument(
96 "req_length", metavar="OUTPUT-LENGTH", type=int, 100 "req_length", metavar="OUTPUT-LENGTH", type=int,
97 help="The required length of the generated output") 101 help="The required length of the generated output")
98 102
99 opts = aparser.parse_args(args=argv) 103 opts = aparser.parse_args(args=argv)
100 104
101 if opts.repertoire == "web": 105 if opts.algorithm == "web":
102 pwd = gen_from_repertoire(opts.req_length, WEB_CHARS) 106 pwd = gen_from_repertoire(opts.req_length, WEB_CHARS)
103 elif opts.repertoire == "safe-web": 107 elif opts.algorithm == "safe-web":
104 pwd = gen_from_repertoire(opts.req_length, SAFE_WEB_CHARS) 108 pwd = gen_from_repertoire(opts.req_length, SAFE_WEB_CHARS)
105 elif opts.repertoire == "safe-web-2": 109 elif opts.algorithm == "safe-web-2":
106 pwd = gen_from_repertoire(opts.req_length, SAFE_WEB_CHARS_2) 110 pwd = gen_from_repertoire(opts.req_length, SAFE_WEB_CHARS_2)
107 elif opts.repertoire == "uri": 111 elif opts.algorithm == "uri":
108 pwd = gen_from_repertoire(opts.req_length, URI_CHARS) 112 pwd = gen_from_repertoire(opts.req_length, URI_CHARS)
109 elif opts.repertoire == "safe-uri": 113 elif opts.algorithm == "safe-uri":
110 pwd = gen_from_repertoire(opts.req_length, SAFE_URI_CHARS) 114 pwd = gen_from_repertoire(opts.req_length, SAFE_URI_CHARS)
111 elif opts.repertoire == "safe-uri-2": 115 elif opts.algorithm == "safe-uri-2":
112 pwd = gen_from_repertoire(opts.req_length, SAFE_URI_CHARS_2) 116 pwd = gen_from_repertoire(opts.req_length, SAFE_URI_CHARS_2)
113 elif opts.repertoire == "ascii": 117 elif opts.algorithm == "ascii":
114 pwd = gen_from_repertoire(opts.req_length, FULL_ASCII) 118 pwd = gen_from_repertoire(opts.req_length, FULL_ASCII)
115 elif opts.repertoire == "safe-ascii": 119 elif opts.algorithm == "safe-ascii":
116 pwd = gen_from_repertoire(opts.req_length, SAFE_ASCII) 120 pwd = gen_from_repertoire(opts.req_length, SAFE_ASCII)
117 elif opts.repertoire == "alnum": 121 elif opts.algorithm == "alnum":
118 pwd = gen_from_repertoire(opts.req_length, ALNUM) 122 pwd = gen_from_repertoire(opts.req_length, ALNUM)
119 elif opts.repertoire == "safe-alnum": 123 elif opts.algorithm == "safe-alnum":
120 pwd = gen_from_repertoire(opts.req_length, SAFE_ALNUM) 124 pwd = gen_from_repertoire(opts.req_length, SAFE_ALNUM)
121 elif opts.repertoire == "bin-base64": 125 elif opts.algorithm == "bin-base64":
122 encoder = base64.b64encode 126 encoder = base64.b64encode
123 pwd = gen_bin(opts.req_length, opts.use_bin_length, encoder, 127 pwd = gen_bin(opts.req_length, opts.use_bin_length, encoder,
124 rstrip_chars=b"=") 128 rstrip_chars=b"=")
125 elif opts.repertoire == "bin-urlsafe-base64": 129 elif opts.algorithm == "bin-urlsafe-base64":
126 encoder = base64.urlsafe_b64encode 130 encoder = base64.urlsafe_b64encode
127 pwd = gen_bin(opts.req_length, opts.use_bin_length, encoder, 131 pwd = gen_bin(opts.req_length, opts.use_bin_length, encoder,
128 rstrip_chars=b"=") 132 rstrip_chars=b"=")
129 elif opts.repertoire == "bin-base32": 133 elif opts.algorithm == "bin-base32":
130 encoder = base64.b32encode 134 encoder = base64.b32encode
131 pwd = gen_bin(opts.req_length, opts.use_bin_length, encoder, 135 pwd = gen_bin(opts.req_length, opts.use_bin_length, encoder,
132 rstrip_chars=b"=") 136 rstrip_chars=b"=")
133 elif opts.repertoire == "bin-ascii85": 137 elif opts.algorithm == "bin-ascii85":
134 encoder = base64.a85encode 138 encoder = base64.a85encode
135 pwd = gen_bin(opts.req_length, opts.use_bin_length, encoder) 139 pwd = gen_bin(opts.req_length, opts.use_bin_length, encoder)
136 elif opts.repertoire == "bin-hex": 140 elif opts.algorithm == "bin-hex":
137 encoder = binascii.hexlify 141 encoder = binascii.hexlify
138 pwd = gen_bin(opts.req_length, opts.use_bin_length, encoder) 142 pwd = gen_bin(opts.req_length, opts.use_bin_length, encoder)
139 else: 143 else:
140 raise NotImplementedError("type not yet implemented: %s" 144 raise NotImplementedError("algorithm not yet implemented: %s"
141 % opts.repertoire) 145 % opts.algorithm)
142 if opts.use_bin_length: 146 if opts.use_bin_length:
143 if len(pwd) < opts.req_length: 147 if len(pwd) < opts.req_length:
144 raise AssertionError("internal length mismatch") 148 raise AssertionError("internal length mismatch")
145 else: 149 else:
146 if len(pwd) != opts.req_length: 150 if len(pwd) != opts.req_length: