summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2006-10-22 17:35:03 +0000
committerMarcel Holtmann <marcel@holtmann.org>2006-10-22 17:35:03 +0000
commitc6e02b7f95315f1dafa3a6489ea5f2f558ec56cf (patch)
treec3d8dd844da07de1451f5eba8905931f1114223c
parentaf34a71cc0f6fdfb3ccd3085fd77030988e229f1 (diff)
Basic integration of confirmation concept
-rw-r--r--hcid/dbus-security.c8
-rw-r--r--hcid/dbus.c18
-rw-r--r--hcid/dbus.h2
-rw-r--r--hcid/hcid.h1
-rw-r--r--hcid/security.c11
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);