[librest] sha: Use GHmac



commit e412da58080eec2e771482e7e4c509b9e71477ff
Author: Timm Bäder <mail baedert org>
Date:   Mon Oct 5 15:06:55 2015 +0200

    sha: Use GHmac
    
    https://bugzilla.gnome.org/show_bug.cgi?id=658725

 rest/sha1.c |   70 ++++++-----------------------------------------------------
 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);
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]