Bluetooth: Add basic support for AES-CMAC
authorJohan Hedberg <johan.hedberg@intel.com>
Fri, 2 May 2014 11:19:47 +0000 (14:19 +0300)
committerMarcel Holtmann <marcel@holtmann.org>
Wed, 3 Dec 2014 15:51:16 +0000 (16:51 +0100)
Most of the LE Secure Connections SMP crypto functions build on top of
the AES-CMAC function. This patch adds access to AES-CMAC in the kernel
crypto subsystem by allocating a crypto_hash handle for it in a similar
way that we have one for AES-CBC.

Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
net/bluetooth/Kconfig
net/bluetooth/smp.c

index 5e97a8ff850b95e5aaa40be87cae3285041d8527..29bcafc41adfd19b59b0437021d5ebd044dcef9b 100644 (file)
@@ -10,6 +10,7 @@ menuconfig BT
        select CRYPTO
        select CRYPTO_BLKCIPHER
        select CRYPTO_AES
+       select CRYPTO_CMAC
        select CRYPTO_ECB
        select CRYPTO_SHA256
        help
index d993d7d4fcc8a3d8eb7f0ba5d996dca2389efe24..4fed367da380789424bbf7c5bef1f8571242e376 100644 (file)
@@ -72,6 +72,7 @@ struct smp_chan {
        unsigned long   flags;
 
        struct crypto_blkcipher *tfm_aes;
+       struct crypto_hash      *tfm_cmac;
 };
 
 static inline void swap_buf(const u8 *src, u8 *dst, size_t len)
@@ -396,6 +397,7 @@ static void smp_chan_destroy(struct l2cap_conn *conn)
        kfree(smp->slave_csrk);
 
        crypto_free_blkcipher(smp->tfm_aes);
+       crypto_free_hash(smp->tfm_cmac);
 
        /* If pairing failed clean up any keys we might have */
        if (!complete) {
@@ -861,6 +863,14 @@ static struct smp_chan *smp_chan_create(struct l2cap_conn *conn)
                return NULL;
        }
 
+       smp->tfm_cmac = crypto_alloc_hash("cmac(aes)", 0, CRYPTO_ALG_ASYNC);
+       if (IS_ERR(smp->tfm_cmac)) {
+               BT_ERR("Unable to create CMAC crypto context");
+               crypto_free_blkcipher(smp->tfm_aes);
+               kfree(smp);
+               return NULL;
+       }
+
        smp->conn = conn;
        chan->data = smp;