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 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