diff options
| author | Marcel Holtmann <marcel@holtmann.org> | 2008-06-11 03:22:14 +0000 | 
|---|---|---|
| committer | Marcel Holtmann <marcel@holtmann.org> | 2008-06-11 03:22:14 +0000 | 
| commit | 130ec73e48a959f397856808fdd64d3b0084a3d2 (patch) | |
| tree | d2482962f80c6924cba7353102b9b93027bc04e2 | |
| parent | d4dc948acace9ab535c78b15d3fc04b11a0e3751 (diff) | |
Retrieve link key type together with the key itself
| -rw-r--r-- | hcid/hcid.h | 4 | ||||
| -rw-r--r-- | hcid/security.c | 6 | ||||
| -rw-r--r-- | hcid/storage.c | 9 | 
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; | 
