Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nu11secur1ty
GitHub Repository: nu11secur1ty/Kali-Linux
Path: blob/master/ALFA-W1F1/RTL8814AU/core/rtw_wapi.c
1307 views
1
/******************************************************************************
2
*
3
* Copyright(c) 2016 - 2017 Realtek Corporation.
4
*
5
* This program is free software; you can redistribute it and/or modify it
6
* under the terms of version 2 of the GNU General Public License as
7
* published by the Free Software Foundation.
8
*
9
* This program is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12
* more details.
13
*
14
*****************************************************************************/
15
#ifdef CONFIG_WAPI_SUPPORT
16
17
#include <linux/unistd.h>
18
#include <linux/etherdevice.h>
19
#include <drv_types.h>
20
#include <rtw_wapi.h>
21
22
23
u32 wapi_debug_component =
24
/* WAPI_INIT |
25
* WAPI_API |
26
* WAPI_TX |
27
* WAPI_RX | */
28
WAPI_ERR ; /* always open err flags on */
29
30
void WapiFreeAllStaInfo(_adapter *padapter)
31
{
32
PRT_WAPI_T pWapiInfo;
33
PRT_WAPI_STA_INFO pWapiStaInfo;
34
PRT_WAPI_BKID pWapiBkid;
35
36
WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__);
37
pWapiInfo = &padapter->wapiInfo;
38
39
/* Pust to Idle List */
40
rtw_wapi_return_all_sta_info(padapter);
41
42
/* Sta Info List */
43
while (!list_empty(&(pWapiInfo->wapiSTAIdleList))) {
44
pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAIdleList.next, RT_WAPI_STA_INFO, list);
45
list_del_init(&pWapiStaInfo->list);
46
}
47
48
/* BKID List */
49
while (!list_empty(&(pWapiInfo->wapiBKIDIdleList))) {
50
pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDIdleList.next, RT_WAPI_BKID, list);
51
list_del_init(&pWapiBkid->list);
52
}
53
WAPI_TRACE(WAPI_INIT, "<=========== %s\n", __FUNCTION__);
54
return;
55
}
56
57
void WapiSetIE(_adapter *padapter)
58
{
59
PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);
60
/* PRT_WAPI_BKID pWapiBkid; */
61
u16 protocolVer = 1;
62
u16 akmCnt = 1;
63
u16 suiteCnt = 1;
64
u16 capability = 0;
65
u8 OUI[3];
66
67
OUI[0] = 0x00;
68
OUI[1] = 0x14;
69
OUI[2] = 0x72;
70
71
pWapiInfo->wapiIELength = 0;
72
/* protocol version */
73
memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, &protocolVer, 2);
74
pWapiInfo->wapiIELength += 2;
75
/* akm */
76
memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, &akmCnt, 2);
77
pWapiInfo->wapiIELength += 2;
78
79
if (pWapiInfo->bWapiPSK) {
80
memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, OUI, 3);
81
pWapiInfo->wapiIELength += 3;
82
pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x2;
83
pWapiInfo->wapiIELength += 1;
84
} else {
85
memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, OUI, 3);
86
pWapiInfo->wapiIELength += 3;
87
pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1;
88
pWapiInfo->wapiIELength += 1;
89
}
90
91
/* usk */
92
memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, &suiteCnt, 2);
93
pWapiInfo->wapiIELength += 2;
94
memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, OUI, 3);
95
pWapiInfo->wapiIELength += 3;
96
pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1;
97
pWapiInfo->wapiIELength += 1;
98
99
/* msk */
100
memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, OUI, 3);
101
pWapiInfo->wapiIELength += 3;
102
pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1;
103
pWapiInfo->wapiIELength += 1;
104
105
/* Capbility */
106
memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, &capability, 2);
107
pWapiInfo->wapiIELength += 2;
108
}
109
110
111
/* PN1 > PN2, return 1,
112
* else return 0.
113
*/
114
u32 WapiComparePN(u8 *PN1, u8 *PN2)
115
{
116
char i;
117
118
if ((NULL == PN1) || (NULL == PN2))
119
return 1;
120
121
/* overflow case */
122
if ((PN2[15] - PN1[15]) & 0x80)
123
return 1;
124
125
for (i = 16; i > 0; i--) {
126
if (PN1[i - 1] == PN2[i - 1])
127
continue;
128
else if (PN1[i - 1] > PN2[i - 1])
129
return 1;
130
else
131
return 0;
132
}
133
134
return 0;
135
}
136
137
u8
138
WapiGetEntryForCamWrite(_adapter *padapter, u8 *pMacAddr, u8 KID, BOOLEAN IsMsk)
139
{
140
PRT_WAPI_T pWapiInfo = NULL;
141
/* PRT_WAPI_CAM_ENTRY pEntry=NULL; */
142
u8 i = 0;
143
u8 ret = 0xff;
144
145
WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);
146
147
pWapiInfo = &padapter->wapiInfo;
148
149
/* exist? */
150
for (i = 0; i < WAPI_CAM_ENTRY_NUM; i++) {
151
if (pWapiInfo->wapiCamEntry[i].IsUsed
152
&& (_rtw_memcmp(pMacAddr, pWapiInfo->wapiCamEntry[i].PeerMacAddr, ETH_ALEN) == _TRUE)
153
&& pWapiInfo->wapiCamEntry[i].keyidx == KID
154
&& pWapiInfo->wapiCamEntry[i].type == IsMsk) {
155
ret = pWapiInfo->wapiCamEntry[i].entry_idx; /* cover it */
156
break;
157
}
158
}
159
160
if (i == WAPI_CAM_ENTRY_NUM) { /* not found */
161
for (i = 0; i < WAPI_CAM_ENTRY_NUM; i++) {
162
if (pWapiInfo->wapiCamEntry[i].IsUsed == 0) {
163
pWapiInfo->wapiCamEntry[i].IsUsed = 1;
164
pWapiInfo->wapiCamEntry[i].type = IsMsk;
165
pWapiInfo->wapiCamEntry[i].keyidx = KID;
166
_rtw_memcpy(pWapiInfo->wapiCamEntry[i].PeerMacAddr, pMacAddr, ETH_ALEN);
167
ret = pWapiInfo->wapiCamEntry[i].entry_idx;
168
break;
169
}
170
}
171
}
172
173
WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__);
174
return ret;
175
176
/*
177
if(RTIsListEmpty(&pWapiInfo->wapiCamIdleList)) {
178
return 0;
179
}
180
181
pEntry = (PRT_WAPI_CAM_ENTRY)RTRemoveHeadList(&pWapiInfo->wapiCamIdleList);
182
RTInsertTailList(&pWapiInfo->wapiCamUsedList, &pEntry->list);
183
184
185
return pEntry->entry_idx;*/
186
}
187
188
u8 WapiGetEntryForCamClear(_adapter *padapter, u8 *pPeerMac, u8 keyid, u8 IsMsk)
189
{
190
PRT_WAPI_T pWapiInfo = NULL;
191
u8 i = 0;
192
193
WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);
194
195
pWapiInfo = &padapter->wapiInfo;
196
197
for (i = 0; i < WAPI_CAM_ENTRY_NUM; i++) {
198
if (pWapiInfo->wapiCamEntry[i].IsUsed
199
&& (_rtw_memcmp(pPeerMac, pWapiInfo->wapiCamEntry[i].PeerMacAddr, ETH_ALEN) == _TRUE)
200
&& pWapiInfo->wapiCamEntry[i].keyidx == keyid
201
&& pWapiInfo->wapiCamEntry[i].type == IsMsk) {
202
pWapiInfo->wapiCamEntry[i].IsUsed = 0;
203
pWapiInfo->wapiCamEntry[i].keyidx = 2;
204
_rtw_memset(pWapiInfo->wapiCamEntry[i].PeerMacAddr, 0, ETH_ALEN);
205
206
WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__);
207
return pWapiInfo->wapiCamEntry[i].entry_idx;
208
}
209
}
210
211
WAPI_TRACE(WAPI_API, "<====WapiGetReturnCamEntry(), No this cam entry.\n");
212
return 0xff;
213
/*
214
if(RTIsListEmpty(&pWapiInfo->wapiCamUsedList)) {
215
return FALSE;
216
}
217
218
pList = &pWapiInfo->wapiCamUsedList;
219
while(pList->Flink != &pWapiInfo->wapiCamUsedList)
220
{
221
pEntry = (PRT_WAPI_CAM_ENTRY)pList->Flink;
222
if(PlatformCompareMemory(pPeerMac,pEntry->PeerMacAddr, ETHER_ADDRLEN)== 0
223
&& keyid == pEntry->keyidx)
224
{
225
RTRemoveEntryList(pList);
226
RTInsertHeadList(&pWapiInfo->wapiCamIdleList, pList);
227
return pEntry->entry_idx;
228
}
229
pList = pList->Flink;
230
}
231
232
return 0;
233
*/
234
}
235
236
void
237
WapiResetAllCamEntry(_adapter *padapter)
238
{
239
PRT_WAPI_T pWapiInfo;
240
int i;
241
242
WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);
243
244
pWapiInfo = &padapter->wapiInfo;
245
246
for (i = 0; i < WAPI_CAM_ENTRY_NUM; i++) {
247
_rtw_memset(pWapiInfo->wapiCamEntry[i].PeerMacAddr, 0, ETH_ALEN);
248
pWapiInfo->wapiCamEntry[i].IsUsed = 0;
249
pWapiInfo->wapiCamEntry[i].keyidx = 2; /* invalid */
250
pWapiInfo->wapiCamEntry[i].entry_idx = 4 + i * 2;
251
}
252
253
WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__);
254
255
return;
256
}
257
258
u8 WapiWriteOneCamEntry(
259
_adapter *padapter,
260
u8 *pMacAddr,
261
u8 KeyId,
262
u8 EntryId,
263
u8 EncAlg,
264
u8 bGroupKey,
265
u8 *pKey
266
)
267
{
268
u8 retVal = 0;
269
u16 usConfig = 0;
270
271
WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);
272
273
if (EntryId >= 32) {
274
WAPI_TRACE(WAPI_ERR, "<=== CamAddOneEntry(): ulKeyId exceed!\n");
275
return retVal;
276
}
277
278
usConfig = usConfig | (0x01 << 15) | ((u16)(EncAlg) << 2) | (KeyId);
279
280
if (EncAlg == _SMS4_) {
281
if (bGroupKey == 1)
282
usConfig |= (0x01 << 6);
283
if ((EntryId % 2) == 1) /* ==0 sec key; == 1mic key */
284
usConfig |= (0x01 << 5);
285
}
286
287
write_cam(padapter, EntryId, usConfig, pMacAddr, pKey);
288
289
WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);
290
return 1;
291
}
292
293
void rtw_wapi_init(_adapter *padapter)
294
{
295
PRT_WAPI_T pWapiInfo;
296
int i;
297
298
WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__);
299
RT_ASSERT_RET(padapter);
300
301
if (!padapter->WapiSupport) {
302
WAPI_TRACE(WAPI_INIT, "<========== %s, WAPI not supported!\n", __FUNCTION__);
303
return;
304
}
305
306
pWapiInfo = &padapter->wapiInfo;
307
pWapiInfo->bWapiEnable = false;
308
309
/* Init BKID List */
310
INIT_LIST_HEAD(&pWapiInfo->wapiBKIDIdleList);
311
INIT_LIST_HEAD(&pWapiInfo->wapiBKIDStoreList);
312
for (i = 0; i < WAPI_MAX_BKID_NUM; i++)
313
list_add_tail(&pWapiInfo->wapiBKID[i].list, &pWapiInfo->wapiBKIDIdleList);
314
315
/* Init STA List */
316
INIT_LIST_HEAD(&pWapiInfo->wapiSTAIdleList);
317
INIT_LIST_HEAD(&pWapiInfo->wapiSTAUsedList);
318
for (i = 0; i < WAPI_MAX_STAINFO_NUM; i++)
319
list_add_tail(&pWapiInfo->wapiSta[i].list, &pWapiInfo->wapiSTAIdleList);
320
321
for (i = 0; i < WAPI_CAM_ENTRY_NUM; i++) {
322
pWapiInfo->wapiCamEntry[i].IsUsed = 0;
323
pWapiInfo->wapiCamEntry[i].keyidx = 2; /* invalid */
324
pWapiInfo->wapiCamEntry[i].entry_idx = 4 + i * 2;
325
}
326
327
WAPI_TRACE(WAPI_INIT, "<========== %s\n", __FUNCTION__);
328
}
329
330
void rtw_wapi_free(_adapter *padapter)
331
{
332
WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__);
333
RT_ASSERT_RET(padapter);
334
335
if (!padapter->WapiSupport) {
336
WAPI_TRACE(WAPI_INIT, "<========== %s, WAPI not supported!\n", __FUNCTION__);
337
return;
338
}
339
340
WapiFreeAllStaInfo(padapter);
341
342
WAPI_TRACE(WAPI_INIT, "<========== %s\n", __FUNCTION__);
343
}
344
345
void rtw_wapi_disable_tx(_adapter *padapter)
346
{
347
WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__);
348
RT_ASSERT_RET(padapter);
349
350
if (!padapter->WapiSupport) {
351
WAPI_TRACE(WAPI_INIT, "<========== %s, WAPI not supported!\n", __FUNCTION__);
352
return;
353
}
354
355
padapter->wapiInfo.wapiTxMsk.bTxEnable = false;
356
padapter->wapiInfo.wapiTxMsk.bSet = false;
357
358
WAPI_TRACE(WAPI_INIT, "<========== %s\n", __FUNCTION__);
359
}
360
361
u8 rtw_wapi_is_wai_packet(_adapter *padapter, u8 *pkt_data)
362
{
363
PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);
364
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
365
struct security_priv *psecuritypriv = &padapter->securitypriv;
366
PRT_WAPI_STA_INFO pWapiSta = NULL;
367
u8 WaiPkt = 0, *pTaddr, bFind = false;
368
u8 Offset_TypeWAI = 0 ; /* (mac header len + llc length) */
369
370
WAPI_TRACE(WAPI_TX | WAPI_RX, "===========> %s\n", __FUNCTION__);
371
372
if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) {
373
WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__);
374
return 0;
375
}
376
377
Offset_TypeWAI = 24 + 6 ;
378
379
/* YJ,add,091103. Data frame may also have skb->data[30]=0x88 and skb->data[31]=0xb4. */
380
if ((pkt_data[1] & 0x40) != 0) {
381
/* RTW_INFO("data is privacy\n"); */
382
return 0;
383
}
384
385
pTaddr = get_addr2_ptr(pkt_data);
386
if (list_empty(&pWapiInfo->wapiSTAUsedList))
387
bFind = false;
388
else {
389
list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {
390
if (_rtw_memcmp(pTaddr, pWapiSta->PeerMacAddr, 6) == _TRUE) {
391
bFind = true;
392
break;
393
}
394
}
395
}
396
397
WAPI_TRACE(WAPI_TX | WAPI_RX, "%s: bFind=%d pTaddr="MAC_FMT"\n", __FUNCTION__, bFind, MAC_ARG(pTaddr));
398
399
if (pkt_data[0] == WIFI_QOS_DATA_TYPE)
400
Offset_TypeWAI += 2;
401
402
/* 88b4? */
403
if ((pkt_data[Offset_TypeWAI] == 0x88) && (pkt_data[Offset_TypeWAI + 1] == 0xb4)) {
404
WaiPkt = pkt_data[Offset_TypeWAI + 5];
405
406
psecuritypriv->hw_decrypted = _TRUE;
407
} else
408
WAPI_TRACE(WAPI_TX | WAPI_RX, "%s(): non wai packet\n", __FUNCTION__);
409
410
WAPI_TRACE(WAPI_TX | WAPI_RX, "%s(): Recvd WAI frame. IsWAIPkt(%d)\n", __FUNCTION__, WaiPkt);
411
412
return WaiPkt;
413
}
414
415
416
void rtw_wapi_update_info(_adapter *padapter, union recv_frame *precv_frame)
417
{
418
PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);
419
struct recv_frame_hdr *precv_hdr;
420
u8 *ptr;
421
u8 *pTA;
422
u8 *pRecvPN;
423
424
425
WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__);
426
427
if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) {
428
WAPI_TRACE(WAPI_RX, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__);
429
return;
430
}
431
432
precv_hdr = &precv_frame->u.hdr;
433
ptr = precv_hdr->rx_data;
434
435
if (precv_hdr->attrib.qos == 1)
436
precv_hdr->UserPriority = GetTid(ptr);
437
else
438
precv_hdr->UserPriority = 0;
439
440
pTA = get_addr2_ptr(ptr);
441
_rtw_memcpy((u8 *)precv_hdr->WapiSrcAddr, pTA, 6);
442
pRecvPN = ptr + precv_hdr->attrib.hdrlen + 2;
443
_rtw_memcpy((u8 *)precv_hdr->WapiTempPN, pRecvPN, 16);
444
445
WAPI_TRACE(WAPI_RX, "<========== %s\n", __FUNCTION__);
446
}
447
448
/****************************************************************************
449
TRUE-----------------Drop
450
FALSE---------------- handle
451
add to support WAPI to N-mode
452
*****************************************************************************/
453
u8 rtw_wapi_check_for_drop(
454
_adapter *padapter,
455
union recv_frame *precv_frame,
456
u8 *ehdr_ops
457
)
458
{
459
PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);
460
u8 *pLastRecvPN = NULL;
461
u8 bFind = false;
462
PRT_WAPI_STA_INFO pWapiSta = NULL;
463
u8 bDrop = false;
464
struct recv_frame_hdr *precv_hdr = &precv_frame->u.hdr;
465
u8 WapiAEPNInitialValueSrc[16] = {0x37, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;
466
u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;
467
u8 *ptr = ehdr_ops;
468
int i;
469
470
WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__);
471
472
if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) {
473
WAPI_TRACE(WAPI_RX, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__);
474
return false;
475
}
476
477
if (precv_hdr->bIsWaiPacket != 0) {
478
if (precv_hdr->bIsWaiPacket == 0x8) {
479
480
RTW_INFO("rtw_wapi_check_for_drop: dump packet\n");
481
for (i = 0; i < 50; i++) {
482
RTW_INFO("%02X ", ptr[i]);
483
if ((i + 1) % 8 == 0)
484
RTW_INFO("\n");
485
}
486
RTW_INFO("\n rtw_wapi_check_for_drop: dump packet\n");
487
488
for (i = 0; i < 16; i++) {
489
if (ptr[i + 27] != 0)
490
break;
491
}
492
493
if (i == 16) {
494
WAPI_TRACE(WAPI_RX, "rtw_wapi_check_for_drop: drop with zero BKID\n");
495
return true;
496
} else
497
return false;
498
} else
499
return false;
500
}
501
502
if (list_empty(&pWapiInfo->wapiSTAUsedList))
503
bFind = false;
504
else {
505
list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {
506
if (_rtw_memcmp(precv_hdr->WapiSrcAddr, pWapiSta->PeerMacAddr, ETH_ALEN) == _TRUE) {
507
bFind = true;
508
break;
509
}
510
}
511
}
512
WAPI_TRACE(WAPI_RX, "%s: bFind=%d prxb->WapiSrcAddr="MAC_FMT"\n", __FUNCTION__, bFind, MAC_ARG(precv_hdr->WapiSrcAddr));
513
514
if (bFind) {
515
if (IS_MCAST(precv_hdr->attrib.ra)) {
516
WAPI_TRACE(WAPI_RX, "rtw_wapi_check_for_drop: multicast case\n");
517
pLastRecvPN = pWapiSta->lastRxMulticastPN;
518
} else {
519
WAPI_TRACE(WAPI_RX, "rtw_wapi_check_for_drop: unicast case\n");
520
switch (precv_hdr->UserPriority) {
521
case 0:
522
case 3:
523
pLastRecvPN = pWapiSta->lastRxUnicastPNBEQueue;
524
break;
525
case 1:
526
case 2:
527
pLastRecvPN = pWapiSta->lastRxUnicastPNBKQueue;
528
break;
529
case 4:
530
case 5:
531
pLastRecvPN = pWapiSta->lastRxUnicastPNVIQueue;
532
break;
533
case 6:
534
case 7:
535
pLastRecvPN = pWapiSta->lastRxUnicastPNVOQueue;
536
break;
537
default:
538
WAPI_TRACE(WAPI_ERR, "%s: Unknown TID\n", __FUNCTION__);
539
break;
540
}
541
}
542
543
if (!WapiComparePN(precv_hdr->WapiTempPN, pLastRecvPN)) {
544
WAPI_TRACE(WAPI_RX, "%s: Equal PN!!\n", __FUNCTION__);
545
if (IS_MCAST(precv_hdr->attrib.ra))
546
_rtw_memcpy(pLastRecvPN, WapiAEMultiCastPNInitialValueSrc, 16);
547
else
548
_rtw_memcpy(pLastRecvPN, WapiAEPNInitialValueSrc, 16);
549
bDrop = true;
550
} else
551
_rtw_memcpy(pLastRecvPN, precv_hdr->WapiTempPN, 16);
552
}
553
554
WAPI_TRACE(WAPI_RX, "<========== %s\n", __FUNCTION__);
555
return bDrop;
556
}
557
558
void rtw_build_probe_resp_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib)
559
{
560
PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);
561
u8 WapiIELength = 0;
562
563
WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__);
564
565
if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) {
566
WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported!\n", __FUNCTION__);
567
return;
568
}
569
570
WapiSetIE(padapter);
571
WapiIELength = pWapiInfo->wapiIELength;
572
pframe[0] = _WAPI_IE_;
573
pframe[1] = WapiIELength;
574
_rtw_memcpy(pframe + 2, pWapiInfo->wapiIE, WapiIELength);
575
pframe += WapiIELength + 2;
576
pattrib->pktlen += WapiIELength + 2;
577
578
WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__);
579
}
580
581
void rtw_build_beacon_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib)
582
{
583
PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);
584
u8 WapiIELength = 0;
585
WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__);
586
587
if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) {
588
WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported!\n", __FUNCTION__);
589
return;
590
}
591
592
WapiSetIE(padapter);
593
WapiIELength = pWapiInfo->wapiIELength;
594
pframe[0] = _WAPI_IE_;
595
pframe[1] = WapiIELength;
596
_rtw_memcpy(pframe + 2, pWapiInfo->wapiIE, WapiIELength);
597
pframe += WapiIELength + 2;
598
pattrib->pktlen += WapiIELength + 2;
599
600
WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__);
601
}
602
603
void rtw_build_assoc_req_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib)
604
{
605
PRT_WAPI_BKID pWapiBKID;
606
u16 bkidNum;
607
PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);
608
u8 WapiIELength = 0;
609
610
WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__);
611
612
if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) {
613
WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported!\n", __FUNCTION__);
614
return;
615
}
616
617
WapiSetIE(padapter);
618
WapiIELength = pWapiInfo->wapiIELength;
619
bkidNum = 0;
620
if (!list_empty(&(pWapiInfo->wapiBKIDStoreList))) {
621
list_for_each_entry(pWapiBKID, &pWapiInfo->wapiBKIDStoreList, list) {
622
bkidNum++;
623
_rtw_memcpy(pWapiInfo->wapiIE + WapiIELength + 2, pWapiBKID->bkid, 16);
624
WapiIELength += 16;
625
}
626
}
627
_rtw_memcpy(pWapiInfo->wapiIE + WapiIELength, &bkidNum, 2);
628
WapiIELength += 2;
629
630
pframe[0] = _WAPI_IE_;
631
pframe[1] = WapiIELength;
632
_rtw_memcpy(pframe + 2, pWapiInfo->wapiIE, WapiIELength);
633
pframe += WapiIELength + 2;
634
pattrib->pktlen += WapiIELength + 2;
635
WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__);
636
}
637
638
void rtw_wapi_on_assoc_ok(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
639
{
640
PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);
641
PRT_WAPI_STA_INFO pWapiSta;
642
u8 WapiAEPNInitialValueSrc[16] = {0x37, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;
643
/* u8 WapiASUEPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; */
644
u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;
645
646
WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__);
647
648
if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) {
649
WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__);
650
return;
651
}
652
653
pWapiSta = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAIdleList.next, RT_WAPI_STA_INFO, list);
654
list_del_init(&pWapiSta->list);
655
list_add_tail(&pWapiSta->list, &pWapiInfo->wapiSTAUsedList);
656
_rtw_memcpy(pWapiSta->PeerMacAddr, padapter->mlmeextpriv.mlmext_info.network.MacAddress, 6);
657
_rtw_memcpy(pWapiSta->lastRxMulticastPN, WapiAEMultiCastPNInitialValueSrc, 16);
658
_rtw_memcpy(pWapiSta->lastRxUnicastPN, WapiAEPNInitialValueSrc, 16);
659
660
/* For chenk PN error with Qos Data after s3: add by ylb 20111114 */
661
_rtw_memcpy(pWapiSta->lastRxUnicastPNBEQueue, WapiAEPNInitialValueSrc, 16);
662
_rtw_memcpy(pWapiSta->lastRxUnicastPNBKQueue, WapiAEPNInitialValueSrc, 16);
663
_rtw_memcpy(pWapiSta->lastRxUnicastPNVIQueue, WapiAEPNInitialValueSrc, 16);
664
_rtw_memcpy(pWapiSta->lastRxUnicastPNVOQueue, WapiAEPNInitialValueSrc, 16);
665
666
WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__);
667
}
668
669
670
void rtw_wapi_return_one_sta_info(_adapter *padapter, u8 *MacAddr)
671
{
672
PRT_WAPI_T pWapiInfo;
673
PRT_WAPI_STA_INFO pWapiStaInfo = NULL;
674
PRT_WAPI_BKID pWapiBkid = NULL;
675
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
676
677
pWapiInfo = &padapter->wapiInfo;
678
679
WAPI_TRACE(WAPI_API, "==========> %s\n", __FUNCTION__);
680
681
if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) {
682
WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__);
683
return;
684
}
685
686
if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
687
while (!list_empty(&(pWapiInfo->wapiBKIDStoreList))) {
688
pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDStoreList.next, RT_WAPI_BKID, list);
689
list_del_init(&pWapiBkid->list);
690
_rtw_memset(pWapiBkid->bkid, 0, 16);
691
list_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDIdleList);
692
}
693
}
694
695
696
WAPI_TRACE(WAPI_API, " %s: after clear bkid\n", __FUNCTION__);
697
698
699
/* Remove STA info */
700
if (list_empty(&(pWapiInfo->wapiSTAUsedList))) {
701
WAPI_TRACE(WAPI_API, " %s: wapiSTAUsedList is null\n", __FUNCTION__);
702
return;
703
} else {
704
705
WAPI_TRACE(WAPI_API, " %s: wapiSTAUsedList is not null\n", __FUNCTION__);
706
#if 0
707
pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry((pWapiInfo->wapiSTAUsedList.next), RT_WAPI_STA_INFO, list);
708
709
list_for_each_entry(pWapiStaInfo, &(pWapiInfo->wapiSTAUsedList), list) {
710
711
RTW_INFO("MAC Addr %02x-%02x-%02x-%02x-%02x-%02x\n", MacAddr[0], MacAddr[1], MacAddr[2], MacAddr[3], MacAddr[4], MacAddr[5]);
712
713
714
RTW_INFO("peer Addr %02x-%02x-%02x-%02x-%02x-%02x\n", pWapiStaInfo->PeerMacAddr[0], pWapiStaInfo->PeerMacAddr[1], pWapiStaInfo->PeerMacAddr[2], pWapiStaInfo->PeerMacAddr[3],
715
pWapiStaInfo->PeerMacAddr[4], pWapiStaInfo->PeerMacAddr[5]);
716
717
if (pWapiStaInfo == NULL) {
718
WAPI_TRACE(WAPI_API, " %s: pWapiStaInfo == NULL Case\n", __FUNCTION__);
719
return;
720
}
721
722
if (pWapiStaInfo->PeerMacAddr == NULL) {
723
WAPI_TRACE(WAPI_API, " %s: pWapiStaInfo->PeerMacAddr == NULL Case\n", __FUNCTION__);
724
return;
725
}
726
727
if (MacAddr == NULL) {
728
WAPI_TRACE(WAPI_API, " %s: MacAddr == NULL Case\n", __FUNCTION__);
729
return;
730
}
731
732
if (_rtw_memcmp(pWapiStaInfo->PeerMacAddr, MacAddr, ETH_ALEN) == _TRUE) {
733
pWapiStaInfo->bAuthenticateInProgress = false;
734
pWapiStaInfo->bSetkeyOk = false;
735
_rtw_memset(pWapiStaInfo->PeerMacAddr, 0, ETH_ALEN);
736
list_del_init(&pWapiStaInfo->list);
737
list_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList);
738
break;
739
}
740
741
}
742
#endif
743
744
while (!list_empty(&(pWapiInfo->wapiSTAUsedList))) {
745
pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAUsedList.next, RT_WAPI_STA_INFO, list);
746
747
RTW_INFO("peer Addr %02x-%02x-%02x-%02x-%02x-%02x\n", pWapiStaInfo->PeerMacAddr[0], pWapiStaInfo->PeerMacAddr[1], pWapiStaInfo->PeerMacAddr[2], pWapiStaInfo->PeerMacAddr[3],
748
pWapiStaInfo->PeerMacAddr[4], pWapiStaInfo->PeerMacAddr[5]);
749
750
list_del_init(&pWapiStaInfo->list);
751
memset(pWapiStaInfo->PeerMacAddr, 0, ETH_ALEN);
752
pWapiStaInfo->bSetkeyOk = 0;
753
list_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList);
754
}
755
756
}
757
758
WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__);
759
return;
760
}
761
762
void rtw_wapi_return_all_sta_info(_adapter *padapter)
763
{
764
PRT_WAPI_T pWapiInfo;
765
PRT_WAPI_STA_INFO pWapiStaInfo;
766
PRT_WAPI_BKID pWapiBkid;
767
WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);
768
769
pWapiInfo = &padapter->wapiInfo;
770
771
if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) {
772
WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__);
773
return;
774
}
775
776
/* Sta Info List */
777
while (!list_empty(&(pWapiInfo->wapiSTAUsedList))) {
778
pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAUsedList.next, RT_WAPI_STA_INFO, list);
779
list_del_init(&pWapiStaInfo->list);
780
memset(pWapiStaInfo->PeerMacAddr, 0, ETH_ALEN);
781
pWapiStaInfo->bSetkeyOk = 0;
782
list_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList);
783
}
784
785
/* BKID List */
786
while (!list_empty(&(pWapiInfo->wapiBKIDStoreList))) {
787
pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDStoreList.next, RT_WAPI_BKID, list);
788
list_del_init(&pWapiBkid->list);
789
memset(pWapiBkid->bkid, 0, 16);
790
list_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDIdleList);
791
}
792
WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__);
793
}
794
795
void CAM_empty_entry(
796
PADAPTER Adapter,
797
u8 ucIndex
798
)
799
{
800
rtw_hal_set_hwreg(Adapter, HW_VAR_CAM_EMPTY_ENTRY, (u8 *)(&ucIndex));
801
}
802
803
void rtw_wapi_clear_cam_entry(_adapter *padapter, u8 *pMacAddr)
804
{
805
u8 UcIndex = 0;
806
807
WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);
808
809
if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) {
810
WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__);
811
return;
812
}
813
814
UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 0, 0);
815
if (UcIndex != 0xff) {
816
/* CAM_mark_invalid(Adapter, UcIndex); */
817
CAM_empty_entry(padapter, UcIndex);
818
}
819
820
UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 1, 0);
821
if (UcIndex != 0xff) {
822
/* CAM_mark_invalid(Adapter, UcIndex); */
823
CAM_empty_entry(padapter, UcIndex);
824
}
825
826
UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 0, 1);
827
if (UcIndex != 0xff) {
828
/* CAM_mark_invalid(Adapter, UcIndex); */
829
CAM_empty_entry(padapter, UcIndex);
830
}
831
832
UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 1, 1);
833
if (UcIndex != 0xff) {
834
/* CAM_mark_invalid(padapter, UcIndex); */
835
CAM_empty_entry(padapter, UcIndex);
836
}
837
838
WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__);
839
}
840
841
void rtw_wapi_clear_all_cam_entry(_adapter *padapter)
842
{
843
WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);
844
845
if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) {
846
WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__);
847
return;
848
}
849
850
invalidate_cam_all(padapter); /* is this ok? */
851
WapiResetAllCamEntry(padapter);
852
853
WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);
854
}
855
856
void rtw_wapi_set_key(_adapter *padapter, RT_WAPI_KEY *pWapiKey, RT_WAPI_STA_INFO *pWapiSta, u8 bGroupKey, u8 bUseDefaultKey)
857
{
858
PRT_WAPI_T pWapiInfo = &padapter->wapiInfo;
859
u8 *pMacAddr = pWapiSta->PeerMacAddr;
860
u32 EntryId = 0;
861
BOOLEAN IsPairWise = false ;
862
u8 EncAlgo;
863
864
WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);
865
866
if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) {
867
WAPI_TRACE(WAPI_API, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__);
868
return;
869
}
870
871
EncAlgo = _SMS4_;
872
873
/* For Tx bc/mc pkt,use defualt key entry */
874
if (bUseDefaultKey) {
875
/* when WAPI update key, keyid will be 0 or 1 by turns. */
876
if (pWapiKey->keyId == 0)
877
EntryId = 0;
878
else
879
EntryId = 2;
880
} else {
881
/* tx/rx unicast pkt, or rx broadcast, find the key entry by peer's MacAddr */
882
EntryId = WapiGetEntryForCamWrite(padapter, pMacAddr, pWapiKey->keyId, bGroupKey);
883
}
884
885
if (EntryId == 0xff) {
886
WAPI_TRACE(WAPI_API, "===>No entry for WAPI setkey! !!\n");
887
return;
888
}
889
890
/* EntryId is also used to diff Sec key and Mic key */
891
/* Sec Key */
892
WapiWriteOneCamEntry(padapter,
893
pMacAddr,
894
pWapiKey->keyId, /* keyid */
895
EntryId, /* entry */
896
EncAlgo, /* type */
897
bGroupKey, /* pairwise or group key */
898
pWapiKey->dataKey);
899
/* MIC key */
900
WapiWriteOneCamEntry(padapter,
901
pMacAddr,
902
pWapiKey->keyId, /* keyid */
903
EntryId + 1, /* entry */
904
EncAlgo, /* type */
905
bGroupKey, /* pairwise or group key */
906
pWapiKey->micKey);
907
908
WAPI_TRACE(WAPI_API, "Set Wapi Key :KeyId:%d,EntryId:%d,PairwiseKey:%d.\n", pWapiKey->keyId, EntryId, !bGroupKey);
909
WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);
910
911
}
912
913
#if 0
914
/* YJ,test,091013 */
915
void wapi_test_set_key(struct _adapter *padapter, u8 *buf)
916
{
917
/*Data: keyType(1) + bTxEnable(1) + bAuthenticator(1) + bUpdate(1) + PeerAddr(6) + DataKey(16) + MicKey(16) + KeyId(1)*/
918
PRT_WAPI_T pWapiInfo = &padapter->wapiInfo;
919
PRT_WAPI_BKID pWapiBkid;
920
PRT_WAPI_STA_INFO pWapiSta;
921
u8 data[43];
922
bool bTxEnable;
923
bool bUpdate;
924
bool bAuthenticator;
925
u8 PeerAddr[6];
926
u8 WapiAEPNInitialValueSrc[16] = {0x37, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;
927
u8 WapiASUEPNInitialValueSrc[16] = {0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;
928
u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;
929
930
WAPI_TRACE(WAPI_INIT, "===========>%s\n", __FUNCTION__);
931
932
if (!padapter->WapiSupport)
933
return;
934
935
copy_from_user(data, buf, 43);
936
bTxEnable = data[1];
937
bAuthenticator = data[2];
938
bUpdate = data[3];
939
memcpy(PeerAddr, data + 4, 6);
940
941
if (data[0] == 0x3) {
942
if (!list_empty(&(pWapiInfo->wapiBKIDIdleList))) {
943
pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDIdleList.next, RT_WAPI_BKID, list);
944
list_del_init(&pWapiBkid->list);
945
memcpy(pWapiBkid->bkid, data + 10, 16);
946
WAPI_DATA(WAPI_INIT, "SetKey - BKID", pWapiBkid->bkid, 16);
947
list_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDStoreList);
948
}
949
} else {
950
list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {
951
if (!memcmp(pWapiSta->PeerMacAddr, PeerAddr, 6)) {
952
pWapiSta->bAuthenticatorInUpdata = false;
953
switch (data[0]) {
954
case 1: /* usk */
955
if (bAuthenticator) { /* authenticator */
956
memcpy(pWapiSta->lastTxUnicastPN, WapiAEPNInitialValueSrc, 16);
957
if (!bUpdate) { /* first */
958
WAPI_TRACE(WAPI_INIT, "AE fisrt set usk\n");
959
pWapiSta->wapiUsk.bSet = true;
960
memcpy(pWapiSta->wapiUsk.dataKey, data + 10, 16);
961
memcpy(pWapiSta->wapiUsk.micKey, data + 26, 16);
962
pWapiSta->wapiUsk.keyId = *(data + 42);
963
pWapiSta->wapiUsk.bTxEnable = true;
964
WAPI_DATA(WAPI_INIT, "SetKey - AE USK Data Key", pWapiSta->wapiUsk.dataKey, 16);
965
WAPI_DATA(WAPI_INIT, "SetKey - AE USK Mic Key", pWapiSta->wapiUsk.micKey, 16);
966
} else { /* update */
967
WAPI_TRACE(WAPI_INIT, "AE update usk\n");
968
pWapiSta->wapiUskUpdate.bSet = true;
969
pWapiSta->bAuthenticatorInUpdata = true;
970
memcpy(pWapiSta->wapiUskUpdate.dataKey, data + 10, 16);
971
memcpy(pWapiSta->wapiUskUpdate.micKey, data + 26, 16);
972
memcpy(pWapiSta->lastRxUnicastPNBEQueue, WapiASUEPNInitialValueSrc, 16);
973
memcpy(pWapiSta->lastRxUnicastPNBKQueue, WapiASUEPNInitialValueSrc, 16);
974
memcpy(pWapiSta->lastRxUnicastPNVIQueue, WapiASUEPNInitialValueSrc, 16);
975
memcpy(pWapiSta->lastRxUnicastPNVOQueue, WapiASUEPNInitialValueSrc, 16);
976
memcpy(pWapiSta->lastRxUnicastPN, WapiASUEPNInitialValueSrc, 16);
977
pWapiSta->wapiUskUpdate.keyId = *(data + 42);
978
pWapiSta->wapiUskUpdate.bTxEnable = true;
979
}
980
} else {
981
if (!bUpdate) {
982
WAPI_TRACE(WAPI_INIT, "ASUE fisrt set usk\n");
983
if (bTxEnable) {
984
pWapiSta->wapiUsk.bTxEnable = true;
985
memcpy(pWapiSta->lastTxUnicastPN, WapiASUEPNInitialValueSrc, 16);
986
} else {
987
pWapiSta->wapiUsk.bSet = true;
988
memcpy(pWapiSta->wapiUsk.dataKey, data + 10, 16);
989
memcpy(pWapiSta->wapiUsk.micKey, data + 26, 16);
990
pWapiSta->wapiUsk.keyId = *(data + 42);
991
pWapiSta->wapiUsk.bTxEnable = false;
992
}
993
} else {
994
WAPI_TRACE(WAPI_INIT, "ASUE update usk\n");
995
if (bTxEnable) {
996
pWapiSta->wapiUskUpdate.bTxEnable = true;
997
if (pWapiSta->wapiUskUpdate.bSet) {
998
memcpy(pWapiSta->wapiUsk.dataKey, pWapiSta->wapiUskUpdate.dataKey, 16);
999
memcpy(pWapiSta->wapiUsk.micKey, pWapiSta->wapiUskUpdate.micKey, 16);
1000
pWapiSta->wapiUsk.keyId = pWapiSta->wapiUskUpdate.keyId;
1001
memcpy(pWapiSta->lastRxUnicastPNBEQueue, WapiASUEPNInitialValueSrc, 16);
1002
memcpy(pWapiSta->lastRxUnicastPNBKQueue, WapiASUEPNInitialValueSrc, 16);
1003
memcpy(pWapiSta->lastRxUnicastPNVIQueue, WapiASUEPNInitialValueSrc, 16);
1004
memcpy(pWapiSta->lastRxUnicastPNVOQueue, WapiASUEPNInitialValueSrc, 16);
1005
memcpy(pWapiSta->lastRxUnicastPN, WapiASUEPNInitialValueSrc, 16);
1006
pWapiSta->wapiUskUpdate.bTxEnable = false;
1007
pWapiSta->wapiUskUpdate.bSet = false;
1008
}
1009
memcpy(pWapiSta->lastTxUnicastPN, WapiASUEPNInitialValueSrc, 16);
1010
} else {
1011
pWapiSta->wapiUskUpdate.bSet = true;
1012
memcpy(pWapiSta->wapiUskUpdate.dataKey, data + 10, 16);
1013
memcpy(pWapiSta->wapiUskUpdate.micKey, data + 26, 16);
1014
pWapiSta->wapiUskUpdate.keyId = *(data + 42);
1015
pWapiSta->wapiUskUpdate.bTxEnable = false;
1016
}
1017
}
1018
}
1019
break;
1020
case 2: /* msk */
1021
if (bAuthenticator) { /* authenticator */
1022
pWapiInfo->wapiTxMsk.bSet = true;
1023
memcpy(pWapiInfo->wapiTxMsk.dataKey, data + 10, 16);
1024
memcpy(pWapiInfo->wapiTxMsk.micKey, data + 26, 16);
1025
pWapiInfo->wapiTxMsk.keyId = *(data + 42);
1026
pWapiInfo->wapiTxMsk.bTxEnable = true;
1027
memcpy(pWapiInfo->lastTxMulticastPN, WapiAEMultiCastPNInitialValueSrc, 16);
1028
1029
if (!bUpdate) { /* first */
1030
WAPI_TRACE(WAPI_INIT, "AE fisrt set msk\n");
1031
if (!pWapiSta->bSetkeyOk)
1032
pWapiSta->bSetkeyOk = true;
1033
pWapiInfo->bFirstAuthentiateInProgress = false;
1034
} else /* update */
1035
WAPI_TRACE(WAPI_INIT, "AE update msk\n");
1036
1037
WAPI_DATA(WAPI_INIT, "SetKey - AE MSK Data Key", pWapiInfo->wapiTxMsk.dataKey, 16);
1038
WAPI_DATA(WAPI_INIT, "SetKey - AE MSK Mic Key", pWapiInfo->wapiTxMsk.micKey, 16);
1039
} else {
1040
if (!bUpdate) {
1041
WAPI_TRACE(WAPI_INIT, "ASUE fisrt set msk\n");
1042
pWapiSta->wapiMsk.bSet = true;
1043
memcpy(pWapiSta->wapiMsk.dataKey, data + 10, 16);
1044
memcpy(pWapiSta->wapiMsk.micKey, data + 26, 16);
1045
pWapiSta->wapiMsk.keyId = *(data + 42);
1046
pWapiSta->wapiMsk.bTxEnable = false;
1047
if (!pWapiSta->bSetkeyOk)
1048
pWapiSta->bSetkeyOk = true;
1049
pWapiInfo->bFirstAuthentiateInProgress = false;
1050
WAPI_DATA(WAPI_INIT, "SetKey - ASUE MSK Data Key", pWapiSta->wapiMsk.dataKey, 16);
1051
WAPI_DATA(WAPI_INIT, "SetKey - ASUE MSK Mic Key", pWapiSta->wapiMsk.micKey, 16);
1052
} else {
1053
WAPI_TRACE(WAPI_INIT, "ASUE update msk\n");
1054
pWapiSta->wapiMskUpdate.bSet = true;
1055
memcpy(pWapiSta->wapiMskUpdate.dataKey, data + 10, 16);
1056
memcpy(pWapiSta->wapiMskUpdate.micKey, data + 26, 16);
1057
pWapiSta->wapiMskUpdate.keyId = *(data + 42);
1058
pWapiSta->wapiMskUpdate.bTxEnable = false;
1059
}
1060
}
1061
break;
1062
default:
1063
WAPI_TRACE(WAPI_ERR, "Unknown Flag\n");
1064
break;
1065
}
1066
}
1067
}
1068
}
1069
WAPI_TRACE(WAPI_INIT, "<===========%s\n", __FUNCTION__);
1070
}
1071
1072
1073
void wapi_test_init(struct _adapter *padapter)
1074
{
1075
u8 keybuf[100];
1076
u8 mac_addr[ETH_ALEN] = {0x00, 0xe0, 0x4c, 0x72, 0x04, 0x70};
1077
u8 UskDataKey[16] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
1078
u8 UskMicKey[16] = {0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f};
1079
u8 UskId = 0;
1080
u8 MskDataKey[16] = {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f};
1081
u8 MskMicKey[16] = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f};
1082
u8 MskId = 0;
1083
1084
WAPI_TRACE(WAPI_INIT, "===========>%s\n", __FUNCTION__);
1085
1086
/* Enable Wapi */
1087
WAPI_TRACE(WAPI_INIT, "%s: Enable wapi!!!!\n", __FUNCTION__);
1088
padapter->wapiInfo.bWapiEnable = true;
1089
padapter->pairwise_key_type = KEY_TYPE_SMS4;
1090
ieee->group_key_type = KEY_TYPE_SMS4;
1091
padapter->wapiInfo.extra_prefix_len = WAPI_EXT_LEN;
1092
padapter->wapiInfo.extra_postfix_len = SMS4_MIC_LEN;
1093
1094
/* set usk */
1095
WAPI_TRACE(WAPI_INIT, "%s: Set USK!!!!\n", __FUNCTION__);
1096
memset(keybuf, 0, 100);
1097
keybuf[0] = 1; /* set usk */
1098
keybuf[1] = 1; /* enable tx */
1099
keybuf[2] = 1; /* AE */
1100
keybuf[3] = 0; /* not update */
1101
1102
memcpy(keybuf + 4, mac_addr, ETH_ALEN);
1103
memcpy(keybuf + 10, UskDataKey, 16);
1104
memcpy(keybuf + 26, UskMicKey, 16);
1105
keybuf[42] = UskId;
1106
wapi_test_set_key(padapter, keybuf);
1107
1108
memset(keybuf, 0, 100);
1109
keybuf[0] = 1; /* set usk */
1110
keybuf[1] = 1; /* enable tx */
1111
keybuf[2] = 0; /* AE */
1112
keybuf[3] = 0; /* not update */
1113
1114
memcpy(keybuf + 4, mac_addr, ETH_ALEN);
1115
memcpy(keybuf + 10, UskDataKey, 16);
1116
memcpy(keybuf + 26, UskMicKey, 16);
1117
keybuf[42] = UskId;
1118
wapi_test_set_key(padapter, keybuf);
1119
1120
/* set msk */
1121
WAPI_TRACE(WAPI_INIT, "%s: Set MSK!!!!\n", __FUNCTION__);
1122
memset(keybuf, 0, 100);
1123
keybuf[0] = 2; /* set msk */
1124
keybuf[1] = 1; /* Enable TX */
1125
keybuf[2] = 1; /* AE */
1126
keybuf[3] = 0; /* not update */
1127
memcpy(keybuf + 4, mac_addr, ETH_ALEN);
1128
memcpy(keybuf + 10, MskDataKey, 16);
1129
memcpy(keybuf + 26, MskMicKey, 16);
1130
keybuf[42] = MskId;
1131
wapi_test_set_key(padapter, keybuf);
1132
1133
memset(keybuf, 0, 100);
1134
keybuf[0] = 2; /* set msk */
1135
keybuf[1] = 1; /* Enable TX */
1136
keybuf[2] = 0; /* AE */
1137
keybuf[3] = 0; /* not update */
1138
memcpy(keybuf + 4, mac_addr, ETH_ALEN);
1139
memcpy(keybuf + 10, MskDataKey, 16);
1140
memcpy(keybuf + 26, MskMicKey, 16);
1141
keybuf[42] = MskId;
1142
wapi_test_set_key(padapter, keybuf);
1143
WAPI_TRACE(WAPI_INIT, "<===========%s\n", __FUNCTION__);
1144
}
1145
#endif
1146
1147
void rtw_wapi_get_iv(_adapter *padapter, u8 *pRA, u8 *IV)
1148
{
1149
PWLAN_HEADER_WAPI_EXTENSION pWapiExt = NULL;
1150
PRT_WAPI_T pWapiInfo = &padapter->wapiInfo;
1151
bool bPNOverflow = false;
1152
bool bFindMatchPeer = false;
1153
PRT_WAPI_STA_INFO pWapiSta = NULL;
1154
1155
pWapiExt = (PWLAN_HEADER_WAPI_EXTENSION)IV;
1156
1157
WAPI_DATA(WAPI_RX, "wapi_get_iv: pra", pRA, 6);
1158
1159
if (IS_MCAST(pRA)) {
1160
if (!pWapiInfo->wapiTxMsk.bTxEnable) {
1161
WAPI_TRACE(WAPI_ERR, "%s: bTxEnable = 0!!\n", __FUNCTION__);
1162
return;
1163
}
1164
1165
if (pWapiInfo->wapiTxMsk.keyId <= 1) {
1166
pWapiExt->KeyIdx = pWapiInfo->wapiTxMsk.keyId;
1167
pWapiExt->Reserved = 0;
1168
bPNOverflow = WapiIncreasePN(pWapiInfo->lastTxMulticastPN, 1);
1169
memcpy(pWapiExt->PN, pWapiInfo->lastTxMulticastPN, 16);
1170
}
1171
} else {
1172
if (list_empty(&pWapiInfo->wapiSTAUsedList)) {
1173
WAPI_TRACE(WAPI_RX, "rtw_wapi_get_iv: list is empty\n");
1174
_rtw_memset(IV, 10, 18);
1175
return;
1176
} else {
1177
list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {
1178
WAPI_DATA(WAPI_RX, "rtw_wapi_get_iv: peermacaddr ", pWapiSta->PeerMacAddr, 6);
1179
if (_rtw_memcmp((u8 *)pWapiSta->PeerMacAddr, pRA, 6) == _TRUE) {
1180
bFindMatchPeer = true;
1181
break;
1182
}
1183
}
1184
1185
WAPI_TRACE(WAPI_RX, "bFindMatchPeer: %d\n", bFindMatchPeer);
1186
WAPI_DATA(WAPI_RX, "Addr", pRA, 6);
1187
1188
if (bFindMatchPeer) {
1189
if ((!pWapiSta->wapiUskUpdate.bTxEnable) && (!pWapiSta->wapiUsk.bTxEnable))
1190
return;
1191
1192
if (pWapiSta->wapiUsk.keyId <= 1) {
1193
if (pWapiSta->wapiUskUpdate.bTxEnable)
1194
pWapiExt->KeyIdx = pWapiSta->wapiUskUpdate.keyId;
1195
else
1196
pWapiExt->KeyIdx = pWapiSta->wapiUsk.keyId;
1197
1198
pWapiExt->Reserved = 0;
1199
bPNOverflow = WapiIncreasePN(pWapiSta->lastTxUnicastPN, 2);
1200
_rtw_memcpy(pWapiExt->PN, pWapiSta->lastTxUnicastPN, 16);
1201
1202
}
1203
}
1204
}
1205
1206
}
1207
1208
}
1209
1210
bool rtw_wapi_drop_for_key_absent(_adapter *padapter, u8 *pRA)
1211
{
1212
PRT_WAPI_T pWapiInfo = &padapter->wapiInfo;
1213
bool bFindMatchPeer = false;
1214
bool bDrop = false;
1215
PRT_WAPI_STA_INFO pWapiSta = NULL;
1216
struct security_priv *psecuritypriv = &padapter->securitypriv;
1217
1218
WAPI_DATA(WAPI_RX, "rtw_wapi_drop_for_key_absent: ra ", pRA, 6);
1219
1220
if (psecuritypriv->dot11PrivacyAlgrthm == _SMS4_) {
1221
if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable))
1222
return true;
1223
1224
if (IS_MCAST(pRA)) {
1225
if (!pWapiInfo->wapiTxMsk.bTxEnable) {
1226
bDrop = true;
1227
WAPI_TRACE(WAPI_RX, "rtw_wapi_drop_for_key_absent: multicast key is absent\n");
1228
return bDrop;
1229
}
1230
} else {
1231
if (!list_empty(&pWapiInfo->wapiSTAUsedList)) {
1232
list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {
1233
WAPI_DATA(WAPI_RX, "rtw_wapi_drop_for_key_absent: pWapiSta->PeerMacAddr ", pWapiSta->PeerMacAddr, 6);
1234
if (_rtw_memcmp(pRA, pWapiSta->PeerMacAddr, 6) == _TRUE) {
1235
bFindMatchPeer = true;
1236
break;
1237
}
1238
}
1239
if (bFindMatchPeer) {
1240
if (!pWapiSta->wapiUsk.bTxEnable) {
1241
bDrop = true;
1242
WAPI_TRACE(WAPI_RX, "rtw_wapi_drop_for_key_absent: unicast key is absent\n");
1243
return bDrop;
1244
}
1245
} else {
1246
bDrop = true;
1247
WAPI_TRACE(WAPI_RX, "rtw_wapi_drop_for_key_absent: no peer find\n");
1248
return bDrop;
1249
}
1250
1251
} else {
1252
bDrop = true;
1253
WAPI_TRACE(WAPI_RX, "rtw_wapi_drop_for_key_absent: no sta exist\n");
1254
return bDrop;
1255
}
1256
}
1257
} else
1258
return bDrop;
1259
1260
return bDrop;
1261
}
1262
1263
void rtw_wapi_set_set_encryption(_adapter *padapter, struct ieee_param *param)
1264
{
1265
struct security_priv *psecuritypriv = &padapter->securitypriv;
1266
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1267
PRT_WAPI_T pWapiInfo = &padapter->wapiInfo;
1268
PRT_WAPI_STA_INFO pWapiSta;
1269
u8 WapiASUEPNInitialValueSrc[16] = {0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;
1270
u8 WapiAEPNInitialValueSrc[16] = {0x37, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;
1271
u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;
1272
1273
if (param->u.crypt.set_tx == 1) {
1274
list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {
1275
if (_rtw_memcmp(pWapiSta->PeerMacAddr, param->sta_addr, 6)) {
1276
_rtw_memcpy(pWapiSta->lastTxUnicastPN, WapiASUEPNInitialValueSrc, 16);
1277
1278
pWapiSta->wapiUsk.bSet = true;
1279
_rtw_memcpy(pWapiSta->wapiUsk.dataKey, param->u.crypt.key, 16);
1280
_rtw_memcpy(pWapiSta->wapiUsk.micKey, param->u.crypt.key + 16, 16);
1281
pWapiSta->wapiUsk.keyId = param->u.crypt.idx ;
1282
pWapiSta->wapiUsk.bTxEnable = true;
1283
1284
_rtw_memcpy(pWapiSta->lastRxUnicastPNBEQueue, WapiAEPNInitialValueSrc, 16);
1285
_rtw_memcpy(pWapiSta->lastRxUnicastPNBKQueue, WapiAEPNInitialValueSrc, 16);
1286
_rtw_memcpy(pWapiSta->lastRxUnicastPNVIQueue, WapiAEPNInitialValueSrc, 16);
1287
_rtw_memcpy(pWapiSta->lastRxUnicastPNVOQueue, WapiAEPNInitialValueSrc, 16);
1288
_rtw_memcpy(pWapiSta->lastRxUnicastPN, WapiAEPNInitialValueSrc, 16);
1289
pWapiSta->wapiUskUpdate.bTxEnable = false;
1290
pWapiSta->wapiUskUpdate.bSet = false;
1291
1292
if (psecuritypriv->sw_encrypt == false || psecuritypriv->sw_decrypt == false) {
1293
/* set unicast key for ASUE */
1294
rtw_wapi_set_key(padapter, &pWapiSta->wapiUsk, pWapiSta, false, false);
1295
}
1296
}
1297
}
1298
} else {
1299
list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {
1300
if (_rtw_memcmp(pWapiSta->PeerMacAddr, get_bssid(pmlmepriv), 6)) {
1301
pWapiSta->wapiMsk.bSet = true;
1302
_rtw_memcpy(pWapiSta->wapiMsk.dataKey, param->u.crypt.key, 16);
1303
_rtw_memcpy(pWapiSta->wapiMsk.micKey, param->u.crypt.key + 16, 16);
1304
pWapiSta->wapiMsk.keyId = param->u.crypt.idx ;
1305
pWapiSta->wapiMsk.bTxEnable = false;
1306
if (!pWapiSta->bSetkeyOk)
1307
pWapiSta->bSetkeyOk = true;
1308
pWapiSta->bAuthenticateInProgress = false;
1309
1310
_rtw_memcpy(pWapiSta->lastRxMulticastPN, WapiAEMultiCastPNInitialValueSrc, 16);
1311
1312
if (psecuritypriv->sw_decrypt == false) {
1313
/* set rx broadcast key for ASUE */
1314
rtw_wapi_set_key(padapter, &pWapiSta->wapiMsk, pWapiSta, true, false);
1315
}
1316
}
1317
}
1318
}
1319
}
1320
#endif
1321
1322