1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* crypto/rand/rand_unix.c */
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * All rights reserved.
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This package is an SSL implementation written
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * by Eric Young (eay@cryptsoft.com).
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The implementation was written so as to conform with Netscapes SSL.
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This library is free for commercial and non-commercial use as long as
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the following conditions are aheared to.  The following conditions
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * apply to all code found in this distribution, be it the RC4, RSA,
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * included with this distribution is covered by the same copyright terms
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright remains Eric Young's, and as such any Copyright notices in
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the code are not to be removed.
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If this package is used in a product, Eric Young should be given attribution
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * as the author of the parts of the library used.
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This can be in the form of a textual message at program startup or
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * in documentation (online or textual) provided with the package.
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met:
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the copyright
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer.
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    documentation and/or other materials provided with the distribution.
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this software
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    must display the following acknowledgement:
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes cryptographic software written by
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *     Eric Young (eay@cryptsoft.com)"
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    The word 'cryptographic' can be left out if the rouines from the library
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    being used are not cryptographic related :-).
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. If you include any Windows specific code (or a derivative thereof) from
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    the apps directory (application code) you must include an acknowledgement:
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SUCH DAMAGE.
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The licence and distribution terms for any publically available version or
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * derivative of this code cannot be changed.  i.e. this code cannot simply be
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * copied and put under another distribution licence
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * [including the GNU Public Licence.]
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* ====================================================================
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright (c) 1998-2006 The OpenSSL Project.  All rights reserved.
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met:
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the above copyright
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer.
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer in
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    the documentation and/or other materials provided with the
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    distribution.
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    software must display the following acknowledgment:
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software developed by the OpenSSL Project
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    endorse or promote products derived from this software without
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    prior written permission. For written permission, please contact
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    openssl-core@openssl.org.
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5. Products derived from this software may not be called "OpenSSL"
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    nor may "OpenSSL" appear in their names without prior written
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    permission of the OpenSSL Project.
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 6. Redistributions of any form whatsoever must retain the following
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    acknowledgment:
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software developed by the OpenSSL Project
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OF THE POSSIBILITY OF SUCH DAMAGE.
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ====================================================================
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This product includes cryptographic software written by Eric Young
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * (eay@cryptsoft.com).  This product includes software written by Tim
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Hudson (tjh@cryptsoft.com).
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h>
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define USE_SOCKETS
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "e_os.h"
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "cryptlib.h"
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/rand.h>
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "rand_lcl.h"
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if !(defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_VXWORKS) || defined(OPENSSL_SYS_NETWARE))
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <sys/types.h>
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <sys/time.h>
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <sys/times.h>
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <sys/stat.h>
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <fcntl.h>
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <unistd.h>
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <time.h>
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_LINUX) /* should actually be available virtually everywhere */
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# include <poll.h>
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <limits.h>
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef FD_SETSIZE
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# define FD_SETSIZE (8*sizeof(fd_set))
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1367b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom#if defined(OPENSSL_SYS_VOS)
1377b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom
1387b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom/* The following algorithm repeatedly samples the real-time clock
1397b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom   (RTC) to generate a sequence of unpredictable data.  The algorithm
1407b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom   relies upon the uneven execution speed of the code (due to factors
1417b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom   such as cache misses, interrupts, bus activity, and scheduling) and
1427b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom   upon the rather large relative difference between the speed of the
1437b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom   clock and the rate at which it can be read.
1447b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom
1457b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom   If this code is ported to an environment where execution speed is
1467b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom   more constant or where the RTC ticks at a much slower rate, or the
1477b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom   clock can be read with fewer instructions, it is likely that the
1487b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom   results would be far more predictable.
1497b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom
1507b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom   As a precaution, we generate 4 times the minimum required amount of
1517b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom   seed data.  */
1527b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom
153221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint RAND_poll(void)
154221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom{
1557b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom	short int code;
1567b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom	gid_t curr_gid;
157221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	pid_t curr_pid;
158221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	uid_t curr_uid;
1597b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom	int i, k;
160221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	struct timespec ts;
1617b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom	unsigned char v;
162221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1637b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom#ifdef OPENSSL_SYS_VOS_HPPA
1647b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom	long duration;
1657b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom	extern void s$sleep (long *_duration, short int *_code);
1667b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom#else
1677b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom#ifdef OPENSSL_SYS_VOS_IA32
1687b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom	long long duration;
1697b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom	extern void s$sleep2 (long long *_duration, short int *_code);
1707b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom#else
1717b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom#error "Unsupported Platform."
1727b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom#endif /* OPENSSL_SYS_VOS_IA32 */
1737b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom#endif /* OPENSSL_SYS_VOS_HPPA */
1747b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom
1757b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom	/* Seed with the gid, pid, and uid, to ensure *some*
1767b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom	   variation between different processes.  */
1777b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom
1787b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom	curr_gid = getgid();
1797b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom	RAND_add (&curr_gid, sizeof curr_gid, 1);
1807b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom	curr_gid = 0;
1817b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom
1827b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom	curr_pid = getpid();
1837b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom	RAND_add (&curr_pid, sizeof curr_pid, 1);
1847b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom	curr_pid = 0;
185221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1867b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom	curr_uid = getuid();
1877b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom	RAND_add (&curr_uid, sizeof curr_uid, 1);
1887b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom	curr_uid = 0;
1897b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom
1907b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom	for (i=0; i<(ENTROPY_NEEDED*4); i++)
1917b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom	{
1927b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom		/* burn some cpu; hope for interrupts, cache
1937b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom		   collisions, bus interference, etc.  */
1947b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom		for (k=0; k<99; k++)
1957b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom			ts.tv_nsec = random ();
1967b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom
1977b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom#ifdef OPENSSL_SYS_VOS_HPPA
1987b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom		/* sleep for 1/1024 of a second (976 us).  */
1997b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom		duration = 1;
2007b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom		s$sleep (&duration, &code);
2017b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom#else
2027b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom#ifdef OPENSSL_SYS_VOS_IA32
2037b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom		/* sleep for 1/65536 of a second (15 us).  */
2047b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom		duration = 1;
2057b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom		s$sleep2 (&duration, &code);
2067b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom#endif /* OPENSSL_SYS_VOS_IA32 */
2077b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom#endif /* OPENSSL_SYS_VOS_HPPA */
2087b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom
2097b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom		/* get wall clock time.  */
2107b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom		clock_gettime (CLOCK_REALTIME, &ts);
2117b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom
2127b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom		/* take 8 bits */
2137b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom		v = (unsigned char) (ts.tv_nsec % 256);
2147b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom		RAND_add (&v, sizeof v, 1);
2157b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom		v = 0;
2167b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom	}
217221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return 1;
218221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
219221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#elif defined __OpenBSD__
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint RAND_poll(void)
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	u_int32_t rnd = 0, i;
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char buf[ENTROPY_NEEDED];
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i = 0; i < sizeof(buf); i++) {
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (i % 4 == 0)
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			rnd = arc4random();
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		buf[i] = rnd;
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		rnd >>= 8;
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	RAND_add(buf, sizeof(buf), ENTROPY_NEEDED);
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memset(buf, 0, sizeof(buf));
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else /* !defined(__OpenBSD__) */
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint RAND_poll(void)
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned long l;
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pid_t curr_pid = getpid();
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(DEVRANDOM) || defined(DEVRANDOM_EGD)
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char tmpbuf[ENTROPY_NEEDED];
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int n = 0;
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef DEVRANDOM
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static const char *randomfiles[] = { DEVRANDOM };
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct stat randomstats[sizeof(randomfiles)/sizeof(randomfiles[0])];
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int fd;
249221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	unsigned int i;
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef DEVRANDOM_EGD
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static const char *egdsockets[] = { DEVRANDOM_EGD, NULL };
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const char **egdsocket = NULL;
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef DEVRANDOM
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memset(randomstats,0,sizeof(randomstats));
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Use a random entropy pool device. Linux, FreeBSD and OpenBSD
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * have this. Use /dev/urandom if you can as /dev/random may block
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * if it runs out of random entries.  */
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
262221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	for (i = 0; (i < sizeof(randomfiles)/sizeof(randomfiles[0])) &&
263221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			(n < ENTROPY_NEEDED); i++)
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((fd = open(randomfiles[i], O_RDONLY
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef O_NONBLOCK
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			|O_NONBLOCK
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef O_BINARY
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			|O_BINARY
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef O_NOCTTY /* If it happens to be a TTY (god forbid), do not make it
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		   our controlling tty */
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			|O_NOCTTY
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			)) >= 0)
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			int usec = 10*1000; /* spend 10ms on each file */
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			int r;
280221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			unsigned int j;
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			struct stat *st=&randomstats[i];
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			/* Avoid using same input... Used to be O_NOFOLLOW
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * above, but it's not universally appropriate... */
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (fstat(fd,st) != 0)	{ close(fd); continue; }
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			for (j=0;j<i;j++)
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (randomstats[j].st_ino==st->st_ino &&
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				    randomstats[j].st_dev==st->st_dev)
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					break;
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (j<i)		{ close(fd); continue; }
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			do
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				int try_read = 0;
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
298221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#if defined(OPENSSL_SYS_BEOS_R5)
299221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				/* select() is broken in BeOS R5, so we simply
300221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				 *  try to read something and snooze if we couldn't */
301221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				try_read = 1;
302221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
303221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#elif defined(OPENSSL_SYS_LINUX)
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				/* use poll() */
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				struct pollfd pset;
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				pset.fd = fd;
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				pset.events = POLLIN;
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				pset.revents = 0;
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (poll(&pset, 1, usec / 1000) < 0)
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					usec = 0;
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				else
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					try_read = (pset.revents & POLLIN) != 0;
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				/* use select() */
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				fd_set fset;
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				struct timeval t;
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				t.tv_sec = 0;
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				t.tv_usec = usec;
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
324e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu				if (FD_SETSIZE > 0 && (unsigned)fd >= FD_SETSIZE)
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					/* can't use select, so just try to read once anyway */
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					try_read = 1;
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				else
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					FD_ZERO(&fset);
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					FD_SET(fd, &fset);
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					if (select(fd+1,&fset,NULL,NULL,&t) >= 0)
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						{
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						usec = t.tv_usec;
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						if (FD_ISSET(fd, &fset))
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project							try_read = 1;
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						}
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					else
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						usec = 0;
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (try_read)
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					r = read(fd,(unsigned char *)tmpbuf+n, ENTROPY_NEEDED-n);
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					if (r > 0)
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						n += r;
350221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#if defined(OPENSSL_SYS_BEOS_R5)
351221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom					if (r == 0)
352221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom						snooze(t.tv_usec);
353221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				else
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					r = -1;
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				/* Some Unixen will update t in select(), some
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				   won't.  For those who won't, or if we
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				   didn't use select() in the first place,
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				   give up here, otherwise, we will do
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				   this once again for the remaining
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				   time. */
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (usec == 10*1000)
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					usec = 0;
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			while ((r > 0 ||
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			       (errno == EINTR || errno == EAGAIN)) && usec != 0 && n < ENTROPY_NEEDED);
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			close(fd);
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* defined(DEVRANDOM) */
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef DEVRANDOM_EGD
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Use an EGD socket to read entropy from an EGD or PRNGD entropy
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * collecting daemon. */
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (egdsocket = egdsockets; *egdsocket && n < ENTROPY_NEEDED; egdsocket++)
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		int r;
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		r = RAND_query_egd_bytes(*egdsocket, (unsigned char *)tmpbuf+n,
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					 ENTROPY_NEEDED-n);
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (r > 0)
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			n += r;
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* defined(DEVRANDOM_EGD) */
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(DEVRANDOM) || defined(DEVRANDOM_EGD)
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (n > 0)
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		RAND_add(tmpbuf,sizeof tmpbuf,(double)n);
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_cleanse(tmpbuf,n);
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* put in some default random data, we need more than just this */
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	l=curr_pid;
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	RAND_add(&l,sizeof(l),0.0);
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	l=getuid();
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	RAND_add(&l,sizeof(l),0.0);
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	l=time(NULL);
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	RAND_add(&l,sizeof(l),0.0);
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
407221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#if defined(OPENSSL_SYS_BEOS)
408221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{
409221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	system_info sysInfo;
410221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	get_system_info(&sysInfo);
411221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	RAND_add(&sysInfo,sizeof(sysInfo),0);
412221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
413221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif
414221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(DEVRANDOM) || defined(DEVRANDOM_EGD)
416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* defined(__OpenBSD__) */
423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* !(defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_VXWORKS) || defined(OPENSSL_SYS_NETWARE)) */
424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_VXWORKS)
427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint RAND_poll(void)
428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
432