summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2008-06-11 03:22:14 +0000
committerMarcel Holtmann <marcel@holtmann.org>2008-06-11 03:22:14 +0000
commit130ec73e48a959f397856808fdd64d3b0084a3d2 (patch)
treed2482962f80c6924cba7353102b9b93027bc04e2
parentd4dc948acace9ab535c78b15d3fc04b11a0e3751 (diff)
Retrieve link key type together with the key itself
-rw-r--r--hcid/hcid.h4
-rw-r--r--hcid/security.c6
-rw-r--r--hcid/storage.c9
3 files changed, 13 insertions, 6 deletions
diff --git a/hcid/hcid.h b/hcid/hcid.h
index 099357f0..8a4c0f48 100644
--- a/hcid/hcid.h
+++ b/hcid/hcid.h
@@ -202,8 +202,8 @@ int write_version_info(bdaddr_t *local, bdaddr_t *peer, uint16_t manufacturer, u
int write_features_info(bdaddr_t *local, bdaddr_t *peer, unsigned char *features);
int write_lastseen_info(bdaddr_t *local, bdaddr_t *peer, struct tm *tm);
int write_lastused_info(bdaddr_t *local, bdaddr_t *peer, struct tm *tm);
-int write_link_key(bdaddr_t *local, bdaddr_t *peer, unsigned char *key, int type, int length);
-int read_link_key(bdaddr_t *local, bdaddr_t *peer, unsigned char *key);
+int write_link_key(bdaddr_t *local, bdaddr_t *peer, unsigned char *key, uint8_t type, int length);
+int read_link_key(bdaddr_t *local, bdaddr_t *peer, unsigned char *key, uint8_t *type);
int read_pin_length(bdaddr_t *local, bdaddr_t *peer);
int read_pin_code(bdaddr_t *local, bdaddr_t *peer, char *pin);
gboolean read_trust(const bdaddr_t *local, const char *addr, const char *service);
diff --git a/hcid/security.c b/hcid/security.c
index b4520745..5a395055 100644
--- a/hcid/security.c
+++ b/hcid/security.c
@@ -278,17 +278,19 @@ static void link_key_request(int dev, bdaddr_t *sba, bdaddr_t *dba)
{
unsigned char key[16];
char sa[18], da[18];
+ uint8_t type;
int err;
ba2str(sba, sa); ba2str(dba, da);
info("link_key_request (sba=%s, dba=%s)", sa, da);
- err = read_link_key(sba, dba, key);
+ err = read_link_key(sba, dba, key, &type);
if (err < 0) {
/* Link key not found */
hci_send_cmd(dev, OGF_LINK_CTL, OCF_LINK_KEY_NEG_REPLY, 6, dba);
} else {
/* Link key found */
+ debug("Link key with type %d", type);
link_key_reply_cp lr;
memcpy(lr.link_key, key, 16);
bacpy(&lr.bdaddr, dba);
@@ -477,7 +479,7 @@ static void pin_code_request(int dev, bdaddr_t *sba, bdaddr_t *dba)
pinlen = read_pin_code(sba, dba, pin);
if (pairing == HCID_PAIRING_ONCE) {
- err = read_link_key(sba, dba, key);
+ err = read_link_key(sba, dba, key, NULL);
if (!err) {
ba2str(dba, da);
error("PIN code request for already paired device %s", da);
diff --git a/hcid/storage.c b/hcid/storage.c
index 4dbf8a94..595e9a22 100644
--- a/hcid/storage.c
+++ b/hcid/storage.c
@@ -433,7 +433,7 @@ int write_lastused_info(bdaddr_t *local, bdaddr_t *peer, struct tm *tm)
return textfile_put(filename, addr, str);
}
-int write_link_key(bdaddr_t *local, bdaddr_t *peer, unsigned char *key, int type, int length)
+int write_link_key(bdaddr_t *local, bdaddr_t *peer, unsigned char *key, uint8_t type, int length)
{
char filename[PATH_MAX + 1], addr[18], str[38];
int i;
@@ -461,7 +461,7 @@ int write_link_key(bdaddr_t *local, bdaddr_t *peer, unsigned char *key, int type
return textfile_put(filename, addr, str);
}
-int read_link_key(bdaddr_t *local, bdaddr_t *peer, unsigned char *key)
+int read_link_key(bdaddr_t *local, bdaddr_t *peer, unsigned char *key, uint8_t *type)
{
char filename[PATH_MAX + 1], addr[18], tmp[3], *str;
int i;
@@ -479,6 +479,11 @@ int read_link_key(bdaddr_t *local, bdaddr_t *peer, unsigned char *key)
key[i] = (uint8_t) strtol(tmp, NULL, 16);
}
+ if (type) {
+ memcpy(tmp, str + 33, 2);
+ *type = (uint8_t) strtol(tmp, NULL, 10);
+ }
+
free(str);
return 0;