--- a/libpurple/util.c Wed Sep 28 15:42:32 2016 -0500 +++ b/libpurple/util.c Wed Sep 28 15:45:05 2016 -0500 @@ -18,7 +18,6 @@ */ #include "internal.h" -#include "ciphers/md5hash.h" #include "conversation.h" #include "core.h" #include "debug.h" @@ -4799,9 +4798,8 @@ const gchar *nonce, const gchar *client_nonce) { - PurpleHash *hasher; - gchar hash[33]; /* We only support MD5. */ - gboolean digest_ok; + GChecksum *hasher; + gchar *hash; g_return_val_if_fail(username != NULL, NULL); g_return_val_if_fail(realm != NULL, NULL); @@ -4814,18 +4812,19 @@ g_ascii_strcasecmp(algorithm, "MD5") || g_ascii_strcasecmp(algorithm, "MD5-sess"), NULL); - hasher = purple_md5_hash_new(); - g_return_val_if_fail(hash != NULL, NULL); - - purple_hash_append(hasher, (guchar *)username, strlen(username)); - purple_hash_append(hasher, (guchar *)":", 1); - purple_hash_append(hasher, (guchar *)realm, strlen(realm)); - purple_hash_append(hasher, (guchar *)":", 1); - purple_hash_append(hasher, (guchar *)password, strlen(password)); + hasher = g_checksum_new(G_CHECKSUM_MD5); + g_return_val_if_fail(hasher != NULL, NULL); + + g_checksum_update(hasher, (guchar *)username, -1); + g_checksum_update(hasher, (guchar *)":", 1); + g_checksum_update(hasher, (guchar *)realm, -1); + g_checksum_update(hasher, (guchar *)":", 1); + g_checksum_update(hasher, (guchar *)password, -1); if (algorithm != NULL && !g_ascii_strcasecmp(algorithm, "MD5-sess")) { guchar digest[16]; + gsize digest_len = 16; if (client_nonce == NULL) { @@ -4834,22 +4833,20 @@ return NULL; } - purple_hash_digest(hasher, digest, sizeof(digest)); - - purple_hash_reset(hasher); - purple_hash_append(hasher, digest, sizeof(digest)); - purple_hash_append(hasher, (guchar *)":", 1); - purple_hash_append(hasher, (guchar *)nonce, strlen(nonce)); - purple_hash_append(hasher, (guchar *)":", 1); - purple_hash_append(hasher, (guchar *)client_nonce, strlen(client_nonce)); + g_checksum_get_digest(hasher, digest, &digest_len); + + g_checksum_reset(hasher); + g_checksum_update(hasher, digest, sizeof(digest)); + g_checksum_update(hasher, (guchar *)":", 1); + g_checksum_update(hasher, (guchar *)nonce, -1); + g_checksum_update(hasher, (guchar *)":", 1); + g_checksum_update(hasher, (guchar *)client_nonce, -1); } - digest_ok = purple_hash_digest_to_str(hasher, hash, sizeof(hash)); - g_object_unref(hasher); - - g_return_val_if_fail(digest_ok, NULL); - - return g_strdup(hash); + hash = g_strdup(g_checksum_get_string(hasher)); + g_checksum_free(hasher); + + return hash; } gchar *purple_http_digest_calculate_response( @@ -4863,9 +4860,8 @@ const gchar *client_nonce, const gchar *session_key) { - PurpleHash *hash; - static gchar hash2[33]; /* We only support MD5. */ - gboolean digest_ok; + GChecksum *hash; + gchar *hash2; g_return_val_if_fail(method != NULL, NULL); g_return_val_if_fail(digest_uri != NULL, NULL); @@ -4884,85 +4880,83 @@ g_ascii_strcasecmp(qop, "auth") || g_ascii_strcasecmp(qop, "auth-int"), NULL); - hash = purple_md5_hash_new(); + hash = g_checksum_new(G_CHECKSUM_MD5); g_return_val_if_fail(hash != NULL, NULL); - purple_hash_append(hash, (guchar *)method, strlen(method)); - purple_hash_append(hash, (guchar *)":", 1); - purple_hash_append(hash, (guchar *)digest_uri, strlen(digest_uri)); + g_checksum_update(hash, (guchar *)method, -1); + g_checksum_update(hash, (guchar *)":", 1); + g_checksum_update(hash, (guchar *)digest_uri, -1); if (qop != NULL && !g_ascii_strcasecmp(qop, "auth-int")) { - PurpleHash *hash2; - gchar entity_hash[33]; + gchar *entity_hash; if (entity == NULL) { - g_object_unref(hash); + g_checksum_free(hash); purple_debug_error("hash", "Required entity missing for auth-int digest calculation.\n"); return NULL; } - hash2 = purple_md5_hash_new(); - purple_hash_append(hash2, (guchar *)entity, strlen(entity)); - digest_ok = purple_hash_digest_to_str(hash2, entity_hash, sizeof(entity_hash)); - g_object_unref(hash2); - - if (!digest_ok) { - g_object_unref(hash); + entity_hash = g_compute_checksum_for_string(G_CHECKSUM_MD5, + entity, -1); + + if (entity_hash == NULL) { + g_checksum_free(hash); g_return_val_if_reached(NULL); } - purple_hash_append(hash, (guchar *)":", 1); - purple_hash_append(hash, (guchar *)entity_hash, strlen(entity_hash)); + g_checksum_update(hash, (guchar *)":", 1); + g_checksum_update(hash, (guchar *)entity_hash, -1); + g_free(entity_hash); } - digest_ok = purple_hash_digest_to_str(hash, hash2, sizeof(hash2)); - purple_hash_reset(hash); - - if (!digest_ok) { - g_object_unref(hash); + hash2 = g_strdup(g_checksum_get_string(hash)); + g_checksum_reset(hash); + + if (hash2 == NULL) { + g_checksum_free(hash); g_return_val_if_reached(NULL); } - purple_hash_append(hash, (guchar *)session_key, strlen(session_key)); - purple_hash_append(hash, (guchar *)":", 1); - purple_hash_append(hash, (guchar *)nonce, strlen(nonce)); - purple_hash_append(hash, (guchar *)":", 1); + g_checksum_update(hash, (guchar *)session_key, -1); + g_checksum_update(hash, (guchar *)":", 1); + g_checksum_update(hash, (guchar *)nonce, -1); + g_checksum_update(hash, (guchar *)":", 1); if (qop != NULL && *qop != '\0') { if (nonce_count == NULL) { - g_object_unref(hash); + g_checksum_free(hash); purple_debug_error("hash", "Required nonce_count missing for digest calculation.\n"); return NULL; } if (client_nonce == NULL) { - g_object_unref(hash); + g_checksum_free(hash); purple_debug_error("hash", "Required client_nonce missing for digest calculation.\n"); return NULL; } - purple_hash_append(hash, (guchar *)nonce_count, strlen(nonce_count)); - purple_hash_append(hash, (guchar *)":", 1); - purple_hash_append(hash, (guchar *)client_nonce, strlen(client_nonce)); - purple_hash_append(hash, (guchar *)":", 1); - - purple_hash_append(hash, (guchar *)qop, strlen(qop)); - - purple_hash_append(hash, (guchar *)":", 1); + g_checksum_update(hash, (guchar *)nonce_count, -1); + g_checksum_update(hash, (guchar *)":", 1); + g_checksum_update(hash, (guchar *)client_nonce, -1); + g_checksum_update(hash, (guchar *)":", 1); + + g_checksum_update(hash, (guchar *)qop, -1); + + g_checksum_update(hash, (guchar *)":", 1); } - purple_hash_append(hash, (guchar *)hash2, strlen(hash2)); - digest_ok = purple_hash_digest_to_str(hash, hash2, sizeof(hash2)); - g_object_unref(hash); - - g_return_val_if_fail(digest_ok, NULL); - - return g_strdup(hash2); + g_checksum_update(hash, (guchar *)hash2, -1); + g_free(hash2); + + hash2 = g_strdup(g_checksum_get_string(hash)); + g_checksum_free(hash); + + return hash2; } int