--- a/libpurple/cipher.c Sun May 05 14:59:11 2013 +0200
+++ b/libpurple/cipher.c Sun May 05 15:37:25 2013 +0200
@@ -108,6 +108,8 @@
caps |= PURPLE_CIPHER_CAPS_GET_SALT_SIZE;
caps |= PURPLE_CIPHER_CAPS_SET_KEY;
+ caps |= PURPLE_CIPHER_CAPS_GET_KEY_SIZE; caps |= PURPLE_CIPHER_CAPS_SET_BATCH_MODE;
@@ -570,6 +572,25 @@
"set_key operation\n", cipher->name);
+purple_cipher_context_get_key_size(PurpleCipherContext *context) { + PurpleCipher *cipher = NULL; + g_return_val_if_fail(context, 0); + cipher = context->cipher; + g_return_val_if_fail(cipher, 0); + if (cipher->ops && cipher->ops->get_key_size) + return cipher->ops->get_key_size(context); + purple_debug_warning("cipher", "the %s cipher does not support " + "the get_key_size operation\n", cipher->name); purple_cipher_context_set_batch_mode(PurpleCipherContext *context,
PurpleCipherBatchMode mode)
--- a/libpurple/cipher.h Sun May 05 14:59:11 2013 +0200
+++ b/libpurple/cipher.h Sun May 05 15:37:25 2013 +0200
@@ -50,24 +50,25 @@
* The operation flags for a cipher
- PURPLE_CIPHER_CAPS_SET_OPT = 1 << 1, /**< Set option flag */
- PURPLE_CIPHER_CAPS_GET_OPT = 1 << 2, /**< Get option flag */
- PURPLE_CIPHER_CAPS_INIT = 1 << 3, /**< Init flag */
- PURPLE_CIPHER_CAPS_RESET = 1 << 4, /**< Reset flag */
- PURPLE_CIPHER_CAPS_UNINIT = 1 << 5, /**< Uninit flag */
- PURPLE_CIPHER_CAPS_SET_IV = 1 << 6, /**< Set IV flag */
- PURPLE_CIPHER_CAPS_APPEND = 1 << 7, /**< Append flag */
- PURPLE_CIPHER_CAPS_DIGEST = 1 << 8, /**< Digest flag */
+ PURPLE_CIPHER_CAPS_SET_OPT = 1 << 1, /**< Set option flag */ + PURPLE_CIPHER_CAPS_GET_OPT = 1 << 2, /**< Get option flag */ + PURPLE_CIPHER_CAPS_INIT = 1 << 3, /**< Init flag */ + PURPLE_CIPHER_CAPS_RESET = 1 << 4, /**< Reset flag */ + PURPLE_CIPHER_CAPS_UNINIT = 1 << 5, /**< Uninit flag */ + PURPLE_CIPHER_CAPS_SET_IV = 1 << 6, /**< Set IV flag */ + PURPLE_CIPHER_CAPS_APPEND = 1 << 7, /**< Append flag */ + PURPLE_CIPHER_CAPS_DIGEST = 1 << 8, /**< Digest flag */ PURPLE_CIPHER_CAPS_GET_DIGEST_SIZE = 1 << 9, /**< The get digest size flag */
- PURPLE_CIPHER_CAPS_ENCRYPT = 1 << 10, /**< Encrypt flag */
- PURPLE_CIPHER_CAPS_DECRYPT = 1 << 11, /**< Decrypt flag */
- PURPLE_CIPHER_CAPS_SET_SALT = 1 << 12, /**< Set salt flag */
- PURPLE_CIPHER_CAPS_GET_SALT_SIZE = 1 << 13, /**< Get salt size flag */
- PURPLE_CIPHER_CAPS_SET_KEY = 1 << 14, /**< Set key flag */
- PURPLE_CIPHER_CAPS_SET_BATCH_MODE = 1 << 15, /**< Set batch mode flag */
- PURPLE_CIPHER_CAPS_GET_BATCH_MODE = 1 << 16, /**< Get batch mode flag */
- PURPLE_CIPHER_CAPS_GET_BLOCK_SIZE = 1 << 17, /**< The get block size flag */
- PURPLE_CIPHER_CAPS_UNKNOWN = 1 << 18 /**< Unknown */
+ PURPLE_CIPHER_CAPS_ENCRYPT = 1 << 10, /**< Encrypt flag */ + PURPLE_CIPHER_CAPS_DECRYPT = 1 << 11, /**< Decrypt flag */ + PURPLE_CIPHER_CAPS_SET_SALT = 1 << 12, /**< Set salt flag */ + PURPLE_CIPHER_CAPS_GET_SALT_SIZE = 1 << 13, /**< Get salt size flag */ + PURPLE_CIPHER_CAPS_SET_KEY = 1 << 14, /**< Set key flag */ + PURPLE_CIPHER_CAPS_GET_KEY_SIZE = 1 << 15, /**< Get key size flag */ + PURPLE_CIPHER_CAPS_SET_BATCH_MODE = 1 << 16, /**< Set batch mode flag */ + PURPLE_CIPHER_CAPS_GET_BATCH_MODE = 1 << 17, /**< Get batch mode flag */ + PURPLE_CIPHER_CAPS_GET_BLOCK_SIZE = 1 << 18, /**< The get block size flag */ + PURPLE_CIPHER_CAPS_UNKNOWN = 1 << 19 /**< Unknown */ @@ -116,6 +117,9 @@
/** The set key function */
void (*set_key)(PurpleCipherContext *context, const guchar *key, size_t len);
+ /** The get key size function */ + size_t (*get_key_size)(PurpleCipherContext *context); /** The set batch mode function */
void (*set_batch_mode)(PurpleCipherContext *context, PurpleCipherBatchMode mode);
@@ -394,6 +398,15 @@
void purple_cipher_context_set_key(PurpleCipherContext *context, const guchar *key, size_t len);
+ * Gets the size of the key if the cipher supports it + * @param context The context whose key size to get + * @return The size of the key +size_t purple_cipher_context_get_key_size(PurpleCipherContext *context); * Sets the batch mode of a context
* @param context The context whose batch mode to set
--- a/libpurple/ciphers/des.c Sun May 05 14:59:11 2013 +0200
+++ b/libpurple/ciphers/des.c Sun May 05 15:37:25 2013 +0200
@@ -351,6 +351,11 @@
+des_get_key_size(PurpleCipherContext *context) * Electronic Codebook Mode DES encryption/decryption of data according
@@ -477,7 +482,7 @@
NULL, /* get salt size */
des_set_key, /* set key */
- NULL, /* get key size */
+ des_get_key_size, /* get key size */ NULL, /* set batch mode */
NULL, /* get batch mode */
NULL, /* get block size */
@@ -527,6 +532,12 @@
+des3_get_key_size(PurpleCipherContext *context) des3_ecb_encrypt(struct _des3_ctx *ctx, const guchar data[],
size_t len, guchar output[], size_t *outlen)
@@ -830,6 +841,7 @@
NULL, /* get salt size */
des3_set_key, /* set key */
+ des3_get_key_size, /* get_key_size */ des3_set_batch, /* set batch mode */
des3_get_batch, /* get batch mode */
NULL, /* get block size */
--- a/libpurple/ciphers/gchecksum.c Sun May 05 14:59:11 2013 +0200
+++ b/libpurple/ciphers/gchecksum.c Sun May 05 15:37:25 2013 +0200
@@ -121,6 +121,7 @@
NULL, /* get salt size */ \
+ NULL, /* get key size */ \ NULL, /* set batch mode */ \
NULL, /* get batch mode */ \
lower##_get_block_size, /* get block size */ \
--- a/libpurple/ciphers/hmac.c Sun May 05 14:59:11 2013 +0200
+++ b/libpurple/ciphers/hmac.c Sun May 05 15:37:25 2013 +0200
@@ -216,6 +216,7 @@
NULL, /* get salt size */
hmac_set_key, /* set key */
+ NULL, /* get key size */ NULL, /* set batch mode */
NULL, /* get batch mode */
hmac_get_block_size, /* get block size */
--- a/libpurple/ciphers/md4.c Sun May 05 14:59:11 2013 +0200
+++ b/libpurple/ciphers/md4.c Sun May 05 15:37:25 2013 +0200
@@ -289,6 +289,7 @@
NULL, /* get salt size */
+ NULL, /* get key size */ NULL, /* set batch mode */
NULL, /* get batch mode */
md4_get_block_size, /* get block size */
--- a/libpurple/ciphers/rc4.c Sun May 05 14:59:11 2013 +0200
+++ b/libpurple/ciphers/rc4.c Sun May 05 15:37:25 2013 +0200
@@ -143,6 +143,7 @@
NULL, /* get salt size */
rc4_set_key, /* set key */
+ NULL, /* get key size */ NULL, /* set batch mode */
NULL, /* get batch mode */
NULL, /* get block size */