Skip to content

Commit b40c5dd

Browse files
committed
gateway: enforce Bluetooth level 2 security
Request Bluetooth security level 2 (encryption and no authentication). Inrease default mbedTLS heap size from 10k to 16k, so that there is enough space for storing BT encryption context. Signed-off-by: Marcin Niestroj <m.niestroj@emb.dev>
1 parent 6be9794 commit b40c5dd

6 files changed

Lines changed: 124 additions & 0 deletions

File tree

gateway/Kconfig

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ configdefault NET_SHELL
77
configdefault MBEDTLS_USE_PSA_CRYPTO
88
default n
99

10+
configdefault MBEDTLS_HEAP_SIZE
11+
default 16384
12+
1013
configdefault BT_CTLR_DATA_LENGTH_MAX
1114
default 251
1215

gateway/prj.conf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,9 @@ CONFIG_PSA_WANT_ALG_SHA_384=y
5151
CONFIG_PSA_WANT_ECC_SECP_R1_256=y
5252
CONFIG_PSA_WANT_ECC_SECP_R1_384=y
5353
CONFIG_PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY=y
54+
55+
# Bluetooth secure connections
56+
CONFIG_BT_SMP=y
57+
CONFIG_MBEDTLS_ECP_C=y
58+
# This option is implied by BT_SMP and breaks secp384r1 support
59+
CONFIG_MBEDTLS_PSA_P256M_DRIVER_ENABLED=n

gateway/src/main.c

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,15 @@ static void bt_connected(struct bt_conn *conn, uint8_t err)
160160

161161
LOG_INF("Connected: %s", addr);
162162

163+
err = bt_conn_set_security(conn, BT_SECURITY_L2);
164+
if (err)
165+
{
166+
LOG_ERR("Failed to set security (%d).", err);
167+
168+
bt_conn_disconnect(conn, BT_HCI_ERR_REMOTE_USER_TERM_CONN);
169+
return;
170+
}
171+
163172
pouch_gateway_bt_start(conn);
164173
}
165174

@@ -177,9 +186,47 @@ static void bt_disconnected(struct bt_conn *conn, uint8_t reason)
177186
pouch_gateway_scan_start();
178187
}
179188

189+
static void security_changed(struct bt_conn *conn, bt_security_t level, enum bt_security_err err)
190+
{
191+
LOG_INF("BT security changed to level %u, err %s(%u)", level, bt_security_err_to_str(err), err);
192+
}
193+
180194
BT_CONN_CB_DEFINE(conn_callbacks) = {
181195
.connected = bt_connected,
182196
.disconnected = bt_disconnected,
197+
.security_changed = security_changed,
198+
};
199+
200+
static void auth_cancel(struct bt_conn *conn)
201+
{
202+
char addr[BT_ADDR_LE_STR_LEN];
203+
204+
bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));
205+
206+
LOG_INF("Pairing cancelled: %s", addr);
207+
}
208+
209+
static struct bt_conn_auth_cb auth_cb = {
210+
.cancel = auth_cancel,
211+
};
212+
213+
static void pairing_complete(struct bt_conn *conn, bool bonded)
214+
{
215+
LOG_INF("Pairing Complete");
216+
}
217+
218+
static void pairing_failed(struct bt_conn *conn, enum bt_security_err reason)
219+
{
220+
LOG_WRN("Pairing Failed (%d). Disconnecting.", reason);
221+
222+
bt_conn_disconnect(conn,
223+
(reason == BT_SECURITY_ERR_PAIR_NOT_ALLOWED) ? BT_HCI_ERR_PAIRING_NOT_ALLOWED
224+
: BT_HCI_ERR_AUTH_FAIL);
225+
}
226+
227+
static struct bt_conn_auth_info_cb auth_info_cb = {
228+
.pairing_complete = pairing_complete,
229+
.pairing_failed = pairing_failed,
183230
};
184231

185232
void pouch_gateway_bt_finished(struct bt_conn *conn)
@@ -205,6 +252,12 @@ int main(void)
205252
return err;
206253
}
207254

