diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libcrypto/rand/randfile.c | 152 |
1 files changed, 5 insertions, 147 deletions
diff --git a/src/lib/libcrypto/rand/randfile.c b/src/lib/libcrypto/rand/randfile.c index 10d511b8e8..2cacebcf07 100644 --- a/src/lib/libcrypto/rand/randfile.c +++ b/src/lib/libcrypto/rand/randfile.c | |||
| @@ -56,11 +56,6 @@ | |||
| 56 | * [including the GNU Public Licence.] | 56 | * [including the GNU Public Licence.] |
| 57 | */ | 57 | */ |
| 58 | 58 | ||
| 59 | /* We need to define this to get macros like S_IFBLK and S_IFCHR */ | ||
| 60 | #if !defined(OPENSSL_SYS_VXWORKS) | ||
| 61 | #define _XOPEN_SOURCE 500 | ||
| 62 | #endif | ||
| 63 | |||
| 64 | #include <errno.h> | 59 | #include <errno.h> |
| 65 | #include <stdio.h> | 60 | #include <stdio.h> |
| 66 | #include <stdlib.h> | 61 | #include <stdlib.h> |
| @@ -71,35 +66,14 @@ | |||
| 71 | #include <openssl/rand.h> | 66 | #include <openssl/rand.h> |
| 72 | #include <openssl/buffer.h> | 67 | #include <openssl/buffer.h> |
| 73 | 68 | ||
| 74 | #ifdef OPENSSL_SYS_VMS | 69 | #include <sys/types.h> |
| 75 | #include <unixio.h> | 70 | #include <sys/stat.h> |
| 76 | #endif | 71 | #include <fcntl.h> |
| 77 | #ifndef NO_SYS_TYPES_H | ||
| 78 | # include <sys/types.h> | ||
| 79 | #endif | ||
| 80 | #ifndef OPENSSL_NO_POSIX_IO | ||
| 81 | # include <sys/stat.h> | ||
| 82 | #endif | ||
| 83 | |||
| 84 | #ifdef _WIN32 | ||
| 85 | #define stat _stat | ||
| 86 | #define chmod _chmod | ||
| 87 | #define open _open | ||
| 88 | #define fdopen _fdopen | ||
| 89 | #endif | ||
| 90 | 72 | ||
| 91 | #undef BUFSIZE | 73 | #undef BUFSIZE |
| 92 | #define BUFSIZE 1024 | 74 | #define BUFSIZE 1024 |
| 93 | #define RAND_DATA 1024 | 75 | #define RAND_DATA 1024 |
| 94 | 76 | ||
| 95 | #ifdef OPENSSL_SYS_VMS | ||
| 96 | /* This declaration is a nasty hack to get around vms' extension to fopen | ||
| 97 | * for passing in sharing options being disabled by our /STANDARD=ANSI89 */ | ||
| 98 | static FILE *(*const vms_fopen)(const char *, const char *, ...) = | ||
| 99 | (FILE *(*)(const char *, const char *, ...))fopen; | ||
| 100 | #define VMS_OPEN_ATTRS "shr=get,put,upd,del","ctx=bin,stm","rfm=stm","rat=none","mrs=0" | ||
| 101 | #endif | ||
| 102 | |||
| 103 | /* #define RFILE ".rnd" - defined in ../../e_os.h */ | 77 | /* #define RFILE ".rnd" - defined in ../../e_os.h */ |
| 104 | 78 | ||
| 105 | /* Note that these functions are intended for seed files only. | 79 | /* Note that these functions are intended for seed files only. |
| @@ -107,75 +81,7 @@ static FILE *(*const vms_fopen)(const char *, const char *, ...) = | |||
| 107 | 81 | ||
| 108 | int RAND_load_file(const char *file, long bytes) | 82 | int RAND_load_file(const char *file, long bytes) |
| 109 | { | 83 | { |
| 110 | /* If bytes >= 0, read up to 'bytes' bytes. | 84 | return(0); |
| 111 | * if bytes == -1, read complete file. */ | ||
| 112 | |||
| 113 | unsigned char buf[BUFSIZE]; | ||
| 114 | #ifndef OPENSSL_NO_POSIX_IO | ||
| 115 | struct stat sb; | ||
| 116 | #endif | ||
| 117 | int i,ret=0,n; | ||
| 118 | FILE *in; | ||
| 119 | |||
| 120 | if (file == NULL) return(0); | ||
| 121 | |||
| 122 | #ifndef OPENSSL_NO_POSIX_IO | ||
| 123 | #ifdef PURIFY | ||
| 124 | /* struct stat can have padding and unused fields that may not be | ||
| 125 | * initialized in the call to stat(). We need to clear the entire | ||
| 126 | * structure before calling RAND_add() to avoid complaints from | ||
| 127 | * applications such as Valgrind. | ||
| 128 | */ | ||
| 129 | memset(&sb, 0, sizeof(sb)); | ||
| 130 | #endif | ||
| 131 | if (stat(file,&sb) < 0) return(0); | ||
| 132 | RAND_add(&sb,sizeof(sb),0.0); | ||
| 133 | #endif | ||
| 134 | if (bytes == 0) return(ret); | ||
| 135 | |||
| 136 | #ifdef OPENSSL_SYS_VMS | ||
| 137 | in=vms_fopen(file,"rb",VMS_OPEN_ATTRS); | ||
| 138 | #else | ||
| 139 | in=fopen(file,"rb"); | ||
| 140 | #endif | ||
| 141 | if (in == NULL) goto err; | ||
| 142 | #if defined(S_IFBLK) && defined(S_IFCHR) && !defined(OPENSSL_NO_POSIX_IO) | ||
| 143 | if (sb.st_mode & (S_IFBLK | S_IFCHR)) { | ||
| 144 | /* this file is a device. we don't want read an infinite number | ||
| 145 | * of bytes from a random device, nor do we want to use buffered | ||
| 146 | * I/O because we will waste system entropy. | ||
| 147 | */ | ||
| 148 | bytes = (bytes == -1) ? 2048 : bytes; /* ok, is 2048 enough? */ | ||
| 149 | #ifndef OPENSSL_NO_SETVBUF_IONBF | ||
| 150 | setvbuf(in, NULL, _IONBF, 0); /* don't do buffered reads */ | ||
| 151 | #endif /* ndef OPENSSL_NO_SETVBUF_IONBF */ | ||
| 152 | } | ||
| 153 | #endif | ||
| 154 | for (;;) | ||
| 155 | { | ||
| 156 | if (bytes > 0) | ||
| 157 | n = (bytes < BUFSIZE)?(int)bytes:BUFSIZE; | ||
| 158 | else | ||
| 159 | n = BUFSIZE; | ||
| 160 | i=fread(buf,1,n,in); | ||
| 161 | if (i <= 0) break; | ||
| 162 | #ifdef PURIFY | ||
| 163 | RAND_add(buf,i,(double)i); | ||
| 164 | #else | ||
| 165 | /* even if n != i, use the full array */ | ||
| 166 | RAND_add(buf,n,(double)i); | ||
| 167 | #endif | ||
| 168 | ret+=i; | ||
| 169 | if (bytes > 0) | ||
| 170 | { | ||
| 171 | bytes-=n; | ||
| 172 | if (bytes <= 0) break; | ||
| 173 | } | ||
| 174 | } | ||
| 175 | fclose(in); | ||
| 176 | OPENSSL_cleanse(buf,BUFSIZE); | ||
| 177 | err: | ||
| 178 | return(ret); | ||
| 179 | } | 85 | } |
| 180 | 86 | ||
| 181 | int RAND_write_file(const char *file) | 87 | int RAND_write_file(const char *file) |
| @@ -184,12 +90,10 @@ int RAND_write_file(const char *file) | |||
| 184 | int i,ret=0,rand_err=0; | 90 | int i,ret=0,rand_err=0; |
| 185 | FILE *out = NULL; | 91 | FILE *out = NULL; |
| 186 | int n; | 92 | int n; |
| 187 | #ifndef OPENSSL_NO_POSIX_IO | ||
| 188 | struct stat sb; | 93 | struct stat sb; |
| 189 | 94 | ||
| 190 | i=stat(file,&sb); | 95 | i=stat(file,&sb); |
| 191 | if (i != -1) { | 96 | if (i != -1) { |
| 192 | #if defined(S_ISBLK) && defined(S_ISCHR) | ||
| 193 | if (S_ISBLK(sb.st_mode) || S_ISCHR(sb.st_mode)) { | 97 | if (S_ISBLK(sb.st_mode) || S_ISCHR(sb.st_mode)) { |
| 194 | /* this file is a device. we don't write back to it. | 98 | /* this file is a device. we don't write back to it. |
| 195 | * we "succeed" on the assumption this is some sort | 99 | * we "succeed" on the assumption this is some sort |
| @@ -198,55 +102,21 @@ int RAND_write_file(const char *file) | |||
| 198 | */ | 102 | */ |
| 199 | return(1); | 103 | return(1); |
| 200 | } | 104 | } |
| 201 | #endif | ||
| 202 | } | 105 | } |
| 203 | #endif | ||
| 204 | 106 | ||
| 205 | #if defined(O_CREAT) && !defined(OPENSSL_NO_POSIX_IO) && !defined(OPENSSL_SYS_VMS) | ||
| 206 | { | 107 | { |
| 207 | #ifndef O_BINARY | ||
| 208 | #define O_BINARY 0 | ||
| 209 | #endif | ||
| 210 | /* chmod(..., 0600) is too late to protect the file, | 108 | /* chmod(..., 0600) is too late to protect the file, |
| 211 | * permissions should be restrictive from the start */ | 109 | * permissions should be restrictive from the start */ |
| 212 | int fd = open(file, O_WRONLY|O_CREAT|O_BINARY, 0600); | 110 | int fd = open(file, O_WRONLY|O_CREAT, 0600); |
| 213 | if (fd != -1) | 111 | if (fd != -1) |
| 214 | out = fdopen(fd, "wb"); | 112 | out = fdopen(fd, "wb"); |
| 215 | } | 113 | } |
| 216 | #endif | ||
| 217 | |||
| 218 | #ifdef OPENSSL_SYS_VMS | ||
| 219 | /* VMS NOTE: Prior versions of this routine created a _new_ | ||
| 220 | * version of the rand file for each call into this routine, then | ||
| 221 | * deleted all existing versions named ;-1, and finally renamed | ||
| 222 | * the current version as ';1'. Under concurrent usage, this | ||
| 223 | * resulted in an RMS race condition in rename() which could | ||
| 224 | * orphan files (see vms message help for RMS$_REENT). With the | ||
| 225 | * fopen() calls below, openssl/VMS now shares the top-level | ||
| 226 | * version of the rand file. Note that there may still be | ||
| 227 | * conditions where the top-level rand file is locked. If so, this | ||
| 228 | * code will then create a new version of the rand file. Without | ||
| 229 | * the delete and rename code, this can result in ascending file | ||
| 230 | * versions that stop at version 32767, and this routine will then | ||
| 231 | * return an error. The remedy for this is to recode the calling | ||
| 232 | * application to avoid concurrent use of the rand file, or | ||
| 233 | * synchronize usage at the application level. Also consider | ||
| 234 | * whether or not you NEED a persistent rand file in a concurrent | ||
| 235 | * use situation. | ||
| 236 | */ | ||
| 237 | 114 | ||
| 238 | out = vms_fopen(file,"rb+",VMS_OPEN_ATTRS); | ||
| 239 | if (out == NULL) | ||
| 240 | out = vms_fopen(file,"wb",VMS_OPEN_ATTRS); | ||
| 241 | #else | ||
| 242 | if (out == NULL) | 115 | if (out == NULL) |
| 243 | out = fopen(file,"wb"); | 116 | out = fopen(file,"wb"); |
| 244 | #endif | ||
| 245 | if (out == NULL) goto err; | 117 | if (out == NULL) goto err; |
| 246 | 118 | ||
| 247 | #ifndef NO_CHMOD | ||
| 248 | chmod(file,0600); | 119 | chmod(file,0600); |
| 249 | #endif | ||
| 250 | n=RAND_DATA; | 120 | n=RAND_DATA; |
| 251 | for (;;) | 121 | for (;;) |
| 252 | { | 122 | { |
| @@ -273,9 +143,7 @@ err: | |||
| 273 | const char *RAND_file_name(char *buf, size_t size) | 143 | const char *RAND_file_name(char *buf, size_t size) |
| 274 | { | 144 | { |
| 275 | char *s=NULL; | 145 | char *s=NULL; |
| 276 | #ifdef __OpenBSD__ | ||
| 277 | struct stat sb; | 146 | struct stat sb; |
| 278 | #endif | ||
| 279 | 147 | ||
| 280 | if (OPENSSL_issetugid() == 0) | 148 | if (OPENSSL_issetugid() == 0) |
| 281 | s=getenv("RANDFILE"); | 149 | s=getenv("RANDFILE"); |
| @@ -288,25 +156,16 @@ const char *RAND_file_name(char *buf, size_t size) | |||
| 288 | { | 156 | { |
| 289 | if (OPENSSL_issetugid() == 0) | 157 | if (OPENSSL_issetugid() == 0) |
| 290 | s=getenv("HOME"); | 158 | s=getenv("HOME"); |
| 291 | #ifdef DEFAULT_HOME | ||
| 292 | if (s == NULL) | ||
| 293 | { | ||
| 294 | s = DEFAULT_HOME; | ||
| 295 | } | ||
| 296 | #endif | ||
| 297 | if (s && *s && strlen(s)+strlen(RFILE)+2 < size) | 159 | if (s && *s && strlen(s)+strlen(RFILE)+2 < size) |
| 298 | { | 160 | { |
| 299 | BUF_strlcpy(buf,s,size); | 161 | BUF_strlcpy(buf,s,size); |
| 300 | #ifndef OPENSSL_SYS_VMS | ||
| 301 | BUF_strlcat(buf,"/",size); | 162 | BUF_strlcat(buf,"/",size); |
| 302 | #endif | ||
| 303 | BUF_strlcat(buf,RFILE,size); | 163 | BUF_strlcat(buf,RFILE,size); |
| 304 | } | 164 | } |
| 305 | else | 165 | else |
| 306 | buf[0] = '\0'; /* no file name */ | 166 | buf[0] = '\0'; /* no file name */ |
| 307 | } | 167 | } |
| 308 | 168 | ||
| 309 | #ifdef __OpenBSD__ | ||
| 310 | /* given that all random loads just fail if the file can't be | 169 | /* given that all random loads just fail if the file can't be |
| 311 | * seen on a stat, we stat the file we're returning, if it | 170 | * seen on a stat, we stat the file we're returning, if it |
| 312 | * fails, use /dev/arandom instead. this allows the user to | 171 | * fails, use /dev/arandom instead. this allows the user to |
| @@ -323,6 +182,5 @@ const char *RAND_file_name(char *buf, size_t size) | |||
| 323 | return(NULL); | 182 | return(NULL); |
| 324 | } | 183 | } |
| 325 | 184 | ||
| 326 | #endif | ||
| 327 | return(buf); | 185 | return(buf); |
| 328 | } | 186 | } |
