1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
/* randstr.c -- Functions for getting random data
*
* GPLv2 only - Copyright (C) 2009
* David Sommerseth <dazo@users.sourceforge.net>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; version 2
* of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include <stdio.h>
#include <unistd.h>
#include <openssl/rand.h>
#include <eurephia_nullsafe.h>
#include <eurephia_context.h>
#include <eurephia_log.h>
static int rand_init = 0;
// Generate some random data and return a string.
int eurephia_randstring(eurephiaCTX *ctx, void *rndstr, size_t len) {
int attempts = 0;
do {
if( !rand_init ) {
if( !RAND_load_file("/dev/urandom", 64) ) {
eurephia_log(ctx, LOG_FATAL, 0, "Could not load random data from /dev/urandom");
return 0;
}
rand_init = 1;
}
if( RAND_pseudo_bytes((unsigned char *) rndstr, len) ) {
return 1;
}
sleep(1);
rand_init = 0;
} while( attempts++ < 11 );
eurephia_log(ctx, LOG_FATAL, 0, "RAND_pseudo_bytes() could not generate enough random data");
return 0;
}
|