diff --git a/monitor/bt.h b/monitor/bt.h
index 09bdbc8..9308fcd 100644
--- a/monitor/bt.h
+++ b/monitor/bt.h
uint16_t tx_time;
} __attribute__ ((packed));
+#define BT_HCI_CMD_LE_READ_LOCAL_PK256 0x2025
+
+#define BT_HCI_CMD_LE_GENERATE_DHKEY 0x2026
+struct bt_hci_cmd_le_generate_dhkey {
+ uint8_t remote_pk256[64];
+} __attribute__ ((packed));
+
#define BT_HCI_CMD_LE_READ_MAX_DATA_LENGTH 0x202f
struct bt_hci_rsp_le_read_max_data_length {
uint8_t status;
uint16_t max_rx_time;
} __attribute__ ((packed));
+#define BT_HCI_EVT_LE_READ_LOCAL_PK256_COMPLETE 0x08
+struct bt_hci_evt_le_read_local_pk256_complete {
+ uint8_t status;
+ uint8_t local_pk256[64];
+} __attribute__ ((packed));
+
+#define BT_HCI_EVT_LE_GENERATE_DHKEY_COMPLETE 0x09
+struct bt_hci_evt_le_generate_dhkey_complete {
+ uint8_t status;
+ uint8_t dhkey[32];
+} __attribute__ ((packed));
+
#define BT_HCI_EVT_LE_DIRECT_ADV_REPORT 0x0b
struct bt_hci_evt_le_direct_adv_report {
uint8_t num_reports;
diff --git a/monitor/packet.c b/monitor/packet.c
index 3dab92f..885c4b1 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c
print_key("Randomizer R with P-256", randomizer);
}
+static void print_pk256(const char *label, const uint8_t *key)
+{
+ print_hex_field(label, key, 64);
+}
+
+static void print_dhkey(const uint8_t *dhkey)
+{
+ print_hex_field("Diffie-Hellman key", dhkey, 32);
+}
+
static void print_passkey(uint32_t passkey)
{
print_field("Passkey: %06d", le32_to_cpu(passkey));
print_field("TX time: %d", le16_to_cpu(cmd->tx_time));
}
+static void le_generate_dhkey_cmd(const void *data, uint8_t size)
+{
+ const struct bt_hci_cmd_le_generate_dhkey *cmd = data;
+
+ print_pk256("Remote P-256 public key", cmd->remote_pk256);
+}
+
static void le_read_max_data_length_rsp(const void *data, uint8_t size)
{
const struct bt_hci_rsp_le_read_max_data_length *rsp = data;
{ 0x2024, 272, "LE Write Suggested Default Data Length",
le_write_default_data_length_cmd, 4, true,
status_rsp, 1, true },
- { 0x2025, 273, "LE Read Local P-256 Public Key" },
- { 0x2026, 274, "LE Generate DHKey" },
+ { 0x2025, 273, "LE Read Local P-256 Public Key",
+ null_cmd, 0, true },
+ { 0x2026, 274, "LE Generate DHKey",
+ le_generate_dhkey_cmd, 64, true },
{ 0x2027, 275, "LE Add Device To Resolving List" },
{ 0x2028, 276, "LE Remove Device From Resolving List" },
{ 0x2029, 277, "LE Clear Resolving List" },
print_field("Max RX time: %d", le16_to_cpu(evt->max_rx_time));
}
+static void le_read_local_pk256_complete_evt(const void *data, uint8_t size)
+{
+ const struct bt_hci_evt_le_read_local_pk256_complete *evt = data;
+
+ print_status(evt->status);
+ print_pk256("Local P-256 public key", evt->local_pk256);
+}
+
+static void le_generate_dhkey_complete_evt(const void *data, uint8_t size)
+{
+ const struct bt_hci_evt_le_generate_dhkey_complete *evt = data;
+
+ print_status(evt->status);
+ print_dhkey(evt->dhkey);
+}
+
static void le_direct_adv_report_evt(const void *data, uint8_t size)
{
const struct bt_hci_evt_le_direct_adv_report *evt = data;
le_conn_param_request_evt, 10, true },
{ 0x07, "LE Data Length Change",
le_data_length_change_evt, 10, true },
- { 0x08, "LE Read Local P-256 Public Key Complete" },
- { 0x09, "LE Generate DHKey Complete" },
+ { 0x08, "LE Read Local P-256 Public Key Complete",
+ le_read_local_pk256_complete_evt, 65, true },
+ { 0x09, "LE Generate DHKey Complete",
+ le_generate_dhkey_complete_evt, 33, true },
{ 0x0a, "LE Enhanced Connection Complete" },
{ 0x0b, "LE Direct Advertising Report",
le_direct_adv_report_evt, 1, false },