1 /* 2 * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the OpenSSL license (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 #include <openssl/rc4.h> 11 #include "rc4_local.h" 12 13 /*- 14 * RC4 as implemented from a posting from 15 * Newsgroups: sci.crypt 16 * Subject: RC4 Algorithm revealed. 17 * Message-ID: <sternCvKL4B.Hyy@netcom.com> 18 * Date: Wed, 14 Sep 1994 06:35:31 GMT 19 */ 20 21 void RC4(RC4_KEY *key, size_t len, const unsigned char *indata, 22 unsigned char *outdata) 23 { 24 register RC4_INT *d; 25 register RC4_INT x, y, tx, ty; 26 size_t i; 27 28 x = key->x; 29 y = key->y; 30 d = key->data; 31 32 #define LOOP(in,out) \ 33 x=((x+1)&0xff); \ 34 tx=d[x]; \ 35 y=(tx+y)&0xff; \ 36 d[x]=ty=d[y]; \ 37 d[y]=tx; \ 38 (out) = d[(tx+ty)&0xff]^ (in); 39 40 i = len >> 3; 41 if (i) { 42 for (;;) { 43 LOOP(indata[0], outdata[0]); 44 LOOP(indata[1], outdata[1]); 45 LOOP(indata[2], outdata[2]); 46 LOOP(indata[3], outdata[3]); 47 LOOP(indata[4], outdata[4]); 48 LOOP(indata[5], outdata[5]); 49 LOOP(indata[6], outdata[6]); 50 LOOP(indata[7], outdata[7]); 51 indata += 8; 52 outdata += 8; 53 if (--i == 0) 54 break; 55 } 56 } 57 i = len & 0x07; 58 if (i) { 59 for (;;) { 60 LOOP(indata[0], outdata[0]); 61 if (--i == 0) 62 break; 63 LOOP(indata[1], outdata[1]); 64 if (--i == 0) 65 break; 66 LOOP(indata[2], outdata[2]); 67 if (--i == 0) 68 break; 69 LOOP(indata[3], outdata[3]); 70 if (--i == 0) 71 break; 72 LOOP(indata[4], outdata[4]); 73 if (--i == 0) 74 break; 75 LOOP(indata[5], outdata[5]); 76 if (--i == 0) 77 break; 78 LOOP(indata[6], outdata[6]); 79 if (--i == 0) 80 break; 81 } 82 } 83 key->x = x; 84 key->y = y; 85 } 86