mirror of
https://github.com/sheumann/hush.git
synced 2024-10-11 10:23:41 +00:00
82b1429966
function old new delta bb_ask - 355 +355 mkpasswd_main - 296 +296 .rodata 121746 121847 +101 packed_usage 24632 24689 +57 static.methods - 21 +21 gmatch 229 248 +19 bb_ask_stdin - 11 +11 applet_names 1949 1958 +9 applet_main 1172 1176 +4 sulogin_main 503 505 +2 applet_nameofs 586 588 +2 sha256_hash 329 327 -2 correct_password 208 206 -2 parse_command 1442 1439 -3 get_cred_or_die 145 141 -4 passwd_main 1054 1044 -10 bb_askpass 348 - -348 ------------------------------------------------------------------------------ (add/remove: 4/1 grow/shrink: 7/5 up/down: 877/-369) Total: 508 bytes
72 lines
1.9 KiB
C
72 lines
1.9 KiB
C
/* vi: set sw=4 ts=4 sts=4: */
|
|
/*
|
|
* mkpasswd - Overfeatured front end to crypt(3)
|
|
* Copyright (c) 2008 Bernhard Reutner-Fischer
|
|
*
|
|
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
|
|
*/
|
|
|
|
#include "libbb.h"
|
|
|
|
int mkpasswd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
|
int mkpasswd_main(int argc UNUSED_PARAM, char **argv)
|
|
{
|
|
char *chp = NULL, *method = NULL, *salt = NULL;
|
|
char *encrypted;
|
|
int fd = STDIN_FILENO;
|
|
enum {
|
|
OPT_P = (1 << 0),
|
|
OPT_s = (1 << 1),
|
|
OPT_m = (1 << 2),
|
|
OPT_S = (1 << 3)
|
|
};
|
|
static const char methods[] ALIGN1 =
|
|
/*"des\0"*/"md5\0""sha-256\0""sha-512\0";
|
|
enum { TYPE_des, TYPE_md5, TYPE_sha256, TYPE_sha512 };
|
|
unsigned algo = TYPE_des, algobits = 1;
|
|
#if ENABLE_GETOPT_LONG
|
|
static const char mkpasswd_longopts[] ALIGN1 =
|
|
"password-fd\0" Required_argument "P"
|
|
"stdin\0" No_argument "s"
|
|
"method\0" Required_argument "m"
|
|
"salt\0" Required_argument "S"
|
|
;
|
|
applet_long_options = mkpasswd_longopts;
|
|
#endif
|
|
opt_complementary = "?1"; /* at most one non-option argument */
|
|
getopt32(argv, "P:sm:S:", &chp, &method, &salt);
|
|
argv += optind;
|
|
if (option_mask32 & OPT_P)
|
|
fd = xatoi_u(chp);
|
|
if (option_mask32 & OPT_m)
|
|
algo = index_in_strings(methods, method) + 1;
|
|
if (*argv) /* we have a cleartext passwd */
|
|
chp = *argv;
|
|
else
|
|
chp = bb_ask(fd, 0, "Password: ");
|
|
if (!salt)
|
|
salt = xmalloc(128);
|
|
|
|
if (algo) {
|
|
char foo[2];
|
|
foo[0] = foo[2] = '$';
|
|
algobits = 4;
|
|
/* MD5 == "$1$", SHA-256 == "$5$", SHA-512 == "$6$" */
|
|
if (algo > 1) {
|
|
algo += 3;
|
|
algobits = 8;
|
|
}
|
|
foo[1] = '0' + (algo);
|
|
strcpy(salt, foo);
|
|
}
|
|
/* The opt_complementary adds a bit of additional noise, which is good
|
|
but not strictly needed. */
|
|
crypt_make_salt(salt + ((!!algo) * 3), algobits, (int)&opt_complementary);
|
|
encrypted = pw_encrypt(chp, salt, 1);
|
|
puts(encrypted);
|
|
if (ENABLE_FEATURE_CLEAN_UP) {
|
|
free(encrypted);
|
|
}
|
|
return EXIT_SUCCESS;
|
|
}
|