1/* 2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. 3 * All rights reserved. 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License along 16 * with this program; if not, write to the Free Software Foundation, Inc., 17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * File: rc4.c 20 * 21 * Purpose: 22 * 23 * Functions: 24 * 25 * Revision History: 26 * 27 * Author: Kyle Hsu 28 * 29 * Date: Sep 4, 2002 30 * 31 */ 32 33#include "rc4.h" 34 35void rc4_init(PRC4Ext pRC4, PBYTE pbyKey, unsigned int cbKey_len) 36{ 37 unsigned int ust1, ust2; 38 unsigned int keyindex; 39 unsigned int stateindex; 40 PBYTE pbyst; 41 unsigned int idx; 42 43 pbyst = pRC4->abystate; 44 pRC4->ux = 0; 45 pRC4->uy = 0; 46 for (idx = 0; idx < 256; idx++) 47 pbyst[idx] = (BYTE)idx; 48 keyindex = 0; 49 stateindex = 0; 50 for (idx = 0; idx < 256; idx++) { 51 ust1 = pbyst[idx]; 52 stateindex = (stateindex + pbyKey[keyindex] + ust1) & 0xff; 53 ust2 = pbyst[stateindex]; 54 pbyst[stateindex] = (BYTE)ust1; 55 pbyst[idx] = (BYTE)ust2; 56 if (++keyindex >= cbKey_len) 57 keyindex = 0; 58 } 59} 60 61unsigned int rc4_byte(PRC4Ext pRC4) 62{ 63 unsigned int ux; 64 unsigned int uy; 65 unsigned int ustx, usty; 66 PBYTE pbyst; 67 68 pbyst = pRC4->abystate; 69 ux = (pRC4->ux + 1) & 0xff; 70 ustx = pbyst[ux]; 71 uy = (ustx + pRC4->uy) & 0xff; 72 usty = pbyst[uy]; 73 pRC4->ux = ux; 74 pRC4->uy = uy; 75 pbyst[uy] = (BYTE)ustx; 76 pbyst[ux] = (BYTE)usty; 77 78 return pbyst[(ustx + usty) & 0xff]; 79} 80 81void rc4_encrypt(PRC4Ext pRC4, PBYTE pbyDest, 82 PBYTE pbySrc, unsigned int cbData_len) 83{ 84 unsigned int ii; 85 for (ii = 0; ii < cbData_len; ii++) 86 pbyDest[ii] = (BYTE)(pbySrc[ii] ^ rc4_byte(pRC4)); 87} 88