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 * 26 * Copyright � 2003 Agere Systems Inc. 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 * 47 * THIS SOFTWARE IS PROVIDED �AS IS� AND ANY EXPRESS OR IMPLIED WARRANTIES, 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 62/******************************************************************************* 63 * include files 64 ******************************************************************************/ 65#include <linux/string.h> 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 81extern 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 ******************************************************************************/ 108int 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 ******************************************************************************/ 185int 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