From: Alan T. DeKok Date: Wed, 8 Apr 2009 14:58:31 +0000 (+0200) Subject: Added md5 xlat X-Git-Tag: release_2_1_7~217 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1ef55e5ddd04b4bb3471d0fd8863fbb347639511;p=thirdparty%2Ffreeradius-server.git Added md5 xlat --- diff --git a/src/main/xlat.c b/src/main/xlat.c index 934b98ce1a2..af5f88370b2 100644 --- a/src/main/xlat.c +++ b/src/main/xlat.c @@ -26,6 +26,7 @@ RCSID("$Id$") #include +#include #include #include @@ -182,7 +183,7 @@ static size_t xlat_packet(void *instance, REQUEST *request, vp = pairfind(vp->next, da->attr)) { count++; } - snprintf(out, outlen, "%d", count); + snprintf(out, outlen, "%d", (int) count); return strlen(out); } @@ -439,6 +440,33 @@ static size_t xlat_debug(UNUSED void *instance, REQUEST *request, } +/* + * Calculate the MD5 hash of a string. + */ +static size_t xlat_md5(UNUSED void *instance, REQUEST *request, + char *fmt, char *out, size_t outlen, + UNUSED RADIUS_ESCAPE_STRING func) +{ + int i; + uint8_t digest[16]; + FR_MD5_CTX ctx; + + fr_MD5Init(&ctx); + fr_MD5Update(&ctx, (void *) fmt, strlen(fmt)); + fr_MD5Final(digest, &ctx); + + if (outlen < 33) { + snprintf(out, outlen, "md5_overflow"); + return strlen(out); + } + + for (i = 0; i < 16; i++) { + snprintf(out + i * 2, 3, "%02x", digest[i]); + } + + return strlen(out); +} + /* * Compare two xlat_t structs, based ONLY on the module name. */ @@ -544,6 +572,11 @@ int xlat_register(const char *module, RAD_XLAT_FUNC func, void *instance) c = xlat_find("debug"); rad_assert(c != NULL); c->internal = TRUE; + + xlat_register("md5", xlat_md5, &xlat_inst[0]); + c = xlat_find("md5"); + rad_assert(c != NULL); + c->internal = TRUE; } /*