Bluetooth: Add skeleton for SMP self-tests
authorJohan Hedberg <johan.hedberg@intel.com>
Tue, 30 Dec 2014 07:50:39 +0000 (09:50 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Tue, 30 Dec 2014 07:54:33 +0000 (08:54 +0100)
This patch adds the initial skeleton and kernel config option for SMP
self-tests.

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

index 8d3b607a72be9f0e7e1740db1cdf9f273c3d1207..7de74635a110cbbecbaaddf31ac5d39708362397 100644 (file)
@@ -84,4 +84,11 @@ config BT_SELFTEST_ECDH
          Run test cases for ECDH cryptographic functionality used by the
          Bluetooth Low Energy Secure Connections feature.
 
+config BT_SELFTEST_SMP
+       bool "SMP test cases"
+       depends on BT_LE && BT_SELFTEST
+       help
+         Run test cases for SMP cryptographic functionality, including both
+         legacy SMP as well as the Secure Connections features.
+
 source "drivers/bluetooth/Kconfig"
index b9cb33cd45d7186c9c65322ef1d25c16df558802..a7602b3d0b0d842e6ef9ac6d5347f1409b918817 100644 (file)
 */
 
 #include <net/bluetooth/bluetooth.h>
+#include <net/bluetooth/hci_core.h>
 
 #include "ecc.h"
+#include "smp.h"
 #include "selftest.h"
 
 #if IS_ENABLED(CONFIG_BT_SELFTEST_ECDH)
@@ -195,7 +197,12 @@ static int __init run_selftest(void)
        BT_INFO("Starting self testing");
 
        err = test_ecdh();
+       if (err)
+               goto done;
 
+       err = bt_selftest_smp();
+
+done:
        BT_INFO("Finished self testing");
 
        return err;
index 9025e177d2789650e29aa4b79e0f09241a00caca..b47528d66a5f9c14e4df090b2db45c75998c3cb0 100644 (file)
@@ -3022,3 +3022,42 @@ void smp_unregister(struct hci_dev *hdev)
                smp_del_chan(chan);
        }
 }
+
+#if IS_ENABLED(CONFIG_BT_SELFTEST_SMP)
+
+static int __init run_selftests(struct crypto_blkcipher *tfm_aes,
+                               struct crypto_hash *tfm_cmac)
+{
+       BT_INFO("SMP test passed");
+
+       return 0;
+}
+
+int __init bt_selftest_smp(void)
+{
+       struct crypto_blkcipher *tfm_aes;
+       struct crypto_hash *tfm_cmac;
+       int err;
+
+       tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
+       if (IS_ERR(tfm_aes)) {
+               BT_ERR("Unable to create ECB crypto context");
+               return PTR_ERR(tfm_aes);
+       }
+
+       tfm_cmac = crypto_alloc_hash("cmac(aes)", 0, CRYPTO_ALG_ASYNC);
+       if (IS_ERR(tfm_cmac)) {
+               BT_ERR("Unable to create CMAC crypto context");
+               crypto_free_blkcipher(tfm_aes);
+               return PTR_ERR(tfm_cmac);
+       }
+
+       err = run_selftests(tfm_aes, tfm_cmac);
+
+       crypto_free_hash(tfm_cmac);
+       crypto_free_blkcipher(tfm_aes);
+
+       return err;
+}
+
+#endif
index 3296bf42ae80d627c478c5199e167429ca16079b..60c5b73fcb4b26e3aab32604b58809ca30a4e6f4 100644 (file)
@@ -192,4 +192,17 @@ int smp_generate_rpa(struct hci_dev *hdev, const u8 irk[16], bdaddr_t *rpa);
 int smp_register(struct hci_dev *hdev);
 void smp_unregister(struct hci_dev *hdev);
 
+#if IS_ENABLED(CONFIG_BT_SELFTEST_SMP)
+
+int bt_selftest_smp(void);
+
+#else
+
+static inline int bt_selftest_smp(void)
+{
+       return 0;
+}
+
+#endif
+
 #endif /* __SMP_H */