Browse Source

Bluetooth: Add skeleton for SMP self-tests

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>
Johan Hedberg 11 years ago
parent
commit
0a2b0f0452
4 changed files with 66 additions and 0 deletions
  1. 7 0
      net/bluetooth/Kconfig
  2. 7 0
      net/bluetooth/selftest.c
  3. 39 0
      net/bluetooth/smp.c
  4. 13 0
      net/bluetooth/smp.h

+ 7 - 0
net/bluetooth/Kconfig

@@ -84,4 +84,11 @@ config BT_SELFTEST_ECDH
 	  Run test cases for ECDH cryptographic functionality used by the
 	  Run test cases for ECDH cryptographic functionality used by the
 	  Bluetooth Low Energy Secure Connections feature.
 	  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"
 source "drivers/bluetooth/Kconfig"

+ 7 - 0
net/bluetooth/selftest.c

@@ -22,8 +22,10 @@
 */
 */
 
 
 #include <net/bluetooth/bluetooth.h>
 #include <net/bluetooth/bluetooth.h>
+#include <net/bluetooth/hci_core.h>
 
 
 #include "ecc.h"
 #include "ecc.h"
+#include "smp.h"
 #include "selftest.h"
 #include "selftest.h"
 
 
 #if IS_ENABLED(CONFIG_BT_SELFTEST_ECDH)
 #if IS_ENABLED(CONFIG_BT_SELFTEST_ECDH)
@@ -195,7 +197,12 @@ static int __init run_selftest(void)
 	BT_INFO("Starting self testing");
 	BT_INFO("Starting self testing");
 
 
 	err = test_ecdh();
 	err = test_ecdh();
+	if (err)
+		goto done;
 
 
+	err = bt_selftest_smp();
+
+done:
 	BT_INFO("Finished self testing");
 	BT_INFO("Finished self testing");
 
 
 	return err;
 	return err;

+ 39 - 0
net/bluetooth/smp.c

@@ -3022,3 +3022,42 @@ void smp_unregister(struct hci_dev *hdev)
 		smp_del_chan(chan);
 		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

+ 13 - 0
net/bluetooth/smp.h

@@ -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);
 int smp_register(struct hci_dev *hdev);
 void smp_unregister(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 */
 #endif /* __SMP_H */