diff --git a/umac/cmn_services/crypto/src/wlan_crypto_global_api.c b/umac/cmn_services/crypto/src/wlan_crypto_global_api.c index 7237136b2d26..50aefdee6d0a 100644 --- a/umac/cmn_services/crypto/src/wlan_crypto_global_api.c +++ b/umac/cmn_services/crypto/src/wlan_crypto_global_api.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -1280,6 +1280,17 @@ bool wlan_crypto_is_pmf_enabled(struct wlan_objmgr_vdev *vdev, return false; } + +static void wlan_crypto_gmac_pn_swap(uint8_t *a, uint8_t *b) +{ + a[0] = b[5]; + a[1] = b[4]; + a[2] = b[3]; + a[3] = b[2]; + a[4] = b[1]; + a[5] = b[0]; +} + /** * wlan_crypto_add_mmie - called by mgmt txrx to add mmie in frame * @@ -1397,17 +1408,15 @@ uint8_t *wlan_crypto_add_mmie(struct wlan_objmgr_vdev *vdev, ret = omac1_aes_256(key->keyval, buf, len + aad_len - hdrlen, mmie->mic); - } else if ((crypto_priv->igtk_key_type == WLAN_CRYPTO_CIPHER_AES_GMAC) || (crypto_priv->igtk_key_type == WLAN_CRYPTO_CIPHER_AES_GMAC_256)) { qdf_mem_copy(nounce, hdr->addr2, WLAN_ALEN); - qdf_mem_copy(nounce + 6, pn, 6); + wlan_crypto_gmac_pn_swap(nounce + 6, pn); ret = wlan_crypto_aes_gmac(key->keyval, key->keylen, nounce, sizeof(nounce), buf, len + aad_len - hdrlen, mmie->mic); - } qdf_mem_free(buf); if (ret < 0) { @@ -1415,8 +1424,6 @@ uint8_t *wlan_crypto_add_mmie(struct wlan_objmgr_vdev *vdev, return NULL; } - key->keytsc++; - return bfrm + len; } @@ -1532,7 +1539,7 @@ bool wlan_crypto_is_mmie_valid(struct wlan_objmgr_vdev *vdev, || (crypto_priv->igtk_key_type == WLAN_CRYPTO_CIPHER_AES_GMAC_256)) { qdf_mem_copy(nounce, hdr->addr2, WLAN_ALEN); - qdf_mem_copy(nounce + 6, ipn, 6); + wlan_crypto_gmac_pn_swap(nounce + 6, ipn); ret = wlan_crypto_aes_gmac(key->keyval, key->keylen, nounce, sizeof(nounce), buf, len + aad_len - hdrlen, mic);