diff options
-rw-r--r-- | libbb/Kbuild | 7 | ||||
-rw-r--r-- | libbb/crypt_make_salt.c | 48 | ||||
-rw-r--r-- | loginutils/cryptpw.c | 37 |
3 files changed, 87 insertions, 5 deletions
diff --git a/libbb/Kbuild b/libbb/Kbuild index eeca7d536..5cc8d1428 100644 --- a/libbb/Kbuild +++ b/libbb/Kbuild @@ -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 diff --git a/libbb/crypt_make_salt.c b/libbb/crypt_make_salt.c new file mode 100644 index 000000000..12e96328f --- /dev/null +++ b/libbb/crypt_make_salt.c @@ -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 <thomasez@zelow.no> + * + */ + +#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'; +} + diff --git a/loginutils/cryptpw.c b/loginutils/cryptpw.c new file mode 100644 index 000000000..d4bcad3e0 --- /dev/null +++ b/loginutils/cryptpw.c @@ -0,0 +1,37 @@ +/* vi: set sw=4 ts=4: */ +/* + * cryptpw.c + * + * Cooked from passwd.c by Thomas Lundquist <thomasez@zelow.no> + * + */ + +#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; +} |