Home | History | Annotate | Line # | Download | only in rc4
      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 (at) netcom.com>
     24  * Date: Wed, 14 Sep 1994 06:35:31 GMT
     25  */
     26 
     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