rtw_security.c 89 KB

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