#include "silcincludes.h"
#include "ciphers.h" /* Includes cipher definitions */
+/* The SilcCipher context */
+struct SilcCipherStruct {
+ SilcCipherObject *cipher;
+ void *context;
+ unsigned char iv[SILC_CIPHER_MAX_IV_SIZE];
+};
+
#ifndef SILC_EPOC
/* Dynamically registered list of ciphers. */
SilcDList silc_cipher_list = NULL;
{ "rc6-128-cbc", 16, 128, silc_rc6_set_key, silc_rc6_set_key_with_string,
silc_rc6_encrypt_cbc, silc_rc6_decrypt_cbc,
silc_rc6_context_len },
- { "mars-256-cbc", 16, 256, silc_mars_set_key, silc_mars_set_key_with_string,
- silc_mars_encrypt_cbc, silc_mars_decrypt_cbc,
- silc_mars_context_len },
- { "mars-192-cbc", 16, 192, silc_mars_set_key, silc_mars_set_key_with_string,
- silc_mars_encrypt_cbc, silc_mars_decrypt_cbc,
- silc_mars_context_len },
- { "mars-128-cbc", 16, 128, silc_mars_set_key, silc_mars_set_key_with_string,
- silc_mars_encrypt_cbc, silc_mars_decrypt_cbc,
- silc_mars_context_len },
{ "cast-256-cbc", 16, 256, silc_cast_set_key, silc_cast_set_key_with_string,
silc_cast_encrypt_cbc, silc_cast_decrypt_cbc,
silc_cast_context_len },
*new_cipher = silc_calloc(1, sizeof(**new_cipher));
(*new_cipher)->cipher = entry;
(*new_cipher)->context = silc_calloc(1, entry->context_len());
- (*new_cipher)->set_iv = silc_cipher_set_iv;
- (*new_cipher)->get_iv = silc_cipher_get_iv;
- (*new_cipher)->get_key_len = silc_cipher_get_key_len;
- (*new_cipher)->get_block_len = silc_cipher_get_block_len;
return TRUE;
}
unsigned char *dst, SilcUInt32 len,
unsigned char *iv)
{
- return cipher->cipher->encrypt(cipher->context, src, dst, len, iv);
+#ifdef SILC_DEBUG
+ assert((len & (cipher->cipher->block_len - 1)) == 0);
+#endif
+ if (len & (cipher->cipher->block_len - 1))
+ return FALSE;
+ return cipher->cipher->encrypt(cipher->context, src, dst, len,
+ iv ? iv : cipher->iv);
}
/* Decrypts */
unsigned char *dst, SilcUInt32 len,
unsigned char *iv)
{
- return cipher->cipher->decrypt(cipher->context, src, dst, len, iv);
+#ifdef SILC_DEBUG
+ assert((len & (cipher->cipher->block_len - 1)) == 0);
+#endif
+ if (len & (cipher->cipher->block_len - 1))
+ return FALSE;
+ return cipher->cipher->decrypt(cipher->context, src, dst, len,
+ iv ? iv : cipher->iv);
}
/* Sets the key for the cipher */
memcpy(&cipher->iv, iv, cipher->cipher->block_len);
}
-/* Returns the IV (initial vector) of the cipher. The IV is returned
- to 'iv' argument. */
+/* Returns the IV (initial vector) of the cipher. */
-void silc_cipher_get_iv(SilcCipher cipher, unsigned char *iv)
+unsigned char *silc_cipher_get_iv(SilcCipher cipher)
{
- memcpy(iv, &cipher->iv, cipher->cipher->block_len);
+ return cipher->iv;
}
/* Returns the key length of the cipher. */
{
return cipher->cipher->block_len;
}
+
+/* Returns the name of the cipher */
+
+const char *silc_cipher_get_name(SilcCipher cipher)
+{
+ return (const char *)cipher->cipher->name;
+}