Added SILC Server library.
[silc.git] / lib / silccrypt / silchmac.c
index d2c50121c8d42632d8e3922d8fd286b022ac830d..6b3abed3dc6376663c76592ccf48b813dccea4a0 100644 (file)
@@ -1,10 +1,10 @@
 /*
 
-  silchmac.c 
+  silchmac.c
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  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
 */
 /* $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(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"));
 
@@ -220,7 +220,7 @@ bool silc_hmac_alloc(const 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);