summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/rand
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/rand')
-rw-r--r--src/lib/libcrypto/rand/rand.h140
-rw-r--r--src/lib/libcrypto/rand/rand_err.c96
-rw-r--r--src/lib/libcrypto/rand/rand_lib.c (renamed from src/lib/libcrypto/rand/rand_eng.c)94
-rw-r--r--src/lib/libcrypto/rand/rand_nw.c183
-rw-r--r--src/lib/libcrypto/rand/rand_unix.c118
-rw-r--r--src/lib/libcrypto/rand/randfile.c326
6 files changed, 840 insertions, 117 deletions
diff --git a/src/lib/libcrypto/rand/rand.h b/src/lib/libcrypto/rand/rand.h
new file mode 100644
index 0000000000..ac6c021763
--- /dev/null
+++ b/src/lib/libcrypto/rand/rand.h
@@ -0,0 +1,140 @@
1/* crypto/rand/rand.h */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#ifndef HEADER_RAND_H
60#define HEADER_RAND_H
61
62#include <stdlib.h>
63#include <openssl/ossl_typ.h>
64#include <openssl/e_os2.h>
65
66#if defined(OPENSSL_SYS_WINDOWS)
67#include <windows.h>
68#endif
69
70#ifdef __cplusplus
71extern "C" {
72#endif
73
74#if defined(OPENSSL_FIPS)
75#define FIPS_RAND_SIZE_T size_t
76#endif
77
78/* Already defined in ossl_typ.h */
79/* typedef struct rand_meth_st RAND_METHOD; */
80
81struct rand_meth_st
82 {
83 void (*seed)(const void *buf, int num);
84 int (*bytes)(unsigned char *buf, int num);
85 void (*cleanup)(void);
86 void (*add)(const void *buf, int num, double entropy);
87 int (*pseudorand)(unsigned char *buf, int num);
88 int (*status)(void);
89 };
90
91#ifdef BN_DEBUG
92extern int rand_predictable;
93#endif
94
95int RAND_set_rand_method(const RAND_METHOD *meth);
96const RAND_METHOD *RAND_get_rand_method(void);
97#ifndef OPENSSL_NO_ENGINE
98int RAND_set_rand_engine(ENGINE *engine);
99#endif
100RAND_METHOD *RAND_SSLeay(void);
101void RAND_cleanup(void );
102int RAND_bytes(unsigned char *buf,int num);
103int RAND_pseudo_bytes(unsigned char *buf,int num);
104void RAND_seed(const void *buf,int num);
105void RAND_add(const void *buf,int num,double entropy);
106int RAND_load_file(const char *file,long max_bytes);
107int RAND_write_file(const char *file);
108const char *RAND_file_name(char *file,size_t num);
109int RAND_status(void);
110int RAND_query_egd_bytes(const char *path, unsigned char *buf, int bytes);
111int RAND_egd(const char *path);
112int RAND_egd_bytes(const char *path,int bytes);
113int RAND_poll(void);
114
115#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_WIN32)
116
117void RAND_screen(void);
118int RAND_event(UINT, WPARAM, LPARAM);
119
120#endif
121
122/* BEGIN ERROR CODES */
123/* The following lines are auto generated by the script mkerr.pl. Any changes
124 * made after this point may be overwritten when the script is next run.
125 */
126void ERR_load_RAND_strings(void);
127
128/* Error codes for the RAND functions. */
129
130/* Function codes. */
131#define RAND_F_RAND_GET_RAND_METHOD 101
132#define RAND_F_SSLEAY_RAND_BYTES 100
133
134/* Reason codes. */
135#define RAND_R_PRNG_NOT_SEEDED 100
136
137#ifdef __cplusplus
138}
139#endif
140#endif
diff --git a/src/lib/libcrypto/rand/rand_err.c b/src/lib/libcrypto/rand/rand_err.c
new file mode 100644
index 0000000000..03cda4dd92
--- /dev/null
+++ b/src/lib/libcrypto/rand/rand_err.c
@@ -0,0 +1,96 @@
1/* crypto/rand/rand_err.c */
2/* ====================================================================
3 * Copyright (c) 1999-2006 The OpenSSL Project. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in
14 * the documentation and/or other materials provided with the
15 * distribution.
16 *
17 * 3. All advertising materials mentioning features or use of this
18 * software must display the following acknowledgment:
19 * "This product includes software developed by the OpenSSL Project
20 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
21 *
22 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
23 * endorse or promote products derived from this software without
24 * prior written permission. For written permission, please contact
25 * openssl-core@OpenSSL.org.
26 *
27 * 5. Products derived from this software may not be called "OpenSSL"
28 * nor may "OpenSSL" appear in their names without prior written
29 * permission of the OpenSSL Project.
30 *
31 * 6. Redistributions of any form whatsoever must retain the following
32 * acknowledgment:
33 * "This product includes software developed by the OpenSSL Project
34 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
35 *
36 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
37 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
38 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
39 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
40 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
42 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
43 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
44 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
45 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
46 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
47 * OF THE POSSIBILITY OF SUCH DAMAGE.
48 * ====================================================================
49 *
50 * This product includes cryptographic software written by Eric Young
51 * (eay@cryptsoft.com). This product includes software written by Tim
52 * Hudson (tjh@cryptsoft.com).
53 *
54 */
55
56/* NOTE: this file was auto generated by the mkerr.pl script: any changes
57 * made to it will be overwritten when the script next updates this file,
58 * only reason strings will be preserved.
59 */
60
61#include <stdio.h>
62#include <openssl/err.h>
63#include <openssl/rand.h>
64
65/* BEGIN ERROR CODES */
66#ifndef OPENSSL_NO_ERR
67
68#define ERR_FUNC(func) ERR_PACK(ERR_LIB_RAND,func,0)
69#define ERR_REASON(reason) ERR_PACK(ERR_LIB_RAND,0,reason)
70
71static ERR_STRING_DATA RAND_str_functs[]=
72 {
73{ERR_FUNC(RAND_F_RAND_GET_RAND_METHOD), "RAND_get_rand_method"},
74{ERR_FUNC(RAND_F_SSLEAY_RAND_BYTES), "SSLEAY_RAND_BYTES"},
75{0,NULL}
76 };
77
78static ERR_STRING_DATA RAND_str_reasons[]=
79 {
80{ERR_REASON(RAND_R_PRNG_NOT_SEEDED) ,"PRNG not seeded"},
81{0,NULL}
82 };
83
84#endif
85
86void ERR_load_RAND_strings(void)
87 {
88#ifndef OPENSSL_NO_ERR
89
90 if (ERR_func_error_string(RAND_str_functs[0].error) == NULL)
91 {
92 ERR_load_strings(0,RAND_str_functs);
93 ERR_load_strings(0,RAND_str_reasons);
94 }
95#endif
96 }
diff --git a/src/lib/libcrypto/rand/rand_eng.c b/src/lib/libcrypto/rand/rand_lib.c
index 1669cef43c..513e338985 100644
--- a/src/lib/libcrypto/rand/rand_eng.c
+++ b/src/lib/libcrypto/rand/rand_lib.c
@@ -59,42 +59,40 @@
59#include <stdio.h> 59#include <stdio.h>
60#include <time.h> 60#include <time.h>
61#include "cryptlib.h" 61#include "cryptlib.h"
62#include "rand_lcl.h"
63#include <openssl/rand.h> 62#include <openssl/rand.h>
64#ifdef OPENSSL_FIPS
65#include <openssl/fips.h>
66#include <openssl/fips_rand.h>
67#endif
68
69#ifndef OPENSSL_NO_ENGINE 63#ifndef OPENSSL_NO_ENGINE
70#include <openssl/engine.h> 64#include <openssl/engine.h>
71#endif 65#endif
72 66
73#if defined(OPENSSL_FIPS) && !defined(OPENSSL_NO_ENGINE) 67#ifndef OPENSSL_NO_ENGINE
74
75/* non-NULL if default_RAND_meth is ENGINE-provided */ 68/* non-NULL if default_RAND_meth is ENGINE-provided */
76static ENGINE *funct_ref =NULL; 69static ENGINE *funct_ref =NULL;
70#endif
71static const RAND_METHOD *default_RAND_meth = NULL;
77 72
78int eng_RAND_set_rand_method(const RAND_METHOD *meth, const RAND_METHOD **pmeth) 73int RAND_set_rand_method(const RAND_METHOD *meth)
79 { 74 {
75#ifndef OPENSSL_NO_ENGINE
80 if(funct_ref) 76 if(funct_ref)
81 { 77 {
82 ENGINE_finish(funct_ref); 78 ENGINE_finish(funct_ref);
83 funct_ref = NULL; 79 funct_ref = NULL;
84 } 80 }
85 *pmeth = meth; 81#endif
82 default_RAND_meth = meth;
86 return 1; 83 return 1;
87 } 84 }
88 85
89const RAND_METHOD *eng_RAND_get_rand_method(const RAND_METHOD **pmeth) 86const RAND_METHOD *RAND_get_rand_method(void)
90 { 87 {
91 if (!*pmeth) 88 if (!default_RAND_meth)
92 { 89 {
90#ifndef OPENSSL_NO_ENGINE
93 ENGINE *e = ENGINE_get_default_RAND(); 91 ENGINE *e = ENGINE_get_default_RAND();
94 if(e) 92 if(e)
95 { 93 {
96 *pmeth = ENGINE_get_RAND(e); 94 default_RAND_meth = ENGINE_get_RAND(e);
97 if(!*pmeth) 95 if(!default_RAND_meth)
98 { 96 {
99 ENGINE_finish(e); 97 ENGINE_finish(e);
100 e = NULL; 98 e = NULL;
@@ -103,22 +101,13 @@ const RAND_METHOD *eng_RAND_get_rand_method(const RAND_METHOD **pmeth)
103 if(e) 101 if(e)
104 funct_ref = e; 102 funct_ref = e;
105 else 103 else
106 if(FIPS_mode()) 104#endif
107 *pmeth=FIPS_rand_method(); 105 default_RAND_meth = RAND_SSLeay();
108 else
109 *pmeth = RAND_SSLeay();
110 } 106 }
111 107 return default_RAND_meth;
112 if(FIPS_mode()
113 && *pmeth != FIPS_rand_check())
114 {
115 RANDerr(RAND_F_ENG_RAND_GET_RAND_METHOD,RAND_R_NON_FIPS_METHOD);
116 return 0;
117 }
118
119 return *pmeth;
120 } 108 }
121 109
110#ifndef OPENSSL_NO_ENGINE
122int RAND_set_rand_engine(ENGINE *engine) 111int RAND_set_rand_engine(ENGINE *engine)
123 { 112 {
124 const RAND_METHOD *tmp_meth = NULL; 113 const RAND_METHOD *tmp_meth = NULL;
@@ -138,15 +127,50 @@ int RAND_set_rand_engine(ENGINE *engine)
138 funct_ref = engine; 127 funct_ref = engine;
139 return 1; 128 return 1;
140 } 129 }
130#endif
141 131
142void int_RAND_init_engine_callbacks(void) 132void RAND_cleanup(void)
143 { 133 {
144 static int done = 0; 134 const RAND_METHOD *meth = RAND_get_rand_method();
145 if (done) 135 if (meth && meth->cleanup)
146 return; 136 meth->cleanup();
147 int_RAND_set_callbacks(eng_RAND_set_rand_method, 137 RAND_set_rand_method(NULL);
148 eng_RAND_get_rand_method);
149 done = 1;
150 } 138 }
151 139
152#endif 140void RAND_seed(const void *buf, int num)
141 {
142 const RAND_METHOD *meth = RAND_get_rand_method();
143 if (meth && meth->seed)
144 meth->seed(buf,num);
145 }
146
147void RAND_add(const void *buf, int num, double entropy)
148 {
149 const RAND_METHOD *meth = RAND_get_rand_method();
150 if (meth && meth->add)
151 meth->add(buf,num,entropy);
152 }
153
154int RAND_bytes(unsigned char *buf, int num)
155 {
156 const RAND_METHOD *meth = RAND_get_rand_method();
157 if (meth && meth->bytes)
158 return meth->bytes(buf,num);
159 return(-1);
160 }
161
162int RAND_pseudo_bytes(unsigned char *buf, int num)
163 {
164 const RAND_METHOD *meth = RAND_get_rand_method();
165 if (meth && meth->pseudorand)
166 return meth->pseudorand(buf,num);
167 return(-1);
168 }
169
170int RAND_status(void)
171 {
172 const RAND_METHOD *meth = RAND_get_rand_method();
173 if (meth && meth->status)
174 return meth->status();
175 return 0;
176 }
diff --git a/src/lib/libcrypto/rand/rand_nw.c b/src/lib/libcrypto/rand/rand_nw.c
new file mode 100644
index 0000000000..8d5b8d2e32
--- /dev/null
+++ b/src/lib/libcrypto/rand/rand_nw.c
@@ -0,0 +1,183 @@
1/* crypto/rand/rand_nw.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58/* ====================================================================
59 * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved.
60 *
61 * Redistribution and use in source and binary forms, with or without
62 * modification, are permitted provided that the following conditions
63 * are met:
64 *
65 * 1. Redistributions of source code must retain the above copyright
66 * notice, this list of conditions and the following disclaimer.
67 *
68 * 2. Redistributions in binary form must reproduce the above copyright
69 * notice, this list of conditions and the following disclaimer in
70 * the documentation and/or other materials provided with the
71 * distribution.
72 *
73 * 3. All advertising materials mentioning features or use of this
74 * software must display the following acknowledgment:
75 * "This product includes software developed by the OpenSSL Project
76 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77 *
78 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79 * endorse or promote products derived from this software without
80 * prior written permission. For written permission, please contact
81 * openssl-core@openssl.org.
82 *
83 * 5. Products derived from this software may not be called "OpenSSL"
84 * nor may "OpenSSL" appear in their names without prior written
85 * permission of the OpenSSL Project.
86 *
87 * 6. Redistributions of any form whatsoever must retain the following
88 * acknowledgment:
89 * "This product includes software developed by the OpenSSL Project
90 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91 *
92 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
96 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103 * OF THE POSSIBILITY OF SUCH DAMAGE.
104 * ====================================================================
105 *
106 * This product includes cryptographic software written by Eric Young
107 * (eay@cryptsoft.com). This product includes software written by Tim
108 * Hudson (tjh@cryptsoft.com).
109 *
110 */
111
112#include "cryptlib.h"
113#include <openssl/rand.h>
114#include "rand_lcl.h"
115
116#if defined (OPENSSL_SYS_NETWARE)
117
118#if defined(NETWARE_LIBC)
119#include <nks/thread.h>
120#else
121#include <nwthread.h>
122#endif
123
124extern int GetProcessSwitchCount(void);
125#if !defined(NETWARE_LIBC) || (CURRENT_NDK_THRESHOLD < 509220000)
126extern void *RunningProcess; /* declare here same as found in newer NDKs */
127extern unsigned long GetSuperHighResolutionTimer(void);
128#endif
129
130 /* the FAQ indicates we need to provide at least 20 bytes (160 bits) of seed
131 */
132int RAND_poll(void)
133{
134 unsigned long l;
135 unsigned long tsc;
136 int i;
137
138 /* There are several options to gather miscellaneous data
139 * but for now we will loop checking the time stamp counter (rdtsc) and
140 * the SuperHighResolutionTimer. Each iteration will collect 8 bytes
141 * of data but it is treated as only 1 byte of entropy. The call to
142 * ThreadSwitchWithDelay() will introduce additional variability into
143 * the data returned by rdtsc.
144 *
145 * Applications can agument the seed material by adding additional
146 * stuff with RAND_add() and should probably do so.
147 */
148 l = GetProcessSwitchCount();
149 RAND_add(&l,sizeof(l),1);
150
151 /* need to cast the void* to unsigned long here */
152 l = (unsigned long)RunningProcess;
153 RAND_add(&l,sizeof(l),1);
154
155 for( i=2; i<ENTROPY_NEEDED; i++)
156 {
157#ifdef __MWERKS__
158 asm
159 {
160 rdtsc
161 mov tsc, eax
162 }
163#elif defined(__GNUC__) && __GNUC__>=2 && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM)
164 asm volatile("rdtsc":"=a"(tsc)::"edx");
165#endif
166
167 RAND_add(&tsc, sizeof(tsc), 1);
168
169 l = GetSuperHighResolutionTimer();
170 RAND_add(&l, sizeof(l), 0);
171
172# if defined(NETWARE_LIBC)
173 NXThreadYield();
174# else /* NETWARE_CLIB */
175 ThreadSwitchWithDelay();
176# endif
177 }
178
179 return 1;
180}
181
182#endif
183
diff --git a/src/lib/libcrypto/rand/rand_unix.c b/src/lib/libcrypto/rand/rand_unix.c
index e3a65571c8..4bb9666e49 100644
--- a/src/lib/libcrypto/rand/rand_unix.c
+++ b/src/lib/libcrypto/rand/rand_unix.c
@@ -133,102 +133,56 @@
133# define FD_SETSIZE (8*sizeof(fd_set)) 133# define FD_SETSIZE (8*sizeof(fd_set))
134#endif 134#endif
135 135
136#if defined(OPENSSL_SYS_VOS) 136#ifdef __VOS__
137
138/* The following algorithm repeatedly samples the real-time clock
139 (RTC) to generate a sequence of unpredictable data. The algorithm
140 relies upon the uneven execution speed of the code (due to factors
141 such as cache misses, interrupts, bus activity, and scheduling) and
142 upon the rather large relative difference between the speed of the
143 clock and the rate at which it can be read.
144
145 If this code is ported to an environment where execution speed is
146 more constant or where the RTC ticks at a much slower rate, or the
147 clock can be read with fewer instructions, it is likely that the
148 results would be far more predictable.
149
150 As a precaution, we generate 4 times the minimum required amount of
151 seed data. */
152
153int RAND_poll(void) 137int RAND_poll(void)
154{ 138{
155 short int code; 139 unsigned char buf[ENTROPY_NEEDED];
156 gid_t curr_gid;
157 pid_t curr_pid; 140 pid_t curr_pid;
158 uid_t curr_uid; 141 uid_t curr_uid;
159 int i, k; 142 static int first=1;
143 int i;
144 long rnd = 0;
160 struct timespec ts; 145 struct timespec ts;
161 unsigned char v; 146 unsigned seed;
162 147
163#ifdef OPENSSL_SYS_VOS_HPPA 148/* The VOS random() function starts from a static seed so its
164 long duration; 149 initial value is predictable. If random() returns the
165 extern void s$sleep (long *_duration, short int *_code); 150 initial value, reseed it with dynamic data. The VOS
166#else 151 real-time clock has a granularity of 1 nsec so it should be
167#ifdef OPENSSL_SYS_VOS_IA32 152 reasonably difficult to predict its exact value. Do not
168 long long duration; 153 gratuitously reseed the PRNG because other code in this
169 extern void s$sleep2 (long long *_duration, short int *_code); 154 process or thread may be using it. */
170#else 155
171#error "Unsupported Platform." 156 if (first) {
172#endif /* OPENSSL_SYS_VOS_IA32 */ 157 first = 0;
173#endif /* OPENSSL_SYS_VOS_HPPA */ 158 rnd = random ();
174 159 if (rnd == 1804289383) {
175 /* Seed with the gid, pid, and uid, to ensure *some* 160 clock_gettime (CLOCK_REALTIME, &ts);
176 variation between different processes. */ 161 curr_pid = getpid();
177 162 curr_uid = getuid();
178 curr_gid = getgid(); 163 seed = ts.tv_sec ^ ts.tv_nsec ^ curr_pid ^ curr_uid;
179 RAND_add (&curr_gid, sizeof curr_gid, 1); 164 srandom (seed);
180 curr_gid = 0; 165 }
181 166 }
182 curr_pid = getpid();
183 RAND_add (&curr_pid, sizeof curr_pid, 1);
184 curr_pid = 0;
185
186 curr_uid = getuid();
187 RAND_add (&curr_uid, sizeof curr_uid, 1);
188 curr_uid = 0;
189
190 for (i=0; i<(ENTROPY_NEEDED*4); i++)
191 {
192 /* burn some cpu; hope for interrupts, cache
193 collisions, bus interference, etc. */
194 for (k=0; k<99; k++)
195 ts.tv_nsec = random ();
196
197#ifdef OPENSSL_SYS_VOS_HPPA
198 /* sleep for 1/1024 of a second (976 us). */
199 duration = 1;
200 s$sleep (&duration, &code);
201#else
202#ifdef OPENSSL_SYS_VOS_IA32
203 /* sleep for 1/65536 of a second (15 us). */
204 duration = 1;
205 s$sleep2 (&duration, &code);
206#endif /* OPENSSL_SYS_VOS_IA32 */
207#endif /* OPENSSL_SYS_VOS_HPPA */
208
209 /* get wall clock time. */
210 clock_gettime (CLOCK_REALTIME, &ts);
211 167
212 /* take 8 bits */ 168 for (i = 0; i < sizeof(buf); i++) {
213 v = (unsigned char) (ts.tv_nsec % 256); 169 if (i % 4 == 0)
214 RAND_add (&v, sizeof v, 1); 170 rnd = random();
215 v = 0; 171 buf[i] = rnd;
172 rnd >>= 8;
216 } 173 }
174 RAND_add(buf, sizeof(buf), ENTROPY_NEEDED);
175 memset(buf, 0, sizeof(buf));
176
217 return 1; 177 return 1;
218} 178}
219#elif defined __OpenBSD__ 179#elif defined __OpenBSD__
220int RAND_poll(void) 180int RAND_poll(void)
221{ 181{
222 u_int32_t rnd = 0, i;
223 unsigned char buf[ENTROPY_NEEDED]; 182 unsigned char buf[ENTROPY_NEEDED];
224 183
225 for (i = 0; i < sizeof(buf); i++) { 184 arc4random_buf(buf, sizeof(buf));
226 if (i % 4 == 0) 185 RAND_add(buf, sizeof(buf), sizeof(buf));
227 rnd = arc4random();
228 buf[i] = rnd;
229 rnd >>= 8;
230 }
231 RAND_add(buf, sizeof(buf), ENTROPY_NEEDED);
232 memset(buf, 0, sizeof(buf)); 186 memset(buf, 0, sizeof(buf));
233 187
234 return 1; 188 return 1;
diff --git a/src/lib/libcrypto/rand/randfile.c b/src/lib/libcrypto/rand/randfile.c
new file mode 100644
index 0000000000..bc7d9c5804
--- /dev/null
+++ b/src/lib/libcrypto/rand/randfile.c
@@ -0,0 +1,326 @@
1/* crypto/rand/randfile.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59/* We need to define this to get macros like S_IFBLK and S_IFCHR */
60#define _XOPEN_SOURCE 500
61
62#include <errno.h>
63#include <stdio.h>
64#include <stdlib.h>
65#include <string.h>
66
67#include "e_os.h"
68#include <openssl/crypto.h>
69#include <openssl/rand.h>
70#include <openssl/buffer.h>
71
72#ifdef OPENSSL_SYS_VMS
73#include <unixio.h>
74#endif
75#ifndef NO_SYS_TYPES_H
76# include <sys/types.h>
77#endif
78#ifndef OPENSSL_NO_POSIX_IO
79# include <sys/stat.h>
80#endif
81
82#ifdef _WIN32
83#define stat _stat
84#define chmod _chmod
85#define open _open
86#define fdopen _fdopen
87#endif
88
89#undef BUFSIZE
90#define BUFSIZE 1024
91#define RAND_DATA 1024
92
93#ifdef OPENSSL_SYS_VMS
94/* This declaration is a nasty hack to get around vms' extension to fopen
95 * for passing in sharing options being disabled by our /STANDARD=ANSI89 */
96static FILE *(*const vms_fopen)(const char *, const char *, ...) =
97 (FILE *(*)(const char *, const char *, ...))fopen;
98#define VMS_OPEN_ATTRS "shr=get,put,upd,del","ctx=bin,stm","rfm=stm","rat=none","mrs=0"
99#endif
100
101/* #define RFILE ".rnd" - defined in ../../e_os.h */
102
103/* Note that these functions are intended for seed files only.
104 * Entropy devices and EGD sockets are handled in rand_unix.c */
105
106int RAND_load_file(const char *file, long bytes)
107 {
108 /* If bytes >= 0, read up to 'bytes' bytes.
109 * if bytes == -1, read complete file. */
110
111 MS_STATIC unsigned char buf[BUFSIZE];
112#ifndef OPENSSL_NO_POSIX_IO
113 struct stat sb;
114#endif
115 int i,ret=0,n;
116 FILE *in;
117
118 if (file == NULL) return(0);
119
120#ifndef OPENSSL_NO_POSIX_IO
121#ifdef PURIFY
122 /* struct stat can have padding and unused fields that may not be
123 * initialized in the call to stat(). We need to clear the entire
124 * structure before calling RAND_add() to avoid complaints from
125 * applications such as Valgrind.
126 */
127 memset(&sb, 0, sizeof(sb));
128#endif
129 if (stat(file,&sb) < 0) return(0);
130 RAND_add(&sb,sizeof(sb),0.0);
131#endif
132 if (bytes == 0) return(ret);
133
134#ifdef OPENSSL_SYS_VMS
135 in=vms_fopen(file,"rb",VMS_OPEN_ATTRS);
136#else
137 in=fopen(file,"rb");
138#endif
139 if (in == NULL) goto err;
140#if defined(S_IFBLK) && defined(S_IFCHR) && !defined(OPNESSL_NO_POSIX_IO)
141 if (sb.st_mode & (S_IFBLK | S_IFCHR)) {
142 /* this file is a device. we don't want read an infinite number
143 * of bytes from a random device, nor do we want to use buffered
144 * I/O because we will waste system entropy.
145 */
146 bytes = (bytes == -1) ? 2048 : bytes; /* ok, is 2048 enough? */
147#ifndef OPENSSL_NO_SETVBUF_IONBF
148 setvbuf(in, NULL, _IONBF, 0); /* don't do buffered reads */
149#endif /* ndef OPENSSL_NO_SETVBUF_IONBF */
150 }
151#endif
152 for (;;)
153 {
154 if (bytes > 0)
155 n = (bytes < BUFSIZE)?(int)bytes:BUFSIZE;
156 else
157 n = BUFSIZE;
158 i=fread(buf,1,n,in);
159 if (i <= 0) break;
160#ifdef PURIFY
161 RAND_add(buf,i,(double)i);
162#else
163 /* even if n != i, use the full array */
164 RAND_add(buf,n,(double)i);
165#endif
166 ret+=i;
167 if (bytes > 0)
168 {
169 bytes-=n;
170 if (bytes <= 0) break;
171 }
172 }
173 fclose(in);
174 OPENSSL_cleanse(buf,BUFSIZE);
175err:
176 return(ret);
177 }
178
179int RAND_write_file(const char *file)
180 {
181 unsigned char buf[BUFSIZE];
182 int i,ret=0,rand_err=0;
183 FILE *out = NULL;
184 int n;
185#ifndef OPENSSL_NO_POSIX_IO
186 struct stat sb;
187
188 i=stat(file,&sb);
189 if (i != -1) {
190#if defined(S_ISBLK) && defined(S_ISCHR)
191 if (S_ISBLK(sb.st_mode) || S_ISCHR(sb.st_mode)) {
192 /* this file is a device. we don't write back to it.
193 * we "succeed" on the assumption this is some sort
194 * of random device. Otherwise attempting to write to
195 * and chmod the device causes problems.
196 */
197 return(1);
198 }
199#endif
200 }
201#endif
202
203#if defined(O_CREAT) && !defined(OPENSSL_NO_POSIX_IO) && !defined(OPENSSL_SYS_VMS)
204 {
205#ifndef O_BINARY
206#define O_BINARY 0
207#endif
208 /* chmod(..., 0600) is too late to protect the file,
209 * permissions should be restrictive from the start */
210 int fd = open(file, O_WRONLY|O_CREAT|O_BINARY, 0600);
211 if (fd != -1)
212 out = fdopen(fd, "wb");
213 }
214#endif
215
216#ifdef OPENSSL_SYS_VMS
217 /* VMS NOTE: Prior versions of this routine created a _new_
218 * version of the rand file for each call into this routine, then
219 * deleted all existing versions named ;-1, and finally renamed
220 * the current version as ';1'. Under concurrent usage, this
221 * resulted in an RMS race condition in rename() which could
222 * orphan files (see vms message help for RMS$_REENT). With the
223 * fopen() calls below, openssl/VMS now shares the top-level
224 * version of the rand file. Note that there may still be
225 * conditions where the top-level rand file is locked. If so, this
226 * code will then create a new version of the rand file. Without
227 * the delete and rename code, this can result in ascending file
228 * versions that stop at version 32767, and this routine will then
229 * return an error. The remedy for this is to recode the calling
230 * application to avoid concurrent use of the rand file, or
231 * synchronize usage at the application level. Also consider
232 * whether or not you NEED a persistent rand file in a concurrent
233 * use situation.
234 */
235
236 out = vms_fopen(file,"rb+",VMS_OPEN_ATTRS);
237 if (out == NULL)
238 out = vms_fopen(file,"wb",VMS_OPEN_ATTRS);
239#else
240 if (out == NULL)
241 out = fopen(file,"wb");
242#endif
243 if (out == NULL) goto err;
244
245#ifndef NO_CHMOD
246 chmod(file,0600);
247#endif
248 n=RAND_DATA;
249 for (;;)
250 {
251 i=(n > BUFSIZE)?BUFSIZE:n;
252 n-=BUFSIZE;
253 if (RAND_bytes(buf,i) <= 0)
254 rand_err=1;
255 i=fwrite(buf,1,i,out);
256 if (i <= 0)
257 {
258 ret=0;
259 break;
260 }
261 ret+=i;
262 if (n <= 0) break;
263 }
264
265 fclose(out);
266 OPENSSL_cleanse(buf,BUFSIZE);
267err:
268 return (rand_err ? -1 : ret);
269 }
270
271const char *RAND_file_name(char *buf, size_t size)
272 {
273 char *s=NULL;
274#ifdef __OpenBSD__
275 struct stat sb;
276#endif
277
278 if (OPENSSL_issetugid() == 0)
279 s=getenv("RANDFILE");
280 if (s != NULL && *s && strlen(s) + 1 < size)
281 {
282 if (BUF_strlcpy(buf,s,size) >= size)
283 return NULL;
284 }
285 else
286 {
287 if (OPENSSL_issetugid() == 0)
288 s=getenv("HOME");
289#ifdef DEFAULT_HOME
290 if (s == NULL)
291 {
292 s = DEFAULT_HOME;
293 }
294#endif
295 if (s && *s && strlen(s)+strlen(RFILE)+2 < size)
296 {
297 BUF_strlcpy(buf,s,size);
298#ifndef OPENSSL_SYS_VMS
299 BUF_strlcat(buf,"/",size);
300#endif
301 BUF_strlcat(buf,RFILE,size);
302 }
303 else
304 buf[0] = '\0'; /* no file name */
305 }
306
307#ifdef __OpenBSD__
308 /* given that all random loads just fail if the file can't be
309 * seen on a stat, we stat the file we're returning, if it
310 * fails, use /dev/arandom instead. this allows the user to
311 * use their own source for good random data, but defaults
312 * to something hopefully decent if that isn't available.
313 */
314
315 if (!buf[0])
316 if (BUF_strlcpy(buf,"/dev/arandom",size) >= size) {
317 return(NULL);
318 }
319 if (stat(buf,&sb) == -1)
320 if (BUF_strlcpy(buf,"/dev/arandom",size) >= size) {
321 return(NULL);
322 }
323
324#endif
325 return(buf);
326 }