mac80211: expose AES-CMAC subkey calculation
authorAssaf Krauss <assaf.krauss@intel.com>
Wed, 1 Aug 2012 12:12:48 +0000 (15:12 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 23 Oct 2012 17:52:52 +0000 (19:52 +0200)
Expose a function for the AES-CMAC subkey calculation
to drivers. This is the first step of the AES-CMAC
cipher key setup and may be required for CMAC hardware
offloading.

Signed-off-by: Assaf Krauss <assaf.krauss@intel.com>
Reviewed-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/mac80211.h
net/mac80211/aes_cmac.c

index 71c2f9c2f5bea84bed7930668c26215f29fc96b4..00b7204708bd681d7bb8baf241b23557460f1a09 100644 (file)
@@ -3222,6 +3222,19 @@ void ieee80211_get_tkip_rx_p1k(struct ieee80211_key_conf *keyconf,
 void ieee80211_get_tkip_p2k(struct ieee80211_key_conf *keyconf,
                            struct sk_buff *skb, u8 *p2k);
 
+/**
+ * ieee80211_aes_cmac_calculate_k1_k2 - calculate the AES-CMAC sub keys
+ *
+ * This function computes the two AES-CMAC sub-keys, based on the
+ * previously installed master key.
+ *
+ * @keyconf: the parameter passed with the set key
+ * @k1: a buffer to be filled with the 1st sub-key
+ * @k2: a buffer to be filled with the 2nd sub-key
+ */
+void ieee80211_aes_cmac_calculate_k1_k2(struct ieee80211_key_conf *keyconf,
+                                       u8 *k1, u8 *k2);
+
 /**
  * struct ieee80211_key_seq - key sequence counter
  *
index a04752e910239821b1bc3110d078c8d81349d4e2..493353534a0f2c05ef4ad3912c0b91394a5bfcc8 100644 (file)
@@ -126,3 +126,20 @@ void ieee80211_aes_cmac_key_free(struct crypto_cipher *tfm)
 {
        crypto_free_cipher(tfm);
 }
+
+void ieee80211_aes_cmac_calculate_k1_k2(struct ieee80211_key_conf *keyconf,
+                                       u8 *k1, u8 *k2)
+{
+       u8 l[AES_BLOCK_SIZE] = {};
+       struct ieee80211_key *key =
+               container_of(keyconf, struct ieee80211_key, conf);
+
+       crypto_cipher_encrypt_one(key->u.aes_cmac.tfm, l, l);
+
+       memcpy(k1, l, AES_BLOCK_SIZE);
+       gf_mulx(k1);
+
+       memcpy(k2, k1, AES_BLOCK_SIZE);
+       gf_mulx(k2);
+}
+EXPORT_SYMBOL(ieee80211_aes_cmac_calculate_k1_k2);