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(); }