-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
4 changed files
with
176 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
/* | ||
* iothaddr.c: utility library for ioth address management | ||
* hash (md5sum) based mac and ipv6 host address + eui64 conversion | ||
* | ||
* Copyright 2021 Renzo Davoli - Virtual Square Team | ||
* University of Bologna - Italy | ||
* | ||
* This library is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU Lesser General Public License as published by | ||
* the Free Software Foundation; either version 2.1 of the License, or (at | ||
* your option) any later version. | ||
* | ||
* You should have received a copy of the GNU Lesser General Public License | ||
* along with this library; if not, see <http://www.gnu.org/licenses/>. | ||
* | ||
*/ | ||
|
||
#include <mhash.h> | ||
#include <netinet/in.h> | ||
#include <string.h> | ||
#include <time.h> | ||
#include <iothaddr.h> | ||
|
||
void iothaddr_hash(void *addr, const char *name, const char *passwd, uint32_t otiptime) { | ||
struct in6_addr *addr6 = addr; | ||
size_t namelen = strlen(name); | ||
MHASH td; | ||
char out[mhash_get_block_size(MHASH_MD5)]; | ||
int i; | ||
memset(out, 0, mhash_get_block_size(MHASH_MD5)); | ||
if (name[namelen-1] == '.') namelen--; | ||
td=mhash_init(MHASH_MD5); | ||
mhash(td, name, namelen); | ||
if (passwd != NULL) | ||
mhash(td, passwd, strlen(passwd)); | ||
if (otiptime != 0) { | ||
uint32_t otiptime_n = htonl(otiptime); | ||
mhash(td, &otiptime_n, sizeof(otiptime_n)); | ||
} | ||
mhash_deinit(td, out); | ||
for (i=8; i<16; i++) | ||
addr6->s6_addr[i] ^= out[i-8]; | ||
addr6->s6_addr[8] &= ~0x3; // locally adm, unicast | ||
} | ||
|
||
void iothaddr_hashmac(void *mac, const char *name, const char *passwd) { | ||
unsigned char *umac = mac; | ||
size_t namelen = strlen(name); | ||
MHASH td; | ||
char out[mhash_get_block_size(MHASH_MD5)]; | ||
int i; | ||
memset(out, 0, mhash_get_block_size(MHASH_MD5)); | ||
if (name[namelen-1] == '.') namelen--; | ||
td=mhash_init(MHASH_MD5); | ||
mhash(td, name, namelen); | ||
if (passwd != NULL) | ||
mhash(td, passwd, strlen(passwd)); | ||
mhash_deinit(td, out); | ||
for (i=0; i<3; i++) | ||
umac[i] = out[i]; | ||
for (i=3; i<6; i++) | ||
umac[i] = out[i+2]; | ||
umac[0] |= 0x2; // locally adm | ||
umac[0] &= ~0x1; // unicast | ||
} | ||
|
||
void iothaddr_eui64(void *addr, void *mac) { | ||
struct in6_addr *addr6 = addr; | ||
unsigned char *umac = mac; | ||
int i; | ||
for (i=0; i<3; i++) | ||
addr6->s6_addr[i + 8] = umac[i]; | ||
addr6->s6_addr[11] = 0xff; | ||
addr6->s6_addr[12] = 0xfe; | ||
for (i=3; i<6; i++) | ||
addr6->s6_addr[i + 10] ^= umac[i]; | ||
addr6->s6_addr[8] ^= 0x2; // L bit has inverse meaning. | ||
} | ||
|
||
void iothaddr_hasheui64(void *addr, const char *name, const char *passwd) { | ||
unsigned char mac[6]; | ||
iothaddr_hashmac(mac, name, passwd); | ||
iothaddr_eui64(addr, mac); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
#ifndef IOTHADDR_H | ||
#define IOTHADDR_H | ||
#include <stdint.h> | ||
#include <time.h> | ||
|
||
/* hash based IPv6 address: | ||
the rightmost 64 bits of the address are XORed with the first 64 bit of | ||
the md5sum of the concatenation of: | ||
* name | ||
* passwd, if passwd != NULL | ||
* the big-endian 4 byte representation of otiptime, if otiptime != 0. | ||
bits 71 and 72 of addr are cleared (locally adm unicast address. */ | ||
/* e.g. addr: 2000:760::/64, name = "test.v2.cs.unibo.it", passwd = NULL, otiptime = 0 | ||
the md5sum of "test.v2.cs.unibo.it" is 69d62fac095a5a2ee4c2c79f211e57e3 | ||
The resulting address is 2000:760::68d6:2fac:95a:5a2e */ | ||
void iothaddr_hash(void *addr, const char *name, const char *passwd, uint32_t otiptime); | ||
|
||
/* One Time IP address (OTIP), computation of otiptime: | ||
((seconds since the epoch) / otip_period) + otip_offset. | ||
otip_period is the address expiration period. | ||
otip_offset can be used on servers to anticipate the validity of addresses to tolerate | ||
negative drifts or clients' clocks. */ | ||
static inline uint32_t iothaddr_otiptime(int otip_period, int otip_offset) { | ||
return (uint32_t) ((time(NULL) + otip_offset) / otip_period); | ||
} | ||
|
||
/* hash based mac address | ||
Let H be the md5sum of the concatenation of: | ||
* name | ||
* passwd, if passwd != NULL. | ||
The mac address is set to: | ||
H'[0] : H[1] : H[2] : H[5] : H[6] : H[7] | ||
(the first byte has the 7th bit set and the 8th cleared: locally adm unicast address) | ||
e.g. name = "test.v2.cs.unibo.it", passwd = NULL | ||
the md5sum of "test.v2.cs.unibo.it" is 69d62fac095a5a2ee4c2c79f211e57e3 | ||
the mac address is: 69:d6:2f:5a:5a:2e */ | ||
/* Hash based defined MAC address can avoid delays due to old info in arp tables | ||
for process migration or restarting */ | ||
void iothaddr_hashmac(void *mac, const char *name, const char *passwd); | ||
|
||
/* compute the EUI64 based IPv6 address from the mac address. | ||
the rightmost 64 bits of the address are XORed with the EUI64 extension | ||
of the 6 bytes mac address. */ | ||
void iothaddr_eui64(void *addr, void *mac); | ||
|
||
/* compute the EUI64 based IPv6 address from the hash computed mac address. | ||
This function computes iothaddr_eui64 on the result of iothaddr_hashmac */ | ||
/* e.g. addr: 2000:760::/64, name = "test.v2.cs.unibo.it", passwd = NULL | ||
the md5sum of "test.v2.cs.unibo.it" is 69d62fac095a5a2ee4c2c79f211e57e3 | ||
the mac address is: 69:d6:2f:5a:5a:2e | ||
The resulting address is 2000:760::68d6:2fff:fe5a:5a2e */ | ||
void iothaddr_hasheui64(void *addr, const char *name, const char *passwd); | ||
|
||
#endif |