⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key.c

📁 VIA VT6656 USB linux source code.
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. * All rights reserved. * * This software is copyrighted by and is the sole property of * VIA Networking Technologies, Inc. This software may only be used * in accordance with the corresponding license agreement. Any unauthorized * use, duplication, transmission, distribution, or disclosure of this * software is expressly forbidden. * * This software is provided by VIA Networking Technologies, Inc. "as is" * and any express or implied warranties, including, but not limited to, the * implied warranties of merchantability and fitness for a particular purpose * are disclaimed. In no event shall VIA Networking Technologies, Inc. * be liable for any direct, indirect, incidental, special, exemplary, or * consequential damages. * * * File: key.c * * Purpose: Implement functions for 802.11i Key management * * Author: Jerry Chen * * Date: May 29, 2003 * * Functions: *      KeyvInitTable - Init Key management table *      KeybGetKey - Get Key from table *      KeybSetKey - Set Key to table *      KeybRemoveKey - Remove Key from table *      KeybGetTransmitKey - Get Transmit Key from table * * Revision History: * */#if !defined(__TMACRO_H__)#include "tmacro.h"#endif#if !defined(__TBIT_H__)#include "tbit.h"#endif#if !defined(__KEY_H__)#include "key.h"#endif#if !defined(__UMEM_H__)#include "umem.h"#endif#if !defined(__MAC_H__)#include "mac.h"#endif#if !defined(__RNDIS_H__)#include "rndis.h"#endif#if !defined(__CONTROL_H__)
#include "control.h"
#endif/*---------------------  Static Definitions -------------------------*//*---------------------  Static Classes  ----------------------------*//*---------------------  Static Variables  --------------------------*/static int          msglevel                =MSG_LEVEL_INFO;//static int          msglevel                =MSG_LEVEL_DEBUG;/*---------------------  Static Functions  --------------------------*//*---------------------  Export Variables  --------------------------*//*---------------------  Static Definitions -------------------------*//*---------------------  Static Classes  ----------------------------*//*---------------------  Static Variables  --------------------------*//*---------------------  Static Functions  --------------------------*/static VOIDs_vCheckKeyTableValid (PVOID pDeviceHandler, PSKeyManagement pTable){    PSDevice    pDevice = (PSDevice) pDeviceHandler;    int         i;
    WORD        wLength = 0;
    BYTE        pbyData[MAX_KEY_TABLE];

    for (i=0;i<MAX_KEY_TABLE;i++) {
        if ((pTable->KeyTable[i].bInUse == TRUE) &&
            (pTable->KeyTable[i].PairwiseKey.bKeyValid == FALSE) &&
            (pTable->KeyTable[i].GroupKey[0].bKeyValid == FALSE) &&
            (pTable->KeyTable[i].GroupKey[1].bKeyValid == FALSE) &&
            (pTable->KeyTable[i].GroupKey[2].bKeyValid == FALSE) &&
            (pTable->KeyTable[i].GroupKey[3].bKeyValid == FALSE)
            ) {
            
            pTable->KeyTable[i].bInUse = FALSE;
            pTable->KeyTable[i].wKeyCtl = 0;
            pTable->KeyTable[i].bSoftWEP = FALSE;
            pbyData[wLength++] = (BYTE) i;
            //MACvDisableKeyEntry(pDevice, i);
        }
    }
    if ( wLength != 0 ) {
        CONTROLnsRequestOut(pDevice,
                            MESSAGE_TYPE_CLRKEYENTRY,
                            0,
                            0,
                            wLength,
                            pbyData
                            );
    }    }/*---------------------  Export Functions  --------------------------*//* * Description: Init Key management table * * Parameters: *  In: *      pTable          - Pointer to Key table *  Out: *      none * * Return Value: none * */VOID KeyvInitTable(PVOID pDeviceHandler, PSKeyManagement pTable){    PSDevice    pDevice = (PSDevice) pDeviceHandler;    int i;
    int jj;
    BYTE       pbyData[MAX_KEY_TABLE+1];    
    spin_lock_irq(&pDevice->lock);
    for (i=0;i<MAX_KEY_TABLE;i++) {
        pTable->KeyTable[i].bInUse = FALSE;
        pTable->KeyTable[i].PairwiseKey.bKeyValid = FALSE;
        pTable->KeyTable[i].PairwiseKey.pvKeyTable = (PVOID)&pTable->KeyTable[i];
        for (jj=0; jj < MAX_GROUP_KEY; jj++) {
            pTable->KeyTable[i].GroupKey[jj].bKeyValid = FALSE;
            pTable->KeyTable[i].GroupKey[jj].pvKeyTable = (PVOID) &(pTable->KeyTable[i]);
        }
        pTable->KeyTable[i].wKeyCtl = 0;
        pTable->KeyTable[i].dwGTKeyIndex = 0;
        pTable->KeyTable[i].bSoftWEP = FALSE;
        pbyData[i] = (BYTE) i;
    }
    pbyData[i] = (BYTE) i;
    CONTROLnsRequestOut(pDevice,
                        MESSAGE_TYPE_CLRKEYENTRY,
                        0,
                        0,
                        11,
                        pbyData
                        );                                spin_unlock_irq(&pDevice->lock);                                return;}/* * Description: Get Key from table * * Parameters: *  In: *      pTable          - Pointer to Key table *      pbyBSSID        - BSSID of Key *      dwKeyIndex      - Key Index (0xFFFFFFFF means pairwise key) *  Out: *      pKey            - Key return * * Return Value: TRUE if found otherwise FALSE * */BOOL KeybGetKey (    IN  PSKeyManagement pTable,    IN  PBYTE           pbyBSSID,    IN  DWORD           dwKeyIndex,    OUT PSKeyItem       *pKey    ){    int i;    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"KeybGetKey() \n");        *pKey = NULL;    for (i=0;i<MAX_KEY_TABLE;i++) {        if ((pTable->KeyTable[i].bInUse == TRUE) &&            IS_ETH_ADDRESS_EQUAL(pTable->KeyTable[i].abyBSSID,pbyBSSID)) {            if (dwKeyIndex == 0xFFFFFFFF) {                if (pTable->KeyTable[i].PairwiseKey.bKeyValid == TRUE) {                    *pKey = &(pTable->KeyTable[i].PairwiseKey);                    return (TRUE);                }                else {                    return (FALSE);                }            } else if (dwKeyIndex < MAX_GROUP_KEY) {                if (pTable->KeyTable[i].GroupKey[dwKeyIndex].bKeyValid == TRUE) {                    *pKey = &(pTable->KeyTable[i].GroupKey[dwKeyIndex]);                    return (TRUE);                }                else {                    return (FALSE);                }            }            else {                return (FALSE);            }        }    }    return (FALSE);}/* * Description: Set Key to table * * Parameters: *  In: *      pTable          - Pointer to Key table *      pbyBSSID        - BSSID of Key *      dwKeyIndex      - Key index (reference to NDIS DDK) *      uKeyLength      - Key length *      KeyRSC          - Key RSC *      pbyKey          - Pointer to key *  Out: *      none * * Return Value: TRUE if success otherwise FALSE * */BOOL KeybSetKey (    PVOID           pDeviceHandler,    PSKeyManagement pTable,    PBYTE           pbyBSSID,    DWORD           dwKeyIndex,    ULONG           uKeyLength,    PQWORD          pKeyRSC,    PBYTE           pbyKey,    BYTE            byKeyDecMode    ){    PSDevice    pDevice = (PSDevice) pDeviceHandler;            int         i,j;    UINT        ii;    PSKeyItem   pKey;    UINT        uKeyIdx;    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Enter KeybSetKey: %lX\n", dwKeyIndex);        j = (MAX_KEY_TABLE-1);    for (i=0;i<(MAX_KEY_TABLE-1);i++) {        if ((pTable->KeyTable[i].bInUse == FALSE) &&            (j == (MAX_KEY_TABLE-1))) {            // found empty table            j = i;        }        if ((pTable->KeyTable[i].bInUse == TRUE) &&            IS_ETH_ADDRESS_EQUAL(pTable->KeyTable[i].abyBSSID,pbyBSSID)) {            // found table already exist            if ((dwKeyIndex & PAIRWISE_KEY) != 0) {                // Pairwise key                pKey = &(pTable->KeyTable[i].PairwiseKey);                pTable->KeyTable[i].wKeyCtl &= 0xFFF0;          // clear pairwise key control filed                pTable->KeyTable[i].wKeyCtl |= byKeyDecMode;                uKeyIdx = 4;                                    // use HW key entry 4 for pairwise key            } else {                // Group key                if ((dwKeyIndex & 0x000000FF) >= MAX_GROUP_KEY)                    return (FALSE);                pKey = &(pTable->KeyTable[i].GroupKey[dwKeyIndex & 0x000000FF]);                if ((dwKeyIndex & TRANSMIT_KEY) != 0)  {                    // Group transmit key                    pTable->KeyTable[i].dwGTKeyIndex = dwKeyIndex;                    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Group transmit key(R)[%lX]: %d\n", pTable->KeyTable[i].dwGTKeyIndex, i);                }                pTable->KeyTable[i].wKeyCtl &= 0xFF0F;          // clear group key control filed                pTable->KeyTable[i].wKeyCtl |= (byKeyDecMode << 4);                pTable->KeyTable[i].wKeyCtl |= 0x0040;          // use group key for group address                uKeyIdx = (dwKeyIndex & 0x000000FF);            }            pTable->KeyTable[i].wKeyCtl |= 0x8000;              // enable on-fly            pKey->bKeyValid = TRUE;            pKey->uKeyLength = uKeyLength;            pKey->dwKeyIndex = dwKeyIndex;            pKey->byCipherSuite = byKeyDecMode;            MEMvCopy(pKey->abyKey, pbyKey, uKeyLength);            if (byKeyDecMode == KEY_CTL_WEP) {                if (uKeyLength == WLAN_WEP40_KEYLEN)                    pKey->abyKey[15] &= 0x7F;                if (uKeyLength == WLAN_WEP104_KEYLEN)                    pKey->abyKey[15] |= 0x80;            }            MACvSetKeyEntry(pDevice, pTable->KeyTable[i].wKeyCtl, i, uKeyIdx, pbyBSSID, (PDWORD)pKey->abyKey);            if ((dwKeyIndex & USE_KEYRSC) == 0) {                // RSC set by NIC                ZERO_MEMORY(&(pKey->KeyRSC), sizeof(QWORD));            }            else {                MEMvCopy(&(pKey->KeyRSC), pKeyRSC,  sizeof(QWORD));            }            pKey->dwTSC47_16 = 0;            pKey->wTSC15_0 = 0;            DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"KeybSetKey(R): \n");            DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->bKeyValid: %d\n ", pKey->bKeyValid);            //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->uKeyLength: %d\n ", pKey->uKeyLength);            DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->abyKey: ");            for (ii = 0; ii < pKey->uKeyLength; ii++) {                DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%02x ", pKey->abyKey[ii]);            }            DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n");            DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwTSC47_16: %lx\n ", pKey->dwTSC47_16);            DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->wTSC15_0: %x\n ", pKey->wTSC15_0);            DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwKeyIndex: %lx\n ", pKey->dwKeyIndex);            return (TRUE);        }    }    if (j < (MAX_KEY_TABLE-1)) {        MEMvCopy(pTable->KeyTable[j].abyBSSID,pbyBSSID,U_ETHER_ADDR_LEN);        pTable->KeyTable[j].bInUse = TRUE;        if ((dwKeyIndex & PAIRWISE_KEY) != 0)  {            // Pairwise key            pKey = &(pTable->KeyTable[j].PairwiseKey);            pTable->KeyTable[j].wKeyCtl &= 0xFFF0;          // clear pairwise key control filed            pTable->KeyTable[j].wKeyCtl |= byKeyDecMode;            uKeyIdx = 4;                                    // use HW key entry 4 for pairwise key        } else {            // Group key            if ((dwKeyIndex & 0x000000FF) >= MAX_GROUP_KEY)                return (FALSE);            pKey = &(pTable->KeyTable[j].GroupKey[dwKeyIndex & 0x000000FF]);            if ((dwKeyIndex & TRANSMIT_KEY) != 0)  {                // Group transmit key                pTable->KeyTable[j].dwGTKeyIndex = dwKeyIndex;                DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Group transmit key(N)[%lX]: %d\n", pTable->KeyTable[j].dwGTKeyIndex, j);            }            pTable->KeyTable[j].wKeyCtl &= 0xFF0F;          // clear group key control filed            pTable->KeyTable[j].wKeyCtl |= (byKeyDecMode << 4);            pTable->KeyTable[j].wKeyCtl |= 0x0040;          // use group key for group address            uKeyIdx = (dwKeyIndex & 0x000000FF);        }        pTable->KeyTable[j].wKeyCtl |= 0x8000;              // enable on-fly        pKey->bKeyValid = TRUE;        pKey->uKeyLength = uKeyLength;        pKey->dwKeyIndex = dwKeyIndex;        pKey->byCipherSuite = byKeyDecMode;        MEMvCopy(pKey->abyKey, pbyKey, uKeyLength);        if (byKeyDecMode == KEY_CTL_WEP) {            if (uKeyLength == WLAN_WEP40_KEYLEN)                pKey->abyKey[15] &= 0x7F;            if (uKeyLength == WLAN_WEP104_KEYLEN)                pKey->abyKey[15] |= 0x80;        }        MACvSetKeyEntry(pDevice, pTable->KeyTable[j].wKeyCtl, j, uKeyIdx, pbyBSSID, (PDWORD)pKey->abyKey);        if ((dwKeyIndex & USE_KEYRSC) == 0) {            // RSC set by NIC            ZERO_MEMORY(&(pKey->KeyRSC), sizeof(QWORD));        }        else {            MEMvCopy(&(pKey->KeyRSC), pKeyRSC,  sizeof(QWORD));        }        pKey->dwTSC47_16 = 0;        pKey->wTSC15_0 = 0;                DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"KeybSetKey(N): \n");        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->bKeyValid: %d\n ", pKey->bKeyValid);        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->uKeyLength: %d\n ", (int)pKey->uKeyLength);        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->abyKey: ");        for (ii = 0; ii < pKey->uKeyLength; ii++) {            DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%02x ", pKey->abyKey[ii]);        }        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n");        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwTSC47_16: %lx\n ", pKey->dwTSC47_16);        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->wTSC15_0: %x\n ", pKey->wTSC15_0);        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwKeyIndex: %lx\n ", pKey->dwKeyIndex);        return (TRUE);    }    return (FALSE);}/* * Description: Remove Key from table * * Parameters: *  In: *      pTable          - Pointer to Key table *      pbyBSSID        - BSSID of Key *      dwKeyIndex      - Key Index (reference to NDIS DDK) *  Out: *      none * * Return Value: TRUE if success otherwise FALSE * */BOOL KeybRemoveKey (    PVOID           pDeviceHandler,    PSKeyManagement pTable,    PBYTE           pbyBSSID,    DWORD           dwKeyIndex    ){    PSDevice    pDevice = (PSDevice) pDeviceHandler;            int     i;
    BOOL    bReturnValue = FALSE;

    if (IS_BROADCAST_ADDRESS(pbyBSSID)) {
        // dealte all key
        if ((dwKeyIndex & PAIRWISE_KEY) != 0) {
            for (i=0;i<MAX_KEY_TABLE;i++) {
                pTable->KeyTable[i].PairwiseKey.bKeyValid = FALSE;
            }
            bReturnValue =  TRUE;
        }
        else if ((dwKeyIndex & 0x000000FF) < MAX_GROUP_KEY) {
            for (i=0;i<MAX_KEY_TABLE;i++) {
                pTable->KeyTable[i].GroupKey[dwKeyIndex & 0x000000FF].bKeyValid = FALSE;
                if ((dwKeyIndex & 0x7FFFFFFF) == (pTable->KeyTable[i].dwGTKeyIndex & 0x7FFFFFFF)) {
                    // remove Group transmit key
                    pTable->KeyTable[i].dwGTKeyIndex = 0;
                }
            }
            bReturnValue = TRUE;
        }
        else {
            bReturnValue = FALSE;
        }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -