libpurple/util.c

changeset 38325
65f1d2b3e04d
parent 38051
2bb56551e37e
child 38334
cb3f85d86752
--- 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

mercurial