diff options
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/Kbuild | 7 | ||||
-rw-r--r-- | libbb/crypt_make_salt.c | 48 |
2 files changed, 50 insertions, 5 deletions
diff --git a/libbb/Kbuild b/libbb/Kbuild index eeca7d5..5cc8d14 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 0000000..12e9632 --- /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'; +} + |