--- a/libpurple/ciphers/gchecksum.c Sun May 05 13:15:07 2013 +0200 +++ b/libpurple/ciphers/gchecksum.c Sun May 05 14:59:11 2013 +0200 @@ -53,23 +53,24 @@ static gboolean purple_g_checksum_digest(PurpleCipherContext *context, GChecksumType type, - gsize len, guchar *digest, gsize *out_len) + guchar *digest, size_t buff_len) { GChecksum *checksum; - const gssize required_length = g_checksum_type_get_length(type); + const gssize required_len = g_checksum_type_get_length(type); + gsize digest_len = buff_len; checksum = purple_cipher_context_get_data(context); - g_return_val_if_fail(len >= required_length, FALSE); + g_return_val_if_fail(buff_len >= required_len, FALSE); g_return_val_if_fail(checksum != NULL, FALSE); - g_checksum_get_digest(checksum, digest, &len); + g_checksum_get_digest(checksum, digest, &digest_len); + + if (digest_len != required_len) + return FALSE; purple_cipher_context_reset(context, NULL); - if (out_len) - *out_len = len; - return TRUE; } @@ -93,11 +94,16 @@ } \ \ static gboolean \ - lower##_digest(PurpleCipherContext *context, gsize in_len, \ - guchar digest[], size_t *out_len) \ + lower##_digest(PurpleCipherContext *context, guchar digest[], \ + size_t len) \ { \ - return purple_g_checksum_digest(context, (type), in_len, digest, \ - out_len); \ + return purple_g_checksum_digest(context, (type), digest, len); \ + } \ + \ + static size_t \ + lower##_get_digest_size(PurpleCipherContext *context) \ + { \ + return g_checksum_type_get_length((type)); \ } \ \ static PurpleCipherOps camel##Ops = { \ @@ -109,6 +115,7 @@ NULL, /* set iv */ \ purple_g_checksum_append, /* append */ \ lower##_digest, /* digest */ \ + lower##_get_digest_size, /* get digest size */ \ NULL, /* encrypt */ \ NULL, /* decrypt */ \ NULL, /* set salt */ \