Denis Vlasenko | a035e9f | 2007-05-08 23:23:35 +0000 | [diff] [blame] | 1 | /* vi: set sw=4 ts=4: */ |
| 2 | /* |
| 3 | * cryptpw.c |
Denis Vlasenko | 4b924f3 | 2007-05-30 00:29:55 +0000 | [diff] [blame] | 4 | * |
Denis Vlasenko | a035e9f | 2007-05-08 23:23:35 +0000 | [diff] [blame] | 5 | * Cooked from passwd.c by Thomas Lundquist <thomasez@zelow.no> |
Denis Vlasenko | a035e9f | 2007-05-08 23:23:35 +0000 | [diff] [blame] | 6 | */ |
| 7 | |
Denis Vlasenko | b6adbf1 | 2007-05-26 19:00:18 +0000 | [diff] [blame] | 8 | #include "libbb.h" |
Denis Vlasenko | a035e9f | 2007-05-08 23:23:35 +0000 | [diff] [blame] | 9 | |
Denis Vlasenko | 4ea83bf | 2008-06-12 16:55:59 +0000 | [diff] [blame^] | 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 | |
Denis Vlasenko | 9b49a5e | 2007-10-11 10:05:36 +0000 | [diff] [blame] | 34 | int cryptpw_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
Denis Vlasenko | 68404f1 | 2008-03-17 09:00:54 +0000 | [diff] [blame] | 35 | int cryptpw_main(int argc ATTRIBUTE_UNUSED, char **argv) |
Denis Vlasenko | a035e9f | 2007-05-08 23:23:35 +0000 | [diff] [blame] | 36 | { |
Denis Vlasenko | 57bf668 | 2007-05-09 21:27:15 +0000 | [diff] [blame] | 37 | char salt[sizeof("$N$XXXXXXXX")]; |
Denis Vlasenko | a035e9f | 2007-05-08 23:23:35 +0000 | [diff] [blame] | 38 | |
Denis Vlasenko | fe7cd64 | 2007-08-18 15:32:12 +0000 | [diff] [blame] | 39 | if (!getopt32(argv, "a:", NULL) || argv[optind - 1][0] != 'd') { |
Denis Vlasenko | a035e9f | 2007-05-08 23:23:35 +0000 | [diff] [blame] | 40 | strcpy(salt, "$1$"); |
Denis Vlasenko | 57bf668 | 2007-05-09 21:27:15 +0000 | [diff] [blame] | 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) */ |
Denis Vlasenko | 21d1014 | 2007-07-20 21:28:41 +0000 | [diff] [blame] | 44 | crypt_make_salt(salt + 3, 4, 0); /* md5 */ |
Denis Vlasenko | 4ea83bf | 2008-06-12 16:55:59 +0000 | [diff] [blame^] | 45 | #if TESTING |
| 46 | strcpy(salt + 3, "ajg./bcf"); |
| 47 | #endif |
Denis Vlasenko | 57bf668 | 2007-05-09 21:27:15 +0000 | [diff] [blame] | 48 | } else { |
Denis Vlasenko | 21d1014 | 2007-07-20 21:28:41 +0000 | [diff] [blame] | 49 | crypt_make_salt(salt, 1, 0); /* des */ |
Denis Vlasenko | 4ea83bf | 2008-06-12 16:55:59 +0000 | [diff] [blame^] | 50 | #if TESTING |
| 51 | strcpy(salt, "a."); |
| 52 | #endif |
Denis Vlasenko | a035e9f | 2007-05-08 23:23:35 +0000 | [diff] [blame] | 53 | } |
| 54 | |
Denis Vlasenko | 4ea83bf | 2008-06-12 16:55:59 +0000 | [diff] [blame^] | 55 | puts(pw_encrypt(argv[optind] ? argv[optind] : xmalloc_fgetline(stdin), salt, 1)); |
Denis Vlasenko | a035e9f | 2007-05-08 23:23:35 +0000 | [diff] [blame] | 56 | |
Denis Vlasenko | a035e9f | 2007-05-08 23:23:35 +0000 | [diff] [blame] | 57 | return 0; |
| 58 | } |