LINUX: Avoid building rand-fortuna-kernel.o
[openafs.git] / src / crypto / hcrypto / kernel / rand.c
1 /* A trivial implementation of hcrypto's RAND interface for
2  * kernel use */
3
4 #include <config.h>
5 #include <evp.h>
6 #include <evp-hcrypto.h>
7 #include <aes.h>
8 #include <sha.h>
9 #include <heim_threads.h>
10
11 /*
12  * This mutex is used to synchronize hcrypto operations in the kernel.
13  * We cheat and assume that all access into hcrypto comes through routines
14  * in this file, so that we can ensure it is initialized before it is used.
15  */
16 afs_kmutex_t hckernel_mutex;
17
18 /*
19  * For these platforms, we use the fortuna RNG from heimdal (seeded from afsd
20  * userspace on startup). Otherwise, we rely on osi_readRandom() as the source
21  * of random data.
22  */
23 #if defined(AFS_AIX_ENV) || defined(AFS_DFBSD_ENV) || defined(AFS_HPUX_ENV) || defined(AFS_SGI_ENV)
24 # define USE_FORTUNA
25 #endif
26
27 /* Called from osi_Init(); will only run once. */
28 void
29 init_hckernel_mutex(void)
30 {
31     MUTEX_INIT(&hckernel_mutex, "hckernel", MUTEX_DEFAULT, 0);
32 }
33
34 void
35 RAND_seed(const void *indata, size_t size)
36 {
37 #ifdef USE_FORTUNA
38     const RAND_METHOD *m = RAND_fortuna_method();
39     m->seed(indata, size);
40 #endif
41 }
42
43 int
44 RAND_bytes(void *outdata, size_t size)
45 {
46     if (size == 0)
47         return 0;
48 #ifdef USE_FORTUNA
49     const RAND_METHOD *m = RAND_fortuna_method();
50     return m->bytes(outdata, size);
51 #else
52     if (osi_readRandom(outdata, size))
53         return 0;
54 #endif
55     return 1;
56 }