From mboxrd@z Thu Jan 1 00:00:00 1970 From: Robin Farine To: ecos-discuss@sources.redhat.com Subject: Re: [ECOS] dhcp XID generation Date: Thu, 03 May 2001 10:52:00 -0000 Message-id: <86elu6jpa0.fsf@halftrack.hq.acn-group.ch> References: <86oftajxd4.fsf@halftrack.hq.acn-group.ch> X-SW-Source: 2001-05/msg00040.html Hugo Tyson writes: > Robin Farine writes: > > In a system with a single power supply but many independent boards > > running eCos and using the DHCP client, switching the system on sometimes > > results into some boards configured with the *same* parameters (IP > > address, ...). > > ...and all using the same application binary, so (int)res is the same, > right, I can see that would be a problem. > > > The problem resides in the method used to generate the DHCP request's XID > > field. A solution that seems to work for us follows: > > > > > > 2001-05-03 Robin Farine > > > > * src/lib/dhcp_prot.c (do_dhcp): Uses arc4random() instead of > > cyg_current_time() to generate the XID field to improve randomness. > > > > > > > > Index: packages/net/tcpip/current/src/lib/dhcp_prot.c > > =================================================================== > > RCS file: /usr/cvs/eCos/packages/net/net/tcpip/current/src/lib/dhcp_prot.c,v > > retrieving revision 1.1.1.1 > > retrieving revision 1.2 > > diff -r1.1.1.1 -r1.2 > > 397c397 > > < xid = (cyg_uint32)res + (cyg_uint32)(0xffffffff & cyg_current_time()); > > --- > > > xid = (cyg_uint32)res + (cyg_uint32)arc4random(); > > > > Is that really random enough? (Yes, I know the question has no meaning to > a true mathematician). Yeah, the clock is free-running fast, in general. > > You could just pick up the ESA from ifr.ifr_hwaddr.sa_data at that point, I > believe, to salt the token further. It was set in bring_half_up(), as well > as later on in the routine. Yes right, we could use the two most significant bytes of the ESA as the most significant 16 bits of the XID and the 16 least significant bits of the arc4random() result as the 16 least significant bits of the XID. Something like: Index: packages/net/tcpip/current/src/lib/dhcp_prot.c =================================================================== RCS file: /usr/cvs/eCos/packages/net/net/tcpip/current/src/lib/dhcp_prot.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -r1.1.1.1 -r1.2 397c397,399 < xid = (cyg_uint32)res + (cyg_uint32)(0xffffffff & cyg_current_time()); --- > xid = ((cyg_uint32)ifr.ifr_hwaddr.sa_data[5] << 24) | > ((cyg_uint32)ifr.ifr_hwaddr.sa_data[4] << 16) | > ((cyg_uint32)arc4random() & 0xffff); 2001-05-03 Robin Farine * src/lib/dhcp_prot.c (do_dhcp): Decreases the probability that two clients on a given IP subnet generate the same XID. Robin