* Created: Sun Mar 9 00:09:18 1997
*
* The original RNG was based on Secure Shell's random number generator
- * by Tatu Ylönen. This RNG has been rewritten twice since the creation.
+ * by Tatu Ylönen and was used as reference when programming this RNG.
+ * This RNG has been rewritten twice since the creation.
*/
#include "silcincludes.h"
random pool. This is allocated when RNG object is allocated and
free'd when RNG object is free'd.
- uint8 threshold
+ uint8 threshhold
- Threshold to indicate when it is required to acquire more
+ Threshhold to indicate when it is required to acquire more
noise from the environment. More soft noise is acquired after
64 bits of output and hard noise every 160 bits of output.
unsigned char key[64];
SilcRngState state;
SilcHash sha1;
- uint8 threshold;
+ uint8 threshhold;
} SilcRngObject;
/* Allocates new RNG object. */
static void silc_rng_get_soft_noise(SilcRng rng)
{
+#ifndef SILC_WIN32
struct tms ptime;
+#endif
uint32 pos;
pos = silc_rng_get_position(rng);
silc_rng_xor(rng, clock(), 0);
+#ifndef SILC_WIN32
#ifdef HAVE_GETPID
silc_rng_xor(rng, getpid(), 1);
#ifdef HAVE_GETPGID
- silc_rng_xor(rng, getpgid(getpid() << 8), 2);
- silc_rng_xor(rng, getpgid(getpid() << 8), 3);
+ silc_rng_xor(rng, getpgid(getpid()) << 8, 2);
+ silc_rng_xor(rng, getpgid(getpid()) << 8, 3);
#endif
silc_rng_xor(rng, getgid(), 4);
#endif
silc_rng_xor(rng, getpgrp(), 5);
#endif
#ifdef HAVE_GETSID
- silc_rng_xor(rng, getsid(getpid() << 16), 6);
+ silc_rng_xor(rng, getsid(getpid()) << 16, 6);
#endif
silc_rng_xor(rng, times(&ptime), 7);
silc_rng_xor(rng, ptime.tms_utime, 8);
silc_rng_xor(rng, (ptime.tms_stime ^ ptime.tms_cutime), pos++);
silc_rng_xor(rng, (ptime.tms_cutime + ptime.tms_stime), pos++);
silc_rng_xor(rng, (ptime.tms_stime << 8), pos++);
+#endif
silc_rng_xor(rng, clock() << 4, pos++);
+#ifndef SILC_WIN32
#ifdef HAVE_GETPGID
- silc_rng_xor(rng, getpgid(getpid() << 8), pos++);
+ silc_rng_xor(rng, getpgid(getpid()) << 8, pos++);
#endif
#ifdef HAVE_GETPGRP
silc_rng_xor(rng, getpgrp(), pos++);
#endif
#ifdef HAVE_SETSID
- silc_rng_xor(rng, getsid(getpid() << 16), pos++);
+ silc_rng_xor(rng, getsid(getpid()) << 16, pos++);
#endif
silc_rng_xor(rng, times(&ptime), pos++);
silc_rng_xor(rng, ptime.tms_utime, pos++);
#ifdef HAVE_GETPGRP
silc_rng_xor(rng, getpgrp(), pos++);
#endif
+#endif
#ifdef SILC_RNG_DEBUG
SILC_LOG_HEXDUMP(("pool"), rng->pool, sizeof(rng->pool));
static void silc_rng_get_hard_noise(SilcRng rng)
{
+#ifndef SILC_WIN32
char buf[32];
int fd, len, i;
out:
close(fd);
memset(buf, 0, sizeof(buf));
+#endif
}
/* Execs command and gets noise from its output */
static void silc_rng_exec_command(SilcRng rng, char *command)
{
+#ifndef SILC_WIN32
char buf[1024];
FILE *fd;
int i;
/* Add the buffer into random pool */
silc_rng_add_noise(rng, buf, strlen(buf));
memset(buf, 0, sizeof(buf));
+#endif
}
/* This function adds the contents of the buffer as noise into random
unsigned char silc_rng_get_byte(SilcRng rng)
{
- rng->threshold++;
+ rng->threshhold++;
- /* Get more soft noise after 64 bits threshold */
- if (rng->threshold >= 8)
+ /* Get more soft noise after 64 bits threshhold */
+ if (rng->threshhold >= 8)
silc_rng_get_soft_noise(rng);
- /* Get hard noise after 160 bits threshold, zero the threshold. */
- if (rng->threshold >= 20) {
- rng->threshold = 0;
+ /* Get hard noise after 160 bits threshhold, zero the threshhold. */
+ if (rng->threshhold >= 20) {
+ rng->threshhold = 0;
silc_rng_get_hard_noise(rng);
}