blob: 1acbc6db0cb9dbb9f7e7f86988746bac37a63162 [file] [log] [blame]
Denis Vlasenkoa035e9f2007-05-08 23:23:35 +00001/* vi: set sw=4 ts=4: */
2/*
3 * cryptpw.c
Denis Vlasenko4b924f32007-05-30 00:29:55 +00004 *
Denis Vlasenkoa035e9f2007-05-08 23:23:35 +00005 * Cooked from passwd.c by Thomas Lundquist <thomasez@zelow.no>
Denis Vlasenkoa035e9f2007-05-08 23:23:35 +00006 */
7
Denis Vlasenkob6adbf12007-05-26 19:00:18 +00008#include "libbb.h"
Denis Vlasenkoa035e9f2007-05-08 23:23:35 +00009
Denis Vlasenko4ea83bf2008-06-12 16:55:59 +000010#define TESTING 0
11
12/*
13set TESTING to 1 and pipe some file through this script
14if you played with bbox's crypt implementation.
15
16while read line; do
17 n=`./busybox cryptpw -a des -- "$line"`
18 o=`./busybox_old cryptpw -a des -- "$line"`
19 test "$n" != "$o" && {
20 echo n="$n"
21 echo o="$o"
22 exit
23 }
24 n=`./busybox cryptpw -- "$line"`
25 o=`./busybox_old cryptpw -- "$line"`
26 test "$n" != "$o" && {
27 echo n="$n"
28 echo o="$o"
29 exit
30 }
31done
32 */
33
Denis Vlasenko9b49a5e2007-10-11 10:05:36 +000034int cryptpw_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
Denis Vlasenko68404f12008-03-17 09:00:54 +000035int cryptpw_main(int argc ATTRIBUTE_UNUSED, char **argv)
Denis Vlasenkoa035e9f2007-05-08 23:23:35 +000036{
Denis Vlasenko57bf6682007-05-09 21:27:15 +000037 char salt[sizeof("$N$XXXXXXXX")];
Denis Vlasenkoa035e9f2007-05-08 23:23:35 +000038
Denis Vlasenkofe7cd642007-08-18 15:32:12 +000039 if (!getopt32(argv, "a:", NULL) || argv[optind - 1][0] != 'd') {
Denis Vlasenkoa035e9f2007-05-08 23:23:35 +000040 strcpy(salt, "$1$");
Denis Vlasenko57bf6682007-05-09 21:27:15 +000041 /* Too ugly, and needs even more magic to handle endianness: */
42 //((uint32_t*)&salt)[0] = '$' + '1'*0x100 + '$'*0x10000;
43 /* Hope one day gcc will do it itself (inlining strcpy) */
Denis Vlasenko21d10142007-07-20 21:28:41 +000044 crypt_make_salt(salt + 3, 4, 0); /* md5 */
Denis Vlasenko4ea83bf2008-06-12 16:55:59 +000045#if TESTING
46 strcpy(salt + 3, "ajg./bcf");
47#endif
Denis Vlasenko57bf6682007-05-09 21:27:15 +000048 } else {
Denis Vlasenko21d10142007-07-20 21:28:41 +000049 crypt_make_salt(salt, 1, 0); /* des */
Denis Vlasenko4ea83bf2008-06-12 16:55:59 +000050#if TESTING
51 strcpy(salt, "a.");
52#endif
Denis Vlasenkoa035e9f2007-05-08 23:23:35 +000053 }
54
Denis Vlasenko4ea83bf2008-06-12 16:55:59 +000055 puts(pw_encrypt(argv[optind] ? argv[optind] : xmalloc_fgetline(stdin), salt, 1));
Denis Vlasenkoa035e9f2007-05-08 23:23:35 +000056
Denis Vlasenkoa035e9f2007-05-08 23:23:35 +000057 return 0;
58}