libarchive: open_zipped() does not need to check extensions for e.g. gzip
[oweals/busybox.git] / loginutils / cryptpw.c
index 47212e18a032d48085633afed41dc9a45eee461d..29f0fbe91abc23b3fb3c690a7315a009cf8090ef 100644 (file)
@@ -2,14 +2,51 @@
 /*
  * 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:
@@ -53,14 +90,13 @@ to cryptpw. -a option (alias for -m) came from cryptpw.
 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_GETOPT_LONG
+#if ENABLE_LONG_OPTS
        static const char mkpasswd_longopts[] ALIGN1 =
                "stdin\0"       No_argument       "s"
                "password-fd\0" Required_argument "P"
@@ -70,7 +106,7 @@ int cryptpw_main(int argc UNUSED_PARAM, char **argv)
        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+";
@@ -82,36 +118,25 @@ int cryptpw_main(int argc UNUSED_PARAM, char **argv)
        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;
 }