X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilcutil.c;h=5d656b78881324c70aa4d0a4c50e234e4d365ad0;hb=32607f5db7ea3393765be5421e754ef191894dd5;hp=c412262452e550c2673c0f49950825bf7f497f7a;hpb=5d5d716793e67191e7d65ff744e90e01042e4165;p=silc.git diff --git a/lib/silcutil/silcutil.c b/lib/silcutil/silcutil.c index c4122624..5d656b78 100644 --- a/lib/silcutil/silcutil.c +++ b/lib/silcutil/silcutil.c @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 1997 - 2006 Pekka Riikonen + Copyright (C) 1997 - 2007 Pekka Riikonen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -119,8 +119,10 @@ int silc_parse_userfqdn(const char *string, if (!user && !fqdn) return 0; - memset(user, 0, user_size); - memset(fqdn, 0, fqdn_size); + if (user) + memset(user, 0, user_size); + if (user) + memset(fqdn, 0, fqdn_size); if (!string) return 0; @@ -236,7 +238,7 @@ char *silc_format(char *fmt, ...) memset(buf, 0, sizeof(buf)); va_start(args, fmt); - vsnprintf(buf, sizeof(buf) - 1, fmt, args); + silc_vsnprintf(buf, sizeof(buf) - 1, fmt, args); va_end(args); return strdup(buf); @@ -467,28 +469,41 @@ SilcBool silc_hash_public_key_compare(void *key1, void *key2, char *silc_fingerprint(const unsigned char *data, SilcUInt32 data_len) { - char fingerprint[64], *cp; - int i; + unsigned char *fingerprint, *cp; + unsigned int len, blocks, i; + + if (!data || !data_len) + return NULL; + + if (data_len >= 256) + data_len = 255; + + /* Align and calculate total length */ + len = ((data_len + 19) / 20) * 20; + blocks = (len / 10); + len = (len * 2) + ((blocks - 1) * 2) + (4 * blocks) + 2 + 1; + + cp = fingerprint = silc_calloc(len, sizeof(*fingerprint)); + if (!cp) + return NULL; - memset(fingerprint, 0, sizeof(fingerprint)); - cp = fingerprint; for (i = 0; i < data_len; i++) { - snprintf(cp, sizeof(fingerprint), "%02X", data[i]); + silc_snprintf(cp, len, "%02X", data[i]); cp += 2; + len -= 2; if ((i + 1) % 2 == 0) - snprintf(cp++, sizeof(fingerprint), " "); - + silc_snprintf(cp++, len--, " "); if ((i + 1) % 10 == 0) - snprintf(cp++, sizeof(fingerprint), " "); + silc_snprintf(cp++, len--, " "); } i--; - if ((i + 1) % 2 == 0) - cp[-2] = 0; if ((i + 1) % 10 == 0) - cp[-1] = 0; + *(--cp) = '\0'; + if ((i + 1) % 2 == 0) + *(--cp) = '\0'; - return strdup(fingerprint); + return fingerprint; } /* Return TRUE if the `data' is ASCII string. */