summaryrefslogtreecommitdiff
path: root/src/libstdcrypto/rc4.c
blob: 2f39b958815fa5f79d61e7196b2380cb5dcc1e02 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* ISC license. */
/* Thanks to Thomas Pornin <pornin@bolet.org> */

#include <sys/types.h>
#include <skalibs/bytestr.h>
#include <skalibs/rc4.h>

void rc4 (RC4Schedule *r, char const *in, char *out, size_t n)
{
  size_t i = 0 ;
  for (; i < n ; i++)
  {
    unsigned char t ;
    r->x = T8(r->x + 1) ;
    t = r->tab[r->x] ;
    r->y = T8(r->y + t) ;
    r->tab[r->x] = r->tab[r->y] ;
    r->tab[r->y] = t ;
    out[i] = (unsigned char)in[i] ^ T8(r->tab[r->x] + r->tab[r->y]) ;
  }
}