Commit | Line | Data |
---|---|---|
68c0bdff HG |
1 | |
2 | /******************************************************************************* | |
3 | * Agere Systems Inc. | |
4 | * Wireless device driver for Linux (wlags49). | |
5 | * | |
6 | * Copyright (c) 1998-2003 Agere Systems Inc. | |
7 | * All rights reserved. | |
8 | * http://www.agere.com | |
9 | * | |
10 | * Initially developed by TriplePoint, Inc. | |
11 | * http://www.triplepoint.com | |
12 | * | |
13 | *------------------------------------------------------------------------------ | |
14 | * | |
15 | * This file defines functions related to WEP key coding/decoding. | |
16 | * | |
17 | *------------------------------------------------------------------------------ | |
18 | * | |
19 | * SOFTWARE LICENSE | |
20 | * | |
21 | * This software is provided subject to the following terms and conditions, | |
22 | * which you should read carefully before using the software. Using this | |
23 | * software indicates your acceptance of these terms and conditions. If you do | |
24 | * not agree with these terms and conditions, do not use the software. | |
25 | * | |
d36b6910 | 26 | * Copyright © 2003 Agere Systems Inc. |
68c0bdff HG |
27 | * All rights reserved. |
28 | * | |
29 | * Redistribution and use in source or binary forms, with or without | |
30 | * modifications, are permitted provided that the following conditions are met: | |
31 | * | |
32 | * . Redistributions of source code must retain the above copyright notice, this | |
33 | * list of conditions and the following Disclaimer as comments in the code as | |
34 | * well as in the documentation and/or other materials provided with the | |
35 | * distribution. | |
36 | * | |
37 | * . Redistributions in binary form must reproduce the above copyright notice, | |
38 | * this list of conditions and the following Disclaimer in the documentation | |
39 | * and/or other materials provided with the distribution. | |
40 | * | |
41 | * . Neither the name of Agere Systems Inc. nor the names of the contributors | |
42 | * may be used to endorse or promote products derived from this software | |
43 | * without specific prior written permission. | |
44 | * | |
45 | * Disclaimer | |
46 | * | |
d36b6910 | 47 | * THIS SOFTWARE IS PROVIDED \93AS IS\94 AND ANY EXPRESS OR IMPLIED WARRANTIES, |
68c0bdff HG |
48 | * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF |
49 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY | |
50 | * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN | |
51 | * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY | |
52 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
53 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
54 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |
55 | * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT | |
56 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |
57 | * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH | |
58 | * DAMAGE. | |
59 | * | |
60 | ******************************************************************************/ | |
61 | ||
68c0bdff HG |
62 | /******************************************************************************* |
63 | * include files | |
64 | ******************************************************************************/ | |
8174fc04 | 65 | #include <linux/string.h> |
68c0bdff HG |
66 | #include <wl_version.h> |
67 | ||
68 | #include <debug.h> | |
69 | #include <hcf.h> | |
70 | ||
71 | #include <wl_enc.h> | |
72 | ||
73 | ||
74 | ||
75 | ||
76 | /******************************************************************************* | |
77 | * global definitions | |
78 | ******************************************************************************/ | |
79 | #if DBG | |
80 | ||
81 | extern dbg_info_t *DbgInfo; | |
82 | ||
83 | #endif /* DBG */ | |
84 | ||
85 | ||
86 | ||
87 | ||
88 | /******************************************************************************* | |
89 | * wl_wep_code() | |
90 | ******************************************************************************* | |
91 | * | |
92 | * DESCRIPTION: | |
93 | * | |
94 | * This function encodes a set of wep keys for privacy | |
95 | * | |
96 | * PARAMETERS: | |
97 | * | |
98 | * szCrypt - | |
99 | * szDest - | |
100 | * Data - | |
101 | * nLen - | |
102 | * | |
103 | * RETURNS: | |
104 | * | |
105 | * OK | |
106 | * | |
107 | ******************************************************************************/ | |
2d33309e | 108 | int wl_wep_code(char *szCrypt, char *szDest, void *Data, int nLen) |
68c0bdff | 109 | { |
9413127a JM |
110 | int i; |
111 | int t; | |
112 | int k ; | |
113 | char bits; | |
114 | char *szData = (char *) Data; | |
115 | /*------------------------------------------------------------------------*/ | |
68c0bdff HG |
116 | |
117 | ||
2d33309e | 118 | for (i = bits = 0; i < MACADDRESS_STR_LEN; i++) { |
9413127a JM |
119 | bits ^= szCrypt[i]; |
120 | bits += szCrypt[i]; | |
121 | } | |
68c0bdff | 122 | |
2d33309e JM |
123 | for (i = t = *szDest = 0; i < nLen; i++, t++) { |
124 | k = szData[i] ^ (bits + i); | |
68c0bdff HG |
125 | |
126 | ||
2d33309e | 127 | switch (i % 3) { |
68c0bdff | 128 | |
f83a7c34 | 129 | case 0: |
68c0bdff | 130 | |
9413127a JM |
131 | szDest[t] = ((k & 0xFC) >> 2) + CH_START ; |
132 | szDest[t+1] = ((k & 0x03) << 4) + CH_START ; | |
133 | szDest[t+2] = '\0'; | |
68c0bdff | 134 | |
9413127a | 135 | break; |
68c0bdff HG |
136 | |
137 | ||
f83a7c34 | 138 | case 1: |
68c0bdff | 139 | |
2d33309e JM |
140 | szDest[t] += ((k & 0xF0) >> 4); |
141 | szDest[t+1] = ((k & 0x0F) << 2) + CH_START ; | |
9413127a | 142 | szDest[t+2] = '\0'; |
68c0bdff | 143 | |
9413127a | 144 | break; |
68c0bdff HG |
145 | |
146 | ||
f83a7c34 | 147 | case 2: |
68c0bdff | 148 | |
2d33309e JM |
149 | szDest[t] += ((k & 0xC0) >> 6); |
150 | szDest[t+1] = (k & 0x3F) + CH_START ; | |
9413127a JM |
151 | szDest[t+2] = '\0'; |
152 | t++; | |
68c0bdff | 153 | |
9413127a JM |
154 | break; |
155 | } | |
156 | } | |
68c0bdff | 157 | |
13821d96 | 158 | return strlen(szDest); |
68c0bdff HG |
159 | |
160 | } | |
161 | /*============================================================================*/ | |
162 | ||
163 | ||
164 | ||
165 | ||
166 | /******************************************************************************* | |
167 | * wl_wep_decode() | |
168 | ******************************************************************************* | |
169 | * | |
170 | * DESCRIPTION: | |
171 | * | |
172 | * This function decodes a set of WEP keys for use by the card. | |
173 | * | |
174 | * PARAMETERS: | |
175 | * | |
176 | * szCrypt - | |
177 | * szDest - | |
178 | * Data - | |
179 | * | |
180 | * RETURNS: | |
181 | * | |
182 | * OK | |
183 | * | |
184 | ******************************************************************************/ | |
2d33309e | 185 | int wl_wep_decode(char *szCrypt, void *Dest, char *szData) |
68c0bdff | 186 | { |
9413127a JM |
187 | int i; |
188 | int t; | |
189 | int nLen; | |
190 | char bits; | |
191 | char *szDest = Dest; | |
192 | /*------------------------------------------------------------------------*/ | |
68c0bdff HG |
193 | |
194 | ||
2d33309e | 195 | for (i = bits = 0; i < 12; i++) { |
9413127a JM |
196 | bits ^= szCrypt[i] ; |
197 | bits += szCrypt[i] ; | |
198 | } | |
68c0bdff | 199 | |
2d33309e | 200 | nLen = (strlen(szData) * 3) / 4 ; |
68c0bdff | 201 | |
2d33309e JM |
202 | for (i = t = 0; i < nLen; i++, t++) { |
203 | switch (i % 3) { | |
f83a7c34 | 204 | case 0: |
68c0bdff | 205 | |
2d33309e JM |
206 | szDest[i] = (((szData[t] - CH_START) & 0x3f) << 2) + |
207 | (((szData[t+1] - CH_START) & 0x30) >> 4); | |
9413127a | 208 | break; |
68c0bdff HG |
209 | |
210 | ||
f83a7c34 | 211 | case 1: |
2d33309e JM |
212 | szDest[i] = (((szData[t] - CH_START) & 0x0f) << 4) + |
213 | (((szData[t+1] - CH_START) & 0x3c) >> 2); | |
9413127a | 214 | break; |
68c0bdff HG |
215 | |
216 | ||
f83a7c34 | 217 | case 2: |
2d33309e JM |
218 | szDest[i] = (((szData[t] - CH_START) & 0x03) << 6) + |
219 | ((szData[t+1] - CH_START) & 0x3f); | |
9413127a JM |
220 | t++; |
221 | break; | |
222 | } | |
68c0bdff | 223 | |
2d33309e | 224 | szDest[i] ^= (bits + i); |
68c0bdff | 225 | |
9413127a | 226 | } |
68c0bdff | 227 | |
13821d96 | 228 | return i; |
68c0bdff HG |
229 | |
230 | } | |
231 | /*============================================================================*/ | |
232 |