#include "md5.h"
#include "sha1.h"
+#ifndef SILC_EPOC
/* List of dynamically registered hash functions. */
SilcDList silc_hash_list = NULL;
+#endif /* SILC_EPOC */
/* Default hash functions for silc_hash_register_default(). */
-SilcHashObject silc_default_hash[] =
+const SilcHashObject silc_default_hash[] =
{
{ "sha1", 20, 64, silc_sha1_init, silc_sha1_update, silc_sha1_final,
silc_sha1_transform, silc_sha1_context_len },
/* Registers a new hash function into the SILC. This function is used at
the initialization of the SILC. */
-bool silc_hash_register(SilcHashObject *hash)
+bool silc_hash_register(const SilcHashObject *hash)
{
+#ifndef SILC_EPOC
SilcHashObject *new;
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;
silc_hash_list = silc_dlist_init();
silc_dlist_add(silc_hash_list, new);
+#endif /* SILC_EPOC */
return TRUE;
}
bool silc_hash_unregister(SilcHashObject *hash)
{
+#ifndef SILC_EPOC
SilcHashObject *entry;
SILC_LOG_DEBUG(("Unregistering hash function"));
}
}
+#endif /* SILC_EPOC */
return FALSE;
}
bool silc_hash_register_default(void)
{
+#ifndef SILC_EPOC
int i;
for (i = 0; silc_default_hash[i].name; i++)
silc_hash_register(&(silc_default_hash[i]));
+#endif /* SILC_EPOC */
return TRUE;
}
bool silc_hash_alloc(const unsigned char *name, SilcHash *new_hash)
{
- SilcHashObject *entry;
+ SilcHashObject *entry = NULL;
SILC_LOG_DEBUG(("Allocating new hash object"));
+#ifndef SILC_EPOC
if (silc_hash_list) {
silc_dlist_start(silc_hash_list);
while ((entry = silc_dlist_get(silc_hash_list)) != SILC_LIST_END) {
- if (!strcmp(entry->name, name)) {
- *new_hash = silc_calloc(1, sizeof(**new_hash));
- (*new_hash)->hash = entry;
- (*new_hash)->context = silc_calloc(1, entry->context_len());
- (*new_hash)->make_hash = silc_hash_make;
- return TRUE;
+ if (!strcmp(entry->name, name))
+ break;
+ }
+ }
+#else
+ {
+ /* On EPOC which don't have globals we check our constant hash list. */
+ int i;
+ for (i = 0; silc_default_hash[i].name; i++) {
+ if (!strcmp(silc_default_hash[i].name, name)) {
+ entry = (SilcHashObject *)&(silc_default_hash[i]);
+ break;
}
}
}
+#endif /* SILC_EPOC */
+
+ if (entry) {
+ *new_hash = silc_calloc(1, sizeof(**new_hash));
+ (*new_hash)->hash = entry;
+ (*new_hash)->context = silc_calloc(1, entry->context_len());
+ (*new_hash)->make_hash = silc_hash_make;
+ return TRUE;
+ }
return FALSE;
}
/* Returns the length of the hash digest. */
-uint32 silc_hash_len(SilcHash hash)
+SilcUInt32 silc_hash_len(SilcHash hash)
{
return hash->hash->hash_len;
}
bool silc_hash_is_supported(const unsigned char *name)
{
+#ifndef SILC_EPOC
SilcHashObject *entry;
if (silc_hash_list) {
return TRUE;
}
}
-
+#else
+ {
+ int i;
+ for (i = 0; silc_default_hash[i].name; i++)
+ if (!strcmp(silc_default_hash[i].name, name))
+ return TRUE;
+ }
+#endif /* SILC_EPOC */
return FALSE;
}
{
SilcHashObject *entry;
char *list = NULL;
- int len;
+ int len = 0;
- len = 0;
+#ifndef SILC_EPOC
if (silc_hash_list) {
silc_dlist_start(silc_hash_list);
while ((entry = silc_dlist_get(silc_hash_list)) != SILC_LIST_END) {
memcpy(list + len, ",", 1);
len++;
}
- list[len - 1] = 0;
}
+#else
+ {
+ int i;
+ for (i = 0; silc_default_hash[i].name; i++) {
+ entry = (SilcHashObject *)&(silc_default_hash[i]);
+ len += strlen(entry->name);
+ list = silc_realloc(list, len + 1);
+
+ memcpy(list + (len - strlen(entry->name)),
+ entry->name, strlen(entry->name));
+ memcpy(list + len, ",", 1);
+ len++;
+ }
+ }
+#endif /* SILC_EPOC */
+
+ list[len - 1] = 0;
return list;
}
/* 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);
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";
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);
}
babbleprint[k + 3] = co[16];
+ if (new_hash != NULL)
+ silc_hash_free(new_hash);
return babbleprint;
}