/*
* cryptpw.c - output a crypt(3)ed password to stdout.
*
- * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
+ * Licensed under GPLv2 or later, see file LICENSE in this source tree.
*
* Cooked from passwd.c by Thomas Lundquist <thomasez@zelow.no>
* mkpasswd compatible options added by Bernhard Reutner-Fischer
*
- * Licensed under GPLv2, see file LICENSE in this tarball for details.
+ * Licensed under GPLv2, see file LICENSE in this source tree.
*/
+//usage:#define cryptpw_trivial_usage
+//usage: "[OPTIONS] [PASSWORD] [SALT]"
+/* We do support -s, we just don't mention it */
+//usage:#define cryptpw_full_usage "\n\n"
+//usage: "Crypt PASSWORD using crypt(3)\n"
+//usage: IF_LONG_OPTS(
+//usage: "\n -P,--password-fd=N Read password from fd N"
+/* //usage: "\n -s,--stdin Use stdin; like -P0" */
+//usage: "\n -m,--method=TYPE Encryption method"
+//usage: "\n -S,--salt=SALT"
+//usage: )
+//usage: IF_NOT_LONG_OPTS(
+//usage: "\n -P N Read password from fd N"
+/* //usage: "\n -s Use stdin; like -P0" */
+//usage: "\n -m TYPE Encryption method TYPE"
+//usage: "\n -S SALT"
+//usage: )
+
+/* mkpasswd is an alias to cryptpw */
+//usage:#define mkpasswd_trivial_usage
+//usage: "[OPTIONS] [PASSWORD] [SALT]"
+/* We do support -s, we just don't mention it */
+//usage:#define mkpasswd_full_usage "\n\n"
+//usage: "Crypt PASSWORD using crypt(3)\n"
+//usage: IF_LONG_OPTS(
+//usage: "\n -P,--password-fd=N Read password from fd N"
+/* //usage: "\n -s,--stdin Use stdin; like -P0" */
+//usage: "\n -m,--method=TYPE Encryption method"
+//usage: "\n -S,--salt=SALT"
+//usage: )
+//usage: IF_NOT_LONG_OPTS(
+//usage: "\n -P N Read password from fd N"
+/* //usage: "\n -s Use stdin; like -P0" */
+//usage: "\n -m TYPE Encryption method TYPE"
+//usage: "\n -S SALT"
+//usage: )
+
#include "libbb.h"
/* Debian has 'mkpasswd' utility, manpage says:
int cryptpw_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int cryptpw_main(int argc UNUSED_PARAM, char **argv)
{
- /* $N$ + sha_salt_16_bytes + NUL */
- char salt[3 + 16 + 1];
+ char salt[MAX_PW_SALT_LEN];
char *salt_ptr;
+ char *password;
const char *opt_m, *opt_S;
- int len;
int fd;
#if ENABLE_LONG_OPTS
applet_long_options = mkpasswd_longopts;
#endif
fd = STDIN_FILENO;
- opt_m = "d";
+ opt_m = CONFIG_FEATURE_DEFAULT_PASSWD_ALGO;
opt_S = NULL;
/* at most two non-option arguments; -P NUM */
opt_complementary = "?2:P+";
if (argv[0] && !opt_S)
opt_S = argv[1];
- len = 2/2;
- salt_ptr = salt;
- if (opt_m[0] != 'd') { /* not des */
- len = 8/2; /* so far assuming md5 */
- *salt_ptr++ = '$';
- *salt_ptr++ = '1';
- *salt_ptr++ = '$';
-#if !ENABLE_USE_BB_CRYPT || ENABLE_USE_BB_CRYPT_SHA
- if (opt_m[0] == 's') { /* sha */
- salt[1] = '5' + (strcmp(opt_m, "sha512") == 0);
- len = 16/2;
- }
-#endif
- }
+ salt_ptr = crypt_make_pw_salt(salt, opt_m);
if (opt_S)
- safe_strncpy(salt_ptr, opt_S, sizeof(salt) - 3);
- else
- crypt_make_salt(salt_ptr, len, 0);
+ safe_strncpy(salt_ptr, opt_S, sizeof(salt) - (sizeof("$N$")-1));
xmove_fd(fd, STDIN_FILENO);
- puts(pw_encrypt(
- argv[0] ? argv[0] : (
- /* Only mkpasswd, and only from tty, prompts.
- * Otherwise it is a plain read. */
- (isatty(STDIN_FILENO) && applet_name[0] == 'm')
+ password = argv[0];
+ if (!password) {
+ /* Only mkpasswd, and only from tty, prompts.
+ * Otherwise it is a plain read. */
+ password = (isatty(STDIN_FILENO) && applet_name[0] == 'm')
? bb_ask_stdin("Password: ")
: xmalloc_fgetline(stdin)
- ),
- salt, 1));
+ ;
+ /* may still be NULL on EOF/error */
+ }
+
+ if (password)
+ puts(pw_encrypt(password, salt, 1));
return EXIT_SUCCESS;
}