app_rand.c revision 109998
1184610Salfred/* apps/app_rand.c */ 2184610Salfred/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 3184610Salfred * All rights reserved. 4184610Salfred * 5184610Salfred * This package is an SSL implementation written 6184610Salfred * by Eric Young (eay@cryptsoft.com). 7184610Salfred * The implementation was written so as to conform with Netscapes SSL. 8184610Salfred * 9184610Salfred * This library is free for commercial and non-commercial use as long as 10184610Salfred * the following conditions are aheared to. The following conditions 11184610Salfred * apply to all code found in this distribution, be it the RC4, RSA, 12184610Salfred * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13184610Salfred * included with this distribution is covered by the same copyright terms 14184610Salfred * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15184610Salfred * 16184610Salfred * Copyright remains Eric Young's, and as such any Copyright notices in 17184610Salfred * the code are not to be removed. 18184610Salfred * If this package is used in a product, Eric Young should be given attribution 19184610Salfred * as the author of the parts of the library used. 20184610Salfred * This can be in the form of a textual message at program startup or 21184610Salfred * in documentation (online or textual) provided with the package. 22184610Salfred * 23184610Salfred * Redistribution and use in source and binary forms, with or without 24184610Salfred * modification, are permitted provided that the following conditions 25184610Salfred * are met: 26184610Salfred * 1. Redistributions of source code must retain the copyright 27184610Salfred * notice, this list of conditions and the following disclaimer. 28184610Salfred * 2. Redistributions in binary form must reproduce the above copyright 29184610Salfred * notice, this list of conditions and the following disclaimer in the 30184610Salfred * documentation and/or other materials provided with the distribution. 31184610Salfred * 3. All advertising materials mentioning features or use of this software 32184610Salfred * must display the following acknowledgement: 33184610Salfred * "This product includes cryptographic software written by 34184610Salfred * Eric Young (eay@cryptsoft.com)" 35184610Salfred * The word 'cryptographic' can be left out if the rouines from the library 36184610Salfred * being used are not cryptographic related :-). 37184610Salfred * 4. If you include any Windows specific code (or a derivative thereof) from 38184610Salfred * the apps directory (application code) you must include an acknowledgement: 39184610Salfred * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40184610Salfred * 41184610Salfred * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42184610Salfred * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43184610Salfred * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44184610Salfred * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45184610Salfred * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46184610Salfred * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47184610Salfred * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48184610Salfred * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49184610Salfred * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50184610Salfred * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51184610Salfred * SUCH DAMAGE. 52184610Salfred * 53184610Salfred * The licence and distribution terms for any publically available version or 54184610Salfred * derivative of this code cannot be changed. i.e. this code cannot simply be 55184610Salfred * copied and put under another distribution licence 56184610Salfred * [including the GNU Public Licence.] 57184610Salfred */ 58184610Salfred/* ==================================================================== 59184610Salfred * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved. 60184610Salfred * 61184610Salfred * Redistribution and use in source and binary forms, with or without 62184610Salfred * modification, are permitted provided that the following conditions 63184610Salfred * are met: 64184610Salfred * 65184610Salfred * 1. Redistributions of source code must retain the above copyright 66184610Salfred * notice, this list of conditions and the following disclaimer. 67184610Salfred * 68184610Salfred * 2. Redistributions in binary form must reproduce the above copyright 69184610Salfred * notice, this list of conditions and the following disclaimer in 70184610Salfred * the documentation and/or other materials provided with the 71184610Salfred * distribution. 72184610Salfred * 73184610Salfred * 3. All advertising materials mentioning features or use of this 74184610Salfred * software must display the following acknowledgment: 75184610Salfred * "This product includes software developed by the OpenSSL Project 76184610Salfred * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" 77184610Salfred * 78184610Salfred * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 79184610Salfred * endorse or promote products derived from this software without 80184610Salfred * prior written permission. For written permission, please contact 81184610Salfred * openssl-core@openssl.org. 82184610Salfred * 83184610Salfred * 5. Products derived from this software may not be called "OpenSSL" 84184610Salfred * nor may "OpenSSL" appear in their names without prior written 85184610Salfred * permission of the OpenSSL Project. 86184610Salfred * 87184610Salfred * 6. Redistributions of any form whatsoever must retain the following 88184610Salfred * acknowledgment: 89184610Salfred * "This product includes software developed by the OpenSSL Project 90184610Salfred * for use in the OpenSSL Toolkit (http://www.openssl.org/)" 91184610Salfred * 92184610Salfred * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 93184610Salfred * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 94184610Salfred * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 95184610Salfred * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 96184610Salfred * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 97184610Salfred * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 98184610Salfred * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 99184610Salfred * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 100184610Salfred * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 101184610Salfred * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 102184610Salfred * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 103184610Salfred * OF THE POSSIBILITY OF SUCH DAMAGE. 104184610Salfred * ==================================================================== 105184610Salfred * 106184610Salfred * This product includes cryptographic software written by Eric Young 107184610Salfred * (eay@cryptsoft.com). This product includes software written by Tim 108184610Salfred * Hudson (tjh@cryptsoft.com). 109184610Salfred * 110184610Salfred */ 111184610Salfred 112184610Salfred#define NON_MAIN 113184610Salfred#include "apps.h" 114184610Salfred#undef NON_MAIN 115184610Salfred#include <openssl/bio.h> 116187259Sthompsa#include <openssl/rand.h> 117187259Sthompsa 118187259Sthompsa 119187259Sthompsastatic int seeded = 0; 120187259Sthompsastatic int egdsocket = 0; 121187259Sthompsa 122187259Sthompsaint app_RAND_load_file(const char *file, BIO *bio_e, int dont_warn) 123184610Salfred { 124184610Salfred int consider_randfile = (file == NULL); 125184610Salfred char buffer[200]; 126184610Salfred 127184610Salfred#ifdef OPENSSL_SYS_WINDOWS 128184610Salfred BIO_printf(bio_e,"Loading 'screen' into random state -"); 129184610Salfred BIO_flush(bio_e); 130184610Salfred RAND_screen(); 131184610Salfred BIO_printf(bio_e," done\n"); 132184610Salfred#endif 133184610Salfred 134187259Sthompsa if (file == NULL) 135184610Salfred file = RAND_file_name(buffer, sizeof buffer); 136184610Salfred else if (RAND_egd(file) > 0) 137184610Salfred { 138184610Salfred /* we try if the given filename is an EGD socket. 139184610Salfred if it is, we don't write anything back to the file. */ 140184610Salfred egdsocket = 1; 141184610Salfred return 1; 142184610Salfred } 143184610Salfred if (file == NULL || !RAND_load_file(file, -1)) 144184610Salfred { 145 if (RAND_status() == 0) 146 { 147 if (!dont_warn) 148 { 149 BIO_printf(bio_e,"unable to load 'random state'\n"); 150 BIO_printf(bio_e,"This means that the random number generator has not been seeded\n"); 151 BIO_printf(bio_e,"with much random data.\n"); 152 if (consider_randfile) /* explanation does not apply when a file is explicitly named */ 153 { 154 BIO_printf(bio_e,"Consider setting the RANDFILE environment variable to point at a file that\n"); 155 BIO_printf(bio_e,"'random' data can be kept in (the file will be overwritten).\n"); 156 } 157 } 158 return 0; 159 } 160 } 161 seeded = 1; 162 return 1; 163 } 164 165long app_RAND_load_files(char *name) 166 { 167 char *p,*n; 168 int last; 169 long tot=0; 170 int egd; 171 172 for (;;) 173 { 174 last=0; 175 for (p=name; ((*p != '\0') && (*p != LIST_SEPARATOR_CHAR)); p++); 176 if (*p == '\0') last=1; 177 *p='\0'; 178 n=name; 179 name=p+1; 180 if (*n == '\0') break; 181 182 egd=RAND_egd(n); 183 if (egd > 0) 184 tot+=egd; 185 else 186 tot+=RAND_load_file(n,-1); 187 if (last) break; 188 } 189 if (tot > 512) 190 app_RAND_allow_write_file(); 191 return(tot); 192 } 193 194int app_RAND_write_file(const char *file, BIO *bio_e) 195 { 196 char buffer[200]; 197 198 if (egdsocket || !seeded) 199 /* If we did not manage to read the seed file, 200 * we should not write a low-entropy seed file back -- 201 * it would suppress a crucial warning the next time 202 * we want to use it. */ 203 return 0; 204 205 if (file == NULL) 206 file = RAND_file_name(buffer, sizeof buffer); 207 if (file == NULL || !RAND_write_file(file)) 208 { 209 BIO_printf(bio_e,"unable to write 'random state'\n"); 210 return 0; 211 } 212 return 1; 213 } 214 215void app_RAND_allow_write_file(void) 216 { 217 seeded = 1; 218 } 219