Some bug fixes of the last release
[gnupg.git] / cipher / rand-dummy.c
1 /* rand-dummy.c  -  INSECURE dummy random device
2  *      Copyright (C) 1998 Free Software Foundation, Inc.
3  *
4  * This file is part of GNUPG.
5  *
6  * GNUPG is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * GNUPG is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19  */
20
21
22 #include <config.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <assert.h>
26 #include <errno.h>
27 #include <sys/time.h>
28 #include <sys/types.h>
29 #include <sys/stat.h>
30 #ifdef  HAVE_GETHRTIME
31   #include <sys/times.h>
32 #endif
33 #ifdef HAVE_GETTIMEOFDAY
34   #include <sys/times.h>
35 #endif
36 #ifdef HAVE_GETRUSAGE
37   #include <sys/resource.h>
38 #endif
39 #include <string.h>
40 #include <unistd.h>
41 #ifdef __MINGW32__
42   #include <process.h>
43 #endif
44 #include <fcntl.h>
45 #include "util.h"
46 #include "ttyio.h"
47 #include "i18n.h"
48 #include "rand-internal.h"
49 #ifdef USE_RAND_DUMMY /* a dummy random file so we can do some tests */
50
51
52 #ifndef RAND_MAX   /* for SunOS */
53   #define RAND_MAX 32767
54 #endif
55
56 #if __GNUC__
57   #warning Using the insecure dummy random device
58 #endif
59
60 void
61 random_poll()
62 {
63     char buf[POOLSIZE/5];
64     read_random_source( buf, POOLSIZE/5, 1 ); /* read dummy data */
65     add_randomness( buf, POOLSIZE/5, 2);
66     memset( buf, 0, POOLSIZE/5);
67 }
68
69
70 void
71 fast_random_poll()
72 {
73   #if HAVE_GETHRTIME
74     {   hrtime_t tv;
75         tv = gethrtime();
76         add_randomness( &tv, sizeof(tv), 1 );
77     }
78   #elif HAVE_GETTIMEOFDAY
79     {   struct timeval tv;
80         if( gettimeofday( &tv, NULL ) )
81             BUG();
82         add_randomness( &tv.tv_sec, sizeof(tv.tv_sec), 1 );
83         add_randomness( &tv.tv_usec, sizeof(tv.tv_usec), 1 );
84     }
85   #else /* use times */
86     {
87       #ifndef __MINGW32__
88         struct tms buf;
89         times( &buf );
90         add_randomness( &buf, sizeof buf, 1 );
91       #endif
92     }
93   #endif
94   #ifdef HAVE_GETRUSAGE
95     {   struct rusage buf;
96         if( getrusage( RUSAGE_SELF, &buf ) )
97             BUG();
98         add_randomness( &buf, sizeof buf, 1 );
99         memset( &buf, 0, sizeof buf );
100     }
101   #endif
102 }
103
104
105
106 void
107 read_random_source( byte *buffer, size_t length, int level )
108 {
109     static int initialized=0;
110
111     if( !initialized ) {
112         log_info(_("WARNING: using insecure random number generator!!\n"));
113         tty_printf(_("The random number generator is only a kludge to let\n"
114                    "it compile - it is in no way a strong RNG!\n\n"
115                    "DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n\n"));
116         initialized=1;
117       #ifdef HAVE_RAND
118         srand(make_timestamp()*getpid());
119       #else
120         srandom(make_timestamp()*getpid());
121       #endif
122     }
123
124   #ifdef HAVE_RAND
125     while( length-- )
126         *buffer++ = ((unsigned)(1 + (int) (256.0*rand()/(RAND_MAX+1.0)))-1);
127   #else
128     while( length-- )
129         *buffer++ = ((unsigned)(1 + (int) (256.0*random()/(RAND_MAX+1.0)))-1);
130   #endif
131 }
132
133
134 #endif /* USE_RAND_DUMMY */