49 lines
1.1 KiB
C
49 lines
1.1 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);
|
||
|
}
|
||
|
|
||
|
|
||
|
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';
|
||
|
}
|
||
|
|