1*ebfedea0SLionel Sambuc /* apps/app_rand.c */ 2*ebfedea0SLionel Sambuc /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 3*ebfedea0SLionel Sambuc * All rights reserved. 4*ebfedea0SLionel Sambuc * 5*ebfedea0SLionel Sambuc * This package is an SSL implementation written 6*ebfedea0SLionel Sambuc * by Eric Young (eay@cryptsoft.com). 7*ebfedea0SLionel Sambuc * The implementation was written so as to conform with Netscapes SSL. 8*ebfedea0SLionel Sambuc * 9*ebfedea0SLionel Sambuc * This library is free for commercial and non-commercial use as long as 10*ebfedea0SLionel Sambuc * the following conditions are aheared to. The following conditions 11*ebfedea0SLionel Sambuc * apply to all code found in this distribution, be it the RC4, RSA, 12*ebfedea0SLionel Sambuc * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13*ebfedea0SLionel Sambuc * included with this distribution is covered by the same copyright terms 14*ebfedea0SLionel Sambuc * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15*ebfedea0SLionel Sambuc * 16*ebfedea0SLionel Sambuc * Copyright remains Eric Young's, and as such any Copyright notices in 17*ebfedea0SLionel Sambuc * the code are not to be removed. 18*ebfedea0SLionel Sambuc * If this package is used in a product, Eric Young should be given attribution 19*ebfedea0SLionel Sambuc * as the author of the parts of the library used. 20*ebfedea0SLionel Sambuc * This can be in the form of a textual message at program startup or 21*ebfedea0SLionel Sambuc * in documentation (online or textual) provided with the package. 22*ebfedea0SLionel Sambuc * 23*ebfedea0SLionel Sambuc * Redistribution and use in source and binary forms, with or without 24*ebfedea0SLionel Sambuc * modification, are permitted provided that the following conditions 25*ebfedea0SLionel Sambuc * are met: 26*ebfedea0SLionel Sambuc * 1. Redistributions of source code must retain the copyright 27*ebfedea0SLionel Sambuc * notice, this list of conditions and the following disclaimer. 28*ebfedea0SLionel Sambuc * 2. Redistributions in binary form must reproduce the above copyright 29*ebfedea0SLionel Sambuc * notice, this list of conditions and the following disclaimer in the 30*ebfedea0SLionel Sambuc * documentation and/or other materials provided with the distribution. 31*ebfedea0SLionel Sambuc * 3. All advertising materials mentioning features or use of this software 32*ebfedea0SLionel Sambuc * must display the following acknowledgement: 33*ebfedea0SLionel Sambuc * "This product includes cryptographic software written by 34*ebfedea0SLionel Sambuc * Eric Young (eay@cryptsoft.com)" 35*ebfedea0SLionel Sambuc * The word 'cryptographic' can be left out if the rouines from the library 36*ebfedea0SLionel Sambuc * being used are not cryptographic related :-). 37*ebfedea0SLionel Sambuc * 4. If you include any Windows specific code (or a derivative thereof) from 38*ebfedea0SLionel Sambuc * the apps directory (application code) you must include an acknowledgement: 39*ebfedea0SLionel Sambuc * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40*ebfedea0SLionel Sambuc * 41*ebfedea0SLionel Sambuc * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42*ebfedea0SLionel Sambuc * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43*ebfedea0SLionel Sambuc * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44*ebfedea0SLionel Sambuc * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45*ebfedea0SLionel Sambuc * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46*ebfedea0SLionel Sambuc * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47*ebfedea0SLionel Sambuc * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48*ebfedea0SLionel Sambuc * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49*ebfedea0SLionel Sambuc * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50*ebfedea0SLionel Sambuc * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51*ebfedea0SLionel Sambuc * SUCH DAMAGE. 52*ebfedea0SLionel Sambuc * 53*ebfedea0SLionel Sambuc * The licence and distribution terms for any publically available version or 54*ebfedea0SLionel Sambuc * derivative of this code cannot be changed. i.e. this code cannot simply be 55*ebfedea0SLionel Sambuc * copied and put under another distribution licence 56*ebfedea0SLionel Sambuc * [including the GNU Public Licence.] 57*ebfedea0SLionel Sambuc */ 58*ebfedea0SLionel Sambuc /* ==================================================================== 59*ebfedea0SLionel Sambuc * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved. 60*ebfedea0SLionel Sambuc * 61*ebfedea0SLionel Sambuc * Redistribution and use in source and binary forms, with or without 62*ebfedea0SLionel Sambuc * modification, are permitted provided that the following conditions 63*ebfedea0SLionel Sambuc * are met: 64*ebfedea0SLionel Sambuc * 65*ebfedea0SLionel Sambuc * 1. Redistributions of source code must retain the above copyright 66*ebfedea0SLionel Sambuc * notice, this list of conditions and the following disclaimer. 67*ebfedea0SLionel Sambuc * 68*ebfedea0SLionel Sambuc * 2. Redistributions in binary form must reproduce the above copyright 69*ebfedea0SLionel Sambuc * notice, this list of conditions and the following disclaimer in 70*ebfedea0SLionel Sambuc * the documentation and/or other materials provided with the 71*ebfedea0SLionel Sambuc * distribution. 72*ebfedea0SLionel Sambuc * 73*ebfedea0SLionel Sambuc * 3. All advertising materials mentioning features or use of this 74*ebfedea0SLionel Sambuc * software must display the following acknowledgment: 75*ebfedea0SLionel Sambuc * "This product includes software developed by the OpenSSL Project 76*ebfedea0SLionel Sambuc * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" 77*ebfedea0SLionel Sambuc * 78*ebfedea0SLionel Sambuc * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 79*ebfedea0SLionel Sambuc * endorse or promote products derived from this software without 80*ebfedea0SLionel Sambuc * prior written permission. For written permission, please contact 81*ebfedea0SLionel Sambuc * openssl-core@openssl.org. 82*ebfedea0SLionel Sambuc * 83*ebfedea0SLionel Sambuc * 5. Products derived from this software may not be called "OpenSSL" 84*ebfedea0SLionel Sambuc * nor may "OpenSSL" appear in their names without prior written 85*ebfedea0SLionel Sambuc * permission of the OpenSSL Project. 86*ebfedea0SLionel Sambuc * 87*ebfedea0SLionel Sambuc * 6. Redistributions of any form whatsoever must retain the following 88*ebfedea0SLionel Sambuc * acknowledgment: 89*ebfedea0SLionel Sambuc * "This product includes software developed by the OpenSSL Project 90*ebfedea0SLionel Sambuc * for use in the OpenSSL Toolkit (http://www.openssl.org/)" 91*ebfedea0SLionel Sambuc * 92*ebfedea0SLionel Sambuc * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 93*ebfedea0SLionel Sambuc * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 94*ebfedea0SLionel Sambuc * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 95*ebfedea0SLionel Sambuc * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 96*ebfedea0SLionel Sambuc * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 97*ebfedea0SLionel Sambuc * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 98*ebfedea0SLionel Sambuc * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 99*ebfedea0SLionel Sambuc * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 100*ebfedea0SLionel Sambuc * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 101*ebfedea0SLionel Sambuc * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 102*ebfedea0SLionel Sambuc * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 103*ebfedea0SLionel Sambuc * OF THE POSSIBILITY OF SUCH DAMAGE. 104*ebfedea0SLionel Sambuc * ==================================================================== 105*ebfedea0SLionel Sambuc * 106*ebfedea0SLionel Sambuc * This product includes cryptographic software written by Eric Young 107*ebfedea0SLionel Sambuc * (eay@cryptsoft.com). This product includes software written by Tim 108*ebfedea0SLionel Sambuc * Hudson (tjh@cryptsoft.com). 109*ebfedea0SLionel Sambuc * 110*ebfedea0SLionel Sambuc */ 111*ebfedea0SLionel Sambuc 112*ebfedea0SLionel Sambuc #define NON_MAIN 113*ebfedea0SLionel Sambuc #include "apps.h" 114*ebfedea0SLionel Sambuc #undef NON_MAIN 115*ebfedea0SLionel Sambuc #include <openssl/bio.h> 116*ebfedea0SLionel Sambuc #include <openssl/rand.h> 117*ebfedea0SLionel Sambuc 118*ebfedea0SLionel Sambuc 119*ebfedea0SLionel Sambuc static int seeded = 0; 120*ebfedea0SLionel Sambuc static int egdsocket = 0; 121*ebfedea0SLionel Sambuc 122*ebfedea0SLionel Sambuc int app_RAND_load_file(const char *file, BIO *bio_e, int dont_warn) 123*ebfedea0SLionel Sambuc { 124*ebfedea0SLionel Sambuc int consider_randfile = (file == NULL); 125*ebfedea0SLionel Sambuc char buffer[200]; 126*ebfedea0SLionel Sambuc 127*ebfedea0SLionel Sambuc #ifdef OPENSSL_SYS_WINDOWS 128*ebfedea0SLionel Sambuc BIO_printf(bio_e,"Loading 'screen' into random state -"); 129*ebfedea0SLionel Sambuc BIO_flush(bio_e); 130*ebfedea0SLionel Sambuc RAND_screen(); 131*ebfedea0SLionel Sambuc BIO_printf(bio_e," done\n"); 132*ebfedea0SLionel Sambuc #endif 133*ebfedea0SLionel Sambuc 134*ebfedea0SLionel Sambuc if (file == NULL) 135*ebfedea0SLionel Sambuc file = RAND_file_name(buffer, sizeof buffer); 136*ebfedea0SLionel Sambuc else if (RAND_egd(file) > 0) 137*ebfedea0SLionel Sambuc { 138*ebfedea0SLionel Sambuc /* we try if the given filename is an EGD socket. 139*ebfedea0SLionel Sambuc if it is, we don't write anything back to the file. */ 140*ebfedea0SLionel Sambuc egdsocket = 1; 141*ebfedea0SLionel Sambuc return 1; 142*ebfedea0SLionel Sambuc } 143*ebfedea0SLionel Sambuc if (file == NULL || !RAND_load_file(file, -1)) 144*ebfedea0SLionel Sambuc { 145*ebfedea0SLionel Sambuc if (RAND_status() == 0) 146*ebfedea0SLionel Sambuc { 147*ebfedea0SLionel Sambuc if (!dont_warn) 148*ebfedea0SLionel Sambuc { 149*ebfedea0SLionel Sambuc BIO_printf(bio_e,"unable to load 'random state'\n"); 150*ebfedea0SLionel Sambuc BIO_printf(bio_e,"This means that the random number generator has not been seeded\n"); 151*ebfedea0SLionel Sambuc BIO_printf(bio_e,"with much random data.\n"); 152*ebfedea0SLionel Sambuc if (consider_randfile) /* explanation does not apply when a file is explicitly named */ 153*ebfedea0SLionel Sambuc { 154*ebfedea0SLionel Sambuc BIO_printf(bio_e,"Consider setting the RANDFILE environment variable to point at a file that\n"); 155*ebfedea0SLionel Sambuc BIO_printf(bio_e,"'random' data can be kept in (the file will be overwritten).\n"); 156*ebfedea0SLionel Sambuc } 157*ebfedea0SLionel Sambuc } 158*ebfedea0SLionel Sambuc return 0; 159*ebfedea0SLionel Sambuc } 160*ebfedea0SLionel Sambuc } 161*ebfedea0SLionel Sambuc seeded = 1; 162*ebfedea0SLionel Sambuc return 1; 163*ebfedea0SLionel Sambuc } 164*ebfedea0SLionel Sambuc 165*ebfedea0SLionel Sambuc long app_RAND_load_files(char *name) 166*ebfedea0SLionel Sambuc { 167*ebfedea0SLionel Sambuc char *p,*n; 168*ebfedea0SLionel Sambuc int last; 169*ebfedea0SLionel Sambuc long tot=0; 170*ebfedea0SLionel Sambuc int egd; 171*ebfedea0SLionel Sambuc 172*ebfedea0SLionel Sambuc for (;;) 173*ebfedea0SLionel Sambuc { 174*ebfedea0SLionel Sambuc last=0; 175*ebfedea0SLionel Sambuc for (p=name; ((*p != '\0') && (*p != LIST_SEPARATOR_CHAR)); p++); 176*ebfedea0SLionel Sambuc if (*p == '\0') last=1; 177*ebfedea0SLionel Sambuc *p='\0'; 178*ebfedea0SLionel Sambuc n=name; 179*ebfedea0SLionel Sambuc name=p+1; 180*ebfedea0SLionel Sambuc if (*n == '\0') break; 181*ebfedea0SLionel Sambuc 182*ebfedea0SLionel Sambuc egd=RAND_egd(n); 183*ebfedea0SLionel Sambuc if (egd > 0) 184*ebfedea0SLionel Sambuc tot+=egd; 185*ebfedea0SLionel Sambuc else 186*ebfedea0SLionel Sambuc tot+=RAND_load_file(n,-1); 187*ebfedea0SLionel Sambuc if (last) break; 188*ebfedea0SLionel Sambuc } 189*ebfedea0SLionel Sambuc if (tot > 512) 190*ebfedea0SLionel Sambuc app_RAND_allow_write_file(); 191*ebfedea0SLionel Sambuc return(tot); 192*ebfedea0SLionel Sambuc } 193*ebfedea0SLionel Sambuc 194*ebfedea0SLionel Sambuc int app_RAND_write_file(const char *file, BIO *bio_e) 195*ebfedea0SLionel Sambuc { 196*ebfedea0SLionel Sambuc char buffer[200]; 197*ebfedea0SLionel Sambuc 198*ebfedea0SLionel Sambuc if (egdsocket || !seeded) 199*ebfedea0SLionel Sambuc /* If we did not manage to read the seed file, 200*ebfedea0SLionel Sambuc * we should not write a low-entropy seed file back -- 201*ebfedea0SLionel Sambuc * it would suppress a crucial warning the next time 202*ebfedea0SLionel Sambuc * we want to use it. */ 203*ebfedea0SLionel Sambuc return 0; 204*ebfedea0SLionel Sambuc 205*ebfedea0SLionel Sambuc if (file == NULL) 206*ebfedea0SLionel Sambuc file = RAND_file_name(buffer, sizeof buffer); 207*ebfedea0SLionel Sambuc if (file == NULL || !RAND_write_file(file)) 208*ebfedea0SLionel Sambuc { 209*ebfedea0SLionel Sambuc BIO_printf(bio_e,"unable to write 'random state'\n"); 210*ebfedea0SLionel Sambuc return 0; 211*ebfedea0SLionel Sambuc } 212*ebfedea0SLionel Sambuc return 1; 213*ebfedea0SLionel Sambuc } 214*ebfedea0SLionel Sambuc 215*ebfedea0SLionel Sambuc void app_RAND_allow_write_file(void) 216*ebfedea0SLionel Sambuc { 217*ebfedea0SLionel Sambuc seeded = 1; 218*ebfedea0SLionel Sambuc } 219