Пример #1
0
static unsigned int
alt_arc4_getword(void)
{
    unsigned int val;
    val =  ((unsigned int) alt_arc4_getbyte()) << 24;
    val |= ((unsigned int) alt_arc4_getbyte()) << 16;
    val |= ((unsigned int) alt_arc4_getbyte()) << 8;
    val |= ((unsigned int) alt_arc4_getbyte());

    return val;
}
static crypto_uint4
alt_arc4_getword(void)
{
    crypto_uint4 val;

    val  = ((crypto_uint4) alt_arc4_getbyte()) << 24;
    val |= ((crypto_uint4) alt_arc4_getbyte()) << 16;
    val |= ((crypto_uint4) alt_arc4_getbyte()) << 8;
    val |= ((crypto_uint4) alt_arc4_getbyte());

    return val;
}
static void
alt_arc4_stir(void)
{
    int     i;
    unsigned char rnd[128];

    if (!rs_initialized) {
        alt_arc4_init();
        rs_initialized = 1;
    }

    if (random_data_source_fd != -1) {
        safe_read(random_data_source_fd, rnd, sizeof rnd);
    } else {
#ifdef HAVE_RANDOM_DEV
        _exit(1);
#else
        size_t i = (size_t) 0U;
# ifdef HAVE_ARC4RANDOM
        u_int32_t r;
        do {
            r = arc4random();
            memcpy(&rnd[i], &r, (size_t) 4U);
            i += (size_t) 4U;
        } while (i < sizeof(rnd));
# elif defined(HAVE_RANDOM)
        unsigned short r;
        do {
            r = (unsigned short) random();
            rnd[i++] = r & 0xFF;
            rnd[i++] = (r << 8) & 0xFF;
        } while (i < sizeof(rnd));
# else
        unsigned char r;
        do {
            r = (unsigned char) rand();
            rnd[i++] = r;
        } while (i < sizeof(rnd));
# endif
#endif
    }

    alt_arc4_addrandom(rnd, sizeof(rnd));

    /*
     * Discard early keystream, as per recommendations in:
     * http://www.wisdom.weizmann.ac.il/~itsik/RC4/Papers/Rc4_ksa.ps
     */
    for (i = 0; i < 256; i++) {
        (void) alt_arc4_getbyte();
    }
    alt_arc4_count = 1600000;
}
void
alt_arc4random_buf(void *_buf, size_t n)
{
    unsigned char *buf = (unsigned char *)_buf;
    _alt_arc4_LOCK();
    alt_arc4_stir_if_needed();
    while (n--) {
        if (--alt_arc4_count <= 0) {
            alt_arc4_stir();
        }
        buf[n] = alt_arc4_getbyte();
    }
    _alt_arc4_UNLOCK();
}