aboutsummaryrefslogtreecommitdiff log msg author committer range
path: root/libbb/crypt_make_salt.c
blob: 393eba5f9bd1ecff1c918ebcba18a480dc98bbe8 (plain)
 ```1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 ``` ``````/* 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 * */ #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); } int FAST_FUNC crypt_make_salt(char *p, int cnt, int x) { x += getpid() + time(NULL); 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'; return x; } ``````