Commit 278fe0c6 authored by Stef Walter's avatar Stef Walter

gchecksum: Add g_compute_checksum_for_bytes()

 * Add a GBytes based version of g_compute_checksum_for_data()
 * Add appropriate tests

https://bugzilla.gnome.org/show_bug.cgi?id=680912
parent dd2ecf74
......@@ -2845,6 +2845,7 @@ g_checksum_get_digest
<SUBSECTION>
g_compute_checksum_for_data
g_compute_checksum_for_string
g_compute_checksum_for_bytes
</SECTION>
<SECTION>
......
......@@ -1462,3 +1462,33 @@ g_compute_checksum_for_string (GChecksumType checksum_type,
return g_compute_checksum_for_data (checksum_type, (const guchar *) str, length);
}
/**
* g_compute_checksum_for_bytes:
* @checksum_type: a #GChecksumType
* @data: binary blob to compute the digest of
*
* Computes the checksum for a binary @data. This is a
* convenience wrapper for g_checksum_new(), g_checksum_get_string()
* and g_checksum_free().
*
* The hexadecimal string returned will be in lower case.
*
* Return value: the digest of the binary data as a string in hexadecimal.
* The returned string should be freed with g_free() when done using it.
*
* Since: 2.34
*/
gchar *
g_compute_checksum_for_bytes (GChecksumType checksum_type,
GBytes *data)
{
gconstpointer byte_data;
gsize length;
g_return_val_if_fail (IS_VALID_TYPE (checksum_type), NULL);
g_return_val_if_fail (data != NULL, NULL);
byte_data = g_bytes_get_data (data, &length);
return g_compute_checksum_for_data (checksum_type, byte_data, length);
}
......@@ -26,6 +26,7 @@
#define __G_CHECKSUM_H__
#include <glib/gtypes.h>
#include <glib/gbytes.h>
G_BEGIN_DECLS
......@@ -81,6 +82,10 @@ gchar *g_compute_checksum_for_string (GChecksumType checksum_t
const gchar *str,
gssize length);
GLIB_AVAILABLE_IN_2_34
gchar *g_compute_checksum_for_bytes (GChecksumType checksum_type,
GBytes *data);
G_END_DECLS
#endif /* __G_CHECKSUM_H__ */
......@@ -169,6 +169,7 @@ g_checksum_get_string
g_checksum_get_digest
g_compute_checksum_for_data
g_compute_checksum_for_string
g_compute_checksum_for_bytes
g_completion_add_items
g_completion_clear_items
g_completion_complete
......
......@@ -700,12 +700,12 @@ test_checksum_reset (gconstpointer d)
typedef struct {
GChecksumType checksum_type;
const gchar **sums;
} ChecksumStringTest;
} ChecksumComputeTest;
static void
test_checksum_string (gconstpointer d)
{
const ChecksumStringTest *test = d;
const ChecksumComputeTest *test = d;
int length;
gchar *checksum;
......@@ -725,6 +725,25 @@ test_checksum_string (gconstpointer d)
g_free (checksum);
}
static void
test_checksum_bytes (gconstpointer d)
{
const ChecksumComputeTest *test = d;
GBytes *input;
int length;
gchar *checksum;
for (length = 0; length <= FIXED_LEN; length++)
{
input = g_bytes_new_static (FIXED_STR, length);
checksum = g_compute_checksum_for_bytes (test->checksum_type, input);
g_bytes_unref (input);
g_assert_cmpstr (checksum, ==, test->sums[length]);
g_free (checksum);
}
}
static void
add_checksum_test (GChecksumType type,
const char *type_name,
......@@ -750,9 +769,9 @@ add_checksum_string_test (GChecksumType type,
const gchar *type_name,
const gchar **sums)
{
ChecksumStringTest *test;
ChecksumComputeTest *test;
gchar *path;
test = g_new0 (ChecksumStringTest, 1);
test = g_new0 (ChecksumComputeTest, 1);
test->checksum_type = type;
test->sums = sums;
path = g_strdup_printf ("/checksum/%s/string", type_name);
......@@ -760,6 +779,21 @@ add_checksum_string_test (GChecksumType type,
g_free (path);
}
static void
add_checksum_bytes_test (GChecksumType type,
const gchar *type_name,
const gchar **sums)
{
ChecksumComputeTest *test;
gchar *path;
test = g_new0 (ChecksumComputeTest, 1);
test->checksum_type = type;
test->sums = sums;
path = g_strdup_printf ("/checksum/%s/bytes", type_name);
g_test_add_data_func (path, test, test_checksum_bytes);
g_free (path);
}
static void
test_unsupported (void)
{
......@@ -779,14 +813,17 @@ main (int argc, char *argv[])
for (length = 0; length <= FIXED_LEN; length++)
add_checksum_test (G_CHECKSUM_MD5, "MD5", MD5_sums[length], length);
add_checksum_string_test (G_CHECKSUM_MD5, "MD5", MD5_sums);
add_checksum_bytes_test (G_CHECKSUM_MD5, "MD5", MD5_sums);
for (length = 0; length <= FIXED_LEN; length++)
add_checksum_test (G_CHECKSUM_SHA1, "SHA1", SHA1_sums[length], length);
add_checksum_string_test (G_CHECKSUM_SHA1, "SHA1", SHA1_sums);
add_checksum_bytes_test (G_CHECKSUM_SHA1, "SHA1", SHA1_sums);
for (length = 0; length <= FIXED_LEN; length++)
add_checksum_test (G_CHECKSUM_SHA256, "SHA256", SHA256_sums[length], length);
add_checksum_string_test (G_CHECKSUM_SHA256, "SHA256", SHA256_sums);
add_checksum_bytes_test (G_CHECKSUM_SHA256, "SHA256", SHA256_sums);
return g_test_run ();
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment