lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <204e938d-c73b-8572-baca-ee2e99f1e40a@osg.samsung.com>
Date:   Fri, 24 Feb 2017 15:00:12 +0100
From:   Stefan Schmidt <stefan@....samsung.com>
To:     Luiz Augusto von Dentz <luiz.dentz@...il.com>,
        linux-bluetooth@...r.kernel.org
Cc:     patrik.flykt@...ux.intel.com, jukka.rissanen@...ux.intel.com,
        aar@...gutronix.de, linux-wpan@...r.kernel.org,
        netdev@...r.kernel.org
Subject: Re: [PATCH v5 6/6] 6lowpan: Fix IID format for Bluetooth

Hello.

On 02/24/2017 01:14 PM, Luiz Augusto von Dentz wrote:
> From: Luiz Augusto von Dentz <luiz.von.dentz@...el.com>
>
> Accourding to RFC 7668 U/L bit shall not be used:
>
> https://wiki.tools.ietf.org/html/rfc7668#section-3.2.2 [Page 10]:
>
>    In the figure, letter 'b' represents a bit from the
>    Bluetooth device address, copied as is without any changes on any
>    bit.  This means that no bit in the IID indicates whether the
>    underlying Bluetooth device address is public or random.
>
>    |0              1|1              3|3              4|4              6|
>    |0              5|6              1|2              7|8              3|
>    +----------------+----------------+----------------+----------------+
>    |bbbbbbbbbbbbbbbb|bbbbbbbb11111111|11111110bbbbbbbb|bbbbbbbbbbbbbbbb|
>    +----------------+----------------+----------------+----------------+
>
> Because of this the code cannot figure out the address type from the IP
> address anymore thus it makes no sense to use peer_lookup_ba as it needs
> the peer address type.
>
> Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@...el.com>
> ---
>  include/net/6lowpan.h   |  4 ---
>  net/bluetooth/6lowpan.c | 79 ++++++++-----------------------------------------
>  2 files changed, 12 insertions(+), 71 deletions(-)
>
> diff --git a/include/net/6lowpan.h b/include/net/6lowpan.h
> index c5792cb..a713780 100644
> --- a/include/net/6lowpan.h
> +++ b/include/net/6lowpan.h
> @@ -211,10 +211,6 @@ static inline void lowpan_iphc_uncompress_eui48_lladdr(struct in6_addr *ipaddr,
>  	ipaddr->s6_addr[11] = 0xFF;
>  	ipaddr->s6_addr[12] = 0xFE;
>  	memcpy(&ipaddr->s6_addr[13], lladdr + 3, 3);
> -	/* second bit-flip (Universe/Local)
> -	 * is done according RFC2464
> -	 */
> -	ipaddr->s6_addr[8] ^= 0x02;
>  }
>
>  #ifdef DEBUG
> diff --git a/net/bluetooth/6lowpan.c b/net/bluetooth/6lowpan.c
> index 0b68cfc..ec89c55 100644
> --- a/net/bluetooth/6lowpan.c
> +++ b/net/bluetooth/6lowpan.c
> @@ -398,37 +398,6 @@ static int chan_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
>  	return err;
>  }
>
> -static u8 get_addr_type_from_eui64(u8 byte)
> -{
> -	/* Is universal(0) or local(1) bit */
> -	return ((byte & 0x02) ? BDADDR_LE_RANDOM : BDADDR_LE_PUBLIC);
> -}
> -
> -static void copy_to_bdaddr(struct in6_addr *ip6_daddr, bdaddr_t *addr)
> -{
> -	u8 *eui64 = ip6_daddr->s6_addr + 8;
> -
> -	addr->b[0] = eui64[7];
> -	addr->b[1] = eui64[6];
> -	addr->b[2] = eui64[5];
> -	addr->b[3] = eui64[2];
> -	addr->b[4] = eui64[1];
> -	addr->b[5] = eui64[0];
> -}
> -
> -static void convert_dest_bdaddr(struct in6_addr *ip6_daddr,
> -				bdaddr_t *addr, u8 *addr_type)
> -{
> -	copy_to_bdaddr(ip6_daddr, addr);
> -
> -	/* We need to toggle the U/L bit that we got from IPv6 address
> -	 * so that we get the proper address and type of the BD address.
> -	 */
> -	addr->b[5] ^= 0x02;
> -
> -	*addr_type = get_addr_type_from_eui64(addr->b[5]);
> -}
> -
>  static int setup_header(struct sk_buff *skb, struct net_device *netdev,
>  			bdaddr_t *peer_addr, u8 *peer_addr_type)
>  {
> @@ -436,8 +405,7 @@ static int setup_header(struct sk_buff *skb, struct net_device *netdev,
>  	struct ipv6hdr *hdr;
>  	struct lowpan_btle_dev *dev;
>  	struct lowpan_peer *peer;
> -	bdaddr_t addr, *any = BDADDR_ANY;
> -	u8 *daddr = any->b;
> +	u8 *daddr;
>  	int err, status = 0;
>
>  	hdr = ipv6_hdr(skb);
> @@ -448,34 +416,24 @@ static int setup_header(struct sk_buff *skb, struct net_device *netdev,
>
>  	if (ipv6_addr_is_multicast(&ipv6_daddr)) {
>  		lowpan_cb(skb)->chan = NULL;
> +		daddr = NULL;
>  	} else {
> -		u8 addr_type;
> +		BT_DBG("dest IP %pI6c", &ipv6_daddr);
>
> -		/* Get destination BT device from skb.
> -		 * If there is no such peer then discard the packet.
> +		/* The packet might be sent to 6lowpan interface
> +		 * because of routing (either via default route
> +		 * or user set route) so get peer according to
> +		 * the destination address.
>  		 */
> -		convert_dest_bdaddr(&ipv6_daddr, &addr, &addr_type);
> -
> -		BT_DBG("dest addr %pMR type %d IP %pI6c", &addr,
> -		       addr_type, &ipv6_daddr);
> -
> -		peer = peer_lookup_ba(dev, &addr, addr_type);
> +		peer = peer_lookup_dst(dev, &ipv6_daddr, skb);
>  		if (!peer) {
> -			/* The packet might be sent to 6lowpan interface
> -			 * because of routing (either via default route
> -			 * or user set route) so get peer according to
> -			 * the destination address.
> -			 */
> -			peer = peer_lookup_dst(dev, &ipv6_daddr, skb);
> -			if (!peer) {
> -				BT_DBG("no such peer %pMR found", &addr);
> -				return -ENOENT;
> -			}
> +			BT_DBG("no such peer");
> +			return -ENOENT;
>  		}
>
>  		daddr = peer->lladdr;
> -		*peer_addr = addr;
> -		*peer_addr_type = addr_type;
> +		peer_addr = &peer->chan->dst;
> +		*peer_addr_type = peer->chan->dst_type;
>  		lowpan_cb(skb)->chan = peer->chan;
>
>  		status = 1;
> @@ -717,14 +675,6 @@ static struct l2cap_chan *chan_create(void)
>  	return chan;
>  }
>
> -static void set_ip_addr_bits(u8 addr_type, u8 *addr)
> -{
> -	if (addr_type == BDADDR_LE_PUBLIC)
> -		*addr |= 0x02;
> -	else
> -		*addr &= ~0x02;
> -}
> -
>  static struct l2cap_chan *add_peer_chan(struct l2cap_chan *chan,
>  					struct lowpan_btle_dev *dev)
>  {
> @@ -741,11 +691,6 @@ static struct l2cap_chan *add_peer_chan(struct l2cap_chan *chan,
>
>  	lowpan_iphc_uncompress_eui48_lladdr(&peer->peer_addr, peer->lladdr);
>
> -	/* IPv6 address needs to have the U/L bit set properly so toggle
> -	 * it back here.
> -	 */
> -	set_ip_addr_bits(chan->dst_type, (u8 *)&peer->peer_addr.s6_addr + 8);
> -
>  	spin_lock(&devices_lock);
>  	INIT_LIST_HEAD(&peer->list);
>  	peer_add(dev, peer);
>

Reviewed-by: Stefan Schmidt <stefan@....samsung.com>

regards
Stefan Schmidt

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