busybox/loginutils/mkpasswd.c
Bernhard Reutner-Fischer 82b1429966 - add new applet mkpasswd(1)
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
2008-12-03 18:48:39 +00:00

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;
}