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 | ******************************************************************************/ | |
108 | int wl_wep_code( char *szCrypt, char *szDest, void *Data, int nLen ) | |
109 | { | |
110 | int i; | |
111 | int t; | |
112 | int k ; | |
113 | char bits; | |
114 | char *szData = (char *) Data; | |
115 | /*------------------------------------------------------------------------*/ | |
116 | ||
117 | ||
118 | for( i = bits = 0 ; i < MACADDRESS_STR_LEN; i++ ) { | |
119 | bits ^= szCrypt[i]; | |
120 | bits += szCrypt[i]; | |
121 | } | |
122 | ||
123 | for( i = t = *szDest = 0; i < nLen; i++, t++ ) { | |
124 | k = szData[i] ^ ( bits + i ); | |
125 | ||
126 | ||
127 | switch( i % 3 ) { | |
128 | ||
129 | case 0 : | |
130 | ||
131 | szDest[t] = ((k & 0xFC) >> 2) + CH_START ; | |
132 | szDest[t+1] = ((k & 0x03) << 4) + CH_START ; | |
133 | szDest[t+2] = '\0'; | |
134 | ||
135 | break; | |
136 | ||
137 | ||
138 | case 1 : | |
139 | ||
140 | szDest[t] += (( k & 0xF0 ) >> 4 ); | |
141 | szDest[t+1] = (( k & 0x0F ) << 2 ) + CH_START ; | |
142 | szDest[t+2] = '\0'; | |
143 | ||
144 | break; | |
145 | ||
146 | ||
147 | case 2 : | |
148 | ||
149 | szDest[t] += (( k & 0xC0 ) >> 6 ); | |
150 | szDest[t+1] = ( k & 0x3F ) + CH_START ; | |
151 | szDest[t+2] = '\0'; | |
152 | t++; | |
153 | ||
154 | break; | |
155 | } | |
156 | } | |
157 | ||
158 | return( strlen( szDest )) ; | |
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 | ******************************************************************************/ | |
185 | int wl_wep_decode( char *szCrypt, void *Dest, char *szData ) | |
186 | { | |
187 | int i; | |
188 | int t; | |
189 | int nLen; | |
190 | char bits; | |
191 | char *szDest = Dest; | |
192 | /*------------------------------------------------------------------------*/ | |
193 | ||
194 | ||
195 | for( i = bits = 0 ; i < 12; i++ ) { | |
196 | bits ^= szCrypt[i] ; | |
197 | bits += szCrypt[i] ; | |
198 | } | |
199 | ||
200 | nLen = ( strlen( szData ) * 3) / 4 ; | |
201 | ||
202 | for( i = t = 0; i < nLen; i++, t++ ) { | |
203 | switch( i % 3 ) { | |
204 | case 0 : | |
205 | ||
206 | szDest[i] = ((( szData[t]-CH_START ) & 0x3f ) << 2 ) + | |
207 | ((( szData[t+1]-CH_START ) & 0x30 ) >> 4 ); | |
208 | break; | |
209 | ||
210 | ||
211 | case 1 : | |
212 | szDest[i] = ((( szData[t]-CH_START ) & 0x0f ) << 4 ) + | |
213 | ((( szData[t+1]-CH_START ) & 0x3c ) >> 2 ); | |
214 | break; | |
215 | ||
216 | ||
217 | case 2 : | |
218 | szDest[i] = ((( szData[t]-CH_START ) & 0x03 ) << 6 ) + | |
219 | (( szData[t+1]-CH_START ) & 0x3f ); | |
220 | t++; | |
221 | break; | |
222 | } | |
223 | ||
224 | szDest[i] ^= ( bits + i ) ; | |
225 | ||
226 | } | |
227 | ||
228 | return( i ) ; | |
229 | ||
230 | } | |
231 | /*============================================================================*/ | |
232 |