Option to set current cert to server certificate.
[openssl.git] / crypto / rand / rand_unix.c
index e9cba6479d1f81954863980242c3632eace6df52..e3a65571c8dfcd0b5e6fdd19e82ee48ed80fbbae 100644 (file)
 # define FD_SETSIZE (8*sizeof(fd_set))
 #endif
 
-#ifdef __OpenBSD__
+#if defined(OPENSSL_SYS_VOS)
+
+/* The following algorithm repeatedly samples the real-time clock
+   (RTC) to generate a sequence of unpredictable data.  The algorithm
+   relies upon the uneven execution speed of the code (due to factors
+   such as cache misses, interrupts, bus activity, and scheduling) and
+   upon the rather large relative difference between the speed of the
+   clock and the rate at which it can be read.
+
+   If this code is ported to an environment where execution speed is
+   more constant or where the RTC ticks at a much slower rate, or the
+   clock can be read with fewer instructions, it is likely that the
+   results would be far more predictable.
+
+   As a precaution, we generate 4 times the minimum required amount of
+   seed data.  */
+
+int RAND_poll(void)
+{
+       short int code;
+       gid_t curr_gid;
+       pid_t curr_pid;
+       uid_t curr_uid;
+       int i, k;
+       struct timespec ts;
+       unsigned char v;
+
+#ifdef OPENSSL_SYS_VOS_HPPA
+       long duration;
+       extern void s$sleep (long *_duration, short int *_code);
+#else
+#ifdef OPENSSL_SYS_VOS_IA32
+       long long duration;
+       extern void s$sleep2 (long long *_duration, short int *_code);
+#else
+#error "Unsupported Platform."
+#endif /* OPENSSL_SYS_VOS_IA32 */
+#endif /* OPENSSL_SYS_VOS_HPPA */
+
+       /* Seed with the gid, pid, and uid, to ensure *some*
+          variation between different processes.  */
+
+       curr_gid = getgid();
+       RAND_add (&curr_gid, sizeof curr_gid, 1);
+       curr_gid = 0;
+
+       curr_pid = getpid();
+       RAND_add (&curr_pid, sizeof curr_pid, 1);
+       curr_pid = 0;
+
+       curr_uid = getuid();
+       RAND_add (&curr_uid, sizeof curr_uid, 1);
+       curr_uid = 0;
+
+       for (i=0; i<(ENTROPY_NEEDED*4); i++)
+       {
+               /* burn some cpu; hope for interrupts, cache
+                  collisions, bus interference, etc.  */
+               for (k=0; k<99; k++)
+                       ts.tv_nsec = random ();
+
+#ifdef OPENSSL_SYS_VOS_HPPA
+               /* sleep for 1/1024 of a second (976 us).  */
+               duration = 1;
+               s$sleep (&duration, &code);
+#else
+#ifdef OPENSSL_SYS_VOS_IA32
+               /* sleep for 1/65536 of a second (15 us).  */
+               duration = 1;
+               s$sleep2 (&duration, &code);
+#endif /* OPENSSL_SYS_VOS_IA32 */
+#endif /* OPENSSL_SYS_VOS_HPPA */
+
+               /* get wall clock time.  */
+               clock_gettime (CLOCK_REALTIME, &ts);
+
+               /* take 8 bits */
+               v = (unsigned char) (ts.tv_nsec % 256);
+               RAND_add (&v, sizeof v, 1);
+               v = 0;
+       }
+       return 1;
+}
+#elif defined __OpenBSD__
 int RAND_poll(void)
 {
        u_int32_t rnd = 0, i;
@@ -157,7 +240,7 @@ int RAND_poll(void)
        pid_t curr_pid = getpid();
 #if defined(DEVRANDOM) || defined(DEVRANDOM_EGD)
        unsigned char tmpbuf[ENTROPY_NEEDED];
-       size_t n = 0;
+       int n = 0;
 #endif
 #ifdef DEVRANDOM
        static const char *randomfiles[] = { DEVRANDOM };
@@ -238,7 +321,7 @@ int RAND_poll(void)
                                t.tv_sec = 0;
                                t.tv_usec = usec;
 
-                               if (FD_SETSIZE > 0 && fd >= FD_SETSIZE)
+                               if (FD_SETSIZE > 0 && (unsigned)fd >= FD_SETSIZE)
                                        {
                                        /* can't use select, so just try to read once anyway */
                                        try_read = 1;
@@ -261,7 +344,7 @@ int RAND_poll(void)
                                
                                if (try_read)
                                        {
-                                       r = read(fd,tmpbuf+n,ENTROPY_NEEDED-n);
+                                       r = read(fd,(unsigned char *)tmpbuf+n, ENTROPY_NEEDED-n);
                                        if (r > 0)
                                                n += r;
 #if defined(OPENSSL_SYS_BEOS_R5)