5 const struct _prng_descriptor rc4_desc =
14 int rc4_start(prng_state *prng)
16 _ARGCHK(prng != NULL);
18 /* set keysize to zero */
24 int rc4_add_entropy(const unsigned char *buf, unsigned long len, prng_state *prng)
27 _ARGCHK(prng != NULL);
29 if (prng->rc4.x + len > 256) {
30 return CRYPT_INVALID_KEYSIZE;
34 prng->rc4.buf[prng->rc4.x++] = *buf++;
41 int rc4_ready(prng_state *prng)
43 unsigned char key[256], tmp;
46 _ARGCHK(prng != NULL);
49 memcpy(key, prng->rc4.buf, 256);
52 /* make RC4 perm and shuffle */
53 for (x = 0; x < 256; x++) {
57 for (x = y = 0; x < 256; x++) {
58 y = (y + prng->rc4.buf[x] + key[x % keylen]) & 255;
59 tmp = prng->rc4.buf[x]; prng->rc4.buf[x] = prng->rc4.buf[y]; prng->rc4.buf[y] = tmp;
65 zeromem(key, sizeof(key));
71 unsigned long rc4_read(unsigned char *buf, unsigned long len, prng_state *prng)
74 unsigned char *s, tmp;
78 _ARGCHK(prng != NULL);
87 tmp = s[x]; s[x] = s[y]; s[y] = tmp;
88 tmp = (s[x] + s[y]) & 255;