From 3a809ccdc695adc9943688da5d362f50b0e98587 Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Sat, 4 Nov 2006 20:29:09 +0000 Subject: [PATCH] Added silc_cipher_get_iv_len and IV length into the cipher context. --- lib/silccrypt/silccipher.c | 78 ++++++++++++++++++++------------------ lib/silccrypt/silccipher.h | 21 ++++++++-- 2 files changed, 59 insertions(+), 40 deletions(-) diff --git a/lib/silccrypt/silccipher.c b/lib/silccrypt/silccipher.c index d8b73215..c340e255 100644 --- a/lib/silccrypt/silccipher.c +++ b/lib/silccrypt/silccipher.c @@ -36,43 +36,47 @@ SilcDList silc_cipher_list = NULL; /* Static list of ciphers for silc_cipher_register_default(). */ const SilcCipherObject silc_default_ciphers[] = { - { "aes-256-cbc", 16, 256, silc_aes_set_key, - silc_aes_set_key_with_string, silc_aes_encrypt_cbc, - silc_aes_decrypt_cbc, silc_aes_context_len }, - { "aes-192-cbc", 16, 192, silc_aes_set_key, - silc_aes_set_key_with_string, silc_aes_encrypt_cbc, - silc_aes_decrypt_cbc, silc_aes_context_len }, - { "aes-128-cbc", 16, 128, silc_aes_set_key, - silc_aes_set_key_with_string, silc_aes_encrypt_cbc, - silc_aes_decrypt_cbc, silc_aes_context_len }, - { "twofish-256-cbc", 16, 256, silc_twofish_set_key, - silc_twofish_set_key_with_string, + { "aes-256-cbc", silc_aes_set_key, silc_aes_set_key_with_string, + silc_aes_encrypt_cbc, silc_aes_decrypt_cbc, silc_aes_context_len, + 256, 16, 16 }, + { "aes-192-cbc", silc_aes_set_key, silc_aes_set_key_with_string, + silc_aes_encrypt_cbc, silc_aes_decrypt_cbc, silc_aes_context_len, + 192, 16, 16 }, + { "aes-128-cbc", silc_aes_set_key, silc_aes_set_key_with_string, + silc_aes_encrypt_cbc, silc_aes_decrypt_cbc, silc_aes_context_len, + 128, 16, 16 }, + { "twofish-256-cbc", silc_twofish_set_key, silc_twofish_set_key_with_string, silc_twofish_encrypt_cbc, silc_twofish_decrypt_cbc, - silc_twofish_context_len }, - { "twofish-192-cbc", 16, 192, silc_twofish_set_key, - silc_twofish_set_key_with_string, + silc_twofish_context_len, + 256, 16, 16 }, + { "twofish-192-cbc", silc_twofish_set_key, silc_twofish_set_key_with_string, silc_twofish_encrypt_cbc, silc_twofish_decrypt_cbc, - silc_twofish_context_len }, - { "twofish-128-cbc", 16, 128, silc_twofish_set_key, - silc_twofish_set_key_with_string, + silc_twofish_context_len, + 192, 16, 16 }, + { "twofish-128-cbc", silc_twofish_set_key, silc_twofish_set_key_with_string, silc_twofish_encrypt_cbc, silc_twofish_decrypt_cbc, - silc_twofish_context_len }, - { "cast-256-cbc", 16, 256, silc_cast_set_key, silc_cast_set_key_with_string, + silc_twofish_context_len, + 128, 16, 16 }, + { "cast-256-cbc", silc_cast_set_key, silc_cast_set_key_with_string, silc_cast_encrypt_cbc, silc_cast_decrypt_cbc, - silc_cast_context_len }, - { "cast-192-cbc", 16, 192, silc_cast_set_key, silc_cast_set_key_with_string, + silc_cast_context_len, + 256, 16, 16 }, + { "cast-192-cbc", silc_cast_set_key, silc_cast_set_key_with_string, silc_cast_encrypt_cbc, silc_cast_decrypt_cbc, - silc_cast_context_len }, - { "cast-128-cbc", 16, 128, silc_cast_set_key, silc_cast_set_key_with_string, + silc_cast_context_len, + 192, 16, 16 }, + { "cast-128-cbc", silc_cast_set_key, silc_cast_set_key_with_string, silc_cast_encrypt_cbc, silc_cast_decrypt_cbc, - silc_cast_context_len }, + silc_cast_context_len, + 128, 16, 16 }, #ifdef SILC_DEBUG - { "none", 0, 0, silc_none_set_key, silc_none_set_key_with_string, + { "none", silc_none_set_key, silc_none_set_key_with_string, silc_none_encrypt_cbc, silc_none_decrypt_cbc, - silc_none_context_len }, + silc_none_context_len, + 0, 0, 0 }, #endif /* SILC_DEBUG */ - { NULL, 0, 0, NULL, NULL, NULL, NULL, NULL } + { NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0 } }; /* Register a new cipher into SILC. This is used at the initialization of @@ -99,8 +103,9 @@ SilcBool silc_cipher_register(const SilcCipherObject *cipher) new = silc_calloc(1, sizeof(*new)); new->name = strdup(cipher->name); - new->block_len = cipher->block_len; 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_key_with_string = cipher->set_key_with_string; new->encrypt = cipher->encrypt; @@ -307,9 +312,7 @@ SilcBool silc_cipher_encrypt(SilcCipher cipher, const unsigned char *src, unsigned char *dst, SilcUInt32 len, unsigned char *iv) { -#ifdef SILC_DEBUG - assert((len & (cipher->cipher->block_len - 1)) == 0); -#endif + SILC_ASSERT((len & (cipher->cipher->block_len - 1)) == 0); if (len & (cipher->cipher->block_len - 1)) return FALSE; return cipher->cipher->encrypt(cipher->context, src, dst, len, @@ -322,9 +325,6 @@ SilcBool silc_cipher_decrypt(SilcCipher cipher, const unsigned char *src, unsigned char *dst, SilcUInt32 len, unsigned char *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, @@ -343,8 +343,7 @@ SilcBool silc_cipher_set_key(SilcCipher cipher, const unsigned char *key, void silc_cipher_set_iv(SilcCipher cipher, const unsigned char *iv) { - memset(&cipher->iv, 0, sizeof(cipher->iv)); - memcpy(&cipher->iv, iv, cipher->cipher->block_len); + memcpy(&cipher->iv, iv, cipher->cipher->iv_len); } /* Returns the IV (initial vector) of the cipher. */ @@ -368,6 +367,13 @@ SilcUInt32 silc_cipher_get_block_len(SilcCipher cipher) return cipher->cipher->block_len; } +/* Returns the IV length of the cipher. */ + +SilcUInt32 silc_cipher_get_iv_len(SilcCipher cipher) +{ + return cipher->cipher->iv_len; +} + /* Returns the name of the cipher */ const char *silc_cipher_get_name(SilcCipher cipher) diff --git a/lib/silccrypt/silccipher.h b/lib/silccrypt/silccipher.h index 472b0ab8..f571b03a 100644 --- a/lib/silccrypt/silccipher.h +++ b/lib/silccrypt/silccipher.h @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 1997 - 2005 Pekka Riikonen + Copyright (C) 1997 - 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 @@ -49,9 +49,6 @@ typedef struct SilcCipherStruct *SilcCipher; /* The default SILC Cipher object to represent any cipher in SILC. */ typedef struct { char *name; - SilcUInt32 block_len; - SilcUInt32 key_len; - SilcBool (*set_key)(void *, const unsigned char *, SilcUInt32); SilcBool (*set_key_with_string)(void *, const unsigned char *, SilcUInt32); SilcBool (*encrypt)(void *, const unsigned char *, unsigned char *, @@ -59,6 +56,9 @@ typedef struct { SilcBool (*decrypt)(void *, const unsigned char *, unsigned char *, SilcUInt32, unsigned char *); SilcUInt32 (*context_len)(); + unsigned int key_len : 12; + unsigned int block_len : 10; + unsigned int iv_len : 10; } SilcCipherObject; #define SILC_CIPHER_MAX_IV_SIZE 16 @@ -339,6 +339,19 @@ SilcUInt32 silc_cipher_get_key_len(SilcCipher cipher); ***/ SilcUInt32 silc_cipher_get_block_len(SilcCipher cipher); +/****f* silccrypt/SilcCipherAPI/silc_cipher_get_iv_len + * + * SYNOPSIS + * + * SilcUInt32 silc_cipher_get_iv_len(SilcCipher cipher); + * + * DESCRIPTION + * + * Returns the IV length of the cipher in bytes. + * + ***/ +SilcUInt32 silc_cipher_get_iv_len(SilcCipher cipher); + /****f* silccrypt/SilcCipherAPI/silc_cipher_get_name * * SYNOPSIS -- 2.24.0