aboutsummaryrefslogtreecommitdiff
path: root/lib/sha1.c
diff options
context:
space:
mode:
authorJani Nikula <jani@nikula.org>2017-01-06 23:29:27 +0200
committerDavid Bremner <david@tethera.net>2017-01-08 10:50:38 -0400
commitc906da9f60639594fb9c6b9d133aca9c49b3f586 (patch)
treea2040f872fd4ebaf8f08d52a809736689cbfa65f /lib/sha1.c
parent95efe2d4849f218fffd232dd6e10011f0f837878 (diff)
lib: use glib for sha1 digests instead of embedding libsha1
We already depend on glib both directly and indirectly (via gmime). We might as well make use of its facilities. Drop the embedded libsha1 and use glib for sha1 digests.
Diffstat (limited to 'lib/sha1.c')
-rw-r--r--lib/sha1.c69
1 files changed, 24 insertions, 45 deletions
diff --git a/lib/sha1.c b/lib/sha1.c
index b7dea1c2..cb55b49a 100644
--- a/lib/sha1.c
+++ b/lib/sha1.c
@@ -20,28 +20,7 @@
#include "notmuch-private.h"
-#include "libsha1.h"
-
-/* Just some simple interfaces on top of libsha1 so that we can leave
- * libsha1 as untouched as possible. */
-
-static char *
-_hex_of_sha1_digest (const unsigned char digest[SHA1_DIGEST_SIZE])
-{
- char *result, *r;
- int i;
-
- result = xcalloc (SHA1_DIGEST_SIZE * 2 + 1, 1);
-
- for (r = result, i = 0;
- i < SHA1_DIGEST_SIZE;
- r += 2, i++)
- {
- sprintf (r, "%02x", digest[i]);
- }
-
- return result;
-}
+#include <glib.h>
/* Create a hexadecimal string version of the SHA-1 digest of 'str'
* (including its null terminating character).
@@ -52,16 +31,15 @@ _hex_of_sha1_digest (const unsigned char digest[SHA1_DIGEST_SIZE])
char *
_notmuch_sha1_of_string (const char *str)
{
- sha1_ctx sha1;
- unsigned char digest[SHA1_DIGEST_SIZE];
-
- sha1_begin (&sha1);
+ GChecksum *sha1;
+ char *digest;
- sha1_hash ((unsigned char *) str, strlen (str) + 1, &sha1);
+ sha1 = g_checksum_new (G_CHECKSUM_SHA1);
+ g_checksum_update (sha1, (const guchar *) str, strlen (str) + 1);
+ digest = xstrdup (g_checksum_get_string (sha1));
+ g_checksum_free (sha1);
- sha1_end (digest, &sha1);
-
- return _hex_of_sha1_digest (digest);
+ return digest;
}
/* Create a hexadecimal string version of the SHA-1 digest of the
@@ -80,35 +58,36 @@ _notmuch_sha1_of_file (const char *filename)
#define BLOCK_SIZE 4096
unsigned char block[BLOCK_SIZE];
size_t bytes_read;
- sha1_ctx sha1;
- unsigned char digest[SHA1_DIGEST_SIZE];
- char *result;
+ GChecksum *sha1;
+ char *digest = NULL;
file = fopen (filename, "r");
if (file == NULL)
return NULL;
- sha1_begin (&sha1);
+ sha1 = g_checksum_new (G_CHECKSUM_SHA1);
+ if (sha1 == NULL)
+ goto DONE;
while (1) {
bytes_read = fread (block, 1, 4096, file);
if (bytes_read == 0) {
- if (feof (file)) {
+ if (feof (file))
break;
- } else if (ferror (file)) {
- fclose (file);
- return NULL;
- }
+ else if (ferror (file))
+ goto DONE;
} else {
- sha1_hash (block, bytes_read, &sha1);
+ g_checksum_update (sha1, block, bytes_read);
}
}
- sha1_end (digest, &sha1);
-
- result = _hex_of_sha1_digest (digest);
+ digest = xstrdup (g_checksum_get_string (sha1));
- fclose (file);
+ DONE:
+ if (sha1)
+ g_checksum_free (sha1);
+ if (file)
+ fclose (file);
- return result;
+ return digest;
}