Selaa lähdekoodia

qcacmn: Change WAPI Tx IV PN Sequence

Change the receive and transmit Iv in wlan_crypto_set_wapi_key
such as:
	tx_iv[16] = {0x5c, 0x36, 0x5c, 0x36, 0x5c,
		     0x36, 0x5c, 0x36, 0x5c, 0x36,
		     0x5c, 0x36, 0x5c, 0x36, 0x5c,
		     0x36};

	rx_iv[16] = {0x5c, 0x36, 0x5c, 0x36, 0x5c,
		     0x36, 0x5c, 0x36, 0x5c, 0x36,
		     0x5c, 0x36, 0x5c, 0x36, 0x5c,
		     0x37};

This is done as wpi_key_tsc_counter sequence was been sent
in reverse order. 0x365C365C365C365C365C365C365C365C was
sent although 0x5C365C365C365C365C365C365C365C36 was expected.
This is because new chipset firware expects the format to be
in big endian. Also, taken care for the backward compatibility
required for the old chipset firware with the feature flag.

Change-Id: I8c795df5a9143e5089e93aaebe7787e51b570c74
CRs-Fixed: 2743162
Utkarsh Bhatnagar 5 vuotta sitten
vanhempi
sitoutus
4987746ee6
1 muutettua tiedostoa jossa 43 lisäystä ja 0 poistoa
  1. 43 0
      target_if/crypto/src/target_if_crypto.c

+ 43 - 0
target_if/crypto/src/target_if_crypto.c

@@ -38,6 +38,48 @@
 #include <cdp_txrx_peer_ops.h>
 
 #ifdef FEATURE_WLAN_WAPI
+#ifdef FEATURE_WAPI_BIG_ENDIAN
+/*
+ * All lithium firmware expects WAPI in big endian
+ * format , whereas helium firmware's expect otherwise
+ */
+
+static void wlan_crypto_set_wapi_key(struct wlan_objmgr_vdev *vdev,
+				     bool pairwise,
+				     enum wlan_crypto_cipher_type cipher_type,
+				     struct set_key_params *params)
+{
+	static const unsigned char tx_iv[16] = {0x5c, 0x36, 0x5c, 0x36, 0x5c,
+						0x36, 0x5c, 0x36, 0x5c, 0x36,
+						0x5c, 0x36, 0x5c, 0x36, 0x5c,
+						0x36};
+
+	static const unsigned char rx_iv[16] = {0x5c, 0x36, 0x5c, 0x36, 0x5c,
+						0x36, 0x5c, 0x36, 0x5c, 0x36,
+						0x5c, 0x36, 0x5c, 0x36, 0x5c,
+						0x37};
+
+	if (cipher_type != WLAN_CRYPTO_CIPHER_WAPI_SMS4 &&
+	    cipher_type != WLAN_CRYPTO_CIPHER_WAPI_GCM4)
+		return;
+
+	if (vdev->vdev_mlme.vdev_opmode == QDF_SAP_MODE ||
+	    vdev->vdev_mlme.vdev_opmode == QDF_P2P_GO_MODE) {
+			qdf_mem_copy(&params->rx_iv, &tx_iv,
+					 WLAN_CRYPTO_WAPI_IV_SIZE);
+			qdf_mem_copy(params->tx_iv, &rx_iv,
+					 WLAN_CRYPTO_WAPI_IV_SIZE);
+	} else {
+			qdf_mem_copy(params->rx_iv, &rx_iv,
+					 WLAN_CRYPTO_WAPI_IV_SIZE);
+			qdf_mem_copy(params->tx_iv, &tx_iv,
+					 WLAN_CRYPTO_WAPI_IV_SIZE);
+		}
+
+	params->key_txmic_len = WLAN_CRYPTO_MIC_LEN;
+	params->key_rxmic_len = WLAN_CRYPTO_MIC_LEN;
+}
+#else
 static void wlan_crypto_set_wapi_key(struct wlan_objmgr_vdev *vdev,
 				     bool pairwise,
 				     enum wlan_crypto_cipher_type cipher_type,
@@ -75,6 +117,7 @@ static void wlan_crypto_set_wapi_key(struct wlan_objmgr_vdev *vdev,
 	params->key_txmic_len = WLAN_CRYPTO_MIC_LEN;
 	params->key_rxmic_len = WLAN_CRYPTO_MIC_LEN;
 }
+#endif /* FEATURE_WAPI_BIG_ENDIAN */
 #else
 static inline void wlan_crypto_set_wapi_key(struct wlan_objmgr_vdev *vdev,
 					    bool pairwise,