summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimm Bäder <mail@baedert.org>2015-10-05 15:06:55 +0200
committerTimm Bäder <mail@baedert.org>2015-10-05 17:21:08 +0200
commite412da58080eec2e771482e7e4c509b9e71477ff (patch)
tree7232cd141efc474b03c7cec54f0ee177bb9361f4
parent199a39c25355e33f39bfcb0ad2a59401fd20705b (diff)
downloadlibrest-e412da58080eec2e771482e7e4c509b9e71477ff.tar.gz
sha: Use GHmac
https://bugzilla.gnome.org/show_bug.cgi?id=658725
-rw-r--r--rest/sha1.c70
1 files changed, 7 insertions, 63 deletions
diff --git a/rest/sha1.c b/rest/sha1.c
index b2f4f0b..70a61c0 100644
--- a/rest/sha1.c
+++ b/rest/sha1.c
@@ -23,7 +23,6 @@
#include <glib.h>
#include "sha1.h"
-#define SHA1_BLOCK_SIZE 64
#define SHA1_LENGTH 20
/*
@@ -38,71 +37,16 @@
char *
hmac_sha1 (const char *key, const char *message)
{
- GChecksum *checksum;
- char *real_key;
- guchar ipad[SHA1_BLOCK_SIZE];
- guchar opad[SHA1_BLOCK_SIZE];
- guchar inner[SHA1_LENGTH];
- guchar digest[SHA1_LENGTH];
- gsize key_length, inner_length, digest_length;
- int i;
+ GHmac *hmac;
+ gsize digest_length = SHA1_LENGTH;
+ guchar digest[digest_length];
- g_return_val_if_fail (key, NULL);
- g_return_val_if_fail (message, NULL);
+ hmac = g_hmac_new (G_CHECKSUM_SHA1, (guchar *)key, strlen (key));
+ g_hmac_update (hmac, (guchar *)message, -1);
- checksum = g_checksum_new (G_CHECKSUM_SHA1);
+ g_hmac_get_digest (hmac, digest, &digest_length);
- /* If the key is longer than the block size, hash it first */
- if (strlen (key) > SHA1_BLOCK_SIZE) {
- guchar new_key[SHA1_LENGTH];
-
- key_length = sizeof (new_key);
-
- g_checksum_update (checksum, (guchar*)key, strlen (key));
- g_checksum_get_digest (checksum, new_key, &key_length);
- g_checksum_reset (checksum);
-
- real_key = g_memdup (new_key, key_length);
- } else {
- real_key = g_strdup (key);
- key_length = strlen (key);
- }
-
- /* Sanity check the length */
- g_assert (key_length <= SHA1_BLOCK_SIZE);
-
- /* Protect against use of the provided key by NULLing it */
- key = NULL;
-
- /* Stage 1 */
- memset (ipad, 0, sizeof (ipad));
- memset (opad, 0, sizeof (opad));
-
- memcpy (ipad, real_key, key_length);
- memcpy (opad, real_key, key_length);
-
- /* Stage 2 and 5 */
- for (i = 0; i < sizeof (ipad); i++) {
- ipad[i] ^= 0x36;
- opad[i] ^= 0x5C;
- }
-
- /* Stage 3 and 4 */
- g_checksum_update (checksum, ipad, sizeof (ipad));
- g_checksum_update (checksum, (guchar*)message, strlen (message));
- inner_length = sizeof (inner);
- g_checksum_get_digest (checksum, inner, &inner_length);
- g_checksum_reset (checksum);
-
- /* Stage 6 and 7 */
- g_checksum_update (checksum, opad, sizeof (opad));
- g_checksum_update (checksum, inner, inner_length);
-
- digest_length = sizeof (digest);
- g_checksum_get_digest (checksum, digest, &digest_length);
-
- g_checksum_free (checksum);
- g_free (real_key);
+ g_hmac_unref (hmac);
return g_base64_encode (digest, digest_length);
}