X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilccrypt%2Fsilchmac.c;h=1e9380dbfd1e9a57c1bd26ccca21fcbaab823972;hb=e9374395ec9747bddd3ea0bfd3e5a17717e97b31;hp=2ec0160a08cec5f2d161aa7552ee3dac1a8da035;hpb=70f4f5edbd09621b37a989b8367ed5cd5f8f37ad;p=silc.git diff --git a/lib/silccrypt/silchmac.c b/lib/silccrypt/silchmac.c index 2ec0160a..1e9380db 100644 --- a/lib/silccrypt/silchmac.c +++ b/lib/silccrypt/silchmac.c @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 1999 - 2005 Pekka Riikonen + Copyright (C) 1999 - 2006 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 @@ -18,7 +18,7 @@ */ /* $Id$ */ -#include "silcincludes.h" +#include "silc.h" /* HMAC context */ struct SilcHmacStruct { @@ -31,10 +31,10 @@ struct SilcHmacStruct { unsigned int allocated_hash : 1; /* TRUE if the hash was allocated */ }; -#ifndef SILC_EPOC +#ifndef SILC_SYMBIAN /* List of dynamically registered HMACs. */ SilcDList silc_hmac_list = NULL; -#endif /* SILC_EPOC */ +#endif /* SILC_SYMBIAN */ /* Default hmacs for silc_hmac_register_default(). */ const SilcHmacObject silc_default_hmacs[] = @@ -54,7 +54,7 @@ static void silc_hmac_init_internal(SilcHmac hmac, unsigned char *key, { SilcHash hash = hmac->hash; SilcUInt32 block_len; - unsigned char hvalue[20]; + unsigned char hvalue[SILC_HASH_MAXLEN]; int i; memset(hmac->inner_pad, 0, sizeof(hmac->inner_pad)); @@ -84,9 +84,9 @@ static void silc_hmac_init_internal(SilcHmac hmac, unsigned char *key, /* Registers a new HMAC into the SILC. This function is used at the initialization of the SILC. */ -bool silc_hmac_register(const SilcHmacObject *hmac) +SilcBool silc_hmac_register(const SilcHmacObject *hmac) { -#ifndef SILC_EPOC +#ifndef SILC_SYMBIAN SilcHmacObject *new; SILC_LOG_DEBUG(("Registering new HMAC `%s'", hmac->name)); @@ -102,6 +102,8 @@ bool silc_hmac_register(const SilcHmacObject *hmac) } new = silc_calloc(1, sizeof(*new)); + if (!new) + return FALSE; new->name = strdup(hmac->name); new->len = hmac->len; @@ -110,15 +112,15 @@ bool silc_hmac_register(const SilcHmacObject *hmac) silc_hmac_list = silc_dlist_init(); silc_dlist_add(silc_hmac_list, new); -#endif /* SILC_EPOC */ +#endif /* SILC_SYMBIAN */ return TRUE; } /* Unregister a HMAC from the SILC. */ -bool silc_hmac_unregister(SilcHmacObject *hmac) +SilcBool silc_hmac_unregister(SilcHmacObject *hmac) { -#ifndef SILC_EPOC +#ifndef SILC_SYMBIAN SilcHmacObject *entry; SILC_LOG_DEBUG(("Unregistering HMAC")); @@ -142,7 +144,7 @@ bool silc_hmac_unregister(SilcHmacObject *hmac) } } -#endif /* SILC_EPOC */ +#endif /* SILC_SYMBIAN */ return FALSE; } @@ -150,21 +152,21 @@ bool silc_hmac_unregister(SilcHmacObject *hmac) The application may use this to register the default hmacs if specific hmacs in any specific order is not wanted. */ -bool silc_hmac_register_default(void) +SilcBool silc_hmac_register_default(void) { -#ifndef SILC_EPOC +#ifndef SILC_SYMBIAN int i; for (i = 0; silc_default_hmacs[i].name; i++) silc_hmac_register(&(silc_default_hmacs[i])); -#endif /* SILC_EPOC */ +#endif /* SILC_SYMBIAN */ return TRUE; } -bool silc_hmac_unregister_all(void) +SilcBool silc_hmac_unregister_all(void) { -#ifndef SILC_EPOC +#ifndef SILC_SYMBIAN SilcHmacObject *entry; if (!silc_hmac_list) @@ -176,7 +178,7 @@ bool silc_hmac_unregister_all(void) if (!silc_hmac_list) break; } -#endif /* SILC_EPOC */ +#endif /* SILC_SYMBIAN */ return TRUE; } @@ -185,12 +187,14 @@ bool silc_hmac_unregister_all(void) of the HMAC. If it is NULL then the hash function is allocated and the name of the hash algorithm is derived from the `name'. */ -bool silc_hmac_alloc(const char *name, SilcHash hash, SilcHmac *new_hmac) +SilcBool silc_hmac_alloc(const char *name, SilcHash hash, SilcHmac *new_hmac) { SILC_LOG_DEBUG(("Allocating new HMAC")); /* Allocate the new object */ *new_hmac = silc_calloc(1, sizeof(**new_hmac)); + if (!(*new_hmac)) + return FALSE; if (!hash) { char *tmp = strdup(name), *hname; @@ -214,7 +218,7 @@ bool silc_hmac_alloc(const char *name, SilcHash hash, SilcHmac *new_hmac) (*new_hmac)->hash = hash; -#ifndef SILC_EPOC +#ifndef SILC_SYMBIAN if (silc_hmac_list) { SilcHmacObject *entry; silc_dlist_start(silc_hmac_list); @@ -236,7 +240,7 @@ bool silc_hmac_alloc(const char *name, SilcHash hash, SilcHmac *new_hmac) } } } -#endif /* SILC_EPOC */ +#endif /* SILC_SYMBIAN */ silc_free(*new_hmac); *new_hmac = NULL; @@ -283,9 +287,9 @@ const char *silc_hmac_get_name(SilcHmac hmac) /* Returns TRUE if HMAC `name' is supported. */ -bool silc_hmac_is_supported(const char *name) +SilcBool silc_hmac_is_supported(const char *name) { -#ifndef SILC_EPOC +#ifndef SILC_SYMBIAN SilcHmacObject *entry; if (!name) @@ -305,7 +309,7 @@ bool silc_hmac_is_supported(const char *name) if (!strcmp(silc_default_hmacs[i].name, name)) return TRUE; } -#endif /* SILC_EPOC */ +#endif /* SILC_SYMBIAN */ return FALSE; } @@ -317,7 +321,7 @@ char *silc_hmac_get_supported() char *list = NULL; int len = 0; -#ifndef SILC_EPOC +#ifndef SILC_SYMBIAN if (silc_hmac_list) { silc_dlist_start(silc_hmac_list); while ((entry = silc_dlist_get(silc_hmac_list)) != SILC_LIST_END) { @@ -344,7 +348,7 @@ char *silc_hmac_get_supported() len++; } } -#endif /* SILC_EPOC */ +#endif /* SILC_SYMBIAN */ list[len - 1] = 0; @@ -360,11 +364,22 @@ void silc_hmac_set_key(SilcHmac hmac, const unsigned char *key, memset(hmac->key, 0, hmac->key_len); silc_free(hmac->key); } - hmac->key = silc_calloc(key_len, sizeof(unsigned char)); + hmac->key = silc_malloc(key_len); + if (!hmac->key) + return; hmac->key_len = key_len; memcpy(hmac->key, key, key_len); } +/* Return HMAC key */ + +const unsigned char *silc_hmac_get_key(SilcHmac hmac, SilcUInt32 *key_len) +{ + if (key_len) + *key_len = hmac->key_len; + return (const unsigned char *)hmac->key; +} + /* Create the HMAC. This is thee make_hmac function pointer. This uses the internal key set with silc_hmac_set_key. */ @@ -405,7 +420,7 @@ void silc_hmac_make_truncated(SilcHmac hmac, unsigned char *data, SilcUInt32 truncated_len, unsigned char *return_hash) { - unsigned char hvalue[20]; + unsigned char hvalue[SILC_HASH_MAXLEN]; SILC_LOG_DEBUG(("Making HMAC for message")); @@ -449,7 +464,7 @@ void silc_hmac_final(SilcHmac hmac, unsigned char *return_hash, SilcUInt32 *return_len) { SilcHash hash = hmac->hash; - unsigned char mac[20]; + unsigned char mac[SILC_HASH_MAXLEN]; silc_hash_final(hash, mac); silc_hash_init(hash);