|
@@ -621,23 +621,38 @@ mwifiex_cmd_802_11_key_material(struct mwifiex_private *priv,
|
|
|
return ret;
|
|
|
}
|
|
|
if (enc_key->key_len == WLAN_KEY_LEN_CCMP) {
|
|
|
- dev_dbg(priv->adapter->dev, "cmd: WPA_AES\n");
|
|
|
- key_material->key_param_set.key_type_id =
|
|
|
+ if (enc_key->is_igtk_key) {
|
|
|
+ dev_dbg(priv->adapter->dev, "cmd: CMAC_AES\n");
|
|
|
+ key_material->key_param_set.key_type_id =
|
|
|
+ cpu_to_le16(KEY_TYPE_ID_AES_CMAC);
|
|
|
+ if (cmd_oid == KEY_INFO_ENABLED)
|
|
|
+ key_material->key_param_set.key_info =
|
|
|
+ cpu_to_le16(KEY_ENABLED);
|
|
|
+ else
|
|
|
+ key_material->key_param_set.key_info =
|
|
|
+ cpu_to_le16(!KEY_ENABLED);
|
|
|
+
|
|
|
+ key_material->key_param_set.key_info |=
|
|
|
+ cpu_to_le16(KEY_IGTK);
|
|
|
+ } else {
|
|
|
+ dev_dbg(priv->adapter->dev, "cmd: WPA_AES\n");
|
|
|
+ key_material->key_param_set.key_type_id =
|
|
|
cpu_to_le16(KEY_TYPE_ID_AES);
|
|
|
- if (cmd_oid == KEY_INFO_ENABLED)
|
|
|
- key_material->key_param_set.key_info =
|
|
|
+ if (cmd_oid == KEY_INFO_ENABLED)
|
|
|
+ key_material->key_param_set.key_info =
|
|
|
cpu_to_le16(KEY_ENABLED);
|
|
|
- else
|
|
|
- key_material->key_param_set.key_info =
|
|
|
+ else
|
|
|
+ key_material->key_param_set.key_info =
|
|
|
cpu_to_le16(!KEY_ENABLED);
|
|
|
|
|
|
- if (enc_key->key_index & MWIFIEX_KEY_INDEX_UNICAST)
|
|
|
+ if (enc_key->key_index & MWIFIEX_KEY_INDEX_UNICAST)
|
|
|
/* AES pairwise key: unicast */
|
|
|
- key_material->key_param_set.key_info |=
|
|
|
+ key_material->key_param_set.key_info |=
|
|
|
cpu_to_le16(KEY_UNICAST);
|
|
|
- else /* AES group key: multicast */
|
|
|
- key_material->key_param_set.key_info |=
|
|
|
+ else /* AES group key: multicast */
|
|
|
+ key_material->key_param_set.key_info |=
|
|
|
cpu_to_le16(KEY_MCAST);
|
|
|
+ }
|
|
|
} else if (enc_key->key_len == WLAN_KEY_LEN_TKIP) {
|
|
|
dev_dbg(priv->adapter->dev, "cmd: WPA_TKIP\n");
|
|
|
key_material->key_param_set.key_type_id =
|
|
@@ -668,6 +683,24 @@ mwifiex_cmd_802_11_key_material(struct mwifiex_private *priv,
|
|
|
key_param_len = (u16)(enc_key->key_len + KEYPARAMSET_FIXED_LEN)
|
|
|
+ sizeof(struct mwifiex_ie_types_header);
|
|
|
|
|
|
+ if (le16_to_cpu(key_material->key_param_set.key_type_id) ==
|
|
|
+ KEY_TYPE_ID_AES_CMAC) {
|
|
|
+ struct mwifiex_cmac_param *param =
|
|
|
+ (void *)key_material->key_param_set.key;
|
|
|
+
|
|
|
+ memcpy(param->ipn, enc_key->pn, IGTK_PN_LEN);
|
|
|
+ memcpy(param->key, enc_key->key_material,
|
|
|
+ enc_key->key_len);
|
|
|
+
|
|
|
+ key_param_len = sizeof(struct mwifiex_cmac_param);
|
|
|
+ key_material->key_param_set.key_len =
|
|
|
+ cpu_to_le16(key_param_len);
|
|
|
+ key_param_len += KEYPARAMSET_FIXED_LEN;
|
|
|
+ key_material->key_param_set.length =
|
|
|
+ cpu_to_le16(key_param_len);
|
|
|
+ key_param_len += sizeof(struct mwifiex_ie_types_header);
|
|
|
+ }
|
|
|
+
|
|
|
cmd->size = cpu_to_le16(sizeof(key_material->action) + S_DS_GEN
|
|
|
+ key_param_len);
|
|
|
|