Annotation of embedaddon/ntp/ports/winnt/libntp/randfile.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Make sure that there is a good source of random characters
3: * so that OpenSSL can work properly and securely.
4: */
5:
6: #include <config.h>
7: #include <wincrypt.h>
8:
9: #include <stdio.h>
10:
11: unsigned int getrandom_chars(int desired, unsigned char *buf, int lenbuf);
12: BOOL create_random_file(char *filename);
13:
14: BOOL
15: init_randfile()
16: {
17: FILE *rf;
18: char *randfile;
19: char *homedir;
20: char tmp[256];
21: /* See if the environmental variable RANDFILE is defined
22: * and the file exists
23: */
24: randfile = getenv("RANDFILE");
25: if (randfile != NULL) {
26: rf = fopen(randfile, "rb");
27: if (rf != NULL) {
28: fclose(rf);
29: return (TRUE);
30: }
31: else {
32: /* The environmental variable exists but not the file */
33: return (create_random_file(randfile));
34: }
35: }
36: /*
37: * If the RANDFILE environmental variable does not exist,
38: * see if the HOME enviromental variable exists and
39: * a .rnd file is in there.
40: */
41: homedir = getenv("HOME");
42: if (homedir != NULL &&
43: (strlen(homedir) + 5 /* \.rnd */) < sizeof(tmp)) {
44: strncpy(tmp, homedir, sizeof(tmp));
45: strcat(tmp, "\\.rnd");
46: rf = fopen(tmp, "rb");
47: if (rf != NULL) {
48: fclose(rf);
49: return (TRUE);
50: }
51: else {
52: /* The HOME environmental variable exists but not the file */
53: return (create_random_file(tmp));
54: }
55: }
56: /*
57: * Final try. Look for it on the C:\ directory
58: * NOTE: This is a really bad place for it security-wise
59: * However, OpenSSL looks for it there if it can't find it elsewhere
60: */
61: rf = fopen("C:\\.rnd", "rb");
62: if (rf != NULL) {
63: fclose(rf);
64: return (TRUE);
65: }
66: /* The file does not exist */
67: return (create_random_file("C:\\.rnd"));
68: }
69: /*
70: * Routine to create the random file with 1024 random characters
71: */
72: BOOL
73: create_random_file(char *filename) {
74: FILE *rf;
75: int nchars;
76: unsigned char buf[1025];
77:
78: nchars = getrandom_chars(1024, buf, sizeof(buf));
79: rf = fopen(filename, "wb");
80: if (rf == NULL)
81: return (FALSE);
82: fwrite(buf, sizeof(unsigned char), nchars, rf);
83: fclose(rf);
84: return (TRUE);
85: }
86:
87: unsigned int
88: getrandom_chars(int desired, unsigned char *buf, int lenbuf) {
89: HCRYPTPROV hcryptprov;
90: BOOL err;
91:
92: if (buf == NULL || lenbuf <= 0 || desired > lenbuf)
93: return (0);
94: /*
95: * The first time we just try to acquire the context
96: */
97: err = CryptAcquireContext(&hcryptprov, NULL, NULL, PROV_RSA_FULL,
98: CRYPT_VERIFYCONTEXT);
99: if (!err){
100: return (0);
101: }
102: if (!CryptGenRandom(hcryptprov, desired, buf)) {
103: CryptReleaseContext(hcryptprov, 0);
104: return (0);
105: }
106:
107: CryptReleaseContext(hcryptprov, 0);
108: return (desired);
109: }
110:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>