cryptpw: forgot svn add... how typical of me :(
No binary (build failed)
—
(log yok)
| @@ -21,7 +21,6 @@ lib-y += copyfd.o | |
| lib-y += crc32.o | |
| lib-y += create_icmp6_socket.o | |
| lib-y += create_icmp_socket.o | |
| - | lib-y += crypt_make_salt.o |
| lib-y += default_error_retval.o | |
| lib-y += device_open.o | |
| lib-y += dump.o | |
| @@ -103,10 +102,8 @@ lib-y += xreadlink.o | |
| lib-$(CONFIG_FEATURE_MOUNT_LOOP) += loop.o | |
| lib-$(CONFIG_LOSETUP) += loop.o | |
| lib-$(CONFIG_FEATURE_MTAB_SUPPORT) += mtab.o | |
| - | lib-$(CONFIG_PASSWD) += pw_encrypt.o |
| - | lib-$(CONFIG_PASSWD) += crypt_make_salt.o |
| - | lib-$(CONFIG_CRYPTPW) += pw_encrypt.o |
| - | lib-$(CONFIG_CRYPTPW) += crypt_make_salt.o |
| + | lib-$(CONFIG_PASSWD) += pw_encrypt.o crypt_make_salt.o |
| + | lib-$(CONFIG_CRYPTPW) += pw_encrypt.o crypt_make_salt.o |
| lib-$(CONFIG_SULOGIN) += pw_encrypt.o | |
| lib-$(CONFIG_FEATURE_HTTPD_AUTH_MD5) += pw_encrypt.o | |
| lib-$(CONFIG_VLOCK) += correct_password.o | |
| @@ -0,0 +1,48 @@ | |
| + | /* vi: set sw=4 ts=4: */ |
| + | /* |
| + | * crypt_make_salt |
| + | * |
| + | * i64c was also put here, this is the only function that uses it. |
| + | * |
| + | * Lifted from loginutils/passwd.c by Thomas Lundquist <[email protected]> |
| + | * |
| + | */ |
| + | |
| + | #include "libbb.h" |
| + | |
| + | static int i64c(int i) |
| + | { |
| + | i &= 0x3f; |
| + | if (i == 0) |
| + | return '.'; |
| + | if (i == 1) |
| + | return '/'; |
| + | if (i < 12) |
| + | return ('0' - 2 + i); |
| + | if (i < 38) |
| + | return ('A' - 12 + i); |
| + | return ('a' - 38 + i); |
| + | } |
| + | |
| + | |
| + | void crypt_make_salt(char *p, int cnt) |
| + | { |
| + | unsigned x = x; /* it's pointless to initialize it anyway :) */ |
| + | |
| + | x += getpid() + time(NULL) + clock(); |
| + | do { |
| + | /* x = (x*1664525 + 1013904223) % 2^32 generator is lame |
| + | * (low-order bit is not "random", etc...), |
| + | * but for our purposes it is good enough */ |
| + | x = x*1664525 + 1013904223; |
| + | /* BTW, Park and Miller's "minimal standard generator" is |
| + | * x = x*16807 % ((2^31)-1) |
| + | * It has no problem with visibly alternating lowest bit |
| + | * but is also weak in cryptographic sense + needs div, |
| + | * which needs more code (and slower) on many CPUs */ |
| + | *p++ = i64c(x >> 16); |
| + | *p++ = i64c(x >> 22); |
| + | } while (--cnt); |
| + | *p = '\0'; |
| + | } |
| + | |
| @@ -0,0 +1,37 @@ | |
| + | /* vi: set sw=4 ts=4: */ |
| + | /* |
| + | * cryptpw.c |
| + | * |
| + | * Cooked from passwd.c by Thomas Lundquist <[email protected]> |
| + | * |
| + | */ |
| + | |
| + | #include "busybox.h" |
| + | |
| + | int cryptpw_main(int argc, char **argv); |
| + | int cryptpw_main(int argc, char **argv) |
| + | { |
| + | char *clear; |
| + | char salt[sizeof("$N$XXXXXXXX")]; /* "$N$XXXXXXXX" or "XX" */ |
| + | const char *opt_a = "md5"; |
| + | |
| + | getopt32(argc, argv, "a:", &opt_a); |
| + | /* move past the commandline options */ |
| + | /*argc -= optind; - unused */ |
| + | argv += optind; |
| + | |
| + | crypt_make_salt(salt, 1); /* des */ |
| + | if (strcasecmp(opt_a, "md5") == 0) { |
| + | strcpy(salt, "$1$"); |
| + | crypt_make_salt(salt + 3, 4); |
| + | } else if (strcasecmp(opt_a, "des") != 0) { |
| + | bb_show_usage(); |
| + | } |
| + | |
| + | clear = argv[0]; |
| + | if (!clear) |
| + | clear = xmalloc_getline(stdin); |
| + | |
| + | puts(pw_encrypt(clear, salt)); |
| + | return 0; |
| + | } |