Reactos
at master 67 lines 1.9 kB view raw
1/* 2 * Copyright 2006 Mike McCormack 3 * 4 * based on arc4.cpp - written and placed in the public domain by Wei Dai 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 19 */ 20 21/* http://cryptopp.sourceforge.net/docs/ref521/arc4_8cpp-source.html */ 22 23#include "rc4.h" 24 25void rc4_init(RC4_CONTEXT *a4i, const unsigned char *key, unsigned int keyLen) 26{ 27 unsigned int keyIndex = 0, stateIndex = 0; 28 unsigned int i, a; 29 30 a4i->x = a4i->y = 0; 31 32 for (i=0; i<256; i++) 33 a4i->state[i] = i; 34 35 for (i=0; i<256; i++) 36 { 37 a = a4i->state[i]; 38 stateIndex += key[keyIndex] + a; 39 stateIndex &= 0xff; 40 a4i->state[i] = a4i->state[stateIndex]; 41 a4i->state[stateIndex] = a; 42 if (++keyIndex >= keyLen) 43 keyIndex = 0; 44 } 45} 46 47void rc4_crypt(RC4_CONTEXT *a4i, unsigned char *inoutString, unsigned int length) 48{ 49 unsigned char *const s=a4i->state; 50 unsigned int x = a4i->x; 51 unsigned int y = a4i->y; 52 unsigned int a, b; 53 54 while(length--) 55 { 56 x = (x+1) & 0xff; 57 a = s[x]; 58 y = (y+a) & 0xff; 59 b = s[y]; 60 s[x] = b; 61 s[y] = a; 62 *inoutString++ ^= s[(a+b) & 0xff]; 63 } 64 65 a4i->x = x; 66 a4i->y = y; 67}