255+
if (IS_ENABLED(CONFIG_BT_SMP))
256+
{
257+
bt_conn_auth_cb_register(&auth_cb);
258+
bt_conn_auth_info_cb_register(&auth_info_cb);
259+
}
260+
208261
LOG_INF("Bluetooth initialized");
209262

210263
pouch_gateway_scan_start();

samples/custom_connect/Kconfig

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ configdefault NET_SHELL
77
configdefault MBEDTLS_USE_PSA_CRYPTO
88
default n
99

10+
configdefault MBEDTLS_HEAP_SIZE
11+
default 16384
12+
1013
configdefault BT_CTLR_DATA_LENGTH_MAX
1114
default 251
1215

samples/custom_connect/prj.conf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,9 @@ CONFIG_PSA_WANT_ALG_SHA_384=y
5151
CONFIG_PSA_WANT_ECC_SECP_R1_256=y
5252
CONFIG_PSA_WANT_ECC_SECP_R1_384=y
5353
CONFIG_PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY=y
54+
55+
# Bluetooth secure connections
56+
CONFIG_BT_SMP=y
57+
CONFIG_MBEDTLS_ECP_C=y
58+
# This option is implied by BT_SMP and breaks secp384r1 support
59+
CONFIG_MBEDTLS_PSA_P256M_DRIVER_ENABLED=n

samples/custom_connect/src/main.c

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,15 @@ static void bt_connected(struct bt_conn *conn, uint8_t err)
132132

133133
LOG_INF("Connected: %s", addr);
134134

135+
err = bt_conn_set_security(conn, BT_SECURITY_L2);
136+
if (err)
137+
{
138+
LOG_ERR("Failed to set security (%d).", err);
139+
140+
bt_conn_disconnect(conn, BT_HCI_ERR_REMOTE_USER_TERM_CONN);
141+
return;
142+
}
143+
135144
sync_data.conn = conn;
136145
sync_data.counter = 0;
137146

@@ -152,9 +161,47 @@ static void bt_disconnected(struct bt_conn *conn, uint8_t reason)
152161
custom_scan_start();
153162
}
154163

164+
static void security_changed(struct bt_conn *conn, bt_security_t level, enum bt_security_err err)
165+
{
166+
LOG_INF("BT security changed to level %u, err %s(%u)", level, bt_security_err_to_str(err), err);
167+
}
168+
155169
BT_CONN_CB_DEFINE(conn_callbacks) = {
156170
.connected = bt_connected,
157171
.disconnected = bt_disconnected,
172+
.security_changed = security_changed,
173+
};
174+
175+
static void auth_cancel(struct bt_conn *conn)
176+
{
177+
char addr[BT_ADDR_LE_STR_LEN];
178+
179+
bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));
180+
181+
LOG_INF("Pairing cancelled: %s", addr);
182+
}
183+
184+
static struct bt_conn_auth_cb auth_cb = {
185+
.cancel = auth_cancel,
186+
};
187+
188+
static void pairing_complete(struct bt_conn *conn, bool bonded)
189+
{
190+
LOG_INF("Pairing Complete");
191+
}
192+
193+
static void pairing_failed(struct bt_conn *conn, enum bt_security_err reason)
194+
{
195+
LOG_WRN("Pairing Failed (%d). Disconnecting.", reason);
196+
197+
bt_conn_disconnect(conn,
198+
(reason == BT_SECURITY_ERR_PAIR_NOT_ALLOWED) ? BT_HCI_ERR_PAIRING_NOT_ALLOWED
199+
: BT_HCI_ERR_AUTH_FAIL);
200+
}
201+
202+
static struct bt_conn_auth_info_cb auth_info_cb = {
203+
.pairing_complete = pairing_complete,
204+
.pairing_failed = pairing_failed,
158205
};
159206

160207
static void sync_start_handler(struct k_work *work)
@@ -198,6 +245,12 @@ int main(void)
198245
return err;
199246
}
200247

248+
if (IS_ENABLED(CONFIG_BT_SMP))
249+
{
250+
bt_conn_auth_cb_register(&auth_cb);
251+
bt_conn_auth_info_cb_register(&auth_info_cb);
252+
}
253+
201254
LOG_INF("Bluetooth initialized");
202255

203256
custom_scan_start();

0 commit comments

Comments
 (0)