Skip to content

Commit b0955cd

Browse files
pan-pennam
authored andcommitted
BLE: Add privacy trace (ARMmbed#14127)
Add traces to the Bluetooth Security Manager and Privacy controller. The traces are made to be comprehensive to improve the ux when users submit bugs. A centralized set of helpers has been created to convert BLE types to string. * BLE: Add SM traces * BLE: Add traces to Security Manager PAL * BLE: Make SM traces consistent. - Prefix with Connection <id> - when appropriate. - Display parameters after `:`. - If multiple parameters should be displayed name then and print the value after =. They are separated by a `,`. * BLE: Fix SM random number generation. Only the first 8 bytes were generated from the stack. * BLE: Regenerate CSRK if it is all zeroes. * BLE: Add trace into privacy modules Address resolution is set at the debug level as it is a very common operation and may clutter the output. * Address trace review for SM: - Put privacy traces in BLPR - Add missing traces in PALSecurityManagerImpl.cpp - Add missing EventHandler null pointer check - Typo and parameters order fix.
1 parent 7634df9 commit b0955cd

File tree

5 files changed

+834
-87
lines changed

5 files changed

+834
-87
lines changed
Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
1+
/* mbed Microcontroller Library
2+
* Copyright (c) 2021 ARM Limited
3+
* SPDX-License-Identifier: Apache-2.0
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
#ifndef BLE_CLIAPP_BLE_TRACE_HELPERS_H
19+
#define BLE_CLIAPP_BLE_TRACE_HELPERS_H
20+
21+
#include "ble/SecurityManager.h"
22+
#include "mbed-trace/mbed_trace.h"
23+
24+
namespace ble {
25+
26+
static inline constexpr const char* to_string(bool v)
27+
{
28+
if (v) {
29+
return "true";
30+
} else {
31+
return "false";
32+
}
33+
}
34+
35+
static inline constexpr const char* to_string(ble::SecurityManager::SecurityIOCapabilities_t capabilities)
36+
{
37+
switch(capabilities) {
38+
case ble::SecurityManager::IO_CAPS_DISPLAY_ONLY:
39+
return "IO_CAPS_DISPLAY_ONLY";
40+
case ble::SecurityManager::IO_CAPS_DISPLAY_YESNO:
41+
return "IO_CAPS_DISPLAY_YESNO";
42+
case ble::SecurityManager::IO_CAPS_KEYBOARD_DISPLAY:
43+
return "IO_CAPS_KEYBOARD_DISPLAY";
44+
case ble::SecurityManager::IO_CAPS_KEYBOARD_ONLY:
45+
return "IO_CAPS_KEYBOARD_ONLY";
46+
case ble::SecurityManager::IO_CAPS_NONE:
47+
return "IO_CAPS_NONE";
48+
default:
49+
return "unknown";
50+
}
51+
}
52+
53+
static inline const char* to_string(ble::io_capability_t capabilities)
54+
{
55+
switch (capabilities.value()) {
56+
case ble::io_capability_t::DISPLAY_ONLY:
57+
return "DISPLAY_ONLY";
58+
case ble::io_capability_t::DISPLAY_YES_NO:
59+
return "IO_CAPS_DISPLAY_DISPLAY_YES_NOYESNO";
60+
case ble::io_capability_t::KEYBOARD_ONLY:
61+
return "KEYBOARD_ONLY";
62+
case ble::io_capability_t::NO_INPUT_NO_OUTPUT:
63+
return "NO_INPUT_NO_OUTPUT";
64+
case ble::io_capability_t::KEYBOARD_DISPLAY:
65+
return "KEYBOARD_DISPLAY";
66+
default:
67+
return "unknown";
68+
}
69+
}
70+
71+
static inline constexpr const char* to_string(ble::SecurityManager::SecurityMode_t security_mode)
72+
{
73+
switch (security_mode) {
74+
case ble::SecurityManager::SECURITY_MODE_NO_ACCESS:
75+
return "SECURITY_MODE_NO_ACCESS";
76+
case ble::SecurityManager::SECURITY_MODE_ENCRYPTION_OPEN_LINK:
77+
return "SECURITY_MODE_ENCRYPTION_OPEN_LINK";
78+
case ble::SecurityManager::SECURITY_MODE_ENCRYPTION_NO_MITM:
79+
return "SECURITY_MODE_ENCRYPTION_NO_MITM";
80+
case ble::SecurityManager::SECURITY_MODE_ENCRYPTION_WITH_MITM:
81+
return "SECURITY_MODE_ENCRYPTION_WITH_MITM";
82+
case ble::SecurityManager::SECURITY_MODE_SIGNED_NO_MITM:
83+
return "SECURITY_MODE_SIGNED_NO_MITM";
84+
case ble::SecurityManager::SECURITY_MODE_SIGNED_WITH_MITM:
85+
return "SECURITY_MODE_SIGNED_WITH_MITM";
86+
default:
87+
return "Unknown";
88+
}
89+
}
90+
91+
static inline constexpr const char* passkey_str(const uint8_t* passkey)
92+
{
93+
if (!passkey) {
94+
return "0";
95+
} else {
96+
return (mbed_trace_array)(passkey, 6);
97+
}
98+
}
99+
100+
static inline const char* to_string(const ble::address_t& address)
101+
{
102+
return (mbed_trace_array)(address.data(), address.size());
103+
}
104+
105+
template<size_t size>
106+
const char* to_string(const ble::byte_array_t<size> &array)
107+
{
108+
return (mbed_trace_array)(array.data(), array.size());
109+
}
110+
111+
static inline const char* to_string(const ble::link_encryption_t encryption)
112+
{
113+
using link_encryption_t = ble::link_encryption_t;
114+
115+
switch (encryption.value()) {
116+
case link_encryption_t::NOT_ENCRYPTED:
117+
return "NOT_ENCRYPTED";
118+
case link_encryption_t::ENCRYPTION_IN_PROGRESS:
119+
return "ENCRYPTION_IN_PROGRESS";
120+
case link_encryption_t::ENCRYPTED:
121+
return "ENCRYPTED";
122+
case link_encryption_t::ENCRYPTED_WITH_MITM:
123+
return "ENCRYPTED_WITH_MITM";
124+
case link_encryption_t::ENCRYPTED_WITH_SC_AND_MITM:
125+
return "ENCRYPTED_WITH_SC_AND_MITM";
126+
default:
127+
return "Unknown";
128+
}
129+
}
130+
131+
static inline const char* to_string(Keypress_t keypress)
132+
{
133+
switch (keypress) {
134+
case KEYPRESS_STARTED:
135+
return "KEYPRESS_STARTED";
136+
case KEYPRESS_ENTERED:
137+
return "KEYPRESS_ENTERED";
138+
case KEYPRESS_ERASED:
139+
return "KEYPRESS_ERASED";
140+
case KEYPRESS_CLEARED:
141+
return "KEYPRESS_CLEARED";
142+
case KEYPRESS_COMPLETED:
143+
return "KEYPRESS_COMPLETED";
144+
default:
145+
return "Unknown";
146+
}
147+
}
148+
149+
static inline const char *to_string(ble::pairing_failure_t reason)
150+
{
151+
switch (reason.value()) {
152+
case ble::pairing_failure_t::PASSKEY_ENTRY_FAILED:
153+
return "PASSKEY_ENTRY_FAILED";
154+
case ble::pairing_failure_t::OOB_NOT_AVAILABLE:
155+
return "OOB_NOT_AVAILABLE";
156+
case ble::pairing_failure_t::AUTHENTICATION_REQUIREMENTS:
157+
return "AUTHENTICATION_REQUIREMENTS";
158+
case ble::pairing_failure_t::CONFIRM_VALUE_FAILED:
159+
return "CONFIRM_VALUE_FAILED";
160+
case ble::pairing_failure_t::PAIRING_NOT_SUPPORTED:
161+
return "PAIRING_NOT_SUPPORTED";
162+
case ble::pairing_failure_t::ENCRYPTION_KEY_SIZE:
163+
return "ENCRYPTION_KEY_SIZE";
164+
case ble::pairing_failure_t::COMMAND_NOT_SUPPORTED:
165+
return "COMMAND_NOT_SUPPORTED";
166+
case ble::pairing_failure_t::UNSPECIFIED_REASON:
167+
return "UNSPECIFIED_REASON";
168+
case ble::pairing_failure_t::REPEATED_ATTEMPTS:
169+
return "REPEATED_ATTEMPTS";
170+
case ble::pairing_failure_t::INVALID_PARAMETERS:
171+
return "INVALID_PARAMETERS";
172+
case ble::pairing_failure_t::DHKEY_CHECK_FAILED:
173+
return "DHKEY_CHECK_FAILED";
174+
case ble::pairing_failure_t::NUMERIC_COMPARISON_FAILED:
175+
return "NUMERIC_COMPARISON_FAILED";
176+
case ble::pairing_failure_t::BR_EDR_PAIRING_IN_PROGRESS:
177+
return "BR_EDR_PAIRING_IN_PROGRESS";
178+
case ble::pairing_failure_t::CROSS_TRANSPORT_KEY_DERIVATION_OR_GENERATION_NOT_ALLOWED:
179+
return "CROSS_TRANSPORT_KEY_DERIVATION_OR_GENERATION_NOT_ALLOWED";
180+
default:
181+
return "Unknown";
182+
}
183+
}
184+
185+
static inline const char *to_string(target_peer_address_type_t type)
186+
{
187+
if (type == target_peer_address_type_t::PUBLIC) {
188+
return "PUBLIC";
189+
} else {
190+
return "RANDOM";
191+
}
192+
}
193+
194+
static inline const char *to_string(privacy_mode_t mode)
195+
{
196+
if (mode == privacy_mode_t::NETWORK) {
197+
return "NETWORK";
198+
} else {
199+
return "DEVICE";
200+
}
201+
}
202+
203+
204+
} // namespace ble
205+
206+
#endif //BLE_CLIAPP_BLE_TRACE_HELPERS_H

connectivity/FEATURE_BLE/source/cordio/source/PalPrivateAddressControllerImpl.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,24 +19,32 @@
1919

2020
#include "PalPrivateAddressControllerImpl.h"
2121
#include "dm_api.h"
22+
#include "mbed-trace/mbed_trace.h"
23+
#include "common/ble_trace_helpers.h"
24+
25+
#define TRACE_GROUP "BLPR"
2226

2327
namespace ble {
2428
namespace impl {
2529

2630
ble_error_t PalPrivateAddressController::initialize()
2731
{
32+
tr_info("Initialize privacy PAL");
2833
DmPrivInit();
2934
return BLE_ERROR_NONE;
3035
}
3136

3237
ble_error_t PalPrivateAddressController::terminate()
3338
{
39+
tr_info("Terminate privacy PAL");
3440
return BLE_ERROR_NONE;
3541
}
3642

3743
ble_error_t PalPrivateAddressController::generate_resolvable_private_address(const irk_t& local_irk)
3844
{
45+
tr_info("PAL start generation of RPA from local irk: %s", to_string(local_irk));
3946
if (_generating_rpa) {
47+
tr_error("PAL can't generate RPA, it is busy handling a previous request");
4048
return BLE_ERROR_INVALID_STATE;
4149
}
4250

@@ -50,6 +58,7 @@ address_t PalPrivateAddressController::generate_non_resolvable_private_address()
5058
address_t address;
5159
SecRand(address.data(), address.size());
5260
DM_RAND_ADDR_SET(address, DM_RAND_ADDR_NONRESOLV);
61+
tr_info("Non resolvable private address generated: %s", to_string(address));
5362
return address;
5463
}
5564

@@ -59,9 +68,11 @@ ble_error_t PalPrivateAddressController::resolve_private_address(
5968
)
6069
{
6170
if (_resolving_rpa) {
71+
tr_error("Failed to start resolution of RPA: Handling a previous request");
6272
return BLE_ERROR_INVALID_STATE;
6373
}
6474

75+
tr_debug("Start resolution of private address: address=%s, irk=%s", to_string(address), to_string(irk));
6576
DmPrivResolveAddr(
6677
const_cast<uint8_t*>(address.data()),
6778
const_cast<uint8_t*>(irk.data()),
@@ -77,6 +88,7 @@ bool PalPrivateAddressController::is_ll_privacy_supported()
7788

7889
ble_error_t PalPrivateAddressController::set_ll_address_resolution(bool enable)
7990
{
91+
tr_info("Enable LL private address resolution");
8092
DmPrivSetAddrResEnable(enable);
8193
return BLE_ERROR_NONE;
8294
}
@@ -86,9 +98,11 @@ ble_error_t PalPrivateAddressController::set_ll_resolvable_private_address_timeo
8698
)
8799
{
88100
if (HciLlPrivacySupported() == false) {
101+
tr_error("Operation not supported by LL: RPA generation");
89102
return BLE_ERROR_NOT_IMPLEMENTED;
90103
}
91104

105+
tr_info("Set LL resolvable private address generation timeout: %d s", timeout.value());
92106
DmPrivSetResolvablePrivateAddrTimeout(timeout.value());
93107
return BLE_ERROR_NONE;
94108
}
@@ -106,8 +120,12 @@ ble_error_t PalPrivateAddressController::add_device_to_resolving_list(
106120
)
107121
{
108122
if (is_ll_privacy_supported() == false) {
123+
tr_error("Operation not supported by LL: RPA resolution");
109124
return BLE_ERROR_NOT_IMPLEMENTED;
110125
}
126+
127+
tr_info("Add RPA to LL resolving list: peer address=%s, type=%s, peer irk=%s, local irk=%s",
128+
to_string(peer_identity_address), to_string(peer_address_type), to_string(peer_irk), to_string(local_irk));
111129
DmPrivAddDevToResList(
112130
peer_address_type.value(),
113131
peer_identity_address.data(),
@@ -130,9 +148,12 @@ ble_error_t PalPrivateAddressController::remove_device_from_resolving_list(
130148
)
131149
{
132150
if (is_ll_privacy_supported() == false) {
151+
tr_error("Operation not supported by LL: RPA resolution");
133152
return BLE_ERROR_NOT_IMPLEMENTED;
134153
}
135154

155+
tr_info("Remove RPA from LL resolving list: peer address=%s, type=%s",
156+
to_string(peer_identity_address), to_string(peer_address_type));
136157
DmPrivRemDevFromResList(peer_address_type.value(), peer_identity_address.data(), 0);
137158
return BLE_ERROR_NONE;
138159
}
@@ -144,8 +165,11 @@ ble_error_t PalPrivateAddressController::set_peer_privacy_mode(
144165
)
145166
{
146167
if (is_ll_privacy_supported() == false) {
168+
tr_error("Operation not supported by LL: privacy");
147169
return BLE_ERROR_NOT_IMPLEMENTED;
148170
}
171+
tr_info("Set privacy mode: peer address=%s, type=%s, mode=%s",
172+
to_string(peer_address), to_string(peer_address_type), to_string(privacy_mode));
149173
DmPrivSetPrivacyMode(
150174
peer_address_type.value(),
151175
peer_address.data(),
@@ -157,9 +181,11 @@ ble_error_t PalPrivateAddressController::set_peer_privacy_mode(
157181
ble_error_t PalPrivateAddressController::clear_resolving_list()
158182
{
159183
if (is_ll_privacy_supported() == false) {
184+
tr_error("Operation not supported by LL: privacy resolving list");
160185
return BLE_ERROR_NOT_IMPLEMENTED;
161186
}
162187

188+
tr_info("Clear LL resolving list");
163189
DmPrivClearResList();
164190
return BLE_ERROR_NONE;
165191
}
@@ -178,16 +204,19 @@ PalPrivateAddressController& PalPrivateAddressController::instance()
178204
bool PalPrivateAddressController::cordio_handler(const wsfMsgHdr_t *msg)
179205
{
180206
if (msg == nullptr) {
207+
tr_warning("Privacy handler received null message");
181208
return false;
182209
}
183210

184211
auto* handler = instance()._event_handler;
185212

186213
switch (msg->event) {
187214
case DM_PRIV_GENERATE_ADDR_IND: {
215+
tr_info("Privacy handling: DM_PRIV_GENERATE_ADDR_IND");
188216
instance()._generating_rpa = false;
189217

190218
if (!handler) {
219+
tr_warning("No user handler registered for PAL privacy");
191220
return true;
192221
}
193222

@@ -217,7 +246,15 @@ bool PalPrivateAddressController::cordio_handler(const wsfMsgHdr_t *msg)
217246
case DM_PRIV_REM_DEV_FROM_RES_LIST_IND: // Device removed from resolving list
218247
case DM_PRIV_CLEAR_RES_LIST_IND: // Resolving list cleared
219248
{
249+
tr_info("Privacy handling: %s",
250+
msg->event == DM_PRIV_ADD_DEV_TO_RES_LIST_IND ?
251+
"DM_PRIV_ADD_DEV_TO_RES_LIST_IND" :
252+
msg->event == DM_PRIV_ADD_DEV_TO_RES_LIST_IND ?
253+
"DM_PRIV_REM_DEV_FROM_RES_LIST_IND" :
254+
"DM_PRIV_CLEAR_RES_LIST_IND"
255+
);
220256
if (!handler) {
257+
tr_warning("No user handler registered for PAL privacy");
221258
return true;
222259
}
223260

0 commit comments

Comments
 (0)