Merged silc_1_1_branch to trunk.
[silc.git] / lib / silccrypt / silccipher.c
index c5b0c4ae67abc5c889bde0ad1b9f5266aa6f5a5d..f7f64600b34633fc788f756d59dfffab5061f143 100644 (file)
@@ -4,7 +4,7 @@
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 1997 - 2006 Pekka Riikonen
+  Copyright (C) 1997 - 2007 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
@@ -35,9 +35,9 @@ SilcDList silc_cipher_list = NULL;
 
 /* Macro to define cipher to cipher list */
 #define SILC_CIPHER_API_DEF(name, cipher, keylen, blocklen, ivlen, mode) \
-{ name, silc_##cipher##_set_key, silc_##cipher##_encrypt,              \
-  silc_##cipher##_decrypt, silc_##cipher##_context_len,                        \
-  keylen, blocklen, ivlen, mode }
+{ name, silc_##cipher##_set_key, silc_##cipher##_set_iv,               \
+  silc_##cipher##_encrypt, silc_##cipher##_decrypt,                    \
+  silc_##cipher##_context_len, keylen, blocklen, ivlen, mode }
 
 /* Static list of ciphers for silc_cipher_register_default(). */
 const SilcCipherObject silc_default_ciphers[] =
@@ -60,12 +60,6 @@ const SilcCipherObject silc_default_ciphers[] =
                      SILC_CIPHER_MODE_CBC),
   SILC_CIPHER_API_DEF("twofish-128-cbc", twofish_cbc, 128, 16, 16,
                      SILC_CIPHER_MODE_CBC),
-  SILC_CIPHER_API_DEF("cast-256-cbc", cast_cbc, 256, 16, 16,
-                     SILC_CIPHER_MODE_CBC),
-  SILC_CIPHER_API_DEF("cast-192-cbc", cast_cbc, 192, 16, 16,
-                     SILC_CIPHER_MODE_CBC),
-  SILC_CIPHER_API_DEF("cast-128-cbc", cast_cbc, 128, 16, 16,
-                     SILC_CIPHER_MODE_CBC),
 #ifdef SILC_DEBUG
   SILC_CIPHER_API_DEF("none", none, 0, 0, 0, 0),
 #endif /* SILC_DEBUG */
@@ -95,11 +89,18 @@ SilcBool silc_cipher_register(const SilcCipherObject *cipher)
   }
 
   new = silc_calloc(1, sizeof(*new));
+  if (!new)
+    return FALSE;
   new->name = strdup(cipher->name);
+  if (!new->name) {
+    silc_free(new);
+    return FALSE;
+  }
   new->key_len = cipher->key_len;
   new->block_len = cipher->block_len;
   new->iv_len = cipher->iv_len;
   new->set_key = cipher->set_key;
+  new->set_iv = cipher->set_iv;
   new->encrypt = cipher->encrypt;
   new->decrypt = cipher->decrypt;
   new->context_len = cipher->context_len;
@@ -214,8 +215,14 @@ SilcBool silc_cipher_alloc(const unsigned char *name, SilcCipher *new_cipher)
 
   if (entry) {
     *new_cipher = silc_calloc(1, sizeof(**new_cipher));
+    if (!(*new_cipher))
+      return FALSE;
     (*new_cipher)->cipher = entry;
     (*new_cipher)->context = silc_calloc(1, entry->context_len());
+    if (!(*new_cipher)->context) {
+      silc_free(*new_cipher);
+      return FALSE;
+    }
     return TRUE;
   }
 
@@ -331,7 +338,9 @@ SilcBool silc_cipher_set_key(SilcCipher cipher, const unsigned char *key,
 
 void silc_cipher_set_iv(SilcCipher cipher, const unsigned char *iv)
 {
-  memcpy(&cipher->iv, iv, cipher->cipher->iv_len);
+  if (iv)
+    memmove(&cipher->iv, iv, cipher->cipher->iv_len);
+  cipher->cipher->set_iv(cipher->context, iv);
 }
 
 /* Returns the IV (initial vector) of the cipher. */