Integer type name change.
[silc.git] / lib / silccrypt / silchash.c
index 4d0d27062d1f0485f4d5f81f5b0b677f2e2b2459..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,36 +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)
 {
-  char fingerprint[64], *cp;
+  SilcHash new_hash = NULL;
   unsigned char h[32];
-  int i;
+  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);
-  
-  memset(fingerprint, 0, sizeof(fingerprint));
-  cp = fingerprint;
-  for (i = 0; i < hash->hash->hash_len; i++) {
-    snprintf(cp, sizeof(fingerprint), "%02X", h[i]);
-    cp += 2;
-    
-    if ((i + 1) % 2 == 0)
-      snprintf(cp++, sizeof(fingerprint), " ");
+  ret = silc_fingerprint(h, hash->hash->hash_len);
 
-    if ((i + 1) % 10 == 0)
-      snprintf(cp++, sizeof(fingerprint), " ");
-  }
-  i--;
-  if ((i + 1) % 2 == 0)
-    cp[-2] = 0;
-  if ((i + 1) % 10 == 0)
-    cp[-1] = 0;
-  
-  return strdup(fingerprint);
+  if (new_hash != NULL)
+    silc_hash_free(new_hash);
+  return ret;
 }
 
 static const char vo[]= "aeiouy";
@@ -248,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);
@@ -301,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;
 }