hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
/** @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