xref: /openssl/crypto/rc4/rc4_enc.c (revision 33388b44)
1 /*
2  * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License 2.0 (the "License").  You may not use
5  * this file except in compliance with the License.  You can obtain a copy
6  * in the file LICENSE in the source distribution or at
7  * https://www.openssl.org/source/license.html
8  */
9 
10 /*
11  * RC4 low level APIs are deprecated for public use, but still ok for internal
12  * use.
13  */
14 #include "internal/deprecated.h"
15 
16 #include <openssl/rc4.h>
17 #include "rc4_local.h"
18 
19 /*-
20  * RC4 as implemented from a posting from
21  * Newsgroups: sci.crypt
22  * Subject: RC4 Algorithm revealed.
23  * Message-ID: <sternCvKL4B.Hyy@netcom.com>
24  * Date: Wed, 14 Sep 1994 06:35:31 GMT
25  */
26 
RC4(RC4_KEY * key,size_t len,const unsigned char * indata,unsigned char * outdata)27 void RC4(RC4_KEY *key, size_t len, const unsigned char *indata,
28          unsigned char *outdata)
29 {
30     register RC4_INT *d;
31     register RC4_INT x, y, tx, ty;
32     size_t i;
33 
34     x = key->x;
35     y = key->y;
36     d = key->data;
37 
38 #define LOOP(in,out) \
39                 x=((x+1)&0xff); \
40                 tx=d[x]; \
41                 y=(tx+y)&0xff; \
42                 d[x]=ty=d[y]; \
43                 d[y]=tx; \
44                 (out) = d[(tx+ty)&0xff]^ (in);
45 
46     i = len >> 3;
47     if (i) {
48         for (;;) {
49             LOOP(indata[0], outdata[0]);
50             LOOP(indata[1], outdata[1]);
51             LOOP(indata[2], outdata[2]);
52             LOOP(indata[3], outdata[3]);
53             LOOP(indata[4], outdata[4]);
54             LOOP(indata[5], outdata[5]);
55             LOOP(indata[6], outdata[6]);
56             LOOP(indata[7], outdata[7]);
57             indata += 8;
58             outdata += 8;
59             if (--i == 0)
60                 break;
61         }
62     }
63     i = len & 0x07;
64     if (i) {
65         for (;;) {
66             LOOP(indata[0], outdata[0]);
67             if (--i == 0)
68                 break;
69             LOOP(indata[1], outdata[1]);
70             if (--i == 0)
71                 break;
72             LOOP(indata[2], outdata[2]);
73             if (--i == 0)
74                 break;
75             LOOP(indata[3], outdata[3]);
76             if (--i == 0)
77                 break;
78             LOOP(indata[4], outdata[4]);
79             if (--i == 0)
80                 break;
81             LOOP(indata[5], outdata[5]);
82             if (--i == 0)
83                 break;
84             LOOP(indata[6], outdata[6]);
85             if (--i == 0)
86                 break;
87         }
88     }
89     key->x = x;
90     key->y = y;
91 }
92