]> git.ipfire.org Git - thirdparty/openssl.git/blame - crypto/rand/randfile.c
Initial support for MacOS.
[thirdparty/openssl.git] / crypto / rand / randfile.c
CommitLineData
d02b48c6 1/* crypto/rand/randfile.c */
58964a49 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
d02b48c6
RE
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
7d7d2cbc 59#include <errno.h>
d02b48c6 60#include <stdio.h>
a224de3f
BL
61#include <stdlib.h>
62#include <string.h>
17e3dd1c 63
7e701817 64#include "openssl/e_os.h"
17e3dd1c 65
17f389bb
AP
66#ifndef NO_SYS_TYPES_H
67# include <sys/types.h>
68#endif
69#ifdef MAC_OS_pre_X
70# include <stat.h>
71#else
72# include <sys/stat.h>
73#endif
74
ec577822 75#include <openssl/rand.h>
d02b48c6
RE
76
77#undef BUFSIZE
78#define BUFSIZE 1024
79#define RAND_DATA 1024
80
81/* #define RFILE ".rand" - defined in ../../e_os.h */
82
6b691a5c 83int RAND_load_file(const char *file, long bytes)
d02b48c6
RE
84 {
85 MS_STATIC unsigned char buf[BUFSIZE];
86 struct stat sb;
87 int i,ret=0,n;
88 FILE *in;
89
90 if (file == NULL) return(0);
91
92 i=stat(file,&sb);
93 /* If the state fails, put some crap in anyway */
bf5dcd13 94 RAND_seed(&sb,sizeof(sb));
d02b48c6
RE
95 ret+=sizeof(sb);
96 if (i < 0) return(0);
97 if (bytes <= 0) return(ret);
98
41c62a8e 99 in=fopen(file,"rb");
d02b48c6
RE
100 if (in == NULL) goto err;
101 for (;;)
102 {
103 n=(bytes < BUFSIZE)?(int)bytes:BUFSIZE;
104 i=fread(buf,1,n,in);
105 if (i <= 0) break;
106 /* even if n != i, use the full array */
107 RAND_seed(buf,n);
108 ret+=i;
109 bytes-=n;
110 if (bytes <= 0) break;
111 }
112 fclose(in);
113 memset(buf,0,BUFSIZE);
114err:
115 return(ret);
116 }
117
6b691a5c 118int RAND_write_file(const char *file)
d02b48c6
RE
119 {
120 unsigned char buf[BUFSIZE];
121 int i,ret=0;
122 FILE *out;
123 int n;
124
17f389bb 125 /* Under VMS, fopen(file, "wb") will create a new version of the
7d7d2cbc
UM
126 same file. This is not good, so let's try updating an existing
127 one, and create file only if it doesn't already exist. This
128 should be completely harmless on system that have no file
129 versions. -- Richard Levitte */
130 out=fopen(file,"rb+");
17f389bb
AP
131 if (out == NULL
132#ifdef ENOENT
133 && errno == ENOENT
134#endif
135 )
7d7d2cbc
UM
136 {
137 errno = 0;
138 out=fopen(file,"wb");
139 }
d02b48c6 140 if (out == NULL) goto err;
17f389bb 141#ifndef NO_CHMOD
d02b48c6 142 chmod(file,0600);
17f389bb 143#endif
d02b48c6
RE
144 n=RAND_DATA;
145 for (;;)
146 {
147 i=(n > BUFSIZE)?BUFSIZE:n;
148 n-=BUFSIZE;
149 RAND_bytes(buf,i);
150 i=fwrite(buf,1,i,out);
151 if (i <= 0)
152 {
153 ret=0;
154 break;
155 }
156 ret+=i;
157 if (n <= 0) break;
158 }
159 fclose(out);
160 memset(buf,0,BUFSIZE);
161err:
162 return(ret);
163 }
164
6b691a5c 165char *RAND_file_name(char *buf, int size)
d02b48c6
RE
166 {
167 char *s;
168 char *ret=NULL;
169
170 s=getenv("RANDFILE");
171 if (s != NULL)
172 {
173 strncpy(buf,s,size-1);
174 buf[size-1]='\0';
175 ret=buf;
176 }
177 else
178 {
179 s=getenv("HOME");
180 if (s == NULL) return(RFILE);
181 if (((int)(strlen(s)+strlen(RFILE)+2)) > size)
182 return(RFILE);
183 strcpy(buf,s);
7d7d2cbc 184#ifndef VMS
d02b48c6 185 strcat(buf,"/");
7d7d2cbc 186#endif
d02b48c6
RE
187 strcat(buf,RFILE);
188 ret=buf;
189 }
190 return(ret);
191 }