Ejemplo n.º 1
0
int random_byte(void)
{
#ifdef MPEXT
    int pos = pool.poolpos;

    if (pos < sizeof(pool.incoming) || pos >= POOLSIZE)
    {
      EnterCriticalSection(&noise_section);
      if (pool.poolpos >= POOLSIZE)
      {
        random_stir();
      }
      pos = pool.poolpos;
      pool.poolpos++;
      LeaveCriticalSection(&noise_section);
    }
    else
    {
      pool.poolpos++;
    }

    return pool.pool[pos];
#else
    if (pool.poolpos >= POOLSIZE)
	random_stir();

    return pool.pool[pool.poolpos++];
#endif
}
Ejemplo n.º 2
0
int random_byte(void)
{
#ifdef MPEXT
    int pos;

    assert(random_active);

    pos = pool.poolpos;

    if (pos < sizeof(pool.incoming) || pos >= POOLSIZE)
    {
      MPEXT_PUTTY_SECTION_ENTER;
      if (pool.poolpos >= POOLSIZE)
      {
        random_stir();
      }
      pos = pool.poolpos;
      pool.poolpos++;
      MPEXT_PUTTY_SECTION_LEAVE;
    }
    else
    {
      pool.poolpos++;
    }

    return pool.pool[pos];
#else
    assert(random_active);

    if (pool.poolpos >= POOLSIZE)
	random_stir();

    return pool.pool[pool.poolpos++];
#endif
}
Ejemplo n.º 3
0
void random_get_savedata(void **data, int *len)
{
    void *buf = snewn(POOLSIZE / 2, char);
    random_stir();
    memcpy(buf, pool.pool + pool.poolpos, POOLSIZE / 2);
    *len = POOLSIZE / 2;
    *data = buf;
    random_stir();
}
Ejemplo n.º 4
0
void random_get_savedata(void **data, int *len)
{
    void *buf = snewn(POOLSIZE / 2, char);
    MPEXT_PUTTY_SECTION_ENTER;
    random_stir();
    memcpy(buf, pool.pool + pool.poolpos, POOLSIZE / 2);
    *len = POOLSIZE / 2;
    *data = buf;
    random_stir();
    MPEXT_PUTTY_SECTION_LEAVE;
}
Ejemplo n.º 5
0
void random_get_savedata(void **data, int *len)
{
    void *buf = snewn(POOLSIZE / 2, char);
#ifdef MPEXT
    EnterCriticalSection(&noise_section);
#endif
    random_stir();
    memcpy(buf, pool.pool + pool.poolpos, POOLSIZE / 2);
    *len = POOLSIZE / 2;
    *data = buf;
    random_stir();
#ifdef MPEXT
    LeaveCriticalSection(&noise_section);
#endif
}
Ejemplo n.º 6
0
int random_byte(void)
{
    if (pool.poolpos >= POOLSIZE)
	random_stir();

    return pool.pool[pool.poolpos++];
}
Ejemplo n.º 7
0
void random_add_heavynoise(void *noise, int length)
{
    unsigned char *p = noise;
    int i;

    while (length >= POOLSIZE) {
	for (i = 0; i < POOLSIZE; i++)
	    pool.pool[i] ^= *p++;
	random_stir();
	length -= POOLSIZE;
    }

    for (i = 0; i < length; i++)
	pool.pool[i] ^= *p++;
    random_stir();
}
Ejemplo n.º 8
0
void random_add_noise(void *noise, int length)
{
    unsigned char *p = noise;
    int i;

    if (!random_active)
	return;

    /*
     * This function processes HASHINPUT bytes into only HASHSIZE
     * bytes, so _if_ we were getting incredibly high entropy
     * sources then we would be throwing away valuable stuff.
     */
    while (length >= (HASHINPUT - pool.incomingpos)) {
	memcpy(pool.incomingb + pool.incomingpos, p,
	       HASHINPUT - pool.incomingpos);
	p += HASHINPUT - pool.incomingpos;
	length -= HASHINPUT - pool.incomingpos;
	SHATransform((word32 *) pool.incoming, (word32 *) pool.incomingb);
	for (i = 0; i < HASHSIZE; i++) {
	    pool.pool[pool.poolpos++] ^= pool.incomingb[i];
	    if (pool.poolpos >= POOLSIZE)
		pool.poolpos = 0;
	}
	if (pool.poolpos < HASHSIZE)
	    random_stir();

	pool.incomingpos = 0;
    }

    memcpy(pool.incomingb + pool.incomingpos, p, length);
    pool.incomingpos += length;
}
Ejemplo n.º 9
0
void random_init(void)
{
    memset(&pool, 0, sizeof(pool));    /* just to start with */

    random_active = 1;

    noise_get_heavy(random_add_heavynoise_bitbybit);
    random_stir();
}
Ejemplo n.º 10
0
int random_byte(void)
{
#ifndef RECONNECTPORT
    assert(random_active);
#endif

    if (pool.poolpos >= POOLSIZE)
	random_stir();

    return pool.pool[pool.poolpos++];
}
Ejemplo n.º 11
0
void random_ref(void)
{
    if (!random_active) {
	memset(&pool, 0, sizeof(pool));    /* just to start with */

	noise_get_heavy(random_add_heavynoise_bitbybit);
	random_stir();

	//next_noise_collection = schedule_timer(NOISE_REGULAR_INTERVAL, random_timer, &pool);
    }

    random_active++;
}
Ejemplo n.º 12
0
void random_init(void) {
    memset(&pool, 0, sizeof(pool));    /* just to start with */

    /*
     * For noise_get_heavy, we temporarily use `poolpos' as the
     * pointer for addition of noise, rather than extraction of
     * random numbers.
     */
    pool.poolpos = 0;
    noise_get_heavy(random_add_heavynoise);

    random_stir();
}
Ejemplo n.º 13
0
static void random_add_heavynoise(void *noise, int length) {
    unsigned char *p = noise;

    while (length >= (POOLSIZE - pool.poolpos)) {
	memcpy(pool.pool + pool.poolpos, p, POOLSIZE - pool.poolpos);
	p += POOLSIZE - pool.poolpos;
	length -= POOLSIZE - pool.poolpos;
	random_stir();
	pool.poolpos = 0;
    }

    memcpy(pool.pool + pool.poolpos, p, length);
    pool.poolpos += length;
}
Ejemplo n.º 14
0
static void random_add_heavynoise_bitbybit(void *noise, int length)
{
    unsigned char *p = noise;
    int i;

    while (length >= POOLSIZE - pool.poolpos) {
	for (i = 0; i < POOLSIZE - pool.poolpos; i++)
	    pool.pool[pool.poolpos + i] ^= *p++;
	random_stir();
	length -= POOLSIZE - pool.poolpos;
	pool.poolpos = 0;
    }

    for (i = 0; i < length; i++)
	pool.pool[i] ^= *p++;
    pool.poolpos = i;
}
Ejemplo n.º 15
0
void random_add_noise(RandomState * state, const void *buf, unsigned int bytes)
{
    unsigned int pos = state->add_position;
    const char *input = buf;

    while (bytes > 0) {
        if (pos >= RANDOM_STATE_BYTES) {
            pos = 0;
            random_stir(state);
        }
        state->state[pos] ^= *input;
        input++;
        bytes--;
        pos++;
    }
    state->add_position = pos;
}
Ejemplo n.º 16
0
void random_ref(void)
{
    if (!random_active) {
#ifdef MPEXT
        InitializeCriticalSection(&noise_section);
#endif
	memset(&pool, 0, sizeof(pool));    /* just to start with */

	noise_get_heavy(random_add_heavynoise_bitbybit);
	random_stir();

	next_noise_collection =
	    schedule_timer(NOISE_REGULAR_INTERVAL, random_timer, &pool);
    }

#ifdef MPEXT
    EnterCriticalSection(&noise_section);
#endif
    random_active++;
#ifdef MPEXT
    LeaveCriticalSection(&noise_section);
#endif
}
Ejemplo n.º 17
0
void random_get_savedata(void **data, int *len)
{
    random_stir();
    *data = pool.pool + pool.poolpos;
    *len = POOLSIZE / 2;
}
Ejemplo n.º 18
0
static void
random_timer ()
{
  random_stir ();
  timecb (time (NULL) + 1800 + rnd.getword () % 1800, wrap (random_timer));
}
Ejemplo n.º 19
0
void random_acquire_light_environmental_noise(RandomState * state)
{
    int f;
    char buf[32];
    int len;

    /* Stir first to make all bits depend on all other bits (some of
       them not revealed to callers). */
    random_stir(state);

    /* About every five minutes, mix in some noise from /dev/random. */
    if (time(NULL) - state->last_dev_random_usage > 5 * 60) {
        state->last_dev_random_usage = time(NULL);

        /* If /dev/random is available, read some data from there in non-blocking
           mode and mix it into the pool. */
        f = open("/dev/random", O_RDONLY);
        if (f >= 0) {
            /* Set the descriptor into non-blocking mode. */
#if defined(O_NONBLOCK) && !defined(O_NONBLOCK_BROKEN)
            fcntl(f, F_SETFL, O_NONBLOCK);
#else                           /* O_NONBLOCK && !O_NONBLOCK_BROKEN */
            fcntl(f, F_SETFL, O_NDELAY);
#endif                          /* O_NONBLOCK && !O_NONBLOCK_BROKEN */
            len = read(f, buf, sizeof(buf));
            close(f);
            if (len > 0)
                random_add_noise(state, buf, len);
        }
    }

    /* Get miscellaneous noise from various system parameters and statistics. */
    random_xor_noise(state, (unsigned int) (state->state[0] + 256 * state->state[1]) % (RANDOM_STATE_BYTES / 4), (word32) time(NULL));

#ifdef HAVE_GETTIMEOFDAY
    {
        struct timeval tv;

#ifdef HAVE_NO_TZ_IN_GETTIMEOFDAY
        gettimeofday(&tv);
#else
        gettimeofday(&tv, NULL);
#endif
        random_xor_noise(state, 0, (word32) tv.tv_usec);
        random_xor_noise(state, 1, (word32) tv.tv_sec);
#ifdef HAVE_CLOCK
        random_xor_noise(state, 3, (word32) clock());
#endif                          /* HAVE_CLOCK */
    }
#endif                          /* HAVE_GETTIMEOFDAY */
#ifdef HAVE_TIMES
    {
        struct tms tm;

        random_xor_noise(state, 2, (word32) times(&tm));
        random_xor_noise(state, 4, (word32) (tm.tms_utime ^ (tm.tms_stime << 8) ^ (tm.tms_cutime << 16) ^ (tm.tms_cstime << 24)));
    }
#endif                          /* HAVE_TIMES */
#ifdef HAVE_GETRUSAGE
    {
        struct rusage ru, cru;

        getrusage(RUSAGE_SELF, &ru);
        getrusage(RUSAGE_CHILDREN, &cru);
        random_xor_noise(state, 0, (word32) (ru.ru_utime.tv_usec + cru.ru_utime.tv_usec));
        random_xor_noise(state, 2, (word32) (ru.ru_stime.tv_usec + cru.ru_stime.tv_usec));
        random_xor_noise(state, 5, (word32) (ru.ru_maxrss + cru.ru_maxrss));
        random_xor_noise(state, 6, (word32) (ru.ru_ixrss + cru.ru_ixrss));
        random_xor_noise(state, 7, (word32) (ru.ru_idrss + cru.ru_idrss));
        random_xor_noise(state, 8, (word32) (ru.ru_minflt + cru.ru_minflt));
        random_xor_noise(state, 9, (word32) (ru.ru_majflt + cru.ru_majflt));
        random_xor_noise(state, 10, (word32) (ru.ru_nswap + cru.ru_nswap));
        random_xor_noise(state, 11, (word32) (ru.ru_inblock + cru.ru_inblock));
        random_xor_noise(state, 12, (word32) (ru.ru_oublock + cru.ru_oublock));
        random_xor_noise(state, 13, (word32) ((ru.ru_msgsnd ^ ru.ru_msgrcv ^ ru.ru_nsignals) + (cru.ru_msgsnd ^ cru.ru_msgrcv ^ cru.ru_nsignals)));
        random_xor_noise(state, 14, (word32) (ru.ru_nvcsw + cru.ru_nvcsw));
        random_xor_noise(state, 15, (word32) (ru.ru_nivcsw + cru.ru_nivcsw));
    }
#endif                          /* HAVE_GETRUSAGE */
    random_xor_noise(state, 11, (word32) getpid());
    random_xor_noise(state, 12, (word32) getppid());
    random_xor_noise(state, 10, (word32) getuid());
    random_xor_noise(state, 10, (word32) (getgid() << 16));
#ifdef _POSIX_CHILD_MAX
    random_xor_noise(state, 13, (word32) (_POSIX_CHILD_MAX << 16));
#endif                          /* _POSIX_CHILD_MAX */
#ifdef CLK_TCK
    random_xor_noise(state, 14, (word32) (CLK_TCK << 16));
#endif                          /* CLK_TCK */

    random_stir(state);
}