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