/** @file keyCommonDef.h
|
*
|
* @brief This file contains normal data type for key management
|
*
|
* Copyright (C) 2014-2017, Marvell International Ltd.
|
*
|
* This software file (the "File") is distributed by Marvell International
|
* Ltd. under the terms of the GNU General Public License Version 2, June 1991
|
* (the "License"). You may use, redistribute and/or modify this File in
|
* accordance with the terms and conditions of the License, a copy of which
|
* is available by writing to the Free Software Foundation, Inc.,
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
|
* worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
|
*
|
* THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
|
* IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
|
* ARE EXPRESSLY DISCLAIMED. The License provides additional details about
|
* this warranty disclaimer.
|
*/
|
|
/******************************************************
|
Change log:
|
03/07/2014: Initial version
|
******************************************************/
|
#ifndef _KEYMGMT_COMMON_H_
|
#define _KEYMGMT_COMMON_H_
|
|
#include "wltypes.h"
|
#include "IEEE_types.h"
|
#include "wl_mib_rom.h"
|
#include "KeyApiStaDefs.h"
|
|
#define NONCE_SIZE 32
|
#define EAPOL_MIC_KEY_SIZE 16
|
#define EAPOL_MIC_SIZE 16
|
#define EAPOL_ENCR_KEY_SIZE 16
|
#define MAC_ADDR_SIZE 6
|
#define TK_SIZE 16
|
#define HDR_8021x_LEN 4
|
#define KEYMGMTTIMEOUTVAL 10
|
#define TDLS_MIC_KEY_SIZE 16
|
|
#define EAPOL_PROTOCOL_V1 1
|
#define EAPOL_PROTOCOL_V2 2
|
|
#define UAP_HOSTCMD_KEYMGMT_EAP BIT0
|
#define UAP_HOSTCMD_KEYMGMT_PSK BIT1
|
#define UAP_HOSTCMD_KEYMGMT_NONE BIT2
|
#define UAP_HOSTCMD_KEYMGMT_PSK_SHA256 BIT8
|
|
#define UAP_HOSTCMD_CIPHER_WEP40 0x01
|
#define UAP_HOSTCMD_CIPHER_WEP104 0x02
|
#define UAP_HOSTCMD_CIPHER_TKIP 0x04
|
#define UAP_HOSTCMD_CIPHER_CCMP 0x08
|
#define UAP_HOSTCMD_CIPHER_MASK 0x0F
|
|
typedef struct {
|
UINT8 Key[TK_SIZE];
|
UINT8 RxMICKey[8];
|
UINT8 TxMICKey[8];
|
UINT32 TxIV32;
|
UINT16 TxIV16;
|
UINT16 KeyIndex;
|
} KeyData_t;
|
|
#define MAX_WEP_KEYS 4
|
/* This structure is used in rom and existing fields should not be changed */
|
/* This structure is already aligned and hence packing is not needed */
|
|
typedef struct cipher_key_hdr_t {
|
IEEEtypes_MacAddr_t macAddr;
|
UINT8 keyDirection;
|
UINT8 keyType:4;
|
UINT8 version:4;
|
UINT16 keyLen;
|
UINT8 keyState;
|
UINT8 keyInfo;
|
} cipher_key_hdr_t;
|
|
/* This structure is used in rom and existing fields should not be changed */
|
typedef struct tkip_aes_key_data_t {
|
// key material information (TKIP/AES/WEP)
|
UINT8 key[CRYPTO_KEY_LEN_MAX];
|
UINT8 txMICKey[MIC_KEY_LEN_MAX];
|
UINT8 rxMICKey[MIC_KEY_LEN_MAX];
|
UINT32 hiReplayCounter32; //!< initialized by host
|
UINT16 loReplayCounter16; //!< initialized by host
|
UINT32 txIV32; //!< controlled by FW
|
UINT16 txIV16; //!< controlled by FW
|
UINT32 TKIPMicLeftValue;
|
UINT32 TKIPMicRightValue;
|
|
/* HW new design for 8682 only to support interleaving
|
* FW need to save these value and
|
* restore for next fragment
|
*/
|
UINT32 TKIPMicData0Value;
|
UINT32 TKIPMicData1Value;
|
UINT32 TKIPMicData2Value;
|
UINT8 keyIdx;
|
UINT8 reserved[3];
|
|
} tkip_aes_key_data_t;
|
|
/* This structure is used in rom and existing fields should not be changed */
|
typedef struct wep_key_data_t {
|
MIB_WEP_DEFAULT_KEYS WepDefaultKeys[MAX_WEP_KEYS];
|
UINT8 default_key_idx;
|
UINT8 keyCfg;
|
UINT8 Reserved;
|
} wep_key_data_t;
|
|
/* This structure is used in rom and existing fields should not be changed */
|
typedef struct {
|
UINT8 key_idx;
|
UINT8 mickey[WAPI_MIC_LEN];
|
UINT8 rawkey[WAPI_KEY_LEN];
|
} wapi_key_detail_t;
|
|
/* cipher_key_t -> tkip_aes is much bigger than wapi_key_data_t and
|
* since wapi_key_data_t is not used by ROM it is ok to change this size. */
|
|
typedef struct {
|
wapi_key_detail_t key;
|
UINT8 pn_inc;
|
UINT8 TxPN[WAPI_PN_LEN];
|
UINT8 RxPN[WAPI_PN_LEN];
|
UINT8 *pLastKey; //keep the orig cipher_key_t pointer
|
} wapi_key_data_t;
|
|
typedef struct {
|
UINT8 ANonce[NONCE_SIZE];
|
KeyData_t pwsKeyData;
|
} eapolHskData_t;
|
|
/* This structure is used in rom and existing fields should not be changed */
|
typedef struct cipher_key_t {
|
cipher_key_hdr_t hdr;
|
|
union ckd {
|
tkip_aes_key_data_t tkip_aes;
|
wep_key_data_t wep;
|
wapi_key_data_t wapi;
|
eapolHskData_t hskData;
|
} ckd;
|
} cipher_key_t;
|
|
typedef MLAN_PACK_START struct {
|
UINT8 protocol_ver;
|
IEEEtypes_8021x_PacketType_e pckt_type;
|
UINT16 pckt_body_len;
|
} MLAN_PACK_END Hdr_8021x_t;
|
|
typedef MLAN_PACK_START struct {
|
/* don't change this order. It is set to match the
|
** endianness of the message
|
*/
|
|
/* Byte 1 */
|
UINT16 KeyMIC:1; /* Bit 8 */
|
UINT16 Secure:1; /* Bit 9 */
|
UINT16 Error:1; /* Bit 10 */
|
UINT16 Request:1; /* Bit 11 */
|
UINT16 EncryptedKeyData:1; /* Bit 12 */
|
UINT16 Reserved:3; /* Bits 13-15 */
|
|
/* Byte 0 */
|
UINT16 KeyDescriptorVersion:3; /* Bits 0-2 */
|
UINT16 KeyType:1; /* Bit 3 */
|
UINT16 KeyIndex:2; /* Bits 4-5 */
|
UINT16 Install:1; /* Bit 6 */
|
UINT16 KeyAck:1; /* Bit 7 */
|
|
} MLAN_PACK_END key_info_t;
|
|
#define KEY_DESCRIPTOR_HMAC_MD5_RC4 (1U << 0)
|
#define KEY_DESCRIPTOR_HMAC_SHA1_AES (1U << 1)
|
#define EAPOL_KeyMsg_Len (100)
|
/* WPA2 GTK IE */
|
typedef MLAN_PACK_START struct {
|
UINT8 KeyID:2;
|
UINT8 Tx:1;
|
UINT8 rsvd:5;
|
UINT8 rsvd1;
|
UINT8 GTK[1];
|
} MLAN_PACK_END GTK_KDE_t;
|
|
/* WPA2 Key Data */
|
typedef MLAN_PACK_START struct {
|
UINT8 type;
|
UINT8 length;
|
UINT8 OUI[3];
|
UINT8 dataType;
|
UINT8 data[1];
|
} MLAN_PACK_END KDE_t;
|
|
typedef MLAN_PACK_START struct {
|
uint8 llc[3];
|
uint8 snap_oui[3];
|
uint16 snap_type;
|
} MLAN_PACK_END llc_snap_t;
|
|
typedef MLAN_PACK_START struct {
|
Hdr_8021x_t hdr_8021x;
|
UINT8 desc_type;
|
key_info_t key_info;
|
UINT16 key_length;
|
UINT32 replay_cnt[2];
|
UINT8 key_nonce[NONCE_SIZE]; /*32 bytes */
|
UINT8 EAPOL_key_IV[16];
|
UINT8 key_RSC[8];
|
UINT8 key_ID[8];
|
UINT8 key_MIC[EAPOL_MIC_KEY_SIZE];
|
UINT16 key_material_len;
|
UINT8 key_data[1];
|
} MLAN_PACK_END EAPOL_KeyMsg_t;
|
|
typedef MLAN_PACK_START struct {
|
Hdr_8021x_t hdr_8021x;
|
IEEEtypes_8021x_CodeType_e code;
|
UINT8 identifier;
|
UINT16 length;
|
UINT8 data[1];
|
} MLAN_PACK_END EAP_PacketMsg_t;
|
|
typedef MLAN_PACK_START struct {
|
ether_hdr_t ethHdr;
|
EAPOL_KeyMsg_t keyMsg;
|
} MLAN_PACK_END EAPOL_KeyMsg_Tx_t;
|
|
#endif
|