/** @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