text: /*
   * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
   * All rights reserved.
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License along
   * with this program; if not, write to the Free Software Foundation, Inc.,
   * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
   *
   *
   * File: key.h
   *
   * Purpose: Implement functions for 802.11i Key management
   *
   * Author: Jerry Chen
   *
   * Date: May 29, 2003
   *
   */
  
  #ifndef __KEY_H__
  #define __KEY_H__
  
  #include "ttype.h"
  #include "tether.h"
  #include "80211mgr.h"
  
  /*---------------------  Export Definitions -------------------------*/
  #define MAX_GROUP_KEY       4
  #define MAX_KEY_TABLE       11
  #define MAX_KEY_LEN         32
  #define AES_KEY_LEN         16
  
  #define AUTHENTICATOR_KEY   0x10000000
  #define USE_KEYRSC          0x20000000
  #define PAIRWISE_KEY        0x40000000
  #define TRANSMIT_KEY        0x80000000
  
  #define GROUP_KEY           0x00000000
  
  #define KEY_CTL_WEP         0x00
  #define KEY_CTL_NONE        0x01
  #define KEY_CTL_TKIP        0x02
  #define KEY_CTL_CCMP        0x03
  #define KEY_CTL_INVALID     0xFF
  
  typedef struct tagSKeyItem {
  	bool bKeyValid;
  	unsigned long uKeyLength;
  	unsigned char abyKey[MAX_KEY_LEN];
  	u64 KeyRSC;
  	unsigned long dwTSC47_16;
  	unsigned short wTSC15_0;
  	unsigned char byCipherSuite;
  	unsigned char byReserved0;
  	unsigned long dwKeyIndex;
  	void *pvKeyTable;
  } SKeyItem, *PSKeyItem; //64
  
  typedef struct tagSKeyTable {
  	unsigned char abyBSSID[ETH_ALEN];  //6
  	unsigned char byReserved0[2];              //8
  	SKeyItem    PairwiseKey;
  	SKeyItem    GroupKey[MAX_GROUP_KEY]; //64*5 = 320, 320+8=328
  	unsigned long dwGTKeyIndex;            // GroupTransmitKey Index
  	bool bInUse;
  	//2006-1116-01,<Modify> by NomadZhao
  	bool bSoftWEP;
  	unsigned short wKeyCtl;      // for address of wKeyCtl at align 4
  
  	unsigned char byReserved1[6];
  } SKeyTable, *PSKeyTable; //348
  
  typedef struct tagSKeyManagement {
  	SKeyTable   KeyTable[MAX_KEY_TABLE];
  } SKeyManagement, *PSKeyManagement;
  
  /*---------------------  Export Types  ------------------------------*/
  
  /*---------------------  Export Macros ------------------------------*/
  
  /*---------------------  Export Classes  ----------------------------*/
  
  /*---------------------  Export Variables  --------------------------*/
  
  /*---------------------  Export Functions  --------------------------*/
  
  void KeyvInitTable(PSKeyManagement pTable, void __iomem *dwIoBase);
  
  bool KeybGetKey(
  	PSKeyManagement pTable,
  	unsigned char *pbyBSSID,
  	unsigned long dwKeyIndex,
  	PSKeyItem       *pKey
  );
  
  bool KeybSetKey(
  	PSKeyManagement pTable,
  	unsigned char *pbyBSSID,
  	unsigned long dwKeyIndex,
  	unsigned long uKeyLength,
  	u64 *pKeyRSC,
  	unsigned char *pbyKey,
  	unsigned char byKeyDecMode,
  	void __iomem *dwIoBase,
  	unsigned char byLocalID
  );
  
  bool KeybSetDefaultKey(
  	PSKeyManagement pTable,
  	unsigned long dwKeyIndex,
  	unsigned long uKeyLength,
  	u64 *pKeyRSC,
  	unsigned char *pbyKey,
  	unsigned char byKeyDecMode,
  	void __iomem *dwIoBase,
  	unsigned char byLocalID
  );
  
  bool KeybRemoveKey(
  	PSKeyManagement pTable,
  	unsigned char *pbyBSSID,
  	unsigned long dwKeyIndex,
  	void __iomem *dwIoBase
  );
  
  bool KeybGetTransmitKey(
  	PSKeyManagement pTable,
  	unsigned char *pbyBSSID,
  	unsigned long dwKeyType,
  	PSKeyItem       *pKey
  );
  
  bool KeybCheckPairewiseKey(
  	PSKeyManagement pTable,
  	PSKeyItem       *pKey
  );
  
  bool KeybRemoveAllKey(
  	PSKeyManagement pTable,
  	unsigned char *pbyBSSID,
  	void __iomem *dwIoBase
  );
  
  void KeyvRemoveWEPKey(
  	PSKeyManagement pTable,
  	unsigned long dwKeyIndex,
  	void __iomem *dwIoBase
  );
  
  void KeyvRemoveAllWEPKey(
  	PSKeyManagement pTable,
  	void __iomem *dwIoBase
  );
  
  bool KeybSetAllGroupKey(
  	PSKeyManagement pTable,
  	unsigned long dwKeyIndex,
  	unsigned long uKeyLength,
  	u64 *pKeyRSC,
  	unsigned char *pbyKey,
  	unsigned char byKeyDecMode,
  	void __iomem *dwIoBase,
  	unsigned char byLocalID
  );
  
  #endif // __KEY_H__
  