Integer type name change.
[silc.git] / lib / silccrypt / silchash.c
index 4ec556bcbba3d01420ac9ab752a509970c338033..4bb91087de51a278d8478aefd2cbc773f54a221c 100644 (file)
@@ -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;
 }