#ifndef __RPCASYNC_H__
#define __RPCASYNC_H__
#endif
#include <windows.h>
#include <wincrypt.h>
#include <stdio.h>
unsigned int getrandom_chars(int desired, unsigned char *buf, int lenbuf);
BOOL create_random_file(char *filename);
BOOL
init_randfile()
{
FILE *rf;
char *randfile;
char *homedir;
char tmp[256];
randfile = getenv("RANDFILE");
if (randfile != NULL) {
rf = fopen(randfile, "rb");
if (rf != NULL) {
fclose(rf);
return (TRUE);
}
else {
return (create_random_file(randfile));
}
}
homedir = getenv("HOME");
if (homedir != NULL) {
strcpy(tmp, homedir);
strcat(tmp, "\\.rnd");
rf = fopen(tmp, "rb");
if (rf != NULL) {
fclose(rf);
return (TRUE);
}
else {
return (create_random_file(tmp));
}
}
rf = fopen("C:\\.rnd", "rb");
if (rf != NULL) {
fclose(rf);
return (TRUE);
}
return (create_random_file("C:\\.rnd"));
}
BOOL
create_random_file(char *filename) {
FILE *rf;
int nchars;
unsigned char buf[1025];
nchars = getrandom_chars(1024, buf, sizeof(buf));
rf = fopen(filename, "wb");
if (rf == NULL)
return (FALSE);
fwrite(buf, sizeof(unsigned char), nchars, rf);
fclose(rf);
return (TRUE);
}
unsigned int
getrandom_chars(int desired, unsigned char *buf, int lenbuf) {
HCRYPTPROV hcryptprov;
BOOL err;
if (buf == NULL || lenbuf <= 0 || desired > lenbuf)
return (0);
err = CryptAcquireContext(&hcryptprov, NULL, NULL, PROV_RSA_FULL,
CRYPT_VERIFYCONTEXT);
if (!err){
return (0);
}
if (!CryptGenRandom(hcryptprov, desired, buf)) {
CryptReleaseContext(hcryptprov, 0);
return (0);
}
CryptReleaseContext(hcryptprov, 0);
return (desired);
}