46 lines
1.0 KiB
C
46 lines
1.0 KiB
C
/* 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);
|
|
}
|
|
|
|
int 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;
|
|
}
|