uclibc insists on having 70k static buffer for crypt.
[oweals/busybox.git] / loginutils / cryptpw.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * cryptpw.c
4  *
5  * Cooked from passwd.c by Thomas Lundquist <thomasez@zelow.no>
6  */
7
8 #include "libbb.h"
9
10 #define TESTING 0
11
12 /*
13 set TESTING to 1 and pipe some file through this script
14 if you played with bbox's crypt implementation.
15
16 while 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         }
31 done
32  */
33
34 int cryptpw_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
35 int cryptpw_main(int argc ATTRIBUTE_UNUSED, char **argv)
36 {
37         char salt[sizeof("$N$XXXXXXXX")];
38
39         if (!getopt32(argv, "a:", NULL) || argv[optind - 1][0] != 'd') {
40                 strcpy(salt, "$1$");
41                 /* 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) */
44                 crypt_make_salt(salt + 3, 4, 0); /* md5 */
45 #if TESTING
46                 strcpy(salt + 3, "ajg./bcf");
47 #endif
48         } else {
49                 crypt_make_salt(salt, 1, 0);     /* des */
50 #if TESTING
51                 strcpy(salt, "a.");
52 #endif
53         }
54
55         puts(pw_encrypt(argv[optind] ? argv[optind] : xmalloc_fgetline(stdin), salt, 1));
56
57         return 0;
58 }