diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2006-10-22 17:35:03 +0000 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2006-10-22 17:35:03 +0000 |
commit | c6e02b7f95315f1dafa3a6489ea5f2f558ec56cf (patch) | |
tree | c3d8dd844da07de1451f5eba8905931f1114223c /hcid | |
parent | af34a71cc0f6fdfb3ccd3085fd77030988e229f1 (diff) |
Basic integration of confirmation concept
Diffstat (limited to 'hcid')
-rw-r--r-- | hcid/dbus-security.c | 8 | ||||
-rw-r--r-- | hcid/dbus.c | 18 | ||||
-rw-r--r-- | hcid/dbus.h | 2 | ||||
-rw-r--r-- | hcid/hcid.h | 1 | ||||
-rw-r--r-- | hcid/security.c | 11 |
5 files changed, 37 insertions, 3 deletions
diff --git a/hcid/dbus-security.c b/hcid/dbus-security.c index a4ca0dbd..57891afe 100644 --- a/hcid/dbus-security.c +++ b/hcid/dbus-security.c @@ -617,6 +617,14 @@ done: return call_passkey_agent(conn, agent, dev, path, sba, dba); } +int handle_confirm_request(DBusConnection *conn, int dev, const char *path, + bdaddr_t *sba, bdaddr_t *dba, const char *pin) +{ + hci_send_cmd(dev, OGF_LINK_CTL, OCF_PIN_CODE_NEG_REPLY, 6, dba); + + return -1; +} + static void send_cancel_request(struct pending_agent_request *req) { DBusMessage *message; diff --git a/hcid/dbus.c b/hcid/dbus.c index d650ea5f..35855b0e 100644 --- a/hcid/dbus.c +++ b/hcid/dbus.c @@ -855,6 +855,24 @@ int hcid_dbus_request_pin(int dev, bdaddr_t *sba, struct hci_conn_info *ci) return handle_passkey_request(connection, dev, path, sba, &ci->bdaddr); } +int hcid_dbus_confirm_pin(int dev, bdaddr_t *sba, struct hci_conn_info *ci, char *pin) +{ + char path[MAX_PATH_LENGTH], addr[18]; + int id; + + ba2str(sba, addr); + + id = hci_devid(addr); + if (id < 0) { + error("No matching device id for %s", addr); + return -1; + } + + snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); + + return handle_confirm_request(connection, dev, path, sba, &ci->bdaddr, pin); +} + void hcid_dbus_bonding_process_complete(bdaddr_t *local, bdaddr_t *peer, uint8_t status) { diff --git a/hcid/dbus.h b/hcid/dbus.h index 81f37a76..56a0b686 100644 --- a/hcid/dbus.h +++ b/hcid/dbus.h @@ -240,6 +240,8 @@ int pending_remote_name_cancel(struct adapter *adapter); int handle_passkey_request(DBusConnection *conn, int dev, const char *path, bdaddr_t *sba, bdaddr_t *dba); +int handle_confirm_request(DBusConnection *conn, int dev, const char *path, + bdaddr_t *sba, bdaddr_t *dba, const char *pin); void release_default_agent(void); void release_passkey_agents(struct adapter *adapter, bdaddr_t *bda); void cancel_passkey_agent_requests(struct slist *agents, const char *path, bdaddr_t *dba); diff --git a/hcid/hcid.h b/hcid/hcid.h index 2a4d221b..c109f7a2 100644 --- a/hcid/hcid.h +++ b/hcid/hcid.h @@ -149,6 +149,7 @@ int hcid_dbus_start_device(uint16_t id); int hcid_dbus_stop_device(uint16_t id); void hcid_dbus_pending_pin_req_add(bdaddr_t *sba, bdaddr_t *dba); int hcid_dbus_request_pin(int dev, bdaddr_t *sba, struct hci_conn_info *ci); +int hcid_dbus_confirm_pin(int dev, bdaddr_t *sba, struct hci_conn_info *ci, char *pin); void hcid_dbus_inquiry_start(bdaddr_t *local); void hcid_dbus_inquiry_complete(bdaddr_t *local); diff --git a/hcid/security.c b/hcid/security.c index c82fbc00..7d2ff9c1 100644 --- a/hcid/security.c +++ b/hcid/security.c @@ -390,13 +390,18 @@ static void pin_code_request(int dev, bdaddr_t *sba, bdaddr_t *dba) hci_send_cmd(dev, OGF_LINK_CTL, OCF_PIN_CODE_REPLY, PIN_CODE_REPLY_CP_SIZE, &pr); } else { - /* Let PIN helper handle that */ + /* Request PIN from passkey agent */ hcid_dbus_request_pin(dev, sba, ci); } } } else { - /* Let PIN helper handle that */ - hcid_dbus_request_pin(dev, sba, ci); + if (pinlen > 0) { + /* Confirm PIN by passkey agent */ + hcid_dbus_confirm_pin(dev, sba, ci, pin); + } else { + /* Request PIN from passkey agent */ + hcid_dbus_request_pin(dev, sba, ci); + } } hcid_dbus_pending_pin_req_add(sba, &ci->bdaddr); |