Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nu11secur1ty
GitHub Repository: nu11secur1ty/Kali-Linux
Path: blob/master/ALFA-W1F1/RTL8814AU/core/rtw_security.c
1307 views
1
/******************************************************************************
2
*
3
* Copyright(c) 2007 - 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
#define _RTW_SECURITY_C_
16
17
#include <drv_types.h>
18
19
static const char *_security_type_str[] = {
20
"N/A",
21
"WEP40",
22
"TKIP",
23
"TKIP_WM",
24
"AES",
25
"WEP104",
26
"SMS4",
27
"WEP_WPA",
28
"BIP",
29
};
30
31
const char *security_type_str(u8 value)
32
{
33
#ifdef CONFIG_IEEE80211W
34
if (value <= _BIP_)
35
#else
36
if (value <= _WEP_WPA_MIXED_)
37
#endif
38
return _security_type_str[value];
39
return NULL;
40
}
41
42
#ifdef DBG_SW_SEC_CNT
43
#define WEP_SW_ENC_CNT_INC(sec, ra) do {\
44
if (is_broadcast_mac_addr(ra)) \
45
sec->wep_sw_enc_cnt_bc++; \
46
else if (is_multicast_mac_addr(ra)) \
47
sec->wep_sw_enc_cnt_mc++; \
48
else \
49
sec->wep_sw_enc_cnt_uc++; \
50
} while (0)
51
52
#define WEP_SW_DEC_CNT_INC(sec, ra) do {\
53
if (is_broadcast_mac_addr(ra)) \
54
sec->wep_sw_dec_cnt_bc++; \
55
else if (is_multicast_mac_addr(ra)) \
56
sec->wep_sw_dec_cnt_mc++; \
57
else \
58
sec->wep_sw_dec_cnt_uc++; \
59
} while (0)
60
61
#define TKIP_SW_ENC_CNT_INC(sec, ra) do {\
62
if (is_broadcast_mac_addr(ra)) \
63
sec->tkip_sw_enc_cnt_bc++; \
64
else if (is_multicast_mac_addr(ra)) \
65
sec->tkip_sw_enc_cnt_mc++; \
66
else \
67
sec->tkip_sw_enc_cnt_uc++; \
68
} while (0)
69
70
#define TKIP_SW_DEC_CNT_INC(sec, ra) do {\
71
if (is_broadcast_mac_addr(ra)) \
72
sec->tkip_sw_dec_cnt_bc++; \
73
else if (is_multicast_mac_addr(ra)) \
74
sec->tkip_sw_dec_cnt_mc++; \
75
else \
76
sec->tkip_sw_dec_cnt_uc++; \
77
} while (0)
78
79
#define AES_SW_ENC_CNT_INC(sec, ra) do {\
80
if (is_broadcast_mac_addr(ra)) \
81
sec->aes_sw_enc_cnt_bc++; \
82
else if (is_multicast_mac_addr(ra)) \
83
sec->aes_sw_enc_cnt_mc++; \
84
else \
85
sec->aes_sw_enc_cnt_uc++; \
86
} while (0)
87
88
#define AES_SW_DEC_CNT_INC(sec, ra) do {\
89
if (is_broadcast_mac_addr(ra)) \
90
sec->aes_sw_dec_cnt_bc++; \
91
else if (is_multicast_mac_addr(ra)) \
92
sec->aes_sw_dec_cnt_mc++; \
93
else \
94
sec->aes_sw_dec_cnt_uc++; \
95
} while (0)
96
#else
97
#define WEP_SW_ENC_CNT_INC(sec, ra)
98
#define WEP_SW_DEC_CNT_INC(sec, ra)
99
#define TKIP_SW_ENC_CNT_INC(sec, ra)
100
#define TKIP_SW_DEC_CNT_INC(sec, ra)
101
#define AES_SW_ENC_CNT_INC(sec, ra)
102
#define AES_SW_DEC_CNT_INC(sec, ra)
103
#endif /* DBG_SW_SEC_CNT */
104
105
/* *****WEP related***** */
106
107
#define CRC32_POLY 0x04c11db7
108
109
struct arc4context {
110
u32 x;
111
u32 y;
112
u8 state[256];
113
};
114
115
116
static void arcfour_init(struct arc4context *parc4ctx, u8 *key, u32 key_len)
117
{
118
u32 t, u;
119
u32 keyindex;
120
u32 stateindex;
121
u8 *state;
122
u32 counter;
123
state = parc4ctx->state;
124
parc4ctx->x = 0;
125
parc4ctx->y = 0;
126
for (counter = 0; counter < 256; counter++)
127
state[counter] = (u8)counter;
128
keyindex = 0;
129
stateindex = 0;
130
for (counter = 0; counter < 256; counter++) {
131
t = state[counter];
132
stateindex = (stateindex + key[keyindex] + t) & 0xff;
133
u = state[stateindex];
134
state[stateindex] = (u8)t;
135
state[counter] = (u8)u;
136
if (++keyindex >= key_len)
137
keyindex = 0;
138
}
139
}
140
static u32 arcfour_byte(struct arc4context *parc4ctx)
141
{
142
u32 x;
143
u32 y;
144
u32 sx, sy;
145
u8 *state;
146
state = parc4ctx->state;
147
x = (parc4ctx->x + 1) & 0xff;
148
sx = state[x];
149
y = (sx + parc4ctx->y) & 0xff;
150
sy = state[y];
151
parc4ctx->x = x;
152
parc4ctx->y = y;
153
state[y] = (u8)sx;
154
state[x] = (u8)sy;
155
return state[(sx + sy) & 0xff];
156
}
157
158
159
static void arcfour_encrypt(struct arc4context *parc4ctx,
160
u8 *dest,
161
u8 *src,
162
u32 len)
163
{
164
u32 i;
165
for (i = 0; i < len; i++)
166
dest[i] = src[i] ^ (unsigned char)arcfour_byte(parc4ctx);
167
}
168
169
static sint bcrc32initialized = 0;
170
static u32 crc32_table[256];
171
172
173
static u8 crc32_reverseBit(u8 data)
174
{
175
return (u8)((data << 7) & 0x80) | ((data << 5) & 0x40) | ((data << 3) & 0x20) | ((data << 1) & 0x10) | ((data >> 1) & 0x08) | ((data >> 3) & 0x04) | ((data >> 5) & 0x02) | ((
176
data >> 7) & 0x01) ;
177
}
178
179
static void crc32_init(void)
180
{
181
if (bcrc32initialized == 1)
182
goto exit;
183
else {
184
sint i, j;
185
u32 c;
186
u8 *p = (u8 *)&c, *p1;
187
u8 k;
188
189
c = 0x12340000;
190
191
for (i = 0; i < 256; ++i) {
192
k = crc32_reverseBit((u8)i);
193
for (c = ((u32)k) << 24, j = 8; j > 0; --j)
194
c = c & 0x80000000 ? (c << 1) ^ CRC32_POLY : (c << 1);
195
p1 = (u8 *)&crc32_table[i];
196
197
p1[0] = crc32_reverseBit(p[3]);
198
p1[1] = crc32_reverseBit(p[2]);
199
p1[2] = crc32_reverseBit(p[1]);
200
p1[3] = crc32_reverseBit(p[0]);
201
}
202
bcrc32initialized = 1;
203
}
204
exit:
205
return;
206
}
207
208
static u32 getcrc32(u8 *buf, sint len)
209
{
210
u8 *p;
211
u32 crc;
212
if (bcrc32initialized == 0)
213
crc32_init();
214
215
crc = 0xffffffff; /* preload shift register, per CRC-32 spec */
216
217
for (p = buf; len > 0; ++p, --len)
218
crc = crc32_table[(crc ^ *p) & 0xff] ^ (crc >> 8);
219
return ~crc; /* transmit complement, per CRC-32 spec */
220
}
221
222
223
/*
224
Need to consider the fragment situation
225
*/
226
void rtw_wep_encrypt(_adapter *padapter, u8 *pxmitframe)
227
{
228
/* exclude ICV */
229
230
unsigned char crc[4];
231
struct arc4context mycontext;
232
233
sint curfragnum, length;
234
u32 keylength;
235
236
u8 *pframe, *payload, *iv; /* ,*wepkey */
237
u8 wepkey[16];
238
u8 hw_hdr_offset = 0;
239
struct pkt_attrib *pattrib = &((struct xmit_frame *)pxmitframe)->attrib;
240
struct security_priv *psecuritypriv = &padapter->securitypriv;
241
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
242
243
244
245
if (((struct xmit_frame *)pxmitframe)->buf_addr == NULL)
246
return;
247
248
#ifdef CONFIG_USB_TX_AGGREGATION
249
hw_hdr_offset = TXDESC_SIZE +
250
(((struct xmit_frame *)pxmitframe)->pkt_offset * PACKET_OFFSET_SZ);
251
#else
252
#ifdef CONFIG_TX_EARLY_MODE
253
hw_hdr_offset = TXDESC_OFFSET + EARLY_MODE_INFO_SIZE;
254
#else
255
hw_hdr_offset = TXDESC_OFFSET;
256
#endif
257
#endif
258
259
pframe = ((struct xmit_frame *)pxmitframe)->buf_addr + hw_hdr_offset;
260
261
/* start to encrypt each fragment */
262
if ((pattrib->encrypt == _WEP40_) || (pattrib->encrypt == _WEP104_)) {
263
keylength = psecuritypriv->dot11DefKeylen[psecuritypriv->dot11PrivacyKeyIndex];
264
265
for (curfragnum = 0; curfragnum < pattrib->nr_frags; curfragnum++) {
266
iv = pframe + pattrib->hdrlen;
267
_rtw_memcpy(&wepkey[0], iv, 3);
268
_rtw_memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[psecuritypriv->dot11PrivacyKeyIndex].skey[0], keylength);
269
payload = pframe + pattrib->iv_len + pattrib->hdrlen;
270
271
if ((curfragnum + 1) == pattrib->nr_frags) {
272
/* the last fragment */
273
274
length = pattrib->last_txcmdsz - pattrib->hdrlen - pattrib->iv_len - pattrib->icv_len;
275
276
*((u32 *)crc) = cpu_to_le32(getcrc32(payload, length));
277
278
arcfour_init(&mycontext, wepkey, 3 + keylength);
279
arcfour_encrypt(&mycontext, payload, payload, length);
280
arcfour_encrypt(&mycontext, payload + length, crc, 4);
281
282
} else {
283
length = pxmitpriv->frag_len - pattrib->hdrlen - pattrib->iv_len - pattrib->icv_len ;
284
*((u32 *)crc) = cpu_to_le32(getcrc32(payload, length));
285
arcfour_init(&mycontext, wepkey, 3 + keylength);
286
arcfour_encrypt(&mycontext, payload, payload, length);
287
arcfour_encrypt(&mycontext, payload + length, crc, 4);
288
289
pframe += pxmitpriv->frag_len;
290
pframe = (u8 *)RND4((SIZE_PTR)(pframe));
291
292
}
293
294
}
295
296
WEP_SW_ENC_CNT_INC(psecuritypriv, pattrib->ra);
297
}
298
299
300
}
301
302
void rtw_wep_decrypt(_adapter *padapter, u8 *precvframe)
303
{
304
/* exclude ICV */
305
u8 crc[4];
306
struct arc4context mycontext;
307
sint length;
308
u32 keylength;
309
u8 *pframe, *payload, *iv, wepkey[16];
310
u8 keyindex;
311
struct rx_pkt_attrib *prxattrib = &(((union recv_frame *)precvframe)->u.hdr.attrib);
312
struct security_priv *psecuritypriv = &padapter->securitypriv;
313
314
315
pframe = (unsigned char *)((union recv_frame *)precvframe)->u.hdr.rx_data;
316
317
/* start to decrypt recvframe */
318
if ((prxattrib->encrypt == _WEP40_) || (prxattrib->encrypt == _WEP104_)) {
319
iv = pframe + prxattrib->hdrlen;
320
/* keyindex=(iv[3]&0x3); */
321
keyindex = prxattrib->key_index;
322
keylength = psecuritypriv->dot11DefKeylen[keyindex];
323
_rtw_memcpy(&wepkey[0], iv, 3);
324
/* _rtw_memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[psecuritypriv->dot11PrivacyKeyIndex].skey[0],keylength); */
325
_rtw_memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[keyindex].skey[0], keylength);
326
length = ((union recv_frame *)precvframe)->u.hdr.len - prxattrib->hdrlen - prxattrib->iv_len;
327
328
payload = pframe + prxattrib->iv_len + prxattrib->hdrlen;
329
330
/* decrypt payload include icv */
331
arcfour_init(&mycontext, wepkey, 3 + keylength);
332
arcfour_encrypt(&mycontext, payload, payload, length);
333
334
/* calculate icv and compare the icv */
335
*((u32 *)crc) = le32_to_cpu(getcrc32(payload, length - 4));
336
337
338
WEP_SW_DEC_CNT_INC(psecuritypriv, prxattrib->ra);
339
}
340
341
342
return;
343
344
}
345
346
/* 3 =====TKIP related===== */
347
348
static u32 secmicgetuint32(u8 *p)
349
/* Convert from Byte[] to Us4Byte32 in a portable way */
350
{
351
s32 i;
352
u32 res = 0;
353
for (i = 0; i < 4; i++)
354
res |= ((u32)(*p++)) << (8 * i);
355
return res;
356
}
357
358
static void secmicputuint32(u8 *p, u32 val)
359
/* Convert from Us4Byte32 to Byte[] in a portable way */
360
{
361
long i;
362
for (i = 0; i < 4; i++) {
363
*p++ = (u8)(val & 0xff);
364
val >>= 8;
365
}
366
}
367
368
static void secmicclear(struct mic_data *pmicdata)
369
{
370
/* Reset the state to the empty message. */
371
pmicdata->L = pmicdata->K0;
372
pmicdata->R = pmicdata->K1;
373
pmicdata->nBytesInM = 0;
374
pmicdata->M = 0;
375
}
376
377
void rtw_secmicsetkey(struct mic_data *pmicdata, u8 *key)
378
{
379
/* Set the key */
380
pmicdata->K0 = secmicgetuint32(key);
381
pmicdata->K1 = secmicgetuint32(key + 4);
382
/* and reset the message */
383
secmicclear(pmicdata);
384
}
385
386
void rtw_secmicappendbyte(struct mic_data *pmicdata, u8 b)
387
{
388
/* Append the byte to our word-sized buffer */
389
pmicdata->M |= ((unsigned long)b) << (8 * pmicdata->nBytesInM);
390
pmicdata->nBytesInM++;
391
/* Process the word if it is full. */
392
if (pmicdata->nBytesInM >= 4) {
393
pmicdata->L ^= pmicdata->M;
394
pmicdata->R ^= ROL32(pmicdata->L, 17);
395
pmicdata->L += pmicdata->R;
396
pmicdata->R ^= ((pmicdata->L & 0xff00ff00) >> 8) | ((pmicdata->L & 0x00ff00ff) << 8);
397
pmicdata->L += pmicdata->R;
398
pmicdata->R ^= ROL32(pmicdata->L, 3);
399
pmicdata->L += pmicdata->R;
400
pmicdata->R ^= ROR32(pmicdata->L, 2);
401
pmicdata->L += pmicdata->R;
402
/* Clear the buffer */
403
pmicdata->M = 0;
404
pmicdata->nBytesInM = 0;
405
}
406
}
407
408
void rtw_secmicappend(struct mic_data *pmicdata, u8 *src, u32 nbytes)
409
{
410
/* This is simple */
411
while (nbytes > 0) {
412
rtw_secmicappendbyte(pmicdata, *src++);
413
nbytes--;
414
}
415
}
416
417
void rtw_secgetmic(struct mic_data *pmicdata, u8 *dst)
418
{
419
/* Append the minimum padding */
420
rtw_secmicappendbyte(pmicdata, 0x5a);
421
rtw_secmicappendbyte(pmicdata, 0);
422
rtw_secmicappendbyte(pmicdata, 0);
423
rtw_secmicappendbyte(pmicdata, 0);
424
rtw_secmicappendbyte(pmicdata, 0);
425
/* and then zeroes until the length is a multiple of 4 */
426
while (pmicdata->nBytesInM != 0)
427
rtw_secmicappendbyte(pmicdata, 0);
428
/* The appendByte function has already computed the result. */
429
secmicputuint32(dst, pmicdata->L);
430
secmicputuint32(dst + 4, pmicdata->R);
431
/* Reset to the empty message. */
432
secmicclear(pmicdata);
433
}
434
435
436
void rtw_seccalctkipmic(u8 *key, u8 *header, u8 *data, u32 data_len, u8 *mic_code, u8 pri)
437
{
438
439
struct mic_data micdata;
440
u8 priority[4] = {0x0, 0x0, 0x0, 0x0};
441
rtw_secmicsetkey(&micdata, key);
442
priority[0] = pri;
443
444
/* Michael MIC pseudo header: DA, SA, 3 x 0, Priority */
445
if (header[1] & 1) { /* ToDS==1 */
446
rtw_secmicappend(&micdata, &header[16], 6); /* DA */
447
if (header[1] & 2) /* From Ds==1 */
448
rtw_secmicappend(&micdata, &header[24], 6);
449
else
450
rtw_secmicappend(&micdata, &header[10], 6);
451
} else { /* ToDS==0 */
452
rtw_secmicappend(&micdata, &header[4], 6); /* DA */
453
if (header[1] & 2) /* From Ds==1 */
454
rtw_secmicappend(&micdata, &header[16], 6);
455
else
456
rtw_secmicappend(&micdata, &header[10], 6);
457
458
}
459
rtw_secmicappend(&micdata, &priority[0], 4);
460
461
462
rtw_secmicappend(&micdata, data, data_len);
463
464
rtw_secgetmic(&micdata, mic_code);
465
}
466
467
468
469
470
/* macros for extraction/creation of unsigned char/unsigned short values */
471
#define RotR1(v16) ((((v16) >> 1) & 0x7FFF) ^ (((v16) & 1) << 15))
472
#define Lo8(v16) ((u8)((v16) & 0x00FF))
473
#define Hi8(v16) ((u8)(((v16) >> 8) & 0x00FF))
474
#define Lo16(v32) ((u16)((v32) & 0xFFFF))
475
#define Hi16(v32) ((u16)(((v32) >> 16) & 0xFFFF))
476
#define Mk16(hi, lo) ((lo) ^ (((u16)(hi)) << 8))
477
478
/* select the Nth 16-bit word of the temporal key unsigned char array TK[] */
479
#define TK16(N) Mk16(tk[2*(N)+1], tk[2*(N)])
480
481
/* S-box lookup: 16 bits --> 16 bits */
482
#define _S_(v16) (Sbox1[0][Lo8(v16)] ^ Sbox1[1][Hi8(v16)])
483
484
/* fixed algorithm "parameters" */
485
#define PHASE1_LOOP_CNT 8 /* this needs to be "big enough" */
486
#define TA_SIZE 6 /* 48-bit transmitter address */
487
#define TK_SIZE 16 /* 128-bit temporal key */
488
#define P1K_SIZE 10 /* 80-bit Phase1 key */
489
#define RC4_KEY_SIZE 16 /* 128-bit RC4KEY (104 bits unknown) */
490
491
492
/* 2-unsigned char by 2-unsigned char subset of the full AES S-box table */
493
static const unsigned short Sbox1[2][256] = /* Sbox for hash (can be in ROM) */
494
{ {
495
0xC6A5, 0xF884, 0xEE99, 0xF68D, 0xFF0D, 0xD6BD, 0xDEB1, 0x9154,
496
0x6050, 0x0203, 0xCEA9, 0x567D, 0xE719, 0xB562, 0x4DE6, 0xEC9A,
497
0x8F45, 0x1F9D, 0x8940, 0xFA87, 0xEF15, 0xB2EB, 0x8EC9, 0xFB0B,
498
0x41EC, 0xB367, 0x5FFD, 0x45EA, 0x23BF, 0x53F7, 0xE496, 0x9B5B,
499
0x75C2, 0xE11C, 0x3DAE, 0x4C6A, 0x6C5A, 0x7E41, 0xF502, 0x834F,
500
0x685C, 0x51F4, 0xD134, 0xF908, 0xE293, 0xAB73, 0x6253, 0x2A3F,
501
0x080C, 0x9552, 0x4665, 0x9D5E, 0x3028, 0x37A1, 0x0A0F, 0x2FB5,
502
0x0E09, 0x2436, 0x1B9B, 0xDF3D, 0xCD26, 0x4E69, 0x7FCD, 0xEA9F,
503
0x121B, 0x1D9E, 0x5874, 0x342E, 0x362D, 0xDCB2, 0xB4EE, 0x5BFB,
504
0xA4F6, 0x764D, 0xB761, 0x7DCE, 0x527B, 0xDD3E, 0x5E71, 0x1397,
505
0xA6F5, 0xB968, 0x0000, 0xC12C, 0x4060, 0xE31F, 0x79C8, 0xB6ED,
506
0xD4BE, 0x8D46, 0x67D9, 0x724B, 0x94DE, 0x98D4, 0xB0E8, 0x854A,
507
0xBB6B, 0xC52A, 0x4FE5, 0xED16, 0x86C5, 0x9AD7, 0x6655, 0x1194,
508
0x8ACF, 0xE910, 0x0406, 0xFE81, 0xA0F0, 0x7844, 0x25BA, 0x4BE3,
509
0xA2F3, 0x5DFE, 0x80C0, 0x058A, 0x3FAD, 0x21BC, 0x7048, 0xF104,
510
0x63DF, 0x77C1, 0xAF75, 0x4263, 0x2030, 0xE51A, 0xFD0E, 0xBF6D,
511
0x814C, 0x1814, 0x2635, 0xC32F, 0xBEE1, 0x35A2, 0x88CC, 0x2E39,
512
0x9357, 0x55F2, 0xFC82, 0x7A47, 0xC8AC, 0xBAE7, 0x322B, 0xE695,
513
0xC0A0, 0x1998, 0x9ED1, 0xA37F, 0x4466, 0x547E, 0x3BAB, 0x0B83,
514
0x8CCA, 0xC729, 0x6BD3, 0x283C, 0xA779, 0xBCE2, 0x161D, 0xAD76,
515
0xDB3B, 0x6456, 0x744E, 0x141E, 0x92DB, 0x0C0A, 0x486C, 0xB8E4,
516
0x9F5D, 0xBD6E, 0x43EF, 0xC4A6, 0x39A8, 0x31A4, 0xD337, 0xF28B,
517
0xD532, 0x8B43, 0x6E59, 0xDAB7, 0x018C, 0xB164, 0x9CD2, 0x49E0,
518
0xD8B4, 0xACFA, 0xF307, 0xCF25, 0xCAAF, 0xF48E, 0x47E9, 0x1018,
519
0x6FD5, 0xF088, 0x4A6F, 0x5C72, 0x3824, 0x57F1, 0x73C7, 0x9751,
520
0xCB23, 0xA17C, 0xE89C, 0x3E21, 0x96DD, 0x61DC, 0x0D86, 0x0F85,
521
0xE090, 0x7C42, 0x71C4, 0xCCAA, 0x90D8, 0x0605, 0xF701, 0x1C12,
522
0xC2A3, 0x6A5F, 0xAEF9, 0x69D0, 0x1791, 0x9958, 0x3A27, 0x27B9,
523
0xD938, 0xEB13, 0x2BB3, 0x2233, 0xD2BB, 0xA970, 0x0789, 0x33A7,
524
0x2DB6, 0x3C22, 0x1592, 0xC920, 0x8749, 0xAAFF, 0x5078, 0xA57A,
525
0x038F, 0x59F8, 0x0980, 0x1A17, 0x65DA, 0xD731, 0x84C6, 0xD0B8,
526
0x82C3, 0x29B0, 0x5A77, 0x1E11, 0x7BCB, 0xA8FC, 0x6DD6, 0x2C3A,
527
},
528
529
530
{ /* second half of table is unsigned char-reversed version of first! */
531
0xA5C6, 0x84F8, 0x99EE, 0x8DF6, 0x0DFF, 0xBDD6, 0xB1DE, 0x5491,
532
0x5060, 0x0302, 0xA9CE, 0x7D56, 0x19E7, 0x62B5, 0xE64D, 0x9AEC,
533
0x458F, 0x9D1F, 0x4089, 0x87FA, 0x15EF, 0xEBB2, 0xC98E, 0x0BFB,
534
0xEC41, 0x67B3, 0xFD5F, 0xEA45, 0xBF23, 0xF753, 0x96E4, 0x5B9B,
535
0xC275, 0x1CE1, 0xAE3D, 0x6A4C, 0x5A6C, 0x417E, 0x02F5, 0x4F83,
536
0x5C68, 0xF451, 0x34D1, 0x08F9, 0x93E2, 0x73AB, 0x5362, 0x3F2A,
537
0x0C08, 0x5295, 0x6546, 0x5E9D, 0x2830, 0xA137, 0x0F0A, 0xB52F,
538
0x090E, 0x3624, 0x9B1B, 0x3DDF, 0x26CD, 0x694E, 0xCD7F, 0x9FEA,
539
0x1B12, 0x9E1D, 0x7458, 0x2E34, 0x2D36, 0xB2DC, 0xEEB4, 0xFB5B,
540
0xF6A4, 0x4D76, 0x61B7, 0xCE7D, 0x7B52, 0x3EDD, 0x715E, 0x9713,
541
0xF5A6, 0x68B9, 0x0000, 0x2CC1, 0x6040, 0x1FE3, 0xC879, 0xEDB6,
542
0xBED4, 0x468D, 0xD967, 0x4B72, 0xDE94, 0xD498, 0xE8B0, 0x4A85,
543
0x6BBB, 0x2AC5, 0xE54F, 0x16ED, 0xC586, 0xD79A, 0x5566, 0x9411,
544
0xCF8A, 0x10E9, 0x0604, 0x81FE, 0xF0A0, 0x4478, 0xBA25, 0xE34B,
545
0xF3A2, 0xFE5D, 0xC080, 0x8A05, 0xAD3F, 0xBC21, 0x4870, 0x04F1,
546
0xDF63, 0xC177, 0x75AF, 0x6342, 0x3020, 0x1AE5, 0x0EFD, 0x6DBF,
547
0x4C81, 0x1418, 0x3526, 0x2FC3, 0xE1BE, 0xA235, 0xCC88, 0x392E,
548
0x5793, 0xF255, 0x82FC, 0x477A, 0xACC8, 0xE7BA, 0x2B32, 0x95E6,
549
0xA0C0, 0x9819, 0xD19E, 0x7FA3, 0x6644, 0x7E54, 0xAB3B, 0x830B,
550
0xCA8C, 0x29C7, 0xD36B, 0x3C28, 0x79A7, 0xE2BC, 0x1D16, 0x76AD,
551
0x3BDB, 0x5664, 0x4E74, 0x1E14, 0xDB92, 0x0A0C, 0x6C48, 0xE4B8,
552
0x5D9F, 0x6EBD, 0xEF43, 0xA6C4, 0xA839, 0xA431, 0x37D3, 0x8BF2,
553
0x32D5, 0x438B, 0x596E, 0xB7DA, 0x8C01, 0x64B1, 0xD29C, 0xE049,
554
0xB4D8, 0xFAAC, 0x07F3, 0x25CF, 0xAFCA, 0x8EF4, 0xE947, 0x1810,
555
0xD56F, 0x88F0, 0x6F4A, 0x725C, 0x2438, 0xF157, 0xC773, 0x5197,
556
0x23CB, 0x7CA1, 0x9CE8, 0x213E, 0xDD96, 0xDC61, 0x860D, 0x850F,
557
0x90E0, 0x427C, 0xC471, 0xAACC, 0xD890, 0x0506, 0x01F7, 0x121C,
558
0xA3C2, 0x5F6A, 0xF9AE, 0xD069, 0x9117, 0x5899, 0x273A, 0xB927,
559
0x38D9, 0x13EB, 0xB32B, 0x3322, 0xBBD2, 0x70A9, 0x8907, 0xA733,
560
0xB62D, 0x223C, 0x9215, 0x20C9, 0x4987, 0xFFAA, 0x7850, 0x7AA5,
561
0x8F03, 0xF859, 0x8009, 0x171A, 0xDA65, 0x31D7, 0xC684, 0xB8D0,
562
0xC382, 0xB029, 0x775A, 0x111E, 0xCB7B, 0xFCA8, 0xD66D, 0x3A2C,
563
}
564
};
565
566
/*
567
**********************************************************************
568
* Routine: Phase 1 -- generate P1K, given TA, TK, IV32
569
*
570
* Inputs:
571
* tk[] = temporal key [128 bits]
572
* ta[] = transmitter's MAC address [ 48 bits]
573
* iv32 = upper 32 bits of IV [ 32 bits]
574
* Output:
575
* p1k[] = Phase 1 key [ 80 bits]
576
*
577
* Note:
578
* This function only needs to be called every 2**16 packets,
579
* although in theory it could be called every packet.
580
*
581
**********************************************************************
582
*/
583
static void phase1(u16 *p1k, const u8 *tk, const u8 *ta, u32 iv32)
584
{
585
sint i;
586
/* Initialize the 80 bits of P1K[] from IV32 and TA[0..5] */
587
p1k[0] = Lo16(iv32);
588
p1k[1] = Hi16(iv32);
589
p1k[2] = Mk16(ta[1], ta[0]); /* use TA[] as little-endian */
590
p1k[3] = Mk16(ta[3], ta[2]);
591
p1k[4] = Mk16(ta[5], ta[4]);
592
593
/* Now compute an unbalanced Feistel cipher with 80-bit block */
594
/* size on the 80-bit block P1K[], using the 128-bit key TK[] */
595
for (i = 0; i < PHASE1_LOOP_CNT ; i++) {
596
/* Each add operation here is mod 2**16 */
597
p1k[0] += _S_(p1k[4] ^ TK16((i & 1) + 0));
598
p1k[1] += _S_(p1k[0] ^ TK16((i & 1) + 2));
599
p1k[2] += _S_(p1k[1] ^ TK16((i & 1) + 4));
600
p1k[3] += _S_(p1k[2] ^ TK16((i & 1) + 6));
601
p1k[4] += _S_(p1k[3] ^ TK16((i & 1) + 0));
602
p1k[4] += (unsigned short)i; /* avoid "slide attacks" */
603
}
604
}
605
606
607
/*
608
**********************************************************************
609
* Routine: Phase 2 -- generate RC4KEY, given TK, P1K, IV16
610
*
611
* Inputs:
612
* tk[] = Temporal key [128 bits]
613
* p1k[] = Phase 1 output key [ 80 bits]
614
* iv16 = low 16 bits of IV counter [ 16 bits]
615
* Output:
616
* rc4key[] = the key used to encrypt the packet [128 bits]
617
*
618
* Note:
619
* The value {TA,IV32,IV16} for Phase1/Phase2 must be unique
620
* across all packets using the same key TK value. Then, for a
621
* given value of TK[], this TKIP48 construction guarantees that
622
* the final RC4KEY value is unique across all packets.
623
*
624
* Suggested implementation optimization: if PPK[] is "overlaid"
625
* appropriately on RC4KEY[], there is no need for the final
626
* for loop below that copies the PPK[] result into RC4KEY[].
627
*
628
**********************************************************************
629
*/
630
static void phase2(u8 *rc4key, const u8 *tk, const u16 *p1k, u16 iv16)
631
{
632
sint i;
633
u16 PPK[6]; /* temporary key for mixing */
634
/* Note: all adds in the PPK[] equations below are mod 2**16 */
635
for (i = 0; i < 5; i++)
636
PPK[i] = p1k[i]; /* first, copy P1K to PPK */
637
PPK[5] = p1k[4] + iv16; /* next, add in IV16 */
638
639
/* Bijective non-linear mixing of the 96 bits of PPK[0..5] */
640
PPK[0] += _S_(PPK[5] ^ TK16(0)); /* Mix key in each "round" */
641
PPK[1] += _S_(PPK[0] ^ TK16(1));
642
PPK[2] += _S_(PPK[1] ^ TK16(2));
643
PPK[3] += _S_(PPK[2] ^ TK16(3));
644
PPK[4] += _S_(PPK[3] ^ TK16(4));
645
PPK[5] += _S_(PPK[4] ^ TK16(5)); /* Total # S-box lookups == 6 */
646
647
/* Final sweep: bijective, "linear". Rotates kill LSB correlations */
648
PPK[0] += RotR1(PPK[5] ^ TK16(6));
649
PPK[1] += RotR1(PPK[0] ^ TK16(7)); /* Use all of TK[] in Phase2 */
650
PPK[2] += RotR1(PPK[1]);
651
PPK[3] += RotR1(PPK[2]);
652
PPK[4] += RotR1(PPK[3]);
653
PPK[5] += RotR1(PPK[4]);
654
/* Note: At this point, for a given key TK[0..15], the 96-bit output */
655
/* value PPK[0..5] is guaranteed to be unique, as a function */
656
/* of the 96-bit "input" value {TA,IV32,IV16}. That is, P1K */
657
/* is now a keyed permutation of {TA,IV32,IV16}. */
658
659
/* Set RC4KEY[0..3], which includes "cleartext" portion of RC4 key */
660
rc4key[0] = Hi8(iv16); /* RC4KEY[0..2] is the WEP IV */
661
rc4key[1] = (Hi8(iv16) | 0x20) & 0x7F; /* Help avoid weak (FMS) keys */
662
rc4key[2] = Lo8(iv16);
663
rc4key[3] = Lo8((PPK[5] ^ TK16(0)) >> 1);
664
665
666
/* Copy 96 bits of PPK[0..5] to RC4KEY[4..15] (little-endian) */
667
for (i = 0; i < 6; i++) {
668
rc4key[4 + 2 * i] = Lo8(PPK[i]);
669
rc4key[5 + 2 * i] = Hi8(PPK[i]);
670
}
671
}
672
673
674
/* The hlen isn't include the IV */
675
u32 rtw_tkip_encrypt(_adapter *padapter, u8 *pxmitframe)
676
{
677
/* exclude ICV */
678
u16 pnl;
679
u32 pnh;
680
u8 rc4key[16];
681
u8 ttkey[16];
682
u8 crc[4];
683
u8 hw_hdr_offset = 0;
684
struct arc4context mycontext;
685
sint curfragnum, length;
686
u32 prwskeylen;
687
688
u8 *pframe, *payload, *iv, *prwskey;
689
union pn48 dot11txpn;
690
/* struct sta_info *stainfo; */
691
struct pkt_attrib *pattrib = &((struct xmit_frame *)pxmitframe)->attrib;
692
struct security_priv *psecuritypriv = &padapter->securitypriv;
693
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
694
u32 res = _SUCCESS;
695
696
if (((struct xmit_frame *)pxmitframe)->buf_addr == NULL)
697
return _FAIL;
698
699
#ifdef CONFIG_USB_TX_AGGREGATION
700
hw_hdr_offset = TXDESC_SIZE +
701
(((struct xmit_frame *)pxmitframe)->pkt_offset * PACKET_OFFSET_SZ);
702
#else
703
#ifdef CONFIG_TX_EARLY_MODE
704
hw_hdr_offset = TXDESC_OFFSET + EARLY_MODE_INFO_SIZE;
705
#else
706
hw_hdr_offset = TXDESC_OFFSET;
707
#endif
708
#endif
709
710
pframe = ((struct xmit_frame *)pxmitframe)->buf_addr + hw_hdr_offset;
711
/* 4 start to encrypt each fragment */
712
if (pattrib->encrypt == _TKIP_) {
713
714
/*
715
if(pattrib->psta)
716
{
717
stainfo = pattrib->psta;
718
}
719
else
720
{
721
RTW_INFO("%s, call rtw_get_stainfo()\n", __func__);
722
stainfo=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0] );
723
}
724
*/
725
/* if (stainfo!=NULL) */
726
{
727
/*
728
if(!(stainfo->state &_FW_LINKED))
729
{
730
RTW_INFO("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, stainfo->state);
731
return _FAIL;
732
}
733
*/
734
735
if (IS_MCAST(pattrib->ra))
736
prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey;
737
else {
738
/* prwskey=&stainfo->dot118021x_UncstKey.skey[0]; */
739
prwskey = pattrib->dot118021x_UncstKey.skey;
740
}
741
742
prwskeylen = 16;
743
744
for (curfragnum = 0; curfragnum < pattrib->nr_frags; curfragnum++) {
745
iv = pframe + pattrib->hdrlen;
746
payload = pframe + pattrib->iv_len + pattrib->hdrlen;
747
748
GET_TKIP_PN(iv, dot11txpn);
749
750
pnl = (u16)(dot11txpn.val);
751
pnh = (u32)(dot11txpn.val >> 16);
752
753
phase1((u16 *)&ttkey[0], prwskey, &pattrib->ta[0], pnh);
754
755
phase2(&rc4key[0], prwskey, (u16 *)&ttkey[0], pnl);
756
757
if ((curfragnum + 1) == pattrib->nr_frags) { /* 4 the last fragment */
758
length = pattrib->last_txcmdsz - pattrib->hdrlen - pattrib->iv_len - pattrib->icv_len;
759
*((u32 *)crc) = cpu_to_le32(getcrc32(payload, length)); /* modified by Amy*/
760
761
arcfour_init(&mycontext, rc4key, 16);
762
arcfour_encrypt(&mycontext, payload, payload, length);
763
arcfour_encrypt(&mycontext, payload + length, crc, 4);
764
765
} else {
766
length = pxmitpriv->frag_len - pattrib->hdrlen - pattrib->iv_len - pattrib->icv_len ;
767
*((u32 *)crc) = cpu_to_le32(getcrc32(payload, length)); /* modified by Amy*/
768
arcfour_init(&mycontext, rc4key, 16);
769
arcfour_encrypt(&mycontext, payload, payload, length);
770
arcfour_encrypt(&mycontext, payload + length, crc, 4);
771
772
pframe += pxmitpriv->frag_len;
773
pframe = (u8 *)RND4((SIZE_PTR)(pframe));
774
775
}
776
}
777
778
TKIP_SW_ENC_CNT_INC(psecuritypriv, pattrib->ra);
779
}
780
/*
781
else{
782
RTW_INFO("%s, psta==NUL\n", __func__);
783
res=_FAIL;
784
}
785
*/
786
787
}
788
return res;
789
790
}
791
792
793
/* The hlen isn't include the IV */
794
u32 rtw_tkip_decrypt(_adapter *padapter, u8 *precvframe)
795
{
796
/* exclude ICV */
797
u16 pnl;
798
u32 pnh;
799
u8 rc4key[16];
800
u8 ttkey[16];
801
u8 crc[4];
802
struct arc4context mycontext;
803
sint length;
804
u32 prwskeylen;
805
806
u8 *pframe, *payload, *iv, *prwskey;
807
union pn48 dot11txpn;
808
struct sta_info *stainfo;
809
struct rx_pkt_attrib *prxattrib = &((union recv_frame *)precvframe)->u.hdr.attrib;
810
struct security_priv *psecuritypriv = &padapter->securitypriv;
811
/* struct recv_priv *precvpriv=&padapter->recvpriv; */
812
u32 res = _SUCCESS;
813
814
815
pframe = (unsigned char *)((union recv_frame *)precvframe)->u.hdr.rx_data;
816
817
/* 4 start to decrypt recvframe */
818
if (prxattrib->encrypt == _TKIP_) {
819
820
stainfo = rtw_get_stainfo(&padapter->stapriv , &prxattrib->ta[0]);
821
if (stainfo != NULL) {
822
823
if (IS_MCAST(prxattrib->ra)) {
824
static systime start = 0;
825
static u32 no_gkey_bc_cnt = 0;
826
static u32 no_gkey_mc_cnt = 0;
827
828
if (psecuritypriv->binstallGrpkey == _FALSE) {
829
res = _FAIL;
830
831
if (start == 0)
832
start = rtw_get_current_time();
833
834
if (is_broadcast_mac_addr(prxattrib->ra))
835
no_gkey_bc_cnt++;
836
else
837
no_gkey_mc_cnt++;
838
839
if (rtw_get_passing_time_ms(start) > 1000) {
840
if (no_gkey_bc_cnt || no_gkey_mc_cnt) {
841
RTW_PRINT(FUNC_ADPT_FMT" no_gkey_bc_cnt:%u, no_gkey_mc_cnt:%u\n",
842
FUNC_ADPT_ARG(padapter), no_gkey_bc_cnt, no_gkey_mc_cnt);
843
}
844
start = rtw_get_current_time();
845
no_gkey_bc_cnt = 0;
846
no_gkey_mc_cnt = 0;
847
}
848
goto exit;
849
}
850
851
if (no_gkey_bc_cnt || no_gkey_mc_cnt) {
852
RTW_PRINT(FUNC_ADPT_FMT" gkey installed. no_gkey_bc_cnt:%u, no_gkey_mc_cnt:%u\n",
853
FUNC_ADPT_ARG(padapter), no_gkey_bc_cnt, no_gkey_mc_cnt);
854
}
855
start = 0;
856
no_gkey_bc_cnt = 0;
857
no_gkey_mc_cnt = 0;
858
859
/* RTW_INFO("rx bc/mc packets, to perform sw rtw_tkip_decrypt\n"); */
860
/* prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey; */
861
prwskey = psecuritypriv->dot118021XGrpKey[prxattrib->key_index].skey;
862
prwskeylen = 16;
863
} else {
864
prwskey = &stainfo->dot118021x_UncstKey.skey[0];
865
prwskeylen = 16;
866
}
867
868
iv = pframe + prxattrib->hdrlen;
869
payload = pframe + prxattrib->iv_len + prxattrib->hdrlen;
870
length = ((union recv_frame *)precvframe)->u.hdr.len - prxattrib->hdrlen - prxattrib->iv_len;
871
872
GET_TKIP_PN(iv, dot11txpn);
873
874
pnl = (u16)(dot11txpn.val);
875
pnh = (u32)(dot11txpn.val >> 16);
876
877
phase1((u16 *)&ttkey[0], prwskey, &prxattrib->ta[0], pnh);
878
phase2(&rc4key[0], prwskey, (unsigned short *)&ttkey[0], pnl);
879
880
/* 4 decrypt payload include icv */
881
882
arcfour_init(&mycontext, rc4key, 16);
883
arcfour_encrypt(&mycontext, payload, payload, length);
884
885
*((u32 *)crc) = le32_to_cpu(getcrc32(payload, length - 4));
886
887
if (crc[3] != payload[length - 1] || crc[2] != payload[length - 2] || crc[1] != payload[length - 3] || crc[0] != payload[length - 4]) {
888
res = _FAIL;
889
}
890
891
TKIP_SW_DEC_CNT_INC(psecuritypriv, prxattrib->ra);
892
} else {
893
res = _FAIL;
894
}
895
896
}
897
exit:
898
return res;
899
900
}
901
902
903
/* 3 =====AES related===== */
904
905
906
907
#define MAX_MSG_SIZE 2048
908
/*****************************/
909
/******** SBOX Table *********/
910
/*****************************/
911
912
static u8 sbox_table[256] = {
913
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
914
0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
915
0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
916
0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
917
0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,
918
0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
919
0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
920
0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
921
0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
922
0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
923
0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
924
0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
925
0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
926
0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
927
0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
928
0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
929
0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
930
0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
931
0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
932
0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
933
0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
934
0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
935
0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
936
0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
937
0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
938
0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
939
0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
940
0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
941
0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
942
0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
943
0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
944
0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
945
};
946
947
/*****************************/
948
/**** Function Prototypes ****/
949
/*****************************/
950
951
static void bitwise_xor(u8 *ina, u8 *inb, u8 *out);
952
static void construct_mic_iv(
953
u8 *mic_header1,
954
sint qc_exists,
955
sint a4_exists,
956
u8 *mpdu,
957
uint payload_length,
958
u8 *pn_vector,
959
uint frtype);/* add for CONFIG_IEEE80211W, none 11w also can use */
960
static void construct_mic_header1(
961
u8 *mic_header1,
962
sint header_length,
963
u8 *mpdu,
964
uint frtype);/* add for CONFIG_IEEE80211W, none 11w also can use */
965
static void construct_mic_header2(
966
u8 *mic_header2,
967
u8 *mpdu,
968
sint a4_exists,
969
sint qc_exists);
970
static void construct_ctr_preload(
971
u8 *ctr_preload,
972
sint a4_exists,
973
sint qc_exists,
974
u8 *mpdu,
975
u8 *pn_vector,
976
sint c,
977
uint frtype);/* add for CONFIG_IEEE80211W, none 11w also can use */
978
static void xor_128(u8 *a, u8 *b, u8 *out);
979
static void xor_32(u8 *a, u8 *b, u8 *out);
980
static u8 sbox(u8 a);
981
static void next_key(u8 *key, sint round);
982
static void byte_sub(u8 *in, u8 *out);
983
static void shift_row(u8 *in, u8 *out);
984
static void mix_column(u8 *in, u8 *out);
985
static void aes128k128d(u8 *key, u8 *data, u8 *ciphertext);
986
987
988
/****************************************/
989
/* aes128k128d() */
990
/* Performs a 128 bit AES encrypt with */
991
/* 128 bit data. */
992
/****************************************/
993
static void xor_128(u8 *a, u8 *b, u8 *out)
994
{
995
sint i;
996
for (i = 0; i < 16; i++)
997
out[i] = a[i] ^ b[i];
998
}
999
1000
1001
static void xor_32(u8 *a, u8 *b, u8 *out)
1002
{
1003
sint i;
1004
for (i = 0; i < 4; i++)
1005
out[i] = a[i] ^ b[i];
1006
}
1007
1008
1009
static u8 sbox(u8 a)
1010
{
1011
return sbox_table[(sint)a];
1012
}
1013
1014
1015
static void next_key(u8 *key, sint round)
1016
{
1017
u8 rcon;
1018
u8 sbox_key[4];
1019
u8 rcon_table[12] = {
1020
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
1021
0x1b, 0x36, 0x36, 0x36
1022
};
1023
sbox_key[0] = sbox(key[13]);
1024
sbox_key[1] = sbox(key[14]);
1025
sbox_key[2] = sbox(key[15]);
1026
sbox_key[3] = sbox(key[12]);
1027
1028
rcon = rcon_table[round];
1029
1030
xor_32(&key[0], sbox_key, &key[0]);
1031
key[0] = key[0] ^ rcon;
1032
1033
xor_32(&key[4], &key[0], &key[4]);
1034
xor_32(&key[8], &key[4], &key[8]);
1035
xor_32(&key[12], &key[8], &key[12]);
1036
}
1037
1038
1039
static void byte_sub(u8 *in, u8 *out)
1040
{
1041
sint i;
1042
for (i = 0; i < 16; i++)
1043
out[i] = sbox(in[i]);
1044
}
1045
1046
1047
static void shift_row(u8 *in, u8 *out)
1048
{
1049
out[0] = in[0];
1050
out[1] = in[5];
1051
out[2] = in[10];
1052
out[3] = in[15];
1053
out[4] = in[4];
1054
out[5] = in[9];
1055
out[6] = in[14];
1056
out[7] = in[3];
1057
out[8] = in[8];
1058
out[9] = in[13];
1059
out[10] = in[2];
1060
out[11] = in[7];
1061
out[12] = in[12];
1062
out[13] = in[1];
1063
out[14] = in[6];
1064
out[15] = in[11];
1065
}
1066
1067
1068
static void mix_column(u8 *in, u8 *out)
1069
{
1070
sint i;
1071
u8 add1b[4];
1072
u8 add1bf7[4];
1073
u8 rotl[4];
1074
u8 swap_halfs[4];
1075
u8 andf7[4];
1076
u8 rotr[4];
1077
u8 temp[4];
1078
u8 tempb[4];
1079
for (i = 0 ; i < 4; i++) {
1080
if ((in[i] & 0x80) == 0x80)
1081
add1b[i] = 0x1b;
1082
else
1083
add1b[i] = 0x00;
1084
}
1085
1086
swap_halfs[0] = in[2]; /* Swap halfs */
1087
swap_halfs[1] = in[3];
1088
swap_halfs[2] = in[0];
1089
swap_halfs[3] = in[1];
1090
1091
rotl[0] = in[3]; /* Rotate left 8 bits */
1092
rotl[1] = in[0];
1093
rotl[2] = in[1];
1094
rotl[3] = in[2];
1095
1096
andf7[0] = in[0] & 0x7f;
1097
andf7[1] = in[1] & 0x7f;
1098
andf7[2] = in[2] & 0x7f;
1099
andf7[3] = in[3] & 0x7f;
1100
1101
for (i = 3; i > 0; i--) { /* logical shift left 1 bit */
1102
andf7[i] = andf7[i] << 1;
1103
if ((andf7[i - 1] & 0x80) == 0x80)
1104
andf7[i] = (andf7[i] | 0x01);
1105
}
1106
andf7[0] = andf7[0] << 1;
1107
andf7[0] = andf7[0] & 0xfe;
1108
1109
xor_32(add1b, andf7, add1bf7);
1110
1111
xor_32(in, add1bf7, rotr);
1112
1113
temp[0] = rotr[0]; /* Rotate right 8 bits */
1114
rotr[0] = rotr[1];
1115
rotr[1] = rotr[2];
1116
rotr[2] = rotr[3];
1117
rotr[3] = temp[0];
1118
1119
xor_32(add1bf7, rotr, temp);
1120
xor_32(swap_halfs, rotl, tempb);
1121
xor_32(temp, tempb, out);
1122
}
1123
1124
1125
static void aes128k128d(u8 *key, u8 *data, u8 *ciphertext)
1126
{
1127
sint round;
1128
sint i;
1129
u8 intermediatea[16];
1130
u8 intermediateb[16];
1131
u8 round_key[16];
1132
for (i = 0; i < 16; i++)
1133
round_key[i] = key[i];
1134
1135
for (round = 0; round < 11; round++) {
1136
if (round == 0) {
1137
xor_128(round_key, data, ciphertext);
1138
next_key(round_key, round);
1139
} else if (round == 10) {
1140
byte_sub(ciphertext, intermediatea);
1141
shift_row(intermediatea, intermediateb);
1142
xor_128(intermediateb, round_key, ciphertext);
1143
} else { /* 1 - 9 */
1144
byte_sub(ciphertext, intermediatea);
1145
shift_row(intermediatea, intermediateb);
1146
mix_column(&intermediateb[0], &intermediatea[0]);
1147
mix_column(&intermediateb[4], &intermediatea[4]);
1148
mix_column(&intermediateb[8], &intermediatea[8]);
1149
mix_column(&intermediateb[12], &intermediatea[12]);
1150
xor_128(intermediatea, round_key, ciphertext);
1151
next_key(round_key, round);
1152
}
1153
}
1154
}
1155
1156
1157
/************************************************/
1158
/* construct_mic_iv() */
1159
/* Builds the MIC IV from header fields and PN */
1160
/* Baron think the function is construct CCM */
1161
/* nonce */
1162
/************************************************/
1163
static void construct_mic_iv(
1164
u8 *mic_iv,
1165
sint qc_exists,
1166
sint a4_exists,
1167
u8 *mpdu,
1168
uint payload_length,
1169
u8 *pn_vector,
1170
uint frtype/* add for CONFIG_IEEE80211W, none 11w also can use */
1171
)
1172
{
1173
sint i;
1174
mic_iv[0] = 0x59;
1175
if (qc_exists && a4_exists)
1176
mic_iv[1] = mpdu[30] & 0x0f; /* QoS_TC */
1177
if (qc_exists && !a4_exists)
1178
mic_iv[1] = mpdu[24] & 0x0f; /* mute bits 7-4 */
1179
if (!qc_exists)
1180
mic_iv[1] = 0x00;
1181
#if defined(CONFIG_IEEE80211W) || defined(CONFIG_RTW_MESH)
1182
/* 802.11w management frame should set management bit(4) */
1183
if (frtype == WIFI_MGT_TYPE)
1184
mic_iv[1] |= BIT(4);
1185
#endif
1186
for (i = 2; i < 8; i++)
1187
mic_iv[i] = mpdu[i + 8]; /* mic_iv[2:7] = A2[0:5] = mpdu[10:15] */
1188
#ifdef CONSISTENT_PN_ORDER
1189
for (i = 8; i < 14; i++)
1190
mic_iv[i] = pn_vector[i - 8]; /* mic_iv[8:13] = PN[0:5] */
1191
#else
1192
for (i = 8; i < 14; i++)
1193
mic_iv[i] = pn_vector[13 - i]; /* mic_iv[8:13] = PN[5:0] */
1194
#endif
1195
mic_iv[14] = (unsigned char)(payload_length / 256);
1196
mic_iv[15] = (unsigned char)(payload_length % 256);
1197
}
1198
1199
1200
/************************************************/
1201
/* construct_mic_header1() */
1202
/* Builds the first MIC header block from */
1203
/* header fields. */
1204
/* Build AAD SC,A1,A2 */
1205
/************************************************/
1206
static void construct_mic_header1(
1207
u8 *mic_header1,
1208
sint header_length,
1209
u8 *mpdu,
1210
uint frtype/* add for CONFIG_IEEE80211W, none 11w also can use */
1211
)
1212
{
1213
mic_header1[0] = (u8)((header_length - 2) / 256);
1214
mic_header1[1] = (u8)((header_length - 2) % 256);
1215
#if defined(CONFIG_IEEE80211W) || defined(CONFIG_RTW_MESH)
1216
/* 802.11w management frame don't AND subtype bits 4,5,6 of frame control field */
1217
if (frtype == WIFI_MGT_TYPE)
1218
mic_header1[2] = mpdu[0];
1219
else
1220
#endif
1221
mic_header1[2] = mpdu[0] & 0xcf; /* Mute CF poll & CF ack bits */
1222
1223
mic_header1[3] = mpdu[1] & 0xc7; /* Mute retry, more data and pwr mgt bits */
1224
mic_header1[4] = mpdu[4]; /* A1 */
1225
mic_header1[5] = mpdu[5];
1226
mic_header1[6] = mpdu[6];
1227
mic_header1[7] = mpdu[7];
1228
mic_header1[8] = mpdu[8];
1229
mic_header1[9] = mpdu[9];
1230
mic_header1[10] = mpdu[10]; /* A2 */
1231
mic_header1[11] = mpdu[11];
1232
mic_header1[12] = mpdu[12];
1233
mic_header1[13] = mpdu[13];
1234
mic_header1[14] = mpdu[14];
1235
mic_header1[15] = mpdu[15];
1236
}
1237
1238
1239
/************************************************/
1240
/* construct_mic_header2() */
1241
/* Builds the last MIC header block from */
1242
/* header fields. */
1243
/************************************************/
1244
static void construct_mic_header2(
1245
u8 *mic_header2,
1246
u8 *mpdu,
1247
sint a4_exists,
1248
sint qc_exists
1249
)
1250
{
1251
sint i;
1252
for (i = 0; i < 16; i++)
1253
mic_header2[i] = 0x00;
1254
1255
mic_header2[0] = mpdu[16]; /* A3 */
1256
mic_header2[1] = mpdu[17];
1257
mic_header2[2] = mpdu[18];
1258
mic_header2[3] = mpdu[19];
1259
mic_header2[4] = mpdu[20];
1260
mic_header2[5] = mpdu[21];
1261
1262
/* mic_header2[6] = mpdu[22] & 0xf0; SC */
1263
mic_header2[6] = 0x00;
1264
mic_header2[7] = 0x00; /* mpdu[23]; */
1265
1266
1267
if (!qc_exists && a4_exists) {
1268
for (i = 0; i < 6; i++)
1269
mic_header2[8 + i] = mpdu[24 + i]; /* A4 */
1270
1271
}
1272
1273
if (qc_exists && !a4_exists) {
1274
mic_header2[8] = mpdu[24] & 0x0f; /* mute bits 15 - 4 */
1275
mic_header2[9] = mpdu[25] & 0x00;
1276
}
1277
1278
if (qc_exists && a4_exists) {
1279
for (i = 0; i < 6; i++)
1280
mic_header2[8 + i] = mpdu[24 + i]; /* A4 */
1281
1282
mic_header2[14] = mpdu[30] & 0x0f;
1283
mic_header2[15] = mpdu[31] & 0x00;
1284
}
1285
1286
}
1287
1288
1289
/************************************************/
1290
/* construct_mic_header2() */
1291
/* Builds the last MIC header block from */
1292
/* header fields. */
1293
/* Baron think the function is construct CCM */
1294
/* nonce */
1295
/************************************************/
1296
static void construct_ctr_preload(
1297
u8 *ctr_preload,
1298
sint a4_exists,
1299
sint qc_exists,
1300
u8 *mpdu,
1301
u8 *pn_vector,
1302
sint c,
1303
uint frtype /* add for CONFIG_IEEE80211W, none 11w also can use */
1304
)
1305
{
1306
sint i = 0;
1307
for (i = 0; i < 16; i++)
1308
ctr_preload[i] = 0x00;
1309
i = 0;
1310
1311
ctr_preload[0] = 0x01; /* flag */
1312
if (qc_exists && a4_exists)
1313
ctr_preload[1] = mpdu[30] & 0x0f; /* QoC_Control */
1314
if (qc_exists && !a4_exists)
1315
ctr_preload[1] = mpdu[24] & 0x0f;
1316
#if defined(CONFIG_IEEE80211W) || defined(CONFIG_RTW_MESH)
1317
/* 802.11w management frame should set management bit(4) */
1318
if (frtype == WIFI_MGT_TYPE)
1319
ctr_preload[1] |= BIT(4);
1320
#endif
1321
for (i = 2; i < 8; i++)
1322
ctr_preload[i] = mpdu[i + 8]; /* ctr_preload[2:7] = A2[0:5] = mpdu[10:15] */
1323
#ifdef CONSISTENT_PN_ORDER
1324
for (i = 8; i < 14; i++)
1325
ctr_preload[i] = pn_vector[i - 8]; /* ctr_preload[8:13] = PN[0:5] */
1326
#else
1327
for (i = 8; i < 14; i++)
1328
ctr_preload[i] = pn_vector[13 - i]; /* ctr_preload[8:13] = PN[5:0] */
1329
#endif
1330
ctr_preload[14] = (unsigned char)(c / 256); /* Ctr */
1331
ctr_preload[15] = (unsigned char)(c % 256);
1332
}
1333
1334
1335
/************************************/
1336
/* bitwise_xor() */
1337
/* A 128 bit, bitwise exclusive or */
1338
/************************************/
1339
static void bitwise_xor(u8 *ina, u8 *inb, u8 *out)
1340
{
1341
sint i;
1342
for (i = 0; i < 16; i++)
1343
out[i] = ina[i] ^ inb[i];
1344
}
1345
1346
1347
static sint aes_cipher(u8 *key, uint hdrlen,
1348
u8 *pframe, uint plen)
1349
{
1350
/* static unsigned char message[MAX_MSG_SIZE]; */
1351
uint qc_exists, a4_exists, i, j, payload_remainder,
1352
num_blocks, payload_index;
1353
1354
u8 pn_vector[6];
1355
u8 mic_iv[16];
1356
u8 mic_header1[16];
1357
u8 mic_header2[16];
1358
u8 ctr_preload[16];
1359
1360
/* Intermediate Buffers */
1361
u8 chain_buffer[16];
1362
u8 aes_out[16];
1363
u8 padded_buffer[16];
1364
u8 mic[8];
1365
/* uint offset = 0; */
1366
uint frtype = GetFrameType(pframe);
1367
uint frsubtype = get_frame_sub_type(pframe);
1368
1369
frsubtype = frsubtype >> 4;
1370
1371
1372
_rtw_memset((void *)mic_iv, 0, 16);
1373
_rtw_memset((void *)mic_header1, 0, 16);
1374
_rtw_memset((void *)mic_header2, 0, 16);
1375
_rtw_memset((void *)ctr_preload, 0, 16);
1376
_rtw_memset((void *)chain_buffer, 0, 16);
1377
_rtw_memset((void *)aes_out, 0, 16);
1378
_rtw_memset((void *)padded_buffer, 0, 16);
1379
1380
if ((hdrlen == WLAN_HDR_A3_LEN) || (hdrlen == WLAN_HDR_A3_QOS_LEN))
1381
a4_exists = 0;
1382
else
1383
a4_exists = 1;
1384
1385
if (
1386
((frtype | frsubtype) == WIFI_DATA_CFACK) ||
1387
((frtype | frsubtype) == WIFI_DATA_CFPOLL) ||
1388
((frtype | frsubtype) == WIFI_DATA_CFACKPOLL)) {
1389
qc_exists = 1;
1390
if (hdrlen != WLAN_HDR_A3_QOS_LEN && hdrlen != WLAN_HDR_A4_QOS_LEN)
1391
hdrlen += 2;
1392
}
1393
/* add for CONFIG_IEEE80211W, none 11w also can use */
1394
else if ((frtype == WIFI_DATA) &&
1395
((frsubtype == 0x08) ||
1396
(frsubtype == 0x09) ||
1397
(frsubtype == 0x0a) ||
1398
(frsubtype == 0x0b))) {
1399
if (hdrlen != WLAN_HDR_A3_QOS_LEN && hdrlen != WLAN_HDR_A4_QOS_LEN)
1400
hdrlen += 2;
1401
qc_exists = 1;
1402
} else
1403
qc_exists = 0;
1404
1405
pn_vector[0] = pframe[hdrlen];
1406
pn_vector[1] = pframe[hdrlen + 1];
1407
pn_vector[2] = pframe[hdrlen + 4];
1408
pn_vector[3] = pframe[hdrlen + 5];
1409
pn_vector[4] = pframe[hdrlen + 6];
1410
pn_vector[5] = pframe[hdrlen + 7];
1411
1412
construct_mic_iv(
1413
mic_iv,
1414
qc_exists,
1415
a4_exists,
1416
pframe, /* message, */
1417
plen,
1418
pn_vector,
1419
frtype /* add for CONFIG_IEEE80211W, none 11w also can use */
1420
);
1421
1422
construct_mic_header1(
1423
mic_header1,
1424
hdrlen,
1425
pframe, /* message */
1426
frtype /* add for CONFIG_IEEE80211W, none 11w also can use */
1427
);
1428
construct_mic_header2(
1429
mic_header2,
1430
pframe, /* message, */
1431
a4_exists,
1432
qc_exists
1433
);
1434
1435
1436
payload_remainder = plen % 16;
1437
num_blocks = plen / 16;
1438
1439
/* Find start of payload */
1440
payload_index = (hdrlen + 8);
1441
1442
/* Calculate MIC */
1443
aes128k128d(key, mic_iv, aes_out);
1444
bitwise_xor(aes_out, mic_header1, chain_buffer);
1445
aes128k128d(key, chain_buffer, aes_out);
1446
bitwise_xor(aes_out, mic_header2, chain_buffer);
1447
aes128k128d(key, chain_buffer, aes_out);
1448
1449
for (i = 0; i < num_blocks; i++) {
1450
bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);/* bitwise_xor(aes_out, &message[payload_index], chain_buffer); */
1451
1452
payload_index += 16;
1453
aes128k128d(key, chain_buffer, aes_out);
1454
}
1455
1456
/* Add on the final payload block if it needs padding */
1457
if (payload_remainder > 0) {
1458
for (j = 0; j < 16; j++)
1459
padded_buffer[j] = 0x00;
1460
for (j = 0; j < payload_remainder; j++) {
1461
padded_buffer[j] = pframe[payload_index++];/* padded_buffer[j] = message[payload_index++]; */
1462
}
1463
bitwise_xor(aes_out, padded_buffer, chain_buffer);
1464
aes128k128d(key, chain_buffer, aes_out);
1465
1466
}
1467
1468
for (j = 0 ; j < 8; j++)
1469
mic[j] = aes_out[j];
1470
1471
/* Insert MIC into payload */
1472
for (j = 0; j < 8; j++)
1473
pframe[payload_index + j] = mic[j]; /* message[payload_index+j] = mic[j]; */
1474
1475
payload_index = hdrlen + 8;
1476
for (i = 0; i < num_blocks; i++) {
1477
construct_ctr_preload(
1478
ctr_preload,
1479
a4_exists,
1480
qc_exists,
1481
pframe, /* message, */
1482
pn_vector,
1483
i + 1,
1484
frtype); /* add for CONFIG_IEEE80211W, none 11w also can use */
1485
aes128k128d(key, ctr_preload, aes_out);
1486
bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);/* bitwise_xor(aes_out, &message[payload_index], chain_buffer); */
1487
for (j = 0; j < 16; j++)
1488
pframe[payload_index++] = chain_buffer[j];/* for (j=0; j<16;j++) message[payload_index++] = chain_buffer[j]; */
1489
}
1490
1491
if (payload_remainder > 0) { /* If there is a short final block, then pad it,*/
1492
/* encrypt it and copy the unpadded part back */
1493
construct_ctr_preload(
1494
ctr_preload,
1495
a4_exists,
1496
qc_exists,
1497
pframe, /* message, */
1498
pn_vector,
1499
num_blocks + 1,
1500
frtype); /* add for CONFIG_IEEE80211W, none 11w also can use */
1501
1502
for (j = 0; j < 16; j++)
1503
padded_buffer[j] = 0x00;
1504
for (j = 0; j < payload_remainder; j++) {
1505
padded_buffer[j] = pframe[payload_index + j]; /* padded_buffer[j] = message[payload_index+j]; */
1506
}
1507
aes128k128d(key, ctr_preload, aes_out);
1508
bitwise_xor(aes_out, padded_buffer, chain_buffer);
1509
for (j = 0; j < payload_remainder; j++)
1510
pframe[payload_index++] = chain_buffer[j];/* for (j=0; j<payload_remainder;j++) message[payload_index++] = chain_buffer[j]; */
1511
}
1512
1513
/* Encrypt the MIC */
1514
construct_ctr_preload(
1515
ctr_preload,
1516
a4_exists,
1517
qc_exists,
1518
pframe, /* message, */
1519
pn_vector,
1520
0,
1521
frtype); /* add for CONFIG_IEEE80211W, none 11w also can use */
1522
1523
for (j = 0; j < 16; j++)
1524
padded_buffer[j] = 0x00;
1525
for (j = 0; j < 8; j++) {
1526
padded_buffer[j] = pframe[j + hdrlen + 8 + plen]; /* padded_buffer[j] = message[j+hdrlen+8+plen]; */
1527
}
1528
1529
aes128k128d(key, ctr_preload, aes_out);
1530
bitwise_xor(aes_out, padded_buffer, chain_buffer);
1531
for (j = 0; j < 8; j++)
1532
pframe[payload_index++] = chain_buffer[j];/* for (j=0; j<8;j++) message[payload_index++] = chain_buffer[j]; */
1533
return _SUCCESS;
1534
}
1535
1536
1537
1538
1539
1540
u32 rtw_aes_encrypt(_adapter *padapter, u8 *pxmitframe)
1541
{
1542
/* exclude ICV */
1543
1544
1545
/*static*/
1546
/* unsigned char message[MAX_MSG_SIZE]; */
1547
1548
/* Intermediate Buffers */
1549
sint curfragnum, length;
1550
u32 prwskeylen;
1551
u8 *pframe, *prwskey; /* , *payload,*iv */
1552
u8 hw_hdr_offset = 0;
1553
/* struct sta_info *stainfo=NULL; */
1554
struct pkt_attrib *pattrib = &((struct xmit_frame *)pxmitframe)->attrib;
1555
struct security_priv *psecuritypriv = &padapter->securitypriv;
1556
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
1557
1558
/* uint offset = 0; */
1559
u32 res = _SUCCESS;
1560
1561
if (((struct xmit_frame *)pxmitframe)->buf_addr == NULL)
1562
return _FAIL;
1563
1564
#ifdef CONFIG_USB_TX_AGGREGATION
1565
hw_hdr_offset = TXDESC_SIZE +
1566
(((struct xmit_frame *)pxmitframe)->pkt_offset * PACKET_OFFSET_SZ);
1567
#else
1568
#ifdef CONFIG_TX_EARLY_MODE
1569
hw_hdr_offset = TXDESC_OFFSET + EARLY_MODE_INFO_SIZE;
1570
#else
1571
hw_hdr_offset = TXDESC_OFFSET;
1572
#endif
1573
#endif
1574
1575
pframe = ((struct xmit_frame *)pxmitframe)->buf_addr + hw_hdr_offset;
1576
1577
/* 4 start to encrypt each fragment */
1578
if ((pattrib->encrypt == _AES_)) {
1579
/*
1580
if(pattrib->psta)
1581
{
1582
stainfo = pattrib->psta;
1583
}
1584
else
1585
{
1586
RTW_INFO("%s, call rtw_get_stainfo()\n", __func__);
1587
stainfo=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0] );
1588
}
1589
*/
1590
/* if (stainfo!=NULL) */
1591
{
1592
/*
1593
if(!(stainfo->state &_FW_LINKED))
1594
{
1595
RTW_INFO("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, stainfo->state);
1596
return _FAIL;
1597
}
1598
*/
1599
1600
if (IS_MCAST(pattrib->ra))
1601
prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey;
1602
else {
1603
/* prwskey=&stainfo->dot118021x_UncstKey.skey[0]; */
1604
prwskey = pattrib->dot118021x_UncstKey.skey;
1605
}
1606
1607
#ifdef CONFIG_TDLS
1608
{
1609
/* Swencryption */
1610
struct sta_info *ptdls_sta;
1611
ptdls_sta = rtw_get_stainfo(&padapter->stapriv , &pattrib->dst[0]);
1612
if ((ptdls_sta != NULL) && (ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)) {
1613
RTW_INFO("[%s] for tdls link\n", __FUNCTION__);
1614
prwskey = &ptdls_sta->tpk.tk[0];
1615
}
1616
}
1617
#endif /* CONFIG_TDLS */
1618
1619
prwskeylen = 16;
1620
1621
for (curfragnum = 0; curfragnum < pattrib->nr_frags; curfragnum++) {
1622
1623
if ((curfragnum + 1) == pattrib->nr_frags) { /* 4 the last fragment */
1624
length = pattrib->last_txcmdsz - pattrib->hdrlen - pattrib->iv_len - pattrib->icv_len;
1625
1626
aes_cipher(prwskey, pattrib->hdrlen, pframe, length);
1627
} else {
1628
length = pxmitpriv->frag_len - pattrib->hdrlen - pattrib->iv_len - pattrib->icv_len ;
1629
1630
aes_cipher(prwskey, pattrib->hdrlen, pframe, length);
1631
pframe += pxmitpriv->frag_len;
1632
pframe = (u8 *)RND4((SIZE_PTR)(pframe));
1633
1634
}
1635
}
1636
1637
AES_SW_ENC_CNT_INC(psecuritypriv, pattrib->ra);
1638
}
1639
/*
1640
else{
1641
RTW_INFO("%s, psta==NUL\n", __func__);
1642
res=_FAIL;
1643
}
1644
*/
1645
}
1646
1647
1648
1649
return res;
1650
}
1651
1652
static sint aes_decipher(u8 *key, uint hdrlen,
1653
u8 *pframe, uint plen)
1654
{
1655
static u8 message[MAX_MSG_SIZE];
1656
uint qc_exists, a4_exists, i, j, payload_remainder,
1657
num_blocks, payload_index;
1658
sint res = _SUCCESS;
1659
u8 pn_vector[6];
1660
u8 mic_iv[16];
1661
u8 mic_header1[16];
1662
u8 mic_header2[16];
1663
u8 ctr_preload[16];
1664
1665
/* Intermediate Buffers */
1666
u8 chain_buffer[16];
1667
u8 aes_out[16];
1668
u8 padded_buffer[16];
1669
u8 mic[8];
1670
1671
1672
/* uint offset = 0; */
1673
uint frtype = GetFrameType(pframe);
1674
uint frsubtype = get_frame_sub_type(pframe);
1675
frsubtype = frsubtype >> 4;
1676
1677
1678
_rtw_memset((void *)mic_iv, 0, 16);
1679
_rtw_memset((void *)mic_header1, 0, 16);
1680
_rtw_memset((void *)mic_header2, 0, 16);
1681
_rtw_memset((void *)ctr_preload, 0, 16);
1682
_rtw_memset((void *)chain_buffer, 0, 16);
1683
_rtw_memset((void *)aes_out, 0, 16);
1684
_rtw_memset((void *)padded_buffer, 0, 16);
1685
1686
/* start to decrypt the payload */
1687
1688
num_blocks = (plen - 8) / 16; /* (plen including LLC, payload_length and mic ) */
1689
1690
payload_remainder = (plen - 8) % 16;
1691
1692
pn_vector[0] = pframe[hdrlen];
1693
pn_vector[1] = pframe[hdrlen + 1];
1694
pn_vector[2] = pframe[hdrlen + 4];
1695
pn_vector[3] = pframe[hdrlen + 5];
1696
pn_vector[4] = pframe[hdrlen + 6];
1697
pn_vector[5] = pframe[hdrlen + 7];
1698
1699
if ((hdrlen == WLAN_HDR_A3_LEN) || (hdrlen == WLAN_HDR_A3_QOS_LEN))
1700
a4_exists = 0;
1701
else
1702
a4_exists = 1;
1703
1704
if (
1705
((frtype | frsubtype) == WIFI_DATA_CFACK) ||
1706
((frtype | frsubtype) == WIFI_DATA_CFPOLL) ||
1707
((frtype | frsubtype) == WIFI_DATA_CFACKPOLL)) {
1708
qc_exists = 1;
1709
if (hdrlen != WLAN_HDR_A3_QOS_LEN && hdrlen != WLAN_HDR_A4_QOS_LEN)
1710
hdrlen += 2;
1711
} /* only for data packet . add for CONFIG_IEEE80211W, none 11w also can use */
1712
else if ((frtype == WIFI_DATA) &&
1713
((frsubtype == 0x08) ||
1714
(frsubtype == 0x09) ||
1715
(frsubtype == 0x0a) ||
1716
(frsubtype == 0x0b))) {
1717
if (hdrlen != WLAN_HDR_A3_QOS_LEN && hdrlen != WLAN_HDR_A4_QOS_LEN)
1718
hdrlen += 2;
1719
qc_exists = 1;
1720
} else
1721
qc_exists = 0;
1722
1723
1724
/* now, decrypt pframe with hdrlen offset and plen long */
1725
1726
payload_index = hdrlen + 8; /* 8 is for extiv */
1727
1728
for (i = 0; i < num_blocks; i++) {
1729
construct_ctr_preload(
1730
ctr_preload,
1731
a4_exists,
1732
qc_exists,
1733
pframe,
1734
pn_vector,
1735
i + 1,
1736
frtype /* add for CONFIG_IEEE80211W, none 11w also can use */
1737
);
1738
1739
aes128k128d(key, ctr_preload, aes_out);
1740
bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);
1741
1742
for (j = 0; j < 16; j++)
1743
pframe[payload_index++] = chain_buffer[j];
1744
}
1745
1746
if (payload_remainder > 0) { /* If there is a short final block, then pad it,*/
1747
/* encrypt it and copy the unpadded part back */
1748
construct_ctr_preload(
1749
ctr_preload,
1750
a4_exists,
1751
qc_exists,
1752
pframe,
1753
pn_vector,
1754
num_blocks + 1,
1755
frtype /* add for CONFIG_IEEE80211W, none 11w also can use */
1756
);
1757
1758
for (j = 0; j < 16; j++)
1759
padded_buffer[j] = 0x00;
1760
for (j = 0; j < payload_remainder; j++)
1761
padded_buffer[j] = pframe[payload_index + j];
1762
aes128k128d(key, ctr_preload, aes_out);
1763
bitwise_xor(aes_out, padded_buffer, chain_buffer);
1764
for (j = 0; j < payload_remainder; j++)
1765
pframe[payload_index++] = chain_buffer[j];
1766
}
1767
1768
/* start to calculate the mic */
1769
if ((hdrlen + plen + 8) <= MAX_MSG_SIZE)
1770
_rtw_memcpy((void *)message, pframe, (hdrlen + plen + 8)); /* 8 is for ext iv len */
1771
1772
1773
pn_vector[0] = pframe[hdrlen];
1774
pn_vector[1] = pframe[hdrlen + 1];
1775
pn_vector[2] = pframe[hdrlen + 4];
1776
pn_vector[3] = pframe[hdrlen + 5];
1777
pn_vector[4] = pframe[hdrlen + 6];
1778
pn_vector[5] = pframe[hdrlen + 7];
1779
1780
1781
1782
construct_mic_iv(
1783
mic_iv,
1784
qc_exists,
1785
a4_exists,
1786
message,
1787
plen - 8,
1788
pn_vector,
1789
frtype /* add for CONFIG_IEEE80211W, none 11w also can use */
1790
);
1791
1792
construct_mic_header1(
1793
mic_header1,
1794
hdrlen,
1795
message,
1796
frtype /* add for CONFIG_IEEE80211W, none 11w also can use */
1797
);
1798
construct_mic_header2(
1799
mic_header2,
1800
message,
1801
a4_exists,
1802
qc_exists
1803
);
1804
1805
1806
payload_remainder = (plen - 8) % 16;
1807
num_blocks = (plen - 8) / 16;
1808
1809
/* Find start of payload */
1810
payload_index = (hdrlen + 8);
1811
1812
/* Calculate MIC */
1813
aes128k128d(key, mic_iv, aes_out);
1814
bitwise_xor(aes_out, mic_header1, chain_buffer);
1815
aes128k128d(key, chain_buffer, aes_out);
1816
bitwise_xor(aes_out, mic_header2, chain_buffer);
1817
aes128k128d(key, chain_buffer, aes_out);
1818
1819
for (i = 0; i < num_blocks; i++) {
1820
bitwise_xor(aes_out, &message[payload_index], chain_buffer);
1821
1822
payload_index += 16;
1823
aes128k128d(key, chain_buffer, aes_out);
1824
}
1825
1826
/* Add on the final payload block if it needs padding */
1827
if (payload_remainder > 0) {
1828
for (j = 0; j < 16; j++)
1829
padded_buffer[j] = 0x00;
1830
for (j = 0; j < payload_remainder; j++)
1831
padded_buffer[j] = message[payload_index++];
1832
bitwise_xor(aes_out, padded_buffer, chain_buffer);
1833
aes128k128d(key, chain_buffer, aes_out);
1834
1835
}
1836
1837
for (j = 0 ; j < 8; j++)
1838
mic[j] = aes_out[j];
1839
1840
/* Insert MIC into payload */
1841
for (j = 0; j < 8; j++)
1842
message[payload_index + j] = mic[j];
1843
1844
payload_index = hdrlen + 8;
1845
for (i = 0; i < num_blocks; i++) {
1846
construct_ctr_preload(
1847
ctr_preload,
1848
a4_exists,
1849
qc_exists,
1850
message,
1851
pn_vector,
1852
i + 1,
1853
frtype); /* add for CONFIG_IEEE80211W, none 11w also can use */
1854
aes128k128d(key, ctr_preload, aes_out);
1855
bitwise_xor(aes_out, &message[payload_index], chain_buffer);
1856
for (j = 0; j < 16; j++)
1857
message[payload_index++] = chain_buffer[j];
1858
}
1859
1860
if (payload_remainder > 0) { /* If there is a short final block, then pad it,*/
1861
/* encrypt it and copy the unpadded part back */
1862
construct_ctr_preload(
1863
ctr_preload,
1864
a4_exists,
1865
qc_exists,
1866
message,
1867
pn_vector,
1868
num_blocks + 1,
1869
frtype); /* add for CONFIG_IEEE80211W, none 11w also can use */
1870
1871
for (j = 0; j < 16; j++)
1872
padded_buffer[j] = 0x00;
1873
for (j = 0; j < payload_remainder; j++)
1874
padded_buffer[j] = message[payload_index + j];
1875
aes128k128d(key, ctr_preload, aes_out);
1876
bitwise_xor(aes_out, padded_buffer, chain_buffer);
1877
for (j = 0; j < payload_remainder; j++)
1878
message[payload_index++] = chain_buffer[j];
1879
}
1880
1881
/* Encrypt the MIC */
1882
construct_ctr_preload(
1883
ctr_preload,
1884
a4_exists,
1885
qc_exists,
1886
message,
1887
pn_vector,
1888
0,
1889
frtype); /* add for CONFIG_IEEE80211W, none 11w also can use */
1890
1891
for (j = 0; j < 16; j++)
1892
padded_buffer[j] = 0x00;
1893
for (j = 0; j < 8; j++)
1894
padded_buffer[j] = message[j + hdrlen + 8 + plen - 8];
1895
1896
aes128k128d(key, ctr_preload, aes_out);
1897
bitwise_xor(aes_out, padded_buffer, chain_buffer);
1898
for (j = 0; j < 8; j++)
1899
message[payload_index++] = chain_buffer[j];
1900
1901
/* compare the mic */
1902
for (i = 0; i < 8; i++) {
1903
if (pframe[hdrlen + 8 + plen - 8 + i] != message[hdrlen + 8 + plen - 8 + i]) {
1904
RTW_INFO("aes_decipher:mic check error mic[%d]: pframe(%x) != message(%x)\n",
1905
i, pframe[hdrlen + 8 + plen - 8 + i], message[hdrlen + 8 + plen - 8 + i]);
1906
res = _FAIL;
1907
}
1908
}
1909
return res;
1910
}
1911
1912
u32 rtw_aes_decrypt(_adapter *padapter, u8 *precvframe)
1913
{
1914
/* exclude ICV */
1915
1916
1917
/*static*/
1918
/* unsigned char message[MAX_MSG_SIZE]; */
1919
1920
1921
/* Intermediate Buffers */
1922
1923
1924
sint length;
1925
u8 *pframe, *prwskey; /* , *payload,*iv */
1926
struct sta_info *stainfo;
1927
struct rx_pkt_attrib *prxattrib = &((union recv_frame *)precvframe)->u.hdr.attrib;
1928
struct security_priv *psecuritypriv = &padapter->securitypriv;
1929
/* struct recv_priv *precvpriv=&padapter->recvpriv; */
1930
u32 res = _SUCCESS;
1931
pframe = (unsigned char *)((union recv_frame *)precvframe)->u.hdr.rx_data;
1932
/* 4 start to encrypt each fragment */
1933
if ((prxattrib->encrypt == _AES_)) {
1934
1935
stainfo = rtw_get_stainfo(&padapter->stapriv , &prxattrib->ta[0]);
1936
if (stainfo != NULL) {
1937
1938
if (IS_MCAST(prxattrib->ra)) {
1939
static systime start = 0;
1940
static u32 no_gkey_bc_cnt = 0;
1941
static u32 no_gkey_mc_cnt = 0;
1942
1943
/* RTW_INFO("rx bc/mc packets, to perform sw rtw_aes_decrypt\n"); */
1944
/* prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey; */
1945
if ((!MLME_IS_MESH(padapter) && psecuritypriv->binstallGrpkey == _FALSE)
1946
#ifdef CONFIG_RTW_MESH
1947
|| !(stainfo->gtk_bmp | BIT(prxattrib->key_index))
1948
#endif
1949
) {
1950
res = _FAIL;
1951
1952
if (start == 0)
1953
start = rtw_get_current_time();
1954
1955
if (is_broadcast_mac_addr(prxattrib->ra))
1956
no_gkey_bc_cnt++;
1957
else
1958
no_gkey_mc_cnt++;
1959
1960
if (rtw_get_passing_time_ms(start) > 1000) {
1961
if (no_gkey_bc_cnt || no_gkey_mc_cnt) {
1962
RTW_PRINT(FUNC_ADPT_FMT" no_gkey_bc_cnt:%u, no_gkey_mc_cnt:%u\n",
1963
FUNC_ADPT_ARG(padapter), no_gkey_bc_cnt, no_gkey_mc_cnt);
1964
}
1965
start = rtw_get_current_time();
1966
no_gkey_bc_cnt = 0;
1967
no_gkey_mc_cnt = 0;
1968
}
1969
1970
goto exit;
1971
}
1972
1973
if (no_gkey_bc_cnt || no_gkey_mc_cnt) {
1974
RTW_PRINT(FUNC_ADPT_FMT" gkey installed. no_gkey_bc_cnt:%u, no_gkey_mc_cnt:%u\n",
1975
FUNC_ADPT_ARG(padapter), no_gkey_bc_cnt, no_gkey_mc_cnt);
1976
}
1977
start = 0;
1978
no_gkey_bc_cnt = 0;
1979
no_gkey_mc_cnt = 0;
1980
1981
#ifdef CONFIG_RTW_MESH
1982
if (MLME_IS_MESH(padapter)) {
1983
/* TODO: multiple GK? */
1984
prwskey = &stainfo->gtk.skey[0];
1985
} else
1986
#endif
1987
{
1988
prwskey = psecuritypriv->dot118021XGrpKey[prxattrib->key_index].skey;
1989
if (psecuritypriv->dot118021XGrpKeyid != prxattrib->key_index) {
1990
RTW_DBG("not match packet_index=%d, install_index=%d\n"
1991
, prxattrib->key_index, psecuritypriv->dot118021XGrpKeyid);
1992
res = _FAIL;
1993
goto exit;
1994
}
1995
}
1996
} else
1997
prwskey = &stainfo->dot118021x_UncstKey.skey[0];
1998
1999
length = ((union recv_frame *)precvframe)->u.hdr.len - prxattrib->hdrlen - prxattrib->iv_len;
2000
#if 0
2001
/* add for CONFIG_IEEE80211W, debug */
2002
if (0)
2003
printk("@@@@@@@@@@@@@@@@@@ length=%d, prxattrib->hdrlen=%d, prxattrib->pkt_len=%d\n"
2004
, length, prxattrib->hdrlen, prxattrib->pkt_len);
2005
if (0) {
2006
int no;
2007
/* test print PSK */
2008
printk("PSK key below:\n");
2009
for (no = 0; no < 16; no++)
2010
printk(" %02x ", prwskey[no]);
2011
printk("\n");
2012
}
2013
if (0) {
2014
int no;
2015
/* test print PSK */
2016
printk("frame:\n");
2017
for (no = 0; no < prxattrib->pkt_len; no++)
2018
printk(" %02x ", pframe[no]);
2019
printk("\n");
2020
}
2021
#endif
2022
2023
res = aes_decipher(prwskey, prxattrib->hdrlen, pframe, length);
2024
2025
AES_SW_DEC_CNT_INC(psecuritypriv, prxattrib->ra);
2026
} else {
2027
res = _FAIL;
2028
}
2029
2030
}
2031
exit:
2032
return res;
2033
}
2034
2035
#ifdef CONFIG_IEEE80211W
2036
u32 rtw_BIP_verify(_adapter *padapter, u8 *whdr_pos, sint flen
2037
, const u8 *key, u16 keyid, u64* ipn)
2038
{
2039
u8 *BIP_AAD, *mme;
2040
u32 res = _FAIL;
2041
uint len, ori_len;
2042
u16 pkt_keyid = 0;
2043
u64 pkt_ipn = 0;
2044
struct rtw_ieee80211_hdr *pwlanhdr;
2045
u8 mic[16];
2046
2047
mme = whdr_pos + flen - 18;
2048
if (*mme != _MME_IE_)
2049
return RTW_RX_HANDLED;
2050
2051
/* copy key index */
2052
_rtw_memcpy(&pkt_keyid, mme + 2, 2);
2053
pkt_keyid = le16_to_cpu(pkt_keyid);
2054
if (pkt_keyid != keyid) {
2055
RTW_INFO("BIP key index error!\n");
2056
return _FAIL;
2057
}
2058
2059
/* save packet number */
2060
_rtw_memcpy(&pkt_ipn, mme + 4, 6);
2061
pkt_ipn = le64_to_cpu(pkt_ipn);
2062
/* BIP packet number should bigger than previous BIP packet */
2063
if (pkt_ipn <= *ipn) { /* wrap around? */
2064
RTW_INFO("replay BIP packet\n");
2065
return _FAIL;
2066
}
2067
2068
ori_len = flen - WLAN_HDR_A3_LEN + BIP_AAD_SIZE;
2069
BIP_AAD = rtw_zmalloc(ori_len);
2070
if (BIP_AAD == NULL) {
2071
RTW_INFO("BIP AAD allocate fail\n");
2072
return _FAIL;
2073
}
2074
2075
/* mapping to wlan header */
2076
pwlanhdr = (struct rtw_ieee80211_hdr *)whdr_pos;
2077
2078
/* save the frame body + MME */
2079
_rtw_memcpy(BIP_AAD + BIP_AAD_SIZE, whdr_pos + WLAN_HDR_A3_LEN, flen - WLAN_HDR_A3_LEN);
2080
2081
/* point mme to the copy */
2082
mme = BIP_AAD + ori_len - 18;
2083
2084
/* clear the MIC field of MME to zero */
2085
_rtw_memset(mme + 10, 0, 8);
2086
2087
/* conscruct AAD, copy frame control field */
2088
_rtw_memcpy(BIP_AAD, &pwlanhdr->frame_ctl, 2);
2089
ClearRetry(BIP_AAD);
2090
ClearPwrMgt(BIP_AAD);
2091
ClearMData(BIP_AAD);
2092
/* conscruct AAD, copy address 1 to address 3 */
2093
_rtw_memcpy(BIP_AAD + 2, pwlanhdr->addr1, 18);
2094
2095
if (omac1_aes_128(key, BIP_AAD, ori_len, mic))
2096
goto BIP_exit;
2097
2098
#if 0
2099
/* management packet content */
2100
{
2101
int pp;
2102
RTW_INFO("pkt: ");
2103
for (pp = 0; pp < flen; pp++)
2104
printk(" %02x ", whdr_pos[pp]);
2105
RTW_INFO("\n");
2106
/* BIP AAD + management frame body + MME(MIC is zero) */
2107
RTW_INFO("AAD+PKT: ");
2108
for (pp = 0; pp < ori_len; pp++)
2109
RTW_INFO(" %02x ", BIP_AAD[pp]);
2110
RTW_INFO("\n");
2111
/* show the MIC result */
2112
RTW_INFO("mic: ");
2113
for (pp = 0; pp < 16; pp++)
2114
RTW_INFO(" %02x ", mic[pp]);
2115
RTW_INFO("\n");
2116
}
2117
#endif
2118
2119
/* MIC field should be last 8 bytes of packet (packet without FCS) */
2120
if (_rtw_memcmp(mic, whdr_pos + flen - 8, 8)) {
2121
*ipn = pkt_ipn;
2122
res = _SUCCESS;
2123
} else
2124
RTW_INFO("BIP MIC error!\n");
2125
2126
BIP_exit:
2127
2128
rtw_mfree(BIP_AAD, ori_len);
2129
return res;
2130
}
2131
#endif /* CONFIG_IEEE80211W */
2132
2133
#ifndef PLATFORM_FREEBSD
2134
#if defined(CONFIG_TDLS)
2135
/* compress 512-bits */
2136
static int sha256_compress(struct _sha256_state *md, unsigned char *buf)
2137
{
2138
u32 S[8], W[64], t0, t1;
2139
u32 t;
2140
int i;
2141
2142
/* copy state into S */
2143
for (i = 0; i < 8; i++)
2144
S[i] = md->state[i];
2145
2146
/* copy the state into 512-bits into W[0..15] */
2147
for (i = 0; i < 16; i++)
2148
W[i] = WPA_GET_BE32(buf + (4 * i));
2149
2150
/* fill W[16..63] */
2151
for (i = 16; i < 64; i++) {
2152
W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) +
2153
W[i - 16];
2154
}
2155
2156
/* Compress */
2157
#define RND(a, b, c, d, e, f, g, h, i) do {\
2158
t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i]; \
2159
t1 = Sigma0(a) + Maj(a, b, c); \
2160
d += t0; \
2161
h = t0 + t1; \
2162
} while (0)
2163
2164
for (i = 0; i < 64; ++i) {
2165
RND(S[0], S[1], S[2], S[3], S[4], S[5], S[6], S[7], i);
2166
t = S[7];
2167
S[7] = S[6];
2168
S[6] = S[5];
2169
S[5] = S[4];
2170
S[4] = S[3];
2171
S[3] = S[2];
2172
S[2] = S[1];
2173
S[1] = S[0];
2174
S[0] = t;
2175
}
2176
2177
/* feedback */
2178
for (i = 0; i < 8; i++)
2179
md->state[i] = md->state[i] + S[i];
2180
return 0;
2181
}
2182
2183
/* Initialize the hash state */
2184
static void _sha256_init(struct _sha256_state *md)
2185
{
2186
md->curlen = 0;
2187
md->length = 0;
2188
md->state[0] = 0x6A09E667UL;
2189
md->state[1] = 0xBB67AE85UL;
2190
md->state[2] = 0x3C6EF372UL;
2191
md->state[3] = 0xA54FF53AUL;
2192
md->state[4] = 0x510E527FUL;
2193
md->state[5] = 0x9B05688CUL;
2194
md->state[6] = 0x1F83D9ABUL;
2195
md->state[7] = 0x5BE0CD19UL;
2196
}
2197
2198
/**
2199
Process a block of memory though the hash
2200
@param md The hash state
2201
@param in The data to hash
2202
@param inlen The length of the data (octets)
2203
@return CRYPT_OK if successful
2204
*/
2205
static int sha256_process(struct _sha256_state *md, unsigned char *in,
2206
unsigned long inlen)
2207
{
2208
unsigned long n;
2209
#define block_size 64
2210
2211
if (md->curlen >= sizeof(md->buf))
2212
return -1;
2213
2214
while (inlen > 0) {
2215
if (md->curlen == 0 && inlen >= block_size) {
2216
if (sha256_compress(md, (unsigned char *) in) < 0)
2217
return -1;
2218
md->length += block_size * 8;
2219
in += block_size;
2220
inlen -= block_size;
2221
} else {
2222
n = MIN(inlen, (block_size - md->curlen));
2223
_rtw_memcpy(md->buf + md->curlen, in, n);
2224
md->curlen += n;
2225
in += n;
2226
inlen -= n;
2227
if (md->curlen == block_size) {
2228
if (sha256_compress(md, md->buf) < 0)
2229
return -1;
2230
md->length += 8 * block_size;
2231
md->curlen = 0;
2232
}
2233
}
2234
}
2235
2236
return 0;
2237
}
2238
2239
2240
/**
2241
Terminate the hash to get the digest
2242
@param md The hash state
2243
@param out [out] The destination of the hash (32 bytes)
2244
@return CRYPT_OK if successful
2245
*/
2246
static int sha256_done(struct _sha256_state *md, unsigned char *out)
2247
{
2248
int i;
2249
2250
if (md->curlen >= sizeof(md->buf))
2251
return -1;
2252
2253
/* increase the length of the message */
2254
md->length += md->curlen * 8;
2255
2256
/* append the '1' bit */
2257
md->buf[md->curlen++] = (unsigned char) 0x80;
2258
2259
/* if the length is currently above 56 bytes we append zeros
2260
* then compress. Then we can fall back to padding zeros and length
2261
* encoding like normal.
2262
*/
2263
if (md->curlen > 56) {
2264
while (md->curlen < 64)
2265
md->buf[md->curlen++] = (unsigned char) 0;
2266
sha256_compress(md, md->buf);
2267
md->curlen = 0;
2268
}
2269
2270
/* pad upto 56 bytes of zeroes */
2271
while (md->curlen < 56)
2272
md->buf[md->curlen++] = (unsigned char) 0;
2273
2274
/* store length */
2275
WPA_PUT_BE64(md->buf + 56, md->length);
2276
sha256_compress(md, md->buf);
2277
2278
/* copy output */
2279
for (i = 0; i < 8; i++)
2280
WPA_PUT_BE32(out + (4 * i), md->state[i]);
2281
2282
return 0;
2283
}
2284
2285
/**
2286
* sha256_vector - SHA256 hash for data vector
2287
* @num_elem: Number of elements in the data vector
2288
* @addr: Pointers to the data areas
2289
* @len: Lengths of the data blocks
2290
* @mac: Buffer for the hash
2291
* Returns: 0 on success, -1 of failure
2292
*/
2293
static int sha256_vector(size_t num_elem, u8 *addr[], size_t *len,
2294
u8 *mac)
2295
{
2296
struct _sha256_state ctx;
2297
size_t i;
2298
2299
_sha256_init(&ctx);
2300
for (i = 0; i < num_elem; i++)
2301
if (sha256_process(&ctx, addr[i], len[i]))
2302
return -1;
2303
if (sha256_done(&ctx, mac))
2304
return -1;
2305
return 0;
2306
}
2307
2308
static u8 os_strlen(const char *s)
2309
{
2310
const char *p = s;
2311
while (*p)
2312
p++;
2313
return p - s;
2314
}
2315
#endif
2316
2317
#if defined(CONFIG_TDLS) || defined(CONFIG_RTW_MESH_AEK)
2318
static int os_memcmp(const void *s1, const void *s2, u8 n)
2319
{
2320
const unsigned char *p1 = s1, *p2 = s2;
2321
2322
if (n == 0)
2323
return 0;
2324
2325
while (*p1 == *p2) {
2326
p1++;
2327
p2++;
2328
n--;
2329
if (n == 0)
2330
return 0;
2331
}
2332
2333
return *p1 - *p2;
2334
}
2335
#endif
2336
2337
/**
2338
* hmac_sha256_vector - HMAC-SHA256 over data vector (RFC 2104)
2339
* @key: Key for HMAC operations
2340
* @key_len: Length of the key in bytes
2341
* @num_elem: Number of elements in the data vector
2342
* @addr: Pointers to the data areas
2343
* @len: Lengths of the data blocks
2344
* @mac: Buffer for the hash (32 bytes)
2345
*/
2346
#if defined(CONFIG_TDLS)
2347
static void hmac_sha256_vector(u8 *key, size_t key_len, size_t num_elem,
2348
u8 *addr[], size_t *len, u8 *mac)
2349
{
2350
unsigned char k_pad[64]; /* padding - key XORd with ipad/opad */
2351
unsigned char tk[32];
2352
u8 *_addr[6];
2353
size_t _len[6], i;
2354
2355
if (num_elem > 5) {
2356
/*
2357
* Fixed limit on the number of fragments to avoid having to
2358
* allocate memory (which could fail).
2359
*/
2360
return;
2361
}
2362
2363
/* if key is longer than 64 bytes reset it to key = SHA256(key) */
2364
if (key_len > 64) {
2365
sha256_vector(1, &key, &key_len, tk);
2366
key = tk;
2367
key_len = 32;
2368
}
2369
2370
/* the HMAC_SHA256 transform looks like:
2371
*
2372
* SHA256(K XOR opad, SHA256(K XOR ipad, text))
2373
*
2374
* where K is an n byte key
2375
* ipad is the byte 0x36 repeated 64 times
2376
* opad is the byte 0x5c repeated 64 times
2377
* and text is the data being protected */
2378
2379
/* start out by storing key in ipad */
2380
_rtw_memset(k_pad, 0, sizeof(k_pad));
2381
_rtw_memcpy(k_pad, key, key_len);
2382
/* XOR key with ipad values */
2383
for (i = 0; i < 64; i++)
2384
k_pad[i] ^= 0x36;
2385
2386
/* perform inner SHA256 */
2387
_addr[0] = k_pad;
2388
_len[0] = 64;
2389
for (i = 0; i < num_elem; i++) {
2390
_addr[i + 1] = addr[i];
2391
_len[i + 1] = len[i];
2392
}
2393
sha256_vector(1 + num_elem, _addr, _len, mac);
2394
2395
_rtw_memset(k_pad, 0, sizeof(k_pad));
2396
_rtw_memcpy(k_pad, key, key_len);
2397
/* XOR key with opad values */
2398
for (i = 0; i < 64; i++)
2399
k_pad[i] ^= 0x5c;
2400
2401
/* perform outer SHA256 */
2402
_addr[0] = k_pad;
2403
_len[0] = 64;
2404
_addr[1] = mac;
2405
_len[1] = 32;
2406
sha256_vector(2, _addr, _len, mac);
2407
}
2408
#endif /* CONFIG_TDLS */
2409
#endif /* PLATFORM_FREEBSD */
2410
/**
2411
* sha256_prf - SHA256-based Pseudo-Random Function (IEEE 802.11r, 8.5.1.5.2)
2412
* @key: Key for PRF
2413
* @key_len: Length of the key in bytes
2414
* @label: A unique label for each purpose of the PRF
2415
* @data: Extra data to bind into the key
2416
* @data_len: Length of the data
2417
* @buf: Buffer for the generated pseudo-random key
2418
* @buf_len: Number of bytes of key to generate
2419
*
2420
* This function is used to derive new, cryptographically separate keys from a
2421
* given key.
2422
*/
2423
#ifndef PLATFORM_FREEBSD /* Baron */
2424
#if defined(CONFIG_TDLS)
2425
static void sha256_prf(u8 *key, size_t key_len, char *label,
2426
u8 *data, size_t data_len, u8 *buf, size_t buf_len)
2427
{
2428
u16 counter = 1;
2429
size_t pos, plen;
2430
u8 hash[SHA256_MAC_LEN];
2431
u8 *addr[4];
2432
size_t len[4];
2433
u8 counter_le[2], length_le[2];
2434
2435
addr[0] = counter_le;
2436
len[0] = 2;
2437
addr[1] = (u8 *) label;
2438
len[1] = os_strlen(label);
2439
addr[2] = data;
2440
len[2] = data_len;
2441
addr[3] = length_le;
2442
len[3] = sizeof(length_le);
2443
2444
WPA_PUT_LE16(length_le, buf_len * 8);
2445
pos = 0;
2446
while (pos < buf_len) {
2447
plen = buf_len - pos;
2448
WPA_PUT_LE16(counter_le, counter);
2449
if (plen >= SHA256_MAC_LEN) {
2450
hmac_sha256_vector(key, key_len, 4, addr, len,
2451
&buf[pos]);
2452
pos += SHA256_MAC_LEN;
2453
} else {
2454
hmac_sha256_vector(key, key_len, 4, addr, len, hash);
2455
_rtw_memcpy(&buf[pos], hash, plen);
2456
break;
2457
}
2458
counter++;
2459
}
2460
}
2461
#endif
2462
#endif /* PLATFORM_FREEBSD Baron */
2463
2464
/* AES tables*/
2465
const u32 Te0[256] = {
2466
0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,
2467
0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,
2468
0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,
2469
0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU,
2470
0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,
2471
0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU,
2472
0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU,
2473
0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU,
2474
0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU,
2475
0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,
2476
0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U,
2477
0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU,
2478
0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU,
2479
0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U,
2480
0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,
2481
0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU,
2482
0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU,
2483
0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU,
2484
0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU,
2485
0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,
2486
0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU,
2487
0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU,
2488
0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU,
2489
0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU,
2490
0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,
2491
0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U,
2492
0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U,
2493
0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U,
2494
0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU,
2495
0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,
2496
0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U,
2497
0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU,
2498
0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU,
2499
0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U,
2500
0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,
2501
0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U,
2502
0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU,
2503
0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U,
2504
0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU,
2505
0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,
2506
0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU,
2507
0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U,
2508
0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U,
2509
0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU,
2510
0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,
2511
0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U,
2512
0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U,
2513
0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U,
2514
0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U,
2515
0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,
2516
0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U,
2517
0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U,
2518
0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU,
2519
0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U,
2520
0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,
2521
0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U,
2522
0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U,
2523
0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U,
2524
0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U,
2525
0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,
2526
0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U,
2527
0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U,
2528
0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,
2529
0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,
2530
};
2531
const u32 Td0[256] = {
2532
0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U,
2533
0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U,
2534
0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U,
2535
0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU,
2536
0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,
2537
0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U,
2538
0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU,
2539
0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U,
2540
0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU,
2541
0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,
2542
0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U,
2543
0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U,
2544
0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U,
2545
0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU,
2546
0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,
2547
0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU,
2548
0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U,
2549
0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU,
2550
0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U,
2551
0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,
2552
0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U,
2553
0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU,
2554
0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U,
2555
0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU,
2556
0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,
2557
0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU,
2558
0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U,
2559
0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU,
2560
0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU,
2561
0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,
2562
0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU,
2563
0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U,
2564
0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU,
2565
0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U,
2566
0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,
2567
0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U,
2568
0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU,
2569
0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U,
2570
0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U,
2571
0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,
2572
0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U,
2573
0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U,
2574
0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U,
2575
0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U,
2576
0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,
2577
0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU,
2578
0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U,
2579
0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U,
2580
0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U,
2581
0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,
2582
0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U,
2583
0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU,
2584
0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU,
2585
0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU,
2586
0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,
2587
0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U,
2588
0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U,
2589
0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU,
2590
0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU,
2591
0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,
2592
0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU,
2593
0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U,
2594
0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U,
2595
0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U,
2596
};
2597
const u8 Td4s[256] = {
2598
0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U,
2599
0xbfU, 0x40U, 0xa3U, 0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU,
2600
0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU, 0xffU, 0x87U,
2601
0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU,
2602
0x54U, 0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU,
2603
0xeeU, 0x4cU, 0x95U, 0x0bU, 0x42U, 0xfaU, 0xc3U, 0x4eU,
2604
0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U, 0xb2U,
2605
0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U,
2606
0x72U, 0xf8U, 0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U,
2607
0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU, 0x65U, 0xb6U, 0x92U,
2608
0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU,
2609
0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U,
2610
0x90U, 0xd8U, 0xabU, 0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU,
2611
0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U, 0x45U, 0x06U,
2612
0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U,
2613
0xc1U, 0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU,
2614
0x3aU, 0x91U, 0x11U, 0x41U, 0x4fU, 0x67U, 0xdcU, 0xeaU,
2615
0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U, 0x73U,
2616
0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U,
2617
0xe2U, 0xf9U, 0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU,
2618
0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU, 0x29U, 0xc5U, 0x89U,
2619
0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU,
2620
0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U,
2621
0x9aU, 0xdbU, 0xc0U, 0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U,
2622
0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U, 0xc7U, 0x31U,
2623
0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU,
2624
0x60U, 0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU,
2625
0x2dU, 0xe5U, 0x7aU, 0x9fU, 0x93U, 0xc9U, 0x9cU, 0xefU,
2626
0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U, 0xb0U,
2627
0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U,
2628
0x17U, 0x2bU, 0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U,
2629
0xe1U, 0x69U, 0x14U, 0x63U, 0x55U, 0x21U, 0x0cU, 0x7dU,
2630
};
2631
const u8 rcons[] = {
2632
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36
2633
/* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
2634
};
2635
2636
/**
2637
* Expand the cipher key into the encryption key schedule.
2638
*
2639
* @return the number of rounds for the given cipher key size.
2640
*/
2641
#ifndef PLATFORM_FREEBSD /* Baron */
2642
static void rijndaelKeySetupEnc(u32 rk[/*44*/], const u8 cipherKey[])
2643
{
2644
int i;
2645
u32 temp;
2646
2647
rk[0] = GETU32(cipherKey);
2648
rk[1] = GETU32(cipherKey + 4);
2649
rk[2] = GETU32(cipherKey + 8);
2650
rk[3] = GETU32(cipherKey + 12);
2651
for (i = 0; i < 10; i++) {
2652
temp = rk[3];
2653
rk[4] = rk[0] ^
2654
TE421(temp) ^ TE432(temp) ^ TE443(temp) ^ TE414(temp) ^
2655
RCON(i);
2656
rk[5] = rk[1] ^ rk[4];
2657
rk[6] = rk[2] ^ rk[5];
2658
rk[7] = rk[3] ^ rk[6];
2659
rk += 4;
2660
}
2661
}
2662
2663
static void rijndaelEncrypt(u32 rk[/*44*/], u8 pt[16], u8 ct[16])
2664
{
2665
u32 s0, s1, s2, s3, t0, t1, t2, t3;
2666
int Nr = 10;
2667
#ifndef FULL_UNROLL
2668
int r;
2669
#endif /* ?FULL_UNROLL */
2670
2671
/*
2672
* map byte array block to cipher state
2673
* and add initial round key:
2674
*/
2675
s0 = GETU32(pt) ^ rk[0];
2676
s1 = GETU32(pt + 4) ^ rk[1];
2677
s2 = GETU32(pt + 8) ^ rk[2];
2678
s3 = GETU32(pt + 12) ^ rk[3];
2679
2680
#define ROUND(i, d, s) do {\
2681
d##0 = TE0(s##0) ^ TE1(s##1) ^ TE2(s##2) ^ TE3(s##3) ^ rk[4 * i]; \
2682
d##1 = TE0(s##1) ^ TE1(s##2) ^ TE2(s##3) ^ TE3(s##0) ^ rk[4 * i + 1]; \
2683
d##2 = TE0(s##2) ^ TE1(s##3) ^ TE2(s##0) ^ TE3(s##1) ^ rk[4 * i + 2]; \
2684
d##3 = TE0(s##3) ^ TE1(s##0) ^ TE2(s##1) ^ TE3(s##2) ^ rk[4 * i + 3]; \
2685
} while (0)
2686
2687
#ifdef FULL_UNROLL
2688
2689
ROUND(1, t, s);
2690
ROUND(2, s, t);
2691
ROUND(3, t, s);
2692
ROUND(4, s, t);
2693
ROUND(5, t, s);
2694
ROUND(6, s, t);
2695
ROUND(7, t, s);
2696
ROUND(8, s, t);
2697
ROUND(9, t, s);
2698
2699
rk += Nr << 2;
2700
2701
#else /* !FULL_UNROLL */
2702
2703
/* Nr - 1 full rounds: */
2704
r = Nr >> 1;
2705
for (;;) {
2706
ROUND(1, t, s);
2707
rk += 8;
2708
if (--r == 0)
2709
break;
2710
ROUND(0, s, t);
2711
}
2712
2713
#endif /* ?FULL_UNROLL */
2714
2715
#undef ROUND
2716
2717
/*
2718
* apply last round and
2719
* map cipher state to byte array block:
2720
*/
2721
s0 = TE41(t0) ^ TE42(t1) ^ TE43(t2) ^ TE44(t3) ^ rk[0];
2722
PUTU32(ct , s0);
2723
s1 = TE41(t1) ^ TE42(t2) ^ TE43(t3) ^ TE44(t0) ^ rk[1];
2724
PUTU32(ct + 4, s1);
2725
s2 = TE41(t2) ^ TE42(t3) ^ TE43(t0) ^ TE44(t1) ^ rk[2];
2726
PUTU32(ct + 8, s2);
2727
s3 = TE41(t3) ^ TE42(t0) ^ TE43(t1) ^ TE44(t2) ^ rk[3];
2728
PUTU32(ct + 12, s3);
2729
}
2730
2731
static void *aes_encrypt_init(const u8 *key, size_t len)
2732
{
2733
u32 *rk;
2734
if (len != 16)
2735
return NULL;
2736
rk = (u32 *)rtw_malloc(AES_PRIV_SIZE);
2737
if (rk == NULL)
2738
return NULL;
2739
rijndaelKeySetupEnc(rk, key);
2740
return rk;
2741
}
2742
2743
static void aes_128_encrypt(void *ctx, u8 *plain, u8 *crypt)
2744
{
2745
rijndaelEncrypt(ctx, plain, crypt);
2746
}
2747
2748
2749
static void gf_mulx(u8 *pad)
2750
{
2751
int i, carry;
2752
2753
carry = pad[0] & 0x80;
2754
for (i = 0; i < AES_BLOCK_SIZE - 1; i++)
2755
pad[i] = (pad[i] << 1) | (pad[i + 1] >> 7);
2756
pad[AES_BLOCK_SIZE - 1] <<= 1;
2757
if (carry)
2758
pad[AES_BLOCK_SIZE - 1] ^= 0x87;
2759
}
2760
2761
static void aes_encrypt_deinit(void *ctx)
2762
{
2763
_rtw_memset(ctx, 0, AES_PRIV_SIZE);
2764
rtw_mfree(ctx, AES_PRIV_SIZE);
2765
}
2766
2767
2768
/**
2769
* omac1_aes_128_vector - One-Key CBC MAC (OMAC1) hash with AES-128
2770
* @key: 128-bit key for the hash operation
2771
* @num_elem: Number of elements in the data vector
2772
* @addr: Pointers to the data areas
2773
* @len: Lengths of the data blocks
2774
* @mac: Buffer for MAC (128 bits, i.e., 16 bytes)
2775
* Returns: 0 on success, -1 on failure
2776
*
2777
* This is a mode for using block cipher (AES in this case) for authentication.
2778
* OMAC1 was standardized with the name CMAC by NIST in a Special Publication
2779
* (SP) 800-38B.
2780
*/
2781
static int omac1_aes_128_vector(const u8 *key, size_t num_elem,
2782
const u8 *addr[], const size_t *len, u8 *mac)
2783
{
2784
void *ctx;
2785
u8 cbc[AES_BLOCK_SIZE], pad[AES_BLOCK_SIZE];
2786
const u8 *pos, *end;
2787
size_t i, e, left, total_len;
2788
2789
ctx = aes_encrypt_init(key, 16);
2790
if (ctx == NULL)
2791
return -1;
2792
_rtw_memset(cbc, 0, AES_BLOCK_SIZE);
2793
2794
total_len = 0;
2795
for (e = 0; e < num_elem; e++)
2796
total_len += len[e];
2797
left = total_len;
2798
2799
e = 0;
2800
pos = addr[0];
2801
end = pos + len[0];
2802
2803
while (left >= AES_BLOCK_SIZE) {
2804
for (i = 0; i < AES_BLOCK_SIZE; i++) {
2805
cbc[i] ^= *pos++;
2806
if (pos >= end) {
2807
e++;
2808
pos = addr[e];
2809
end = pos + len[e];
2810
}
2811
}
2812
if (left > AES_BLOCK_SIZE)
2813
aes_128_encrypt(ctx, cbc, cbc);
2814
left -= AES_BLOCK_SIZE;
2815
}
2816
2817
_rtw_memset(pad, 0, AES_BLOCK_SIZE);
2818
aes_128_encrypt(ctx, pad, pad);
2819
gf_mulx(pad);
2820
2821
if (left || total_len == 0) {
2822
for (i = 0; i < left; i++) {
2823
cbc[i] ^= *pos++;
2824
if (pos >= end) {
2825
e++;
2826
pos = addr[e];
2827
end = pos + len[e];
2828
}
2829
}
2830
cbc[left] ^= 0x80;
2831
gf_mulx(pad);
2832
}
2833
2834
for (i = 0; i < AES_BLOCK_SIZE; i++)
2835
pad[i] ^= cbc[i];
2836
aes_128_encrypt(ctx, pad, mac);
2837
aes_encrypt_deinit(ctx);
2838
return 0;
2839
}
2840
2841
2842
/**
2843
* omac1_aes_128 - One-Key CBC MAC (OMAC1) hash with AES-128 (aka AES-CMAC)
2844
* @key: 128-bit key for the hash operation
2845
* @data: Data buffer for which a MAC is determined
2846
* @data_len: Length of data buffer in bytes
2847
* @mac: Buffer for MAC (128 bits, i.e., 16 bytes)
2848
* Returns: 0 on success, -1 on failure
2849
*
2850
* This is a mode for using block cipher (AES in this case) for authentication.
2851
* OMAC1 was standardized with the name CMAC by NIST in a Special Publication
2852
* (SP) 800-38B.
2853
*/ /* modify for CONFIG_IEEE80211W */
2854
int omac1_aes_128(const u8 *key, const u8 *data, size_t data_len, u8 *mac)
2855
{
2856
return omac1_aes_128_vector(key, 1, &data, &data_len, mac);
2857
}
2858
#endif /* PLATFORM_FREEBSD Baron */
2859
2860
#ifdef CONFIG_RTW_MESH_AEK
2861
/* for AES-SIV */
2862
#define os_memset _rtw_memset
2863
#define os_memcpy _rtw_memcpy
2864
#define os_malloc rtw_malloc
2865
#define bin_clear_free(bin, len) \
2866
do { \
2867
if (bin) { \
2868
os_memset(bin, 0, len); \
2869
rtw_mfree(bin, len); \
2870
} \
2871
} while (0)
2872
2873
static const u8 zero[AES_BLOCK_SIZE];
2874
2875
static void dbl(u8 *pad)
2876
{
2877
int i, carry;
2878
2879
carry = pad[0] & 0x80;
2880
for (i = 0; i < AES_BLOCK_SIZE - 1; i++)
2881
pad[i] = (pad[i] << 1) | (pad[i + 1] >> 7);
2882
pad[AES_BLOCK_SIZE - 1] <<= 1;
2883
if (carry)
2884
pad[AES_BLOCK_SIZE - 1] ^= 0x87;
2885
}
2886
2887
static void xor(u8 *a, const u8 *b)
2888
{
2889
int i;
2890
2891
for (i = 0; i < AES_BLOCK_SIZE; i++)
2892
*a++ ^= *b++;
2893
}
2894
2895
static void xorend(u8 *a, int alen, const u8 *b, int blen)
2896
{
2897
int i;
2898
2899
if (alen < blen)
2900
return;
2901
2902
for (i = 0; i < blen; i++)
2903
a[alen - blen + i] ^= b[i];
2904
}
2905
2906
static void pad_block(u8 *pad, const u8 *addr, size_t len)
2907
{
2908
os_memset(pad, 0, AES_BLOCK_SIZE);
2909
os_memcpy(pad, addr, len);
2910
2911
if (len < AES_BLOCK_SIZE)
2912
pad[len] = 0x80;
2913
}
2914
2915
static int aes_s2v(const u8 *key, size_t num_elem, const u8 *addr[],
2916
size_t *len, u8 *mac)
2917
{
2918
u8 tmp[AES_BLOCK_SIZE], tmp2[AES_BLOCK_SIZE];
2919
u8 *buf = NULL;
2920
int ret;
2921
size_t i;
2922
2923
if (!num_elem) {
2924
os_memcpy(tmp, zero, sizeof(zero));
2925
tmp[AES_BLOCK_SIZE - 1] = 1;
2926
return omac1_aes_128(key, tmp, sizeof(tmp), mac);
2927
}
2928
2929
ret = omac1_aes_128(key, zero, sizeof(zero), tmp);
2930
if (ret)
2931
return ret;
2932
2933
for (i = 0; i < num_elem - 1; i++) {
2934
ret = omac1_aes_128(key, addr[i], len[i], tmp2);
2935
if (ret)
2936
return ret;
2937
2938
dbl(tmp);
2939
xor(tmp, tmp2);
2940
}
2941
if (len[i] >= AES_BLOCK_SIZE) {
2942
buf = os_malloc(len[i]);
2943
if (!buf)
2944
return -ENOMEM;
2945
2946
os_memcpy(buf, addr[i], len[i]);
2947
xorend(buf, len[i], tmp, AES_BLOCK_SIZE);
2948
ret = omac1_aes_128(key, buf, len[i], mac);
2949
bin_clear_free(buf, len[i]);
2950
return ret;
2951
}
2952
2953
dbl(tmp);
2954
pad_block(tmp2, addr[i], len[i]);
2955
xor(tmp, tmp2);
2956
2957
return omac1_aes_128(key, tmp, sizeof(tmp), mac);
2958
}
2959
2960
/**
2961
* aes_128_ctr_encrypt - AES-128 CTR mode encryption
2962
* @key: Key for encryption (16 bytes)
2963
* @nonce: Nonce for counter mode (16 bytes)
2964
* @data: Data to encrypt in-place
2965
* @data_len: Length of data in bytes
2966
* Returns: 0 on success, -1 on failure
2967
*/
2968
int aes_128_ctr_encrypt(const u8 *key, const u8 *nonce,
2969
u8 *data, size_t data_len)
2970
{
2971
void *ctx;
2972
size_t j, len, left = data_len;
2973
int i;
2974
u8 *pos = data;
2975
u8 counter[AES_BLOCK_SIZE], buf[AES_BLOCK_SIZE];
2976
2977
ctx = aes_encrypt_init(key, 16);
2978
if (ctx == NULL)
2979
return -1;
2980
os_memcpy(counter, nonce, AES_BLOCK_SIZE);
2981
2982
while (left > 0) {
2983
#if 0
2984
aes_encrypt(ctx, counter, buf);
2985
#else
2986
aes_128_encrypt(ctx, counter, buf);
2987
#endif
2988
2989
len = (left < AES_BLOCK_SIZE) ? left : AES_BLOCK_SIZE;
2990
for (j = 0; j < len; j++)
2991
pos[j] ^= buf[j];
2992
pos += len;
2993
left -= len;
2994
2995
for (i = AES_BLOCK_SIZE - 1; i >= 0; i--) {
2996
counter[i]++;
2997
if (counter[i])
2998
break;
2999
}
3000
}
3001
aes_encrypt_deinit(ctx);
3002
return 0;
3003
}
3004
3005
int aes_siv_encrypt(const u8 *key, const u8 *pw,
3006
size_t pwlen, size_t num_elem,
3007
const u8 *addr[], const size_t *len, u8 *out)
3008
{
3009
const u8 *_addr[6];
3010
size_t _len[6];
3011
const u8 *k1 = key, *k2 = key + 16;
3012
u8 v[AES_BLOCK_SIZE];
3013
size_t i;
3014
u8 *iv, *crypt_pw;
3015
3016
if (num_elem > ARRAY_SIZE(_addr) - 1)
3017
return -1;
3018
3019
for (i = 0; i < num_elem; i++) {
3020
_addr[i] = addr[i];
3021
_len[i] = len[i];
3022
}
3023
_addr[num_elem] = pw;
3024
_len[num_elem] = pwlen;
3025
3026
if (aes_s2v(k1, num_elem + 1, _addr, _len, v))
3027
return -1;
3028
3029
iv = out;
3030
crypt_pw = out + AES_BLOCK_SIZE;
3031
3032
os_memcpy(iv, v, AES_BLOCK_SIZE);
3033
os_memcpy(crypt_pw, pw, pwlen);
3034
3035
/* zero out 63rd and 31st bits of ctr (from right) */
3036
v[8] &= 0x7f;
3037
v[12] &= 0x7f;
3038
return aes_128_ctr_encrypt(k2, v, crypt_pw, pwlen);
3039
}
3040
3041
int aes_siv_decrypt(const u8 *key, const u8 *iv_crypt, size_t iv_c_len,
3042
size_t num_elem, const u8 *addr[], const size_t *len,
3043
u8 *out)
3044
{
3045
const u8 *_addr[6];
3046
size_t _len[6];
3047
const u8 *k1 = key, *k2 = key + 16;
3048
size_t crypt_len;
3049
size_t i;
3050
int ret;
3051
u8 iv[AES_BLOCK_SIZE];
3052
u8 check[AES_BLOCK_SIZE];
3053
3054
if (iv_c_len < AES_BLOCK_SIZE || num_elem > ARRAY_SIZE(_addr) - 1)
3055
return -1;
3056
crypt_len = iv_c_len - AES_BLOCK_SIZE;
3057
3058
for (i = 0; i < num_elem; i++) {
3059
_addr[i] = addr[i];
3060
_len[i] = len[i];
3061
}
3062
_addr[num_elem] = out;
3063
_len[num_elem] = crypt_len;
3064
3065
os_memcpy(iv, iv_crypt, AES_BLOCK_SIZE);
3066
os_memcpy(out, iv_crypt + AES_BLOCK_SIZE, crypt_len);
3067
3068
iv[8] &= 0x7f;
3069
iv[12] &= 0x7f;
3070
3071
ret = aes_128_ctr_encrypt(k2, iv, out, crypt_len);
3072
if (ret)
3073
return ret;
3074
3075
ret = aes_s2v(k1, num_elem + 1, _addr, _len, check);
3076
if (ret)
3077
return ret;
3078
if (os_memcmp(check, iv_crypt, AES_BLOCK_SIZE) == 0)
3079
return 0;
3080
3081
return -1;
3082
}
3083
#endif /* CONFIG_RTW_MESH_AEK */
3084
3085
#ifdef CONFIG_TDLS
3086
void wpa_tdls_generate_tpk(_adapter *padapter, void *sta)
3087
{
3088
struct sta_info *psta = (struct sta_info *)sta;
3089
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
3090
u8 *SNonce = psta->SNonce;
3091
u8 *ANonce = psta->ANonce;
3092
3093
u8 key_input[SHA256_MAC_LEN];
3094
u8 *nonce[2];
3095
size_t len[2];
3096
u8 data[3 * ETH_ALEN];
3097
3098
/* IEEE Std 802.11z-2010 8.5.9.1:
3099
* TPK-Key-Input = SHA-256(min(SNonce, ANonce) || max(SNonce, ANonce))
3100
*/
3101
len[0] = 32;
3102
len[1] = 32;
3103
if (os_memcmp(SNonce, ANonce, 32) < 0) {
3104
nonce[0] = SNonce;
3105
nonce[1] = ANonce;
3106
} else {
3107
nonce[0] = ANonce;
3108
nonce[1] = SNonce;
3109
}
3110
3111
sha256_vector(2, nonce, len, key_input);
3112
3113
/*
3114
* TPK-Key-Data = KDF-N_KEY(TPK-Key-Input, "TDLS PMK",
3115
* min(MAC_I, MAC_R) || max(MAC_I, MAC_R) || BSSID || N_KEY)
3116
* TODO: is N_KEY really included in KDF Context and if so, in which
3117
* presentation format (little endian 16-bit?) is it used? It gets
3118
* added by the KDF anyway..
3119
*/
3120
3121
if (os_memcmp(adapter_mac_addr(padapter), psta->cmn.mac_addr, ETH_ALEN) < 0) {
3122
_rtw_memcpy(data, adapter_mac_addr(padapter), ETH_ALEN);
3123
_rtw_memcpy(data + ETH_ALEN, psta->cmn.mac_addr, ETH_ALEN);
3124
} else {
3125
_rtw_memcpy(data, psta->cmn.mac_addr, ETH_ALEN);
3126
_rtw_memcpy(data + ETH_ALEN, adapter_mac_addr(padapter), ETH_ALEN);
3127
}
3128
_rtw_memcpy(data + 2 * ETH_ALEN, get_bssid(pmlmepriv), ETH_ALEN);
3129
3130
sha256_prf(key_input, SHA256_MAC_LEN, "TDLS PMK", data, sizeof(data), (u8 *) &psta->tpk, sizeof(psta->tpk));
3131
3132
3133
}
3134
3135
/**
3136
* wpa_tdls_ftie_mic - Calculate TDLS FTIE MIC
3137
* @kck: TPK-KCK
3138
* @lnkid: Pointer to the beginning of Link Identifier IE
3139
* @rsnie: Pointer to the beginning of RSN IE used for handshake
3140
* @timeoutie: Pointer to the beginning of Timeout IE used for handshake
3141
* @ftie: Pointer to the beginning of FT IE
3142
* @mic: Pointer for writing MIC
3143
*
3144
* Calculate MIC for TDLS frame.
3145
*/
3146
int wpa_tdls_ftie_mic(u8 *kck, u8 trans_seq,
3147
u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie,
3148
u8 *mic)
3149
{
3150
u8 *buf, *pos;
3151
struct wpa_tdls_ftie *_ftie;
3152
struct wpa_tdls_lnkid *_lnkid;
3153
int ret;
3154
int len = 2 * ETH_ALEN + 1 + 2 + lnkid[1] + 2 + rsnie[1] +
3155
2 + timeoutie[1] + 2 + ftie[1];
3156
buf = rtw_zmalloc(len);
3157
if (!buf) {
3158
RTW_INFO("TDLS: No memory for MIC calculation\n");
3159
return -1;
3160
}
3161
3162
pos = buf;
3163
_lnkid = (struct wpa_tdls_lnkid *) lnkid;
3164
/* 1) TDLS initiator STA MAC address */
3165
_rtw_memcpy(pos, _lnkid->init_sta, ETH_ALEN);
3166
pos += ETH_ALEN;
3167
/* 2) TDLS responder STA MAC address */
3168
_rtw_memcpy(pos, _lnkid->resp_sta, ETH_ALEN);
3169
pos += ETH_ALEN;
3170
/* 3) Transaction Sequence number */
3171
*pos++ = trans_seq;
3172
/* 4) Link Identifier IE */
3173
_rtw_memcpy(pos, lnkid, 2 + lnkid[1]);
3174
pos += 2 + lnkid[1];
3175
/* 5) RSN IE */
3176
_rtw_memcpy(pos, rsnie, 2 + rsnie[1]);
3177
pos += 2 + rsnie[1];
3178
/* 6) Timeout Interval IE */
3179
_rtw_memcpy(pos, timeoutie, 2 + timeoutie[1]);
3180
pos += 2 + timeoutie[1];
3181
/* 7) FTIE, with the MIC field of the FTIE set to 0 */
3182
_rtw_memcpy(pos, ftie, 2 + ftie[1]);
3183
_ftie = (struct wpa_tdls_ftie *) pos;
3184
_rtw_memset(_ftie->mic, 0, TDLS_MIC_LEN);
3185
pos += 2 + ftie[1];
3186
3187
ret = omac1_aes_128(kck, buf, pos - buf, mic);
3188
rtw_mfree(buf, len);
3189
return ret;
3190
3191
}
3192
3193
/**
3194
* wpa_tdls_teardown_ftie_mic - Calculate TDLS TEARDOWN FTIE MIC
3195
* @kck: TPK-KCK
3196
* @lnkid: Pointer to the beginning of Link Identifier IE
3197
* @reason: Reason code of TDLS Teardown
3198
* @dialog_token: Dialog token that was used in the MIC calculation for TPK Handshake Message 3
3199
* @trans_seq: Transaction Sequence number (1 octet) which shall be set to the value 4
3200
* @ftie: Pointer to the beginning of FT IE
3201
* @mic: Pointer for writing MIC
3202
*
3203
* Calculate MIC for TDLS TEARDOWN frame according to Section 10.22.5 in IEEE 802.11 - 2012.
3204
*/
3205
int wpa_tdls_teardown_ftie_mic(u8 *kck, u8 *lnkid, u16 reason,
3206
u8 dialog_token, u8 trans_seq, u8 *ftie, u8 *mic)
3207
{
3208
u8 *buf, *pos;
3209
struct wpa_tdls_ftie *_ftie;
3210
int ret;
3211
int len = 2 + lnkid[1] + 2 + 1 + 1 + 2 + ftie[1];
3212
3213
buf = rtw_zmalloc(len);
3214
if (!buf) {
3215
RTW_INFO("TDLS: No memory for MIC calculation\n");
3216
return -1;
3217
}
3218
3219
pos = buf;
3220
/* 1) Link Identifier IE */
3221
_rtw_memcpy(pos, lnkid, 2 + lnkid[1]);
3222
pos += 2 + lnkid[1];
3223
/* 2) Reason Code */
3224
_rtw_memcpy(pos, (u8 *)&reason, 2);
3225
pos += 2;
3226
/* 3) Dialog Token */
3227
*pos++ = dialog_token;
3228
/* 4) Transaction Sequence number */
3229
*pos++ = trans_seq;
3230
/* 5) FTIE, with the MIC field of the FTIE set to 0 */
3231
_rtw_memcpy(pos, ftie, 2 + ftie[1]);
3232
_ftie = (struct wpa_tdls_ftie *) pos;
3233
_rtw_memset(_ftie->mic, 0, TDLS_MIC_LEN);
3234
pos += 2 + ftie[1];
3235
3236
ret = omac1_aes_128(kck, buf, pos - buf, mic);
3237
rtw_mfree(buf, len);
3238
return ret;
3239
3240
}
3241
3242
int tdls_verify_mic(u8 *kck, u8 trans_seq,
3243
u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie)
3244
{
3245
u8 *buf, *pos;
3246
int len;
3247
u8 mic[16];
3248
int ret;
3249
u8 *rx_ftie, *tmp_ftie;
3250
3251
if (lnkid == NULL || rsnie == NULL ||
3252
timeoutie == NULL || ftie == NULL)
3253
return _FAIL;
3254
3255
len = 2 * ETH_ALEN + 1 + 2 + 18 + 2 + *(rsnie + 1) + 2 + *(timeoutie + 1) + 2 + *(ftie + 1);
3256
3257
buf = rtw_zmalloc(len);
3258
if (buf == NULL)
3259
return _FAIL;
3260
3261
pos = buf;
3262
/* 1) TDLS initiator STA MAC address */
3263
_rtw_memcpy(pos, lnkid + ETH_ALEN + 2, ETH_ALEN);
3264
pos += ETH_ALEN;
3265
/* 2) TDLS responder STA MAC address */
3266
_rtw_memcpy(pos, lnkid + 2 * ETH_ALEN + 2, ETH_ALEN);
3267
pos += ETH_ALEN;
3268
/* 3) Transaction Sequence number */
3269
*pos++ = trans_seq;
3270
/* 4) Link Identifier IE */
3271
_rtw_memcpy(pos, lnkid, 2 + 18);
3272
pos += 2 + 18;
3273
/* 5) RSN IE */
3274
_rtw_memcpy(pos, rsnie, 2 + *(rsnie + 1));
3275
pos += 2 + *(rsnie + 1);
3276
/* 6) Timeout Interval IE */
3277
_rtw_memcpy(pos, timeoutie, 2 + *(timeoutie + 1));
3278
pos += 2 + *(timeoutie + 1);
3279
/* 7) FTIE, with the MIC field of the FTIE set to 0 */
3280
_rtw_memcpy(pos, ftie, 2 + *(ftie + 1));
3281
pos += 2;
3282
tmp_ftie = (u8 *)(pos + 2);
3283
_rtw_memset(tmp_ftie, 0, 16);
3284
pos += *(ftie + 1);
3285
3286
ret = omac1_aes_128(kck, buf, pos - buf, mic);
3287
rtw_mfree(buf, len);
3288
if (ret)
3289
return _FAIL;
3290
rx_ftie = ftie + 4;
3291
3292
if (os_memcmp(mic, rx_ftie, 16) == 0) {
3293
/* Valid MIC */
3294
return _SUCCESS;
3295
}
3296
3297
/* Invalid MIC */
3298
RTW_INFO("[%s] Invalid MIC\n", __FUNCTION__);
3299
return _FAIL;
3300
3301
}
3302
#endif /* CONFIG_TDLS */
3303
3304
/* Restore HW wep key setting according to key_mask */
3305
void rtw_sec_restore_wep_key(_adapter *adapter)
3306
{
3307
struct security_priv *securitypriv = &(adapter->securitypriv);
3308
sint keyid;
3309
3310
if ((_WEP40_ == securitypriv->dot11PrivacyAlgrthm) || (_WEP104_ == securitypriv->dot11PrivacyAlgrthm)) {
3311
for (keyid = 0; keyid < 4; keyid++) {
3312
if (securitypriv->key_mask & BIT(keyid)) {
3313
if (keyid == securitypriv->dot11PrivacyKeyIndex)
3314
rtw_set_key(adapter, securitypriv, keyid, 1, _FALSE);
3315
else
3316
rtw_set_key(adapter, securitypriv, keyid, 0, _FALSE);
3317
}
3318
}
3319
}
3320
}
3321
3322
u8 rtw_handle_tkip_countermeasure(_adapter *adapter, const char *caller)
3323
{
3324
struct security_priv *securitypriv = &(adapter->securitypriv);
3325
u8 status = _SUCCESS;
3326
3327
if (securitypriv->btkip_countermeasure == _TRUE) {
3328
u32 passing_ms = rtw_get_passing_time_ms(securitypriv->btkip_countermeasure_time);
3329
if (passing_ms > 60 * 1000) {
3330
RTW_PRINT("%s("ADPT_FMT") countermeasure time:%ds > 60s\n",
3331
caller, ADPT_ARG(adapter), passing_ms / 1000);
3332
securitypriv->btkip_countermeasure = _FALSE;
3333
securitypriv->btkip_countermeasure_time = 0;
3334
} else {
3335
RTW_PRINT("%s("ADPT_FMT") countermeasure time:%ds < 60s\n",
3336
caller, ADPT_ARG(adapter), passing_ms / 1000);
3337
status = _FAIL;
3338
}
3339
}
3340
3341
return status;
3342
}
3343
3344
#ifdef CONFIG_WOWLAN
3345
u16 rtw_cal_crc16(u8 data, u16 crc)
3346
{
3347
u8 shift_in, data_bit;
3348
u8 crc_bit4, crc_bit11, crc_bit15;
3349
u16 crc_result;
3350
int index;
3351
3352
for (index = 0; index < 8; index++) {
3353
crc_bit15 = ((crc & BIT15) ? 1 : 0);
3354
data_bit = (data & (BIT0 << index) ? 1 : 0);
3355
shift_in = crc_bit15 ^ data_bit;
3356
/*printf("crc_bit15=%d, DataBit=%d, shift_in=%d\n",
3357
* crc_bit15, data_bit, shift_in);*/
3358
3359
crc_result = crc << 1;
3360
3361
if (shift_in == 0)
3362
crc_result &= (~BIT0);
3363
else
3364
crc_result |= BIT0;
3365
/*printf("CRC =%x\n",CRC_Result);*/
3366
3367
crc_bit11 = ((crc & BIT11) ? 1 : 0) ^ shift_in;
3368
3369
if (crc_bit11 == 0)
3370
crc_result &= (~BIT12);
3371
else
3372
crc_result |= BIT12;
3373
3374
/*printf("bit12 CRC =%x\n",CRC_Result);*/
3375
3376
crc_bit4 = ((crc & BIT4) ? 1 : 0) ^ shift_in;
3377
3378
if (crc_bit4 == 0)
3379
crc_result &= (~BIT5);
3380
else
3381
crc_result |= BIT5;
3382
3383
/* printf("bit5 CRC =%x\n",CRC_Result); */
3384
/* repeat using the last result*/
3385
crc = crc_result;
3386
}
3387
return crc;
3388
}
3389
3390
/*
3391
* function name :rtw_calc_crc
3392
*
3393
* input: char* pattern , pattern size
3394
*
3395
*/
3396
u16 rtw_calc_crc(u8 *pdata, int length)
3397
{
3398
u16 crc = 0xffff;
3399
int i;
3400
3401
for (i = 0; i < length; i++)
3402
crc = rtw_cal_crc16(pdata[i], crc);
3403
/* get 1' complement */
3404
crc = ~crc;
3405
3406
return crc;
3407
}
3408
#endif /*CONFIG_WOWLAN*/
3409
3410