X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilccrypt%2Fsilchash.c;h=4bb91087de51a278d8478aefd2cbc773f54a221c;hb=a818c5b5411bbc4436d1c5f011236985c96bb787;hp=4ec556bcbba3d01420ac9ab752a509970c338033;hpb=5abf57fab042a9f9e4ea497cea5cdf6bb170ef62;p=silc.git diff --git a/lib/silccrypt/silchash.c b/lib/silccrypt/silchash.c index 4ec556bc..4bb91087 100644 --- a/lib/silccrypt/silchash.c +++ b/lib/silccrypt/silchash.c @@ -47,6 +47,16 @@ bool silc_hash_register(SilcHashObject *hash) SILC_LOG_DEBUG(("Registering new hash function `%s'", hash->name)); + /* Check for existing */ + if (silc_hash_list) { + SilcHashObject *entry; + silc_dlist_start(silc_hash_list); + while ((entry = silc_dlist_get(silc_hash_list)) != SILC_LIST_END) { + if (!strcmp(entry->name, hash->name)) + return FALSE; + } + } + new = silc_calloc(1, sizeof(*new)); new->name = strdup(hash->name); new->hash_len = hash->hash_len; @@ -144,7 +154,7 @@ void silc_hash_free(SilcHash hash) /* Returns the length of the hash digest. */ -uint32 silc_hash_len(SilcHash hash) +SilcUInt32 silc_hash_len(SilcHash hash) { return hash->hash->hash_len; } @@ -195,7 +205,7 @@ char *silc_hash_get_supported(void) /* Creates the hash value and returns it to the return_hash argument. */ void silc_hash_make(SilcHash hash, const unsigned char *data, - uint32 len, unsigned char *return_hash) + SilcUInt32 len, unsigned char *return_hash) { hash->hash->init(hash->context); hash->hash->update(hash->context, (unsigned char *)data, len); @@ -207,15 +217,23 @@ void silc_hash_make(SilcHash hash, const unsigned char *data, caller. */ char *silc_hash_fingerprint(SilcHash hash, const unsigned char *data, - uint32 data_len) + SilcUInt32 data_len) { + SilcHash new_hash = NULL; unsigned char h[32]; + char *ret; - if (!hash) - silc_hash_alloc("sha1", &hash); + if (!hash) { + silc_hash_alloc("sha1", &new_hash); + hash = new_hash; + } silc_hash_make(hash, data, data_len, h); - return silc_fingerprint(h, hash->hash->hash_len); + ret = silc_fingerprint(h, hash->hash->hash_len); + + if (new_hash != NULL) + silc_hash_free(new_hash); + return ret; } static const char vo[]= "aeiouy"; @@ -227,15 +245,18 @@ static const char co[]= "bcdfghklmnprstvzx"; fingerprint to the babbleprint. */ char *silc_hash_babbleprint(SilcHash hash, const unsigned char *data, - uint32 data_len) + SilcUInt32 data_len) { + SilcHash new_hash = NULL; char *babbleprint; unsigned char hval[32]; unsigned int a, b, c, d, e, check; int i, k, out_len; - if (!hash) - silc_hash_alloc("sha1", &hash); + if (!hash) { + silc_hash_alloc("sha1", &new_hash); + hash = new_hash; + } /* Take fingerprint */ silc_hash_make(hash, data, data_len, hval); @@ -280,5 +301,7 @@ char *silc_hash_babbleprint(SilcHash hash, const unsigned char *data, } babbleprint[k + 3] = co[16]; + if (new_hash != NULL) + silc_hash_free(new_hash); return babbleprint; }