summaryrefslogtreecommitdiff
path: root/src/usr.bin/openssl/passwd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr.bin/openssl/passwd.c')
-rw-r--r--src/usr.bin/openssl/passwd.c270
1 files changed, 151 insertions, 119 deletions
diff --git a/src/usr.bin/openssl/passwd.c b/src/usr.bin/openssl/passwd.c
index c29cccf6cf..6267328e62 100644
--- a/src/usr.bin/openssl/passwd.c
+++ b/src/usr.bin/openssl/passwd.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: passwd.c,v 1.2 2014/10/22 13:54:03 jsing Exp $ */ 1/* $OpenBSD: passwd.c,v 1.3 2015/01/05 15:25:39 jsing Exp $ */
2 2
3#if defined OPENSSL_NO_MD5 3#if defined OPENSSL_NO_MD5
4#define NO_MD5CRYPT_1 4#define NO_MD5CRYPT_1
@@ -40,140 +40,166 @@ do_passwd(int passed_salt, char **salt_p, char **salt_malloc_p,
40 char *passwd, BIO * out, int quiet, int table, int reverse, 40 char *passwd, BIO * out, int quiet, int table, int reverse,
41 size_t pw_maxlen, int usecrypt, int use1, int useapr1); 41 size_t pw_maxlen, int usecrypt, int use1, int useapr1);
42 42
43/* -crypt - standard Unix password algorithm (default) 43static struct {
44 * -1 - MD5-based password algorithm 44 char *infile;
45 * -apr1 - MD5-based password algorithm, Apache variant 45 int in_stdin;
46 * -salt string - salt 46 int noverify;
47 * -in file - read passwords from file 47 int quiet;
48 * -stdin - read passwords from stdin 48 int reverse;
49 * -noverify - never verify when reading password from terminal 49 char *salt;
50 * -quiet - no warnings 50 int table;
51 * -table - format output as table 51 int use1;
52 * -reverse - switch table columns 52 int useapr1;
53 */ 53 int usecrypt;
54} passwd_config;
55
56static struct option passwd_options[] = {
57#ifndef NO_MD5CRYPT_1
58 {
59 .name = "1",
60 .desc = "Use MD5 based BSD password algorithm 1",
61 .type = OPTION_FLAG,
62 .opt.flag = &passwd_config.use1,
63 },
64 {
65 .name = "apr1",
66 .desc = "Use apr1 algorithm (Apache variant of BSD algorithm)",
67 .type = OPTION_FLAG,
68 .opt.flag = &passwd_config.useapr1,
69 },
70#endif
71#ifndef OPENSSL_NO_DES
72 {
73 .name = "crypt",
74 .desc = "Use crypt algorithm (default)",
75 .type = OPTION_FLAG,
76 .opt.flag = &passwd_config.usecrypt,
77 },
78#endif
79 {
80 .name = "in",
81 .argname = "file",
82 .desc = "Read passwords from specified file",
83 .type = OPTION_ARG,
84 .opt.arg = &passwd_config.infile,
85 },
86 {
87 .name = "noverify",
88 .desc = "Do not verify password",
89 .type = OPTION_FLAG,
90 .opt.flag = &passwd_config.noverify,
91 },
92 {
93 .name = "quiet",
94 .desc = "Do not output warnings",
95 .type = OPTION_FLAG,
96 .opt.flag = &passwd_config.quiet,
97 },
98 {
99 .name = "reverse",
100 .desc = "Reverse table columns (requires -table)",
101 .type = OPTION_FLAG,
102 .opt.flag = &passwd_config.reverse,
103 },
104 {
105 .name = "salt",
106 .argname = "string",
107 .desc = "Use specified salt",
108 .type = OPTION_ARG,
109 .opt.arg = &passwd_config.salt,
110 },
111 {
112 .name = "stdin",
113 .desc = "Read passwords from stdin",
114 .type = OPTION_FLAG,
115 .opt.flag = &passwd_config.in_stdin,
116 },
117 {
118 .name = "table",
119 .desc = "Output cleartext and hashed passwords (tab separated)",
120 .type = OPTION_FLAG,
121 .opt.flag = &passwd_config.table,
122 },
123 { NULL },
124};
125
126static void
127passwd_usage(void)
128{
129 fprintf(stderr, "usage: passwd [-1 | -apr1 | -crypt] [-in file] "
130 "[-noverify] [-quiet]\n"
131 " [-reverse] [-salt string] [-stdin] [-table] [password]\n\n");
132 options_usage(passwd_options);
133}
54 134
55int passwd_main(int, char **); 135int passwd_main(int, char **);
56 136
57int 137int
58passwd_main(int argc, char **argv) 138passwd_main(int argc, char **argv)
59{ 139{
60 int ret = 1; 140 char *passwd = NULL, **passwds = NULL;
61 char *infile = NULL;
62 int in_stdin = 0;
63 int in_noverify = 0;
64 char *salt = NULL, *passwd = NULL, **passwds = NULL;
65 char *salt_malloc = NULL, *passwd_malloc = NULL; 141 char *salt_malloc = NULL, *passwd_malloc = NULL;
66 size_t passwd_malloc_size = 0; 142 size_t passwd_malloc_size = 0;
67 int pw_source_defined = 0;
68 BIO *in = NULL, *out = NULL; 143 BIO *in = NULL, *out = NULL;
69 int i, badopt, opt_done; 144 int badopt = 0;
70 int passed_salt = 0, quiet = 0, table = 0, reverse = 0; 145 int passed_salt = 0;
71 int usecrypt = 0, use1 = 0, useapr1 = 0;
72 size_t pw_maxlen = 0; 146 size_t pw_maxlen = 0;
147 int argsused;
148 int ret = 1;
73 149
74 out = BIO_new(BIO_s_file()); 150 memset(&passwd_config, 0, sizeof(passwd_config));
75 if (out == NULL)
76 goto err;
77 BIO_set_fp(out, stdout, BIO_NOCLOSE | BIO_FP_TEXT);
78 151
79 badopt = 0, opt_done = 0; 152 if (options_parse(argc, argv, passwd_options, NULL, &argsused) != 0) {
80 i = 0; 153 passwd_usage();
81 while (!badopt && !opt_done && argv[++i] != NULL) { 154 goto err;
82 if (strcmp(argv[i], "-crypt") == 0)
83 usecrypt = 1;
84 else if (strcmp(argv[i], "-1") == 0)
85 use1 = 1;
86 else if (strcmp(argv[i], "-apr1") == 0)
87 useapr1 = 1;
88 else if (strcmp(argv[i], "-salt") == 0) {
89 if ((argv[i + 1] != NULL) && (salt == NULL)) {
90 passed_salt = 1;
91 salt = argv[++i];
92 } else
93 badopt = 1;
94 } else if (strcmp(argv[i], "-in") == 0) {
95 if ((argv[i + 1] != NULL) && !pw_source_defined) {
96 pw_source_defined = 1;
97 infile = argv[++i];
98 } else
99 badopt = 1;
100 } else if (strcmp(argv[i], "-stdin") == 0) {
101 if (!pw_source_defined) {
102 pw_source_defined = 1;
103 in_stdin = 1;
104 } else
105 badopt = 1;
106 } else if (strcmp(argv[i], "-noverify") == 0)
107 in_noverify = 1;
108 else if (strcmp(argv[i], "-quiet") == 0)
109 quiet = 1;
110 else if (strcmp(argv[i], "-table") == 0)
111 table = 1;
112 else if (strcmp(argv[i], "-reverse") == 0)
113 reverse = 1;
114 else if (argv[i][0] == '-')
115 badopt = 1;
116 else if (!pw_source_defined)
117 /* non-option arguments, use as passwords */
118 {
119 pw_source_defined = 1;
120 passwds = &argv[i];
121 opt_done = 1;
122 } else
123 badopt = 1;
124 } 155 }
125 156
126 if (!usecrypt && !use1 && !useapr1) /* use default */ 157 if (argsused < argc)
127 usecrypt = 1; 158 passwds = &argv[argsused];
128 if (usecrypt + use1 + useapr1 > 1) /* conflict */ 159 if (passwd_config.salt != NULL)
129 badopt = 1; 160 passed_salt = 1;
130 161
131 /* reject unsupported algorithms */ 162 if (!passwd_config.usecrypt && !passwd_config.use1 &&
163 !passwd_config.useapr1)
164 passwd_config.usecrypt = 1; /* use default */
165 if (passwd_config.usecrypt + passwd_config.use1 +
166 passwd_config.useapr1 > 1)
167 badopt = 1; /* conflicting options */
168
169 /* Reject unsupported algorithms */
132#ifdef OPENSSL_NO_DES 170#ifdef OPENSSL_NO_DES
133 if (usecrypt) 171 if (passwd_config.usecrypt)
134 badopt = 1; 172 badopt = 1;
135#endif 173#endif
136#ifdef NO_MD5CRYPT_1 174#ifdef NO_MD5CRYPT_1
137 if (use1 || useapr1) 175 if (passwd_config.use1 || passwd_config.useapr1)
138 badopt = 1; 176 badopt = 1;
139#endif 177#endif
140 178
141 if (badopt) { 179 if (badopt) {
142 BIO_printf(bio_err, "Usage: passwd [options] [passwords]\n"); 180 passwd_usage();
143 BIO_printf(bio_err, "where options are\n");
144#ifndef OPENSSL_NO_DES
145 BIO_printf(bio_err, "-crypt standard Unix password algorithm (default)\n");
146#endif
147#ifndef NO_MD5CRYPT_1
148 BIO_printf(bio_err, "-1 MD5-based password algorithm\n");
149 BIO_printf(bio_err, "-apr1 MD5-based password algorithm, Apache variant\n");
150#endif
151 BIO_printf(bio_err, "-salt string use provided salt\n");
152 BIO_printf(bio_err, "-in file read passwords from file\n");
153 BIO_printf(bio_err, "-stdin read passwords from stdin\n");
154 BIO_printf(bio_err, "-noverify never verify when reading password from terminal\n");
155 BIO_printf(bio_err, "-quiet no warnings\n");
156 BIO_printf(bio_err, "-table format output as table\n");
157 BIO_printf(bio_err, "-reverse switch table columns\n");
158
159 goto err; 181 goto err;
160 } 182 }
161 if ((infile != NULL) || in_stdin) { 183
162 in = BIO_new(BIO_s_file()); 184 if ((out = BIO_new(BIO_s_file())) == NULL)
163 if (in == NULL) 185 goto err;
186 BIO_set_fp(out, stdout, BIO_NOCLOSE | BIO_FP_TEXT);
187
188 if (passwd_config.infile != NULL || passwd_config.in_stdin) {
189 if ((in = BIO_new(BIO_s_file())) == NULL)
164 goto err; 190 goto err;
165 if (infile != NULL) { 191 if (passwd_config.infile != NULL) {
166 assert(in_stdin == 0); 192 assert(passwd_config.in_stdin == 0);
167 if (BIO_read_filename(in, infile) <= 0) 193 if (BIO_read_filename(in, passwd_config.infile) <= 0)
168 goto err; 194 goto err;
169 } else { 195 } else {
170 assert(in_stdin); 196 assert(passwd_config.in_stdin);
171 BIO_set_fp(in, stdin, BIO_NOCLOSE); 197 BIO_set_fp(in, stdin, BIO_NOCLOSE);
172 } 198 }
173 } 199 }
174 if (usecrypt) 200 if (passwd_config.usecrypt)
175 pw_maxlen = 8; 201 pw_maxlen = 8;
176 else if (use1 || useapr1) 202 else if (passwd_config.use1 || passwd_config.useapr1)
177 pw_maxlen = 256;/* arbitrary limit, should be enough for most 203 pw_maxlen = 256;/* arbitrary limit, should be enough for most
178 * passwords */ 204 * passwords */
179 205
@@ -186,13 +212,15 @@ passwd_main(int argc, char **argv)
186 if (passwd_malloc == NULL) 212 if (passwd_malloc == NULL)
187 goto err; 213 goto err;
188 } 214 }
189 if ((in == NULL) && (passwds == NULL)) { 215 if (in == NULL && passwds == NULL) {
190 /* build a null-terminated list */ 216 /* build a null-terminated list */
191 static char *passwds_static[2] = {NULL, NULL}; 217 static char *passwds_static[2] = {NULL, NULL};
192 218
193 passwds = passwds_static; 219 passwds = passwds_static;
194 if (in == NULL) 220 if (in == NULL)
195 if (EVP_read_pw_string(passwd_malloc, passwd_malloc_size, "Password: ", !(passed_salt || in_noverify)) != 0) 221 if (EVP_read_pw_string(passwd_malloc,
222 passwd_malloc_size, "Password: ",
223 !(passed_salt || passwd_config.noverify)) != 0)
196 goto err; 224 goto err;
197 passwds[0] = passwd_malloc; 225 passwds[0] = passwd_malloc;
198 } 226 }
@@ -200,16 +228,16 @@ passwd_main(int argc, char **argv)
200 assert(passwds != NULL); 228 assert(passwds != NULL);
201 assert(*passwds != NULL); 229 assert(*passwds != NULL);
202 230
203 do { /* loop over list of passwords */ 231 do { /* loop over list of passwords */
204 passwd = *passwds++; 232 passwd = *passwds++;
205 if (!do_passwd(passed_salt, &salt, &salt_malloc, passwd, out, 233 if (!do_passwd(passed_salt, &passwd_config.salt,
206 quiet, table, reverse, pw_maxlen, usecrypt, use1, useapr1)) 234 &salt_malloc, passwd, out, passwd_config.quiet,
235 passwd_config.table, passwd_config.reverse,
236 pw_maxlen, passwd_config.usecrypt,
237 passwd_config.use1, passwd_config.useapr1))
207 goto err; 238 goto err;
208 } 239 } while (*passwds != NULL);
209 while (*passwds != NULL); 240 } else {
210 } else
211 /* in != NULL */
212 {
213 int done; 241 int done;
214 242
215 assert(passwd != NULL); 243 assert(passwd != NULL);
@@ -227,23 +255,27 @@ passwd_main(int argc, char **argv)
227 while ((r > 0) && (!strchr(trash, '\n'))); 255 while ((r > 0) && (!strchr(trash, '\n')));
228 } 256 }
229 257
230 if (!do_passwd(passed_salt, &salt, &salt_malloc, passwd, out, 258 if (!do_passwd(passed_salt, &passwd_config.salt,
231 quiet, table, reverse, pw_maxlen, usecrypt, use1, useapr1)) 259 &salt_malloc, passwd, out,
260 passwd_config.quiet, passwd_config.table,
261 passwd_config.reverse, pw_maxlen,
262 passwd_config.usecrypt, passwd_config.use1,
263 passwd_config.useapr1))
232 goto err; 264 goto err;
233 } 265 }
234 done = (r <= 0); 266 done = (r <= 0);
235 } 267 } while (!done);
236 while (!done);
237 } 268 }
238 ret = 0; 269 ret = 0;
239 270
240err: 271err:
241 ERR_print_errors(bio_err); 272 ERR_print_errors(bio_err);
273
242 free(salt_malloc); 274 free(salt_malloc);
243 free(passwd_malloc); 275 free(passwd_malloc);
276
244 BIO_free(in); 277 BIO_free(in);
245 if (out) 278 BIO_free_all(out);
246 BIO_free_all(out);
247 279
248 return (ret); 280 return (ret);
249} 281}