Add g_checksum_type_get_length, and change g_checksum_get_digest to use a

2007-12-19  Christian Persch  <chpe@gnome.org>

	* glib/gchecksum.c: (g_checksum_type_get_length),
	(g_checksum_get_digest):
	* glib/gchecksum.h:
	* glib/glib.symbols:
	* tests/checksum-test.c: (test_checksum): Add
	g_checksum_type_get_length, and change g_checksum_get_digest to use a
	provided buffer instead of returning allocated memory. Bug #501853.

svn path=/trunk/; revision=6162
This commit is contained in:
Christian Persch 2007-12-19 18:53:27 +00:00 committed by Christian Persch
parent a979c0d5a2
commit 1ea515d019
6 changed files with 66 additions and 52 deletions

View File

@ -1,3 +1,13 @@
2007-12-19 Christian Persch <chpe@gnome.org>
* glib/gchecksum.c: (g_checksum_type_get_length),
(g_checksum_get_digest):
* glib/gchecksum.h:
* glib/glib.symbols:
* tests/checksum-test.c: (test_checksum): Add
g_checksum_type_get_length, and change g_checksum_get_digest to use a
provided buffer instead of returning allocated memory. Bug #501853.
2007-12-19 Emmanuele Bassi <ebassi@gnome.org> 2007-12-19 Emmanuele Bassi <ebassi@gnome.org>
* glib/gtimer.c (g_time_val_from_iso8601): Fix the date validation * glib/gtimer.c (g_time_val_from_iso8601): Fix the date validation

View File

@ -2530,6 +2530,7 @@ g_uri_unescape_string
<TITLE>Data Checksums</TITLE> <TITLE>Data Checksums</TITLE>
<FILE>checksum</FILE> <FILE>checksum</FILE>
GChecksumType GChecksumType
g_checksum_type_get_length
GChecksum GChecksum
g_checksum_new g_checksum_new
g_checksum_copy g_checksum_copy

View File

@ -1048,6 +1048,41 @@ sha256_sum_digest (Sha256sum *sha256,
* Public API * Public API
*/ */
/**
* g_checksum_type_get_length:
* @checksum_type: a #GChecksumType
*
* Gets the length in bytes of digests of type @type
*
* Return value: the checksum length, or -1 if @type is
* not supported.
*
* Since: 2.16
*/
gssize
g_checksum_type_get_length (GChecksumType checksum_type)
{
gssize len = -1;
switch (checksum_type)
{
case G_CHECKSUM_MD5:
len = MD5_DIGEST_LEN;
break;
case G_CHECKSUM_SHA1:
len = SHA1_DIGEST_LEN;
break;
case G_CHECKSUM_SHA256:
len = SHA256_DIGEST_LEN;
break;
default:
len = -1;
break;
}
return len;
}
/** /**
* g_checksum_new: * g_checksum_new:
* @checksum_type: the desired type of checksum * @checksum_type: the desired type of checksum
@ -1244,8 +1279,9 @@ g_checksum_get_string (GChecksum *checksum)
/** /**
* g_checksum_get_digest: * g_checksum_get_digest:
* @checksum: a #GChecksum * @checksum: a #GChecksum
* @digest: return location for the digest * @digest: output buffer
* @digest_len: return location for the length of the digest, or %NULL * @digest_len: an inout parameter. The caller initializes it to the size of @buffer.
* After the call it contains the length of the digest.
* *
* Gets the digest from @checksum as a raw binary vector and places it * Gets the digest from @checksum as a raw binary vector and places it
* into @digest. The size of the digest depends on the type of checksum. * into @digest. The size of the digest depends on the type of checksum.
@ -1257,16 +1293,17 @@ g_checksum_get_string (GChecksum *checksum)
*/ */
void void
g_checksum_get_digest (GChecksum *checksum, g_checksum_get_digest (GChecksum *checksum,
guint8 **digest, guint8 *buffer,
gsize *digest_len) gsize *digest_len)
{ {
gboolean checksum_open = FALSE; gboolean checksum_open = FALSE;
guint8 *new;
gchar *str = NULL; gchar *str = NULL;
gsize len = 0; gsize len;
g_return_if_fail (checksum != NULL); g_return_if_fail (checksum != NULL);
g_return_if_fail (digest == NULL || *digest == NULL);
len = g_checksum_type_get_length (checksum->type);
g_return_if_fail (*digest_len >= len);
checksum_open = !!(checksum->digest_str == NULL); checksum_open = !!(checksum->digest_str == NULL);
@ -1278,9 +1315,7 @@ g_checksum_get_digest (GChecksum *checksum,
md5_sum_close (&(checksum->sum.md5)); md5_sum_close (&(checksum->sum.md5));
str = md5_sum_to_string (&(checksum->sum.md5)); str = md5_sum_to_string (&(checksum->sum.md5));
} }
new = g_new (guint8, MD5_DIGEST_LEN); md5_sum_digest (&(checksum->sum.md5), buffer);
md5_sum_digest (&(checksum->sum.md5), new);
len = MD5_DIGEST_LEN;
break; break;
case G_CHECKSUM_SHA1: case G_CHECKSUM_SHA1:
if (checksum_open) if (checksum_open)
@ -1288,9 +1323,7 @@ g_checksum_get_digest (GChecksum *checksum,
sha1_sum_close (&(checksum->sum.sha1)); sha1_sum_close (&(checksum->sum.sha1));
str = sha1_sum_to_string (&(checksum->sum.sha1)); str = sha1_sum_to_string (&(checksum->sum.sha1));
} }
new = g_new (guint8, SHA1_DIGEST_LEN); sha1_sum_digest (&(checksum->sum.sha1), buffer);
sha1_sum_digest (&(checksum->sum.sha1), new);
len = SHA1_DIGEST_LEN;
break; break;
case G_CHECKSUM_SHA256: case G_CHECKSUM_SHA256:
if (checksum_open) if (checksum_open)
@ -1298,13 +1331,9 @@ g_checksum_get_digest (GChecksum *checksum,
sha256_sum_close (&(checksum->sum.sha256)); sha256_sum_close (&(checksum->sum.sha256));
str = sha256_sum_to_string (&(checksum->sum.sha256)); str = sha256_sum_to_string (&(checksum->sum.sha256));
} }
new = g_new (guint8, SHA256_DIGEST_LEN); sha256_sum_digest (&(checksum->sum.sha256), buffer);
sha256_sum_digest (&(checksum->sum.sha256), new);
len = SHA256_DIGEST_LEN;
break; break;
default: default:
new = NULL;
len = 0;
g_assert_not_reached (); g_assert_not_reached ();
break; break;
} }
@ -1312,20 +1341,6 @@ g_checksum_get_digest (GChecksum *checksum,
if (str) if (str)
checksum->digest_str = str; checksum->digest_str = str;
if (digest == NULL)
g_free (new);
else
{
if (*digest == NULL)
*digest = new;
else
g_warning ("Digest set on top of a previous digest or uninitialized "
"memory\n"
"This indicates a bug in someone's code. You must ensure "
"a digest is NULL before it's set.");
}
if (digest_len)
*digest_len = len; *digest_len = len;
} }

