X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=lib%2Fsilccrypt%2Fsilchmac.c;h=6b3abed3dc6376663c76592ccf48b813dccea4a0;hp=e839956ed6989f1e9e5f9100ea4b512ce2b795ad;hb=40f8443d8d3a6577336ee66d18e04d9ac4d956bb;hpb=2d15b7c948b7f64e5561d2ed5d216fd3389dc347 diff --git a/lib/silccrypt/silchmac.c b/lib/silccrypt/silchmac.c index e839956e..6b3abed3 100644 --- a/lib/silccrypt/silchmac.c +++ b/lib/silccrypt/silchmac.c @@ -1,10 +1,10 @@ /* - silchmac.c + silchmac.c Author: Pekka Riikonen - Copyright (C) 1999 - 2001 Pekka Riikonen + Copyright (C) 1999 - 2005 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,19 +18,17 @@ */ /* $Id$ */ -#include "silcincludes.h" +#include "silc.h" /* HMAC context */ struct SilcHmacStruct { SilcHmacObject *hmac; SilcHash hash; - - unsigned char *key; - SilcUInt32 key_len; - unsigned char inner_pad[64]; unsigned char outer_pad[64]; - bool allocated_hash; /* TRUE if the hash was allocated */ + unsigned char *key; + unsigned int key_len : 31; + unsigned int allocated_hash : 1; /* TRUE if the hash was allocated */ }; #ifndef SILC_EPOC @@ -41,8 +39,10 @@ SilcDList silc_hmac_list = NULL; /* Default hmacs for silc_hmac_register_default(). */ const SilcHmacObject silc_default_hmacs[] = { + { "hmac-sha256-96", 12 }, { "hmac-sha1-96", 12 }, { "hmac-md5-96", 12 }, + { "hmac-sha256", 32 }, { "hmac-sha1", 20 }, { "hmac-md5", 16 }, @@ -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,7 +84,7 @@ 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 SilcHmacObject *new; @@ -116,7 +116,7 @@ bool silc_hmac_register(const SilcHmacObject *hmac) /* Unregister a HMAC from the SILC. */ -bool silc_hmac_unregister(SilcHmacObject *hmac) +SilcBool silc_hmac_unregister(SilcHmacObject *hmac) { #ifndef SILC_EPOC SilcHmacObject *entry; @@ -146,11 +146,11 @@ bool silc_hmac_unregister(SilcHmacObject *hmac) return FALSE; } -/* Function that registers all the default hmacs (all builtin ones). +/* Function that registers all the default hmacs (all builtin ones). 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 int i; @@ -162,7 +162,7 @@ bool silc_hmac_register_default(void) return TRUE; } -bool silc_hmac_unregister_all(void) +SilcBool silc_hmac_unregister_all(void) { #ifndef SILC_EPOC SilcHmacObject *entry; @@ -185,7 +185,7 @@ 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(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")); @@ -220,7 +220,7 @@ bool silc_hmac_alloc(char *name, SilcHash hash, SilcHmac *new_hmac) silc_dlist_start(silc_hmac_list); while ((entry = silc_dlist_get(silc_hmac_list)) != SILC_LIST_END) { if (!strcmp(entry->name, name)) { - (*new_hmac)->hmac = entry; + (*new_hmac)->hmac = entry; return TRUE; } } @@ -283,14 +283,14 @@ 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 SilcHmacObject *entry; if (!name) return FALSE; - + if (silc_hmac_list) { silc_dlist_start(silc_hmac_list); while ((entry = silc_dlist_get(silc_hmac_list)) != SILC_LIST_END) { @@ -323,8 +323,8 @@ char *silc_hmac_get_supported() while ((entry = silc_dlist_get(silc_hmac_list)) != SILC_LIST_END) { len += strlen(entry->name); list = silc_realloc(list, len + 1); - - memcpy(list + (len - strlen(entry->name)), + + memcpy(list + (len - strlen(entry->name)), entry->name, strlen(entry->name)); memcpy(list + len, ",", 1); len++; @@ -337,8 +337,8 @@ char *silc_hmac_get_supported() entry = (SilcHmacObject *)&(silc_default_hmacs[i]); len += strlen(entry->name); list = silc_realloc(list, len + 1); - - memcpy(list + (len - strlen(entry->name)), + + memcpy(list + (len - strlen(entry->name)), entry->name, strlen(entry->name)); memcpy(list + len, ",", 1); len++; @@ -383,7 +383,7 @@ void silc_hmac_make(SilcHmac hmac, unsigned char *data, key. The key is sent as argument to the function. */ void silc_hmac_make_with_key(SilcHmac hmac, unsigned char *data, - SilcUInt32 data_len, + SilcUInt32 data_len, unsigned char *key, SilcUInt32 key_len, unsigned char *return_hash, SilcUInt32 *return_len) @@ -397,7 +397,7 @@ void silc_hmac_make_with_key(SilcHmac hmac, unsigned char *data, /* Creates the HMAC just as above except that the hash value is truncated to the truncated_len sent as argument. NOTE: One should not truncate to - less than half of the length of original hash value. However, this + less than half of the length of original hash value. However, this routine allows these dangerous truncations. */ void silc_hmac_make_truncated(SilcHmac hmac, unsigned char *data, @@ -405,7 +405,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 +449,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);