*** empty log message ***
[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 #ifndef HAVE_GETTIMEOFTIME
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 #include <fcntl.h>
42 #include "util.h"
43 #include "ttyio.h"
44 #include "i18n.h"
45 #include "rand-internal.h"
46 #ifdef USE_RAND_DUMMY /* a dummy random file so we can do some tests */
47
48
49 #ifndef RAND_MAX   /* for SunOS */
50   #define RAND_MAX 32767
51 #endif
52
53 #if __GNUC__
54   #warning Using the insecure dummy random device
55 #endif
56
57 void
58 random_poll()
59 {
60     char buf[POOLSIZE/5];
61     read_random_source( buf, POOLSIZE/5, 1 ); /* read dummy data */
62     add_randomness( buf, POOLSIZE/5, 2);
63     memset( buf, 0, POOLSIZE/5);
64 }
65
66
67 void
68 fast_random_poll()
69 {
70   #if HAVE_GETHRTIME
71     {   hrtime_t tv;
72         tv = gethrtime();
73         add_randomness( &tv, sizeof(tv), 1 );
74     }
75   #elif HAVE_GETTIMEOFTIME
76     {   struct timeval tv;
77         if( gettimeofday( &tv, NULL ) )
78             BUG();
79         add_randomness( &tv.tv_sec, sizeof(tv.tv_sec), 1 );
80         add_randomness( &tv.tv_usec, sizeof(tv.tv_usec), 1 );
81     }
82   #else /* use times */
83     {   struct tms buf;
84         times( &buf );
85         add_randomness( &buf, sizeof buf, 1 );
86     }
87   #endif
88   #ifdef HAVE_GETRUSAGE
89     {   struct rusage buf;
90         if( getrusage( RUSAGE_SELF, &buf ) )
91             BUG();
92         add_randomness( &buf, sizeof buf, 1 );
93         memset( &buf, 0, sizeof buf );
94     }
95   #endif
96 }
97
98
99
100 void
101 read_random_source( byte *buffer, size_t length, int level )
102 {
103     static int initialized=0;
104
105     if( !initialized ) {
106         log_info(_("warning: using insecure random number generator!!\n"));
107         tty_printf(_("The random number generator is only a kludge to let\n"
108                    "it compile - it is in no way a strong RNG!\n\n"
109                    "DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n\n"));
110         initialized=1;
111       #ifdef HAVE_RAND
112         srand(make_timestamp()*getpid());
113       #else
114         srandom(make_timestamp()*getpid());
115       #endif
116     }
117
118   #ifdef HAVE_RAND
119     while( length-- )
120         *buffer++ = ((unsigned)(1 + (int) (256.0*rand()/(RAND_MAX+1.0)))-1);
121   #else
122     while( length-- )
123         *buffer++ = ((unsigned)(1 + (int) (256.0*random()/(RAND_MAX+1.0)))-1);
124   #endif
125 }
126
127
128 #endif /* USE_RAND_DUMMY */