View File

@ -47,6 +47,8 @@ typedef enum {
typedef struct _GChecksum GChecksum; typedef struct _GChecksum GChecksum;
gssize g_checksum_type_get_length (GChecksumType checksum_type);
GChecksum * g_checksum_new (GChecksumType checksum_type); GChecksum * g_checksum_new (GChecksumType checksum_type);
GChecksum * g_checksum_copy (const GChecksum *checksum); GChecksum * g_checksum_copy (const GChecksum *checksum);
void g_checksum_free (GChecksum *checksum); void g_checksum_free (GChecksum *checksum);
@ -55,7 +57,7 @@ void g_checksum_update (GChecksum *checksum,
gsize length); gsize length);
G_CONST_RETURN gchar *g_checksum_get_string (GChecksum *checksum); G_CONST_RETURN gchar *g_checksum_get_string (GChecksum *checksum);
void g_checksum_get_digest (GChecksum *checksum, void g_checksum_get_digest (GChecksum *checksum,
guint8 **digest, guint8 *buffer,
gsize *digest_len); gsize *digest_len);
gchar *g_compute_checksum_for_data (GChecksumType checksum_type, gchar *g_compute_checksum_for_data (GChecksumType checksum_type,

View File

@ -173,6 +173,7 @@ g_cache_value_foreach
#if IN_HEADER(__G_CHECKSUM_H__) #if IN_HEADER(__G_CHECKSUM_H__)
#if IN_FILE(__G_CHECKSUM_C__) #if IN_FILE(__G_CHECKSUM_C__)
g_checksum_type_get_length
g_checksum_new g_checksum_new
g_checksum_copy g_checksum_copy
g_checksum_free g_checksum_free

View File

@ -48,8 +48,8 @@ test_checksum (GChecksumType checksum_type,
gchar *data; gchar *data;
guchar *p; guchar *p;
gsize data_len; gsize data_len;
guint8 *digest1, *digest2; guint8 digest1[64], digest2[64];
gsize len1, len2; gsize len1 = sizeof (digest1), len2 = sizeof (digest2);
gchar *digest_str1, *digest_str2; gchar *digest_str1, *digest_str2;
checksum0 = g_checksum_new (checksum_type); checksum0 = g_checksum_new (checksum_type);
@ -96,21 +96,8 @@ test_checksum (GChecksumType checksum_type,
g_free (data); g_free (data);
digest1 = NULL; g_checksum_get_digest (checksum1, digest1, &len1);
g_checksum_get_digest (checksum1, &digest1, &len1); g_checksum_get_digest (checksum2, digest2, &len2);
if (!digest1)
{
g_print ("No %s digest found for checksum1\n", type);
exit (1);
}
digest2 = NULL;
g_checksum_get_digest (checksum2, &digest2, &len2);
if (!digest2)
{
g_print ("No %s digest found for checksum2\n", type);
exit (1);
}
digest_str1 = digest_to_string (digest1, len1); digest_str1 = digest_to_string (digest1, len1);
digest_str2 = digest_to_string (digest2, len2); digest_str2 = digest_to_string (digest2, len2);
@ -126,8 +113,6 @@ test_checksum (GChecksumType checksum_type,
g_free (digest_str1); g_free (digest_str1);
g_free (digest_str2); g_free (digest_str2);
g_free (digest1);
g_free (digest2);
digest_str1 = g_strdup (g_checksum_get_string (checksum1)); digest_str1 = g_strdup (g_checksum_get_string (checksum1));
digest_str2 = g_strdup (g_checksum_get_string (checksum2)); digest_str2 = g_strdup (g_checksum_get_string (checksum2));