diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/common/md5calc.c | 31 | ||||
-rw-r--r-- | src/common/md5calc.h | 2 |
2 files changed, 32 insertions, 1 deletions
diff --git a/src/common/md5calc.c b/src/common/md5calc.c index 2eea918..6069070 100644 --- a/src/common/md5calc.c +++ b/src/common/md5calc.c @@ -11,7 +11,6 @@ #include <string.h> #include <stdio.h> #include "mt_rand.h" -#include <netinet/in.h> #ifndef UINT_MAX #define UINT_MAX 4294967295U @@ -333,3 +332,33 @@ int pass_ok(const char *password, const char *crypted) { return(0); } +// [M|h]ashes up an IP address and a secret key +// to return a hopefully unique masked IP. +in_addr_t MD5_ip(char *secret, in_addr_t ip) +{ + char ipbuf[32]; + char obuf[16]; + union { + struct bytes { + unsigned char b1; + unsigned char b2; + unsigned char b3; + unsigned char b4; + } bytes; + in_addr_t ip; + } conv; + + // MD5sum a secret + the IP address + memset(&ipbuf, 0, sizeof(ipbuf)); + snprintf(ipbuf, sizeof(ipbuf), "%lu%s", (unsigned long)ip, secret); + MD5_String2binary(ipbuf, obuf); + + // Fold the md5sum to 32 bits, pack the bytes to an in_addr_t + conv.bytes.b1 = obuf[0] ^ obuf[1] ^ obuf[8] ^ obuf[9]; + conv.bytes.b2 = obuf[2] ^ obuf[3] ^ obuf[10] ^ obuf[11]; + conv.bytes.b3 = obuf[4] ^ obuf[5] ^ obuf[12] ^ obuf[13]; + conv.bytes.b4 = obuf[6] ^ obuf[7] ^ obuf[14] ^ obuf[15]; + + return conv.ip; +} + diff --git a/src/common/md5calc.h b/src/common/md5calc.h index 3571466..5994376 100644 --- a/src/common/md5calc.h +++ b/src/common/md5calc.h @@ -1,11 +1,13 @@ // $Id: md5calc.h,v 1.1.1.1 2004/09/10 17:26:54 MagicalTux Exp $ #ifndef _MD5CALC_H_ #define _MD5CALC_H_ +#include <netinet/in.h> void MD5_String (const char *string, char *output); void MD5_String2binary (const char *string, char *output); char *MD5_saltcrypt(const char *key, const char *salt); char *make_salt(); int pass_ok(const char *password, const char *crypted); +in_addr_t MD5_ip(char *secret, in_addr_t ip); #endif |