void on_nble_sm_passkey_disp_evt(const struct nble_sm_passkey_disp_evt *ev) { struct bt_conn *conn; conn = bt_conn_lookup_handle(ev->conn_handle); if (!conn) { BT_ERR("Unable to find conn for handle %u", ev->conn_handle); return; } BT_DBG("conn %p passkey %u", conn, ev->passkey); /* TODO: Check shall we store io_caps globally */ if (get_io_capa() == BT_SMP_IO_DISPLAY_YESNO) { if (nble.auth && nble.auth->passkey_confirm) { nble.auth->passkey_confirm(conn, ev->passkey); } } else { if (nble.auth && nble.auth->passkey_display) { nble.auth->passkey_display(conn, ev->passkey); } } bt_conn_unref(conn); }
static uint8_t legacy_get_pair_method(struct bt_smp *smp, uint8_t remote_io) { uint8_t local_io = get_io_capa(); uint8_t method; if (remote_io > BT_SMP_IO_KEYBOARD_DISPLAY) return JUST_WORKS; method = gen_method_legacy[remote_io][local_io]; /* if both sides have KeyboardDisplay capabilities, initiator displays * and responder inputs */ if (method == PASSKEY_ROLE) { if (smp->conn->role == BT_HCI_ROLE_MASTER) { method = PASSKEY_DISPLAY; } else { method = PASSKEY_INPUT; } } BT_DBG("local_io %u remote_io %u method %u", local_io, remote_io, method); return method; }
static void send_dm_config(void) { struct nble_sm_config_req config = { .key_size = BT_SMP_MAX_ENC_KEY_SIZE, .oob_present = BT_SMP_OOB_NOT_PRESENT, }; config.io_caps = get_io_capa(); if (config.io_caps == BT_SMP_IO_NO_INPUT_OUTPUT) { config.options = BT_SMP_AUTH_BONDING; } else { config.options = BT_SMP_AUTH_BONDING | BT_SMP_AUTH_MITM; } BT_DBG("io_caps %u options %u", config.io_caps, config.options); nble_sm_config_req(&config); }