1 /* 2 * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for 6 * any purpose with or without fee is hereby granted, provided that the 7 * above copyright notice and this permission notice appear in all 8 * copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17 * PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20 /** 21 * DOC: Private definitions for handling crypto params 22 */ 23 #ifndef _WLAN_CRYPTO_DEF_I_H_ 24 #define _WLAN_CRYPTO_DEF_I_H_ 25 26 #include <wlan_cmn_ieee80211.h> 27 #include "wlan_objmgr_pdev_obj.h" 28 #include "wlan_crypto_global_def.h" 29 #ifdef WLAN_CRYPTO_AES 30 #include "wlan_crypto_aes_i.h" 31 #endif 32 33 /* Number of bits per byte */ 34 #define CRYPTO_NBBY 8 35 /* Default link id for legacy connection */ 36 #define CRYPTO_MAX_LINK_IDX 0xFF 37 38 /* Macros for handling unaligned memory accesses */ 39 40 static inline uint16_t wlan_crypto_get_be16(const uint8_t *a) 41 { 42 return (a[0] << 8) | a[1]; 43 } 44 45 static inline void wlan_crypto_put_be16(uint8_t *a, uint16_t val) 46 { 47 a[0] = val >> 8; 48 a[1] = val & 0xff; 49 } 50 51 static inline uint16_t wlan_crypto_get_le16(const uint8_t *a) 52 { 53 return (a[1] << 8) | a[0]; 54 } 55 56 static inline void wlan_crypto_put_le16(uint8_t *a, uint16_t val) 57 { 58 a[1] = val >> 8; 59 a[0] = val & 0xff; 60 } 61 62 static inline uint32_t wlan_crypto_get_be32(const uint8_t *a) 63 { 64 return ((u32) a[0] << 24) | (a[1] << 16) | (a[2] << 8) | a[3]; 65 } 66 67 static inline void wlan_crypto_put_be32(uint8_t *a, uint32_t val) 68 { 69 a[0] = (val >> 24) & 0xff; 70 a[1] = (val >> 16) & 0xff; 71 a[2] = (val >> 8) & 0xff; 72 a[3] = val & 0xff; 73 } 74 75 static inline uint32_t wlan_crypto_get_le32(const uint8_t *a) 76 { 77 return ((u32) a[3] << 24) | (a[2] << 16) | (a[1] << 8) | a[0]; 78 } 79 80 static inline void wlan_crypto_put_le32(uint8_t *a, uint32_t val) 81 { 82 a[3] = (val >> 24) & 0xff; 83 a[2] = (val >> 16) & 0xff; 84 a[1] = (val >> 8) & 0xff; 85 a[0] = val & 0xff; 86 } 87 88 static inline void wlan_crypto_put_be64(u8 *a, u64 val) 89 { 90 a[0] = val >> 56; 91 a[1] = val >> 48; 92 a[2] = val >> 40; 93 a[3] = val >> 32; 94 a[4] = val >> 24; 95 a[5] = val >> 16; 96 a[6] = val >> 8; 97 a[7] = val & 0xff; 98 } 99 100 #define WLAN_CRYPTO_TX_OPS_ALLOCKEY(tx_ops) \ 101 ((tx_ops)->crypto_tx_ops.allockey) 102 #define WLAN_CRYPTO_TX_OPS_SETKEY(tx_ops) \ 103 ((tx_ops)->crypto_tx_ops.setkey) 104 #define WLAN_CRYPTO_TX_OPS_DELKEY(tx_ops) \ 105 ((tx_ops)->crypto_tx_ops.delkey) 106 #define WLAN_CRYPTO_TX_OPS_DEFAULTKEY(tx_ops) \ 107 ((tx_ops)->crypto_tx_ops.defaultkey) 108 #define WLAN_CRYPTO_TX_OPS_SET_KEY(tx_ops) \ 109 ((tx_ops)->crypto_tx_ops.set_key) 110 #define WLAN_CRYPTO_TX_OPS_SET_VDEV_PARAM(tx_ops) \ 111 ((tx_ops)->crypto_tx_ops.set_vdev_param) 112 #define WLAN_CRYPTO_TX_OPS_GETPN(tx_ops) \ 113 ((tx_ops)->crypto_tx_ops.getpn) 114 #define WLAN_CRYPTO_TX_OPS_SET_LTF_KEYSEED(tx_ops) \ 115 ((tx_ops)->crypto_tx_ops.set_ltf_keyseed) 116 #define WLAN_CRYPTO_TX_OPS_REGISTER_EVENTS(tx_ops) \ 117 ((tx_ops)->crypto_tx_ops.register_events) 118 #define WLAN_CRYPTO_TX_OPS_DEREGISTER_EVENTS(tx_ops) \ 119 ((tx_ops)->crypto_tx_ops.deregister_events) 120 121 /* unaligned little endian access */ 122 #ifndef LE_READ_2 123 #define LE_READ_2(p) \ 124 ((uint16_t) \ 125 ((((const uint8_t *)(p))[0]) | \ 126 (((const uint8_t *)(p))[1] << 8))) 127 #endif 128 129 #ifndef LE_READ_4 130 #define LE_READ_4(p) \ 131 ((uint32_t) \ 132 ((((const uint8_t *)(p))[0]) | \ 133 (((const uint8_t *)(p))[1] << 8) | \ 134 (((const uint8_t *)(p))[2] << 16) | \ 135 (((const uint8_t *)(p))[3] << 24))) 136 #endif 137 138 #ifndef BE_READ_4 139 #define BE_READ_4(p) \ 140 ((uint32_t) \ 141 ((((const uint8_t *)(p))[0] << 24) | \ 142 (((const uint8_t *)(p))[1] << 16) | \ 143 (((const uint8_t *)(p))[2] << 8) | \ 144 (((const uint8_t *)(p))[3]))) 145 #endif 146 147 #ifndef READ_6 148 #define READ_6(b0, b1, b2, b3, b4, b5) ({ \ 149 uint32_t iv32 = (b0 << 0) | (b1 << 8) | (b2 << 16) | (b3 << 24);\ 150 uint16_t iv16 = (b4 << 0) | (b5 << 8);\ 151 (((uint64_t)iv16) << 32) | iv32;\ 152 }) 153 #endif 154 155 #define OUI_SIZE (4) 156 #define WLAN_CRYPTO_ADDSHORT(frm, v) \ 157 do {frm[0] = (v) & 0xff; frm[1] = (v) >> 8; frm += 2; } while (0) 158 159 #define WLAN_CRYPTO_ADDSELECTOR(frm, sel) \ 160 do { \ 161 uint32_t value = sel;\ 162 qdf_mem_copy(frm, (uint8_t *)&value, OUI_SIZE); \ 163 frm += OUI_SIZE; } while (0) 164 165 #define WLAN_CRYPTO_SELECTOR(a, b, c, d) \ 166 ((((uint32_t) (a)) << 24) | \ 167 (((uint32_t) (b)) << 16) | \ 168 (((uint32_t) (c)) << 8) | \ 169 (uint32_t) (d)) 170 171 #define WPA_TYPE_OUI WLAN_WPA_SEL(WLAN_WPA_OUI_TYPE) 172 173 #define WLAN_CRYPTO_WAPI_IE_LEN 20 174 #define WLAN_CRYPTO_WAPI_SMS4_CIPHER 0x01 175 176 #define WPA_AUTH_KEY_MGMT_NONE WLAN_WPA_SEL(WLAN_ASE_NONE) 177 #define WPA_AUTH_KEY_MGMT_UNSPEC_802_1X WLAN_WPA_SEL(WLAN_ASE_8021X_UNSPEC) 178 #define WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X \ 179 WLAN_WPA_SEL(WLAN_ASE_8021X_PSK) 180 #define WPA_AUTH_KEY_MGMT_CCKM WLAN_WPA_CCKM_AKM 181 182 #define WPA_CIPHER_SUITE_NONE WLAN_WPA_SEL(WLAN_CSE_NONE) 183 #define WPA_CIPHER_SUITE_WEP40 WLAN_WPA_SEL(WLAN_CSE_WEP40) 184 #define WPA_CIPHER_SUITE_WEP104 WLAN_WPA_SEL(WLAN_CSE_WEP104) 185 #define WPA_CIPHER_SUITE_TKIP WLAN_WPA_SEL(WLAN_CSE_TKIP) 186 #define WPA_CIPHER_SUITE_CCMP WLAN_WPA_SEL(WLAN_CSE_CCMP) 187 188 #define RSN_AUTH_KEY_MGMT_NONE WLAN_RSN_SEL(0) 189 #define RSN_AUTH_KEY_MGMT_UNSPEC_802_1X WLAN_RSN_SEL(1) 190 #define RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X\ 191 WLAN_RSN_SEL(2) 192 #define RSN_AUTH_KEY_MGMT_FT_802_1X WLAN_RSN_SEL(3) 193 #define RSN_AUTH_KEY_MGMT_FT_PSK WLAN_RSN_SEL(4) 194 #define RSN_AUTH_KEY_MGMT_802_1X_SHA256\ 195 WLAN_RSN_SEL(5) 196 #define RSN_AUTH_KEY_MGMT_PSK_SHA256 WLAN_RSN_SEL(6) 197 #define RSN_AUTH_KEY_MGMT_WPS WLAN_RSN_SEL(7) 198 #define RSN_AUTH_KEY_MGMT_SAE WLAN_RSN_SEL(8) 199 #define RSN_AUTH_KEY_MGMT_FT_SAE WLAN_RSN_SEL(9) 200 #define RSN_AUTH_KEY_MGMT_802_1X_SUITE_B\ 201 WLAN_RSN_SEL(11) 202 #define RSN_AUTH_KEY_MGMT_802_1X_SUITE_B_192\ 203 WLAN_RSN_SEL(12) 204 #define RSN_AUTH_KEY_MGMT_FT_802_1X_SUITE_B_384\ 205 WLAN_RSN_SEL(13) 206 #define RSN_AUTH_KEY_MGMT_FILS_SHA256 WLAN_RSN_SEL(14) 207 #define RSN_AUTH_KEY_MGMT_FILS_SHA384 WLAN_RSN_SEL(15) 208 #define RSN_AUTH_KEY_MGMT_FT_FILS_SHA256\ 209 WLAN_RSN_SEL(16) 210 #define RSN_AUTH_KEY_MGMT_FT_FILS_SHA384\ 211 WLAN_RSN_SEL(17) 212 #define RSN_AUTH_KEY_MGMT_OWE WLAN_RSN_SEL(18) 213 #define RSN_AUTH_KEY_MGMT_FT_PSK_SHA384 WLAN_RSN_SEL(19) 214 #define RSN_AUTH_KEY_MGMT_PSK_SHA384 WLAN_RSN_SEL(20) 215 #define RSN_AUTH_KEY_MGMT_SAE_EXT_KEY WLAN_RSN_SEL(24) 216 #define RSN_AUTH_KEY_MGMT_FT_SAE_EXT_KEY WLAN_RSN_SEL(25) 217 218 #define RSN_AUTH_KEY_MGMT_CCKM (WLAN_RSN_CCKM_AKM) 219 #define RSN_AUTH_KEY_MGMT_OSEN (0x019a6f50) 220 #define RSN_AUTH_KEY_MGMT_DPP (WLAN_RSN_DPP_AKM) 221 222 #define RSN_CIPHER_SUITE_NONE WLAN_RSN_SEL(WLAN_CSE_NONE) 223 #define RSN_CIPHER_SUITE_WEP40 WLAN_RSN_SEL(WLAN_CSE_WEP40) 224 #define RSN_CIPHER_SUITE_TKIP WLAN_RSN_SEL(WLAN_CSE_TKIP) 225 #define RSN_CIPHER_SUITE_WEP104 WLAN_RSN_SEL(WLAN_CSE_WEP104) 226 #define RSN_CIPHER_SUITE_CCMP WLAN_RSN_SEL(WLAN_CSE_CCMP) 227 #define RSN_CIPHER_SUITE_AES_CMAC WLAN_RSN_SEL(WLAN_CSE_AES_CMAC) 228 #define RSN_CIPHER_SUITE_GCMP WLAN_RSN_SEL(WLAN_CSE_GCMP_128) 229 #define RSN_CIPHER_SUITE_GCMP_256 WLAN_RSN_SEL(WLAN_CSE_GCMP_256) 230 #define RSN_CIPHER_SUITE_CCMP_256 WLAN_RSN_SEL(WLAN_CSE_CCMP_256) 231 #define RSN_CIPHER_SUITE_BIP_GMAC_128 WLAN_RSN_SEL(WLAN_CSE_BIP_GMAC_128) 232 #define RSN_CIPHER_SUITE_BIP_GMAC_256 WLAN_RSN_SEL(WLAN_CSE_BIP_GMAC_256) 233 #define RSN_CIPHER_SUITE_BIP_CMAC_256 WLAN_RSN_SEL(WLAN_CSE_BIP_CMAC_256) 234 235 #define RESET_PARAM(__param) ((__param) = 0) 236 #define SET_PARAM(__param, __val) ((__param) |= (1 << (__val))) 237 #define HAS_PARAM(__param, __val) ((__param) & (1 << (__val))) 238 #define CLEAR_PARAM(__param, __val) ((__param) &= (~(1 << (__val)))) 239 240 241 #define RESET_AUTHMODE(_param) ((_param)->authmodeset = 0) 242 243 #define SET_AUTHMODE(_param, _mode) ((_param)->authmodeset |= (1 << (_mode))) 244 #define HAS_AUTHMODE(_param, _mode) ((_param)->authmodeset & (1 << (_mode))) 245 246 #define AUTH_IS_OPEN(_param) HAS_AUTHMODE((_param), WLAN_CRYPTO_AUTH_OPEN) 247 #define AUTH_IS_SHARED_KEY(_param) \ 248 HAS_AUTHMODE((_param), WLAN_CRYPTO_AUTH_SHARED) 249 #define AUTH_IS_8021X(_param) HAS_AUTHMODE((_param), WLAN_CRYPTO_AUTH_8021X) 250 #define AUTH_IS_WPA(_param) HAS_AUTHMODE((_param), WLAN_CRYPTO_AUTH_WPA) 251 #define AUTH_IS_RSNA(_param) HAS_AUTHMODE((_param), WLAN_CRYPTO_AUTH_RSNA) 252 #define AUTH_IS_CCKM(_param) HAS_AUTHMODE((_param), WLAN_CRYPTO_AUTH_CCKM) 253 #define AUTH_IS_WAI(_param) HAS_AUTHMODE((_param), WLAN_CRYPTO_AUTH_WAPI) 254 #define AUTH_IS_WPA2(_param) AUTH_IS_RSNA(_param) 255 256 #define AUTH_MATCH(_param1, _param2) \ 257 (((_param1)->authmodeset & (_param2)->authmodeset) != 0) 258 259 260 #define RESET_UCAST_CIPHERS(_param) ((_param)->ucastcipherset = 0) 261 #define SET_UCAST_CIPHER(_param, _c) ((_param)->ucastcipherset |= (1 << (_c))) 262 #define HAS_UCAST_CIPHER(_param, _c) ((_param)->ucastcipherset & (1 << (_c))) 263 264 #define UCIPHER_IS_CLEAR(_param) \ 265 ((_param)->ucastcipherset == 0) 266 #define UCIPHER_IS_WEP(_param) \ 267 HAS_UCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_WEP) 268 #define UCIPHER_IS_TKIP(_param) \ 269 HAS_UCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_TKIP) 270 #define UCIPHER_IS_CCMP128(_param) \ 271 HAS_UCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_AES_CCM) 272 #define UCIPHER_IS_CCMP256(_param) \ 273 HAS_UCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_AES_CCM_256) 274 #define UCIPHER_IS_GCMP128(_param) \ 275 HAS_UCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_AES_GCM) 276 #define UCIPHER_IS_GCMP256(_param) \ 277 HAS_UCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_AES_GCM_256) 278 #define UCIPHER_IS_SMS4(_param) \ 279 HAS_UCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_WAPI_SMS4) 280 281 #define RESET_MCAST_CIPHERS(_param) ((_param)->mcastcipherset = 0) 282 #define SET_MCAST_CIPHER(_param, _c) ((_param)->mcastcipherset |= (1 << (_c))) 283 #define HAS_MCAST_CIPHER(_param, _c) ((_param)->mcastcipherset & (1 << (_c))) 284 #define HAS_ANY_MCAST_CIPHER(_param) ((_param)->mcastcipherset) 285 #define CLEAR_MCAST_CIPHER(_param, _c) \ 286 ((_param)->mcastcipherset &= (~(1)<<(_c))) 287 288 #define MCIPHER_IS_CLEAR(_param) \ 289 ((_param)->mcastcipherset == 0) 290 #define MCIPHER_IS_WEP(_param) \ 291 HAS_MCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_WEP) 292 #define MCIPHER_IS_TKIP(_param) \ 293 HAS_MCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_TKIP) 294 #define MCIPHER_IS_CCMP128(_param) \ 295 HAS_MCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_AES_CCM) 296 #define MCIPHER_IS_CCMP256(_param) \ 297 HAS_MCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_AES_CCM_256) 298 #define MCIPHER_IS_GCMP128(_param) \ 299 HAS_MCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_AES_GCM) 300 #define MCIPHER_IS_GCMP256(_param) \ 301 HAS_MCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_AES_GCM_256) 302 #define MCIPHER_IS_SMS4(_param) \ 303 HAS_MCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_WAPI_SMS4) 304 305 #define RESET_MGMT_CIPHERS(_param) ((_param)->mgmtcipherset = 0) 306 #define SET_MGMT_CIPHER(_param, _c) ((_param)->mgmtcipherset |= (1 << (_c))) 307 #define HAS_MGMT_CIPHER(_param, _c) ((_param)->mgmtcipherset & (1 << (_c))) 308 #define IS_MGMT_CIPHER(_c) ((_c == WLAN_CRYPTO_CIPHER_AES_CMAC) || \ 309 (_c == WLAN_CRYPTO_CIPHER_AES_CMAC_256) || \ 310 (_c == WLAN_CRYPTO_CIPHER_AES_GMAC) || \ 311 (_c == WLAN_CRYPTO_CIPHER_AES_GMAC_256)) 312 313 #define IS_FILS_CIPHER(_c) ((_c) == WLAN_CRYPTO_CIPHER_FILS_AEAD) 314 315 #define MGMT_CIPHER_IS_CLEAR(_param) \ 316 ((_param)->mgmtcipherset == 0) 317 #define MGMT_CIPHER_IS_CMAC(_param) \ 318 HAS_MGMT_CIPHER((_param), WLAN_CRYPTO_CIPHER_AES_CMAC) 319 #define MGMT_CIPHER_IS_CMAC256(_param) \ 320 HAS_MGMT_CIPHER((_param), WLAN_CRYPTO_CIPHER_AES_CMAC_256) 321 #define MGMT_CIPHER_IS_GMAC(_param) \ 322 HAS_MGMT_CIPHER((_param), WLAN_CRYPTO_CIPHER_AES_GMAC) 323 #define MGMT_CIPHER_IS_GMAC256(_param) \ 324 HAS_MGMT_CIPHER((_param), WLAN_CRYPTO_CIPHER_AES_GMAC_256) 325 326 #define RESET_KEY_MGMT(_param) ((_param)->key_mgmt = 0) 327 #define SET_KEY_MGMT(_param, _c) ((_param)->key_mgmt |= (1 << (_c))) 328 #define HAS_KEY_MGMT(_param, _c) ((_param)->key_mgmt & (1 << (_c))) 329 330 #define UCAST_CIPHER_MATCH(_param1, _param2) \ 331 (((_param1)->ucastcipherset & (_param2)->ucastcipherset) != 0) 332 333 #define MCAST_CIPHER_MATCH(_param1, _param2) \ 334 (((_param1)->mcastcipherset & (_param2)->mcastcipherset) != 0) 335 336 #define MGMT_CIPHER_MATCH(_param1, _param2) \ 337 (((_param1)->mgmtcipherset & (_param2)->mgmtcipherset) != 0) 338 339 #define KEY_MGMTSET_MATCH(_param1, _param2) \ 340 (((_param1)->key_mgmt & (_param2)->key_mgmt) != 0 || \ 341 (!(_param1)->key_mgmt && !(_param2)->key_mgmt)) 342 343 #define RESET_CIPHER_CAP(_param) ((_param)->cipher_caps = 0) 344 #define SET_CIPHER_CAP(_param, _c) ((_param)->cipher_caps |= (1 << (_c))) 345 #define HAS_CIPHER_CAP(_param, _c) ((_param)->cipher_caps & (1 << (_c))) 346 #define HAS_ANY_CIPHER_CAP(_param) ((_param)->cipher_caps) 347 348 #define crypto_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_CRYPTO, params) 349 #define crypto_info(params...) QDF_TRACE_INFO(QDF_MODULE_ID_CRYPTO, params) 350 #define crypto_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_CRYPTO, params) 351 352 /** 353 * struct wlan_crypto_mmie - MMIE IE 354 * @element_id: element id 355 * @length: length of the ie 356 * @key_id: igtk key_id used 357 * @sequence_number: igtk PN number 358 * @mic: MIC for the frame 359 * 360 * This structure represents Management MIC information element (IEEE 802.11w) 361 */ 362 struct wlan_crypto_mmie { 363 uint8_t element_id; 364 uint8_t length; 365 uint16_t key_id; 366 uint8_t sequence_number[6]; 367 uint8_t mic[16]; 368 } __packed; 369 370 /** 371 * struct crypto_add_key_result - add key result structure 372 * @vdev_id: unique id identifying the VDEV 373 * @key_ix: key index 374 * @key_flags: key flags 375 * @status: status of add key 376 * @peer_macaddr: MAC address of the peer 377 * 378 * Structure used for add key result. 379 */ 380 struct crypto_add_key_result { 381 uint32_t vdev_id; 382 uint32_t key_ix; 383 uint32_t key_flags; 384 uint32_t status; 385 uint8_t peer_macaddr[QDF_MAC_ADDR_SIZE]; 386 }; 387 388 /** 389 * typedef crypto_add_key_callback - add key callback 390 * @context: opaque context that the client can use to associate the 391 * callback with the request 392 * @result: result of add key 393 */ 394 typedef void (*crypto_add_key_callback)(void *context, 395 struct crypto_add_key_result *result); 396 397 /** 398 * struct wlan_crypto_comp_priv - crypto component private structure 399 * @crypto_params: crypto params for the peer 400 * @crypto_key: crypto keys structure for the peer 401 * @fils_aead_set: fils params for this peer 402 * @add_key_ctx: Opaque context to be used by the caller to associate the 403 * add key request with the response 404 * @add_key_cb: Callback function to be called with the add key result 405 * 406 */ 407 struct wlan_crypto_comp_priv { 408 struct wlan_crypto_params crypto_params; 409 struct wlan_crypto_keys crypto_key; 410 uint8_t fils_aead_set; 411 void *add_key_ctx; 412 crypto_add_key_callback add_key_cb; 413 }; 414 415 /** 416 * struct wlan_crypto_cipher - crypto cipher table 417 * @cipher_name: printable name 418 * @cipher: cipher type WLAN_CRYPTO_CIPHER_* 419 * @header: size of privacy header (bytes) 420 * @trailer: size of privacy trailer (bytes) 421 * @miclen: size of mic trailer (bytes) 422 * @keylen: max key length 423 * @setkey: function pointer for setkey 424 * @encap: function pointer for encap 425 * @decap: function pointer for decap 426 * @enmic: function pointer for enmic 427 * @demic: function pointer for demic 428 * 429 */ 430 struct wlan_crypto_cipher { 431 const char *cipher_name; 432 wlan_crypto_cipher_type cipher; 433 const uint8_t header; 434 const uint8_t trailer; 435 const uint8_t miclen; 436 const uint32_t keylen; 437 QDF_STATUS(*setkey)(struct wlan_crypto_key *); 438 QDF_STATUS(*encap)(struct wlan_crypto_key *, 439 qdf_nbuf_t, uint8_t, uint8_t); 440 QDF_STATUS(*decap)(struct wlan_crypto_key *, 441 qdf_nbuf_t, uint8_t, uint8_t); 442 QDF_STATUS(*enmic)(struct wlan_crypto_key *, 443 qdf_nbuf_t, uint8_t, uint8_t); 444 QDF_STATUS(*demic)(struct wlan_crypto_key *, 445 qdf_nbuf_t, uint8_t, uint8_t); 446 }; 447 448 449 /** 450 * wlan_crypto_is_data_protected - check is frame is protected or not 451 * @data: frame 452 * 453 * This function check is frame is protected or not 454 * 455 * Return: TRUE/FALSE 456 */ 457 static inline bool wlan_crypto_is_data_protected(const void *data) 458 { 459 const struct wlan_frame_hdr *hdr = (const struct wlan_frame_hdr *)data; 460 if (hdr->i_fc[1] & WLAN_FC1_ISWEP) 461 return true; 462 else 463 return false; 464 } 465 466 /** 467 * ieee80211_hdrsize - calculate frame header size 468 * @data: frame 469 * 470 * This function calculate frame header size 471 * 472 * Return: header size of the frame 473 */ 474 static inline uint8_t ieee80211_hdrsize(const void *data) 475 { 476 const struct wlan_frame_hdr *hdr = (const struct wlan_frame_hdr *)data; 477 uint8_t size = sizeof(struct wlan_frame_hdr); 478 479 if ((hdr->i_fc[1] & WLAN_FC1_DIR_MASK) 480 == (WLAN_FC1_DSTODS)) { 481 size += QDF_MAC_ADDR_SIZE; 482 } 483 484 if (((WLAN_FC0_GET_STYPE(hdr->i_fc[0]) 485 == WLAN_FC0_STYPE_QOS_DATA))) { 486 size += sizeof(uint16_t); 487 /* Qos frame with Order bit set indicates an HTC frame */ 488 if (hdr->i_fc[1] & WLAN_FC1_ORDER) 489 size += (sizeof(uint8_t)*4); 490 } 491 if (((WLAN_FC0_GET_STYPE(hdr->i_fc[0]) 492 == WLAN_FC0_STYPE_ACTION))) { 493 /* Action frame with Order bit set indicates an HTC frame */ 494 if (hdr->i_fc[1] & WLAN_FC1_ORDER) 495 size += (sizeof(uint8_t)*4); 496 } 497 return size; 498 } 499 500 /** 501 * ieee80211_hdrspace - calculate frame header size with padding 502 * @pdev: pdev 503 * @data: frame header 504 * 505 * This function returns the space occupied by the 802.11 header 506 * and any padding required by the driver. This works for a management 507 * or data frame. 508 * 509 * Return: header size of the frame with padding 510 */ 511 static inline uint8_t 512 ieee80211_hdrspace(struct wlan_objmgr_pdev *pdev, const void *data) 513 { 514 uint8_t size = ieee80211_hdrsize(data); 515 516 if (wlan_pdev_nif_feat_cap_get(pdev, WLAN_PDEV_F_DATAPAD)) 517 size = roundup(size, sizeof(u_int32_t)); 518 519 return size; 520 } 521 522 /** 523 * wlan_get_tid - get tid of the frame 524 * @data: frame 525 * 526 * This function get tid of the frame 527 * 528 * Return: tid of the frame 529 */ 530 static inline int wlan_get_tid(const void *data) 531 { 532 const struct wlan_frame_hdr *hdr = (const struct wlan_frame_hdr *)data; 533 534 if (((WLAN_FC0_GET_STYPE(hdr->i_fc[0]) 535 == WLAN_FC0_STYPE_QOS_DATA))) { 536 if ((hdr->i_fc[1] & WLAN_FC1_DIR_MASK) 537 == (WLAN_FC1_DSTODS)) { 538 return ((struct wlan_frame_hdr_qos_addr4 *)data)->i_qos[0] 539 & WLAN_QOS_TID_MASK; 540 } else { 541 return ((struct wlan_frame_hdr_qos *)data)->i_qos[0] 542 & WLAN_QOS_TID_MASK; 543 } 544 } else 545 return WLAN_NONQOS_SEQ; 546 } 547 548 struct crypto_psoc_priv_obj { 549 /** @crypto_key_lock: lock for crypto key table */ 550 qdf_mutex_t crypto_key_lock; 551 /** @crypto_key_lock: lock for crypto key table */ 552 qdf_atomic_t crypto_key_cnt; 553 struct { 554 /** @mask: mask bits */ 555 uint32_t mask; 556 /** @idx_bits: index to shift bits */ 557 uint32_t idx_bits; 558 /** @bins: crypto key table */ 559 TAILQ_HEAD(, wlan_crypto_key_entry) * bins; 560 } crypto_key_holder; 561 }; 562 563 /** 564 * struct pdev_crypto - pdev object structure for crypto 565 * @pdev_obj: pdev object 566 */ 567 struct pdev_crypto { 568 struct wlan_objmgr_pdev *pdev_obj; 569 }; 570 571 /** 572 * wlan_crypto_add_key_entry() - Add a filled key entry to the hashing 573 * framework 574 * @psoc: PSOC pointer 575 * @new_entry: New entry 576 * 577 * Return: QDF_STATUS 578 */ 579 QDF_STATUS wlan_crypto_add_key_entry(struct wlan_objmgr_psoc *psoc, 580 struct wlan_crypto_key_entry *new_entry); 581 582 /** 583 * crypto_add_entry - add key entry to hashing framework 584 * @psoc: psoc handler 585 * @link_id: link id 586 * @mac_addr: mac addr 587 * @crypto_key: crypto key 588 * @key_index: key index 589 * Return: zero on success 590 */ 591 QDF_STATUS crypto_add_entry(struct crypto_psoc_priv_obj *psoc, 592 uint8_t link_id, 593 uint8_t *mac_addr, 594 struct wlan_crypto_key *crypto_key, 595 uint8_t key_index); 596 /** 597 * crypto_hash_find_by_linkid_and_macaddr - find crypto entry by link id 598 * @psoc: psoc handler 599 * @link_id: link id 600 * @mac_addr: mac addr 601 * Return: crypto key entry on success 602 */ 603 struct 604 wlan_crypto_key_entry * crypto_hash_find_by_linkid_and_macaddr( 605 struct crypto_psoc_priv_obj *psoc, 606 uint8_t link_id, 607 uint8_t *mac_addr); 608 609 #ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE 610 /** 611 * wlan_crypto_free_key_by_link_id - free key by link id 612 * @psoc: psoc handler 613 * @link_addr: link address 614 * @link_id: link id 615 */ 616 void wlan_crypto_free_key_by_link_id(struct wlan_objmgr_psoc *psoc, 617 struct qdf_mac_addr *link_addr, 618 uint8_t link_id); 619 #else 620 static inline 621 void wlan_crypto_free_key_by_link_id(struct wlan_objmgr_psoc *psoc, 622 struct qdf_mac_addr *link_addr, 623 uint8_t link_id) 624 {} 625 #endif /* WLAN_FEATURE_11BE_MLO_ADV_FEATURE */ 626 #endif /* end of _WLAN_CRYPTO_DEF_I_H_ */ 627