23#pragma warning(disable : 4514)
30#include <linux/kernel.h>
34 int sysinfo(
struct sysinfo *info);
47unsigned char SecureRandomClass::Seeds[SecureRandomClass::SeedLength];
48bool SecureRandomClass::Initialized=
false;
49unsigned int SecureRandomClass::RandomCache[SecureRandomClass::SHADigestBytes /
sizeof(
unsigned int)];
50int SecureRandomClass::RandomCacheEntries=0;
51unsigned int SecureRandomClass::Counter=0;
56 if (Initialized ==
false)
73 for (
int i=0; i<length; i++)
78 unsigned char uctemp=Seeds[SeedLength-1];
79 for (
int j=SeedLength-1; j>=1; j--)
93 if (RandomCacheEntries == 0)
96 char digest[SHADigestBytes];
98 sha.
Hash(Seeds, SeedLength);
101 memcpy(RandomCache, digest, SHADigestBytes);
102 RandomCacheEntries=(SHADigestBytes /
sizeof(
unsigned int));
104 unsigned int *int_seeds=(
unsigned int *)Seeds;
105 int_seeds[0]^=Counter;
106 int_seeds[0]^=(Counter+1);
108 int_seeds[(SeedLength/
sizeof(int))-1]^=Counter;
109 int_seeds[(SeedLength/
sizeof(int))-1]^=(Counter+1);
114 unsigned long retval=RandomCache[--RandomCacheEntries];
118 unsigned long helperval=RandomHelper();
138void SecureRandomClass::Generate_Seed(
void)
143 memset(Seeds, 0xAA, SeedLength);
145 unsigned int *int_seeds=(
unsigned int *)Seeds;
146 int int_seed_length=SeedLength/
sizeof(
unsigned int);
148#ifdef _USE_DEV_RANDOM
153 FILE *in=fopen(
"/dev/random",
"r");
156 for (i=0; i<SeedLength; i++)
165 int_seeds[0]^=getuid();
170 int_seeds[1 % int_seed_length]^=info.loads[0];
171 int_seeds[2 % int_seed_length]^=info.loads[1];
172 int_seeds[3 % int_seed_length]^=info.loads[2];
173 int_seeds[4 % int_seed_length]^=info.freeram;
174 int_seeds[5 % int_seed_length]^=info.freeswap;
175 int_seeds[6 % int_seed_length]^=info.procs;
176 int_seeds[7 % int_seed_length]^=info.bufferram;
182 DWORD spc, bps, nfc, tnc;
183 GetDiskFreeSpace(
NULL, &spc, &bps, &nfc, &tnc);
185 int_seeds[1 % int_seed_length]^=bps;
186 int_seeds[2 % int_seed_length]^=nfc;
187 int_seeds[3 % int_seed_length]^=tnc;
197 GetComputerName(comp_name, &comp_len);
198 GetUserName(user_name, &name_len);
199 for (i=0; i<128; i++)
202 Seeds[(i+0) % SeedLength]^=comp_name[i];
203 Seeds[(i+2) % SeedLength]^=user_name[i];
208 for (i=0; i<int_seed_length; i++)
211 int_seeds[i]^=time(
NULL);
212 else if ((i % 4) == 1)
213 int_seeds[i]^=getpid();
214 else if ((i % 4) == 2)
215 int_seeds[i]^=GetTickCount();
216 else if ((i % 4) == 3)
void Hash(void const *data, long length)
int Result(void *result) const
void Add_Seeds(unsigned char *values, int length)