[balsa] Use glib for digest calculations
- From: Peter Bloomfield <peterb src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [balsa] Use glib for digest calculations
- Date: Wed, 4 Jan 2017 00:25:42 +0000 (UTC)
commit df413c511c068a167a27225fe98f85c528dcea7e
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date: Tue Jan 3 19:25:14 2017 -0500
Use glib for digest calculations
* libbalsa/imap/auth-cram.c (imap_auth_cram):
* libbalsa/imap/pop3.c (compute_auth_hash):
ChangeLog | 7 ++++
libbalsa/imap/auth-cram.c | 70 ++------------------------------------------
libbalsa/imap/pop3.c | 28 ++++-------------
3 files changed, 18 insertions(+), 87 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 8b894a6..a09df5f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2017-01-03 Albrecht Dreß
+
+ Use glib for digest calculations
+
+ * libbalsa/imap/auth-cram.c (imap_auth_cram):
+ * libbalsa/imap/pop3.c (compute_auth_hash):
+
2016-12-28 Pawel Salek <pawsa0 gmail com>
* libbalsa/imap/imap-tls.c: avoid warnings with openssl-1.1.x
diff --git a/libbalsa/imap/auth-cram.c b/libbalsa/imap/auth-cram.c
index c29d327..6d95fbc 100644
--- a/libbalsa/imap/auth-cram.c
+++ b/libbalsa/imap/auth-cram.c
@@ -25,7 +25,6 @@
#include <stdlib.h>
#include <string.h>
#include <glib.h>
-#include <openssl/evp.h>
#include "imap-auth.h"
#include "util.h"
@@ -34,21 +33,15 @@
#define LONG_STRING 1024
-#define MD5_DIGEST_LEN 16
-
-/* forward declarations */
-static void hmac_md5(const char* password, char* challenge,
- unsigned char* response);
-
/* imap_auth_cram_md5: AUTH=CRAM-MD5 support. */
ImapResult
imap_auth_cram(ImapMboxHandle* handle)
{
char ibuf[LONG_STRING*2], obuf[LONG_STRING];
- unsigned char hmac_response[MD5_DIGEST_LEN];
unsigned cmdno;
int len, rc, ok;
char *user = NULL, *pass = NULL;
+ gchar *digest;
if (!imap_mbox_handle_can_do(handle, IMCAP_ACRAM_MD5))
return IMAP_AUTH_UNAVAIL;
@@ -101,14 +94,9 @@ imap_auth_cram(ImapMboxHandle* handle)
* around them when the bug report comes in. Until then, we'll remain
* blissfully RFC-compliant.
*/
- hmac_md5 (pass, obuf, hmac_response);
- g_snprintf (obuf, sizeof (obuf),
- "%s %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
- user,
- hmac_response[0], hmac_response[1], hmac_response[2], hmac_response[3],
- hmac_response[4], hmac_response[5], hmac_response[6], hmac_response[7],
- hmac_response[8], hmac_response[9], hmac_response[10], hmac_response[11],
- hmac_response[12], hmac_response[13], hmac_response[14], hmac_response[15]);
+ digest = g_compute_hmac_for_string(G_CHECKSUM_MD5, (const guchar *) pass, strlen(pass), obuf, -1);
+ g_snprintf (obuf, sizeof (obuf), "%s %s", user, digest);
+ g_free(digest);
/* XXX - ibuf must be long enough to store the base64 encoding of obuf,
* plus the additional debris
*/
@@ -124,53 +112,3 @@ imap_auth_cram(ImapMboxHandle* handle)
return rc == IMR_OK ? IMAP_SUCCESS : IMAP_AUTH_FAILURE;
}
-
-/* hmac_md5: produce CRAM-MD5 challenge response. */
-#define MD5_BLOCK_LEN 64
-static void
-hmac_md5 (const char* password, char* challenge,
- unsigned char* response)
-{
- EVP_MD_CTX *ctx = EVP_MD_CTX_create();
- unsigned char ipad[MD5_BLOCK_LEN], opad[MD5_BLOCK_LEN];
- unsigned char secret[MD5_BLOCK_LEN+1];
- unsigned int secret_len, chal_len;
- int i;
-
- secret_len = strlen(password);
- chal_len = strlen(challenge);
-
- /* passwords longer than MD5_BLOCK_LEN bytes are substituted with their MD5
- * digests */
- if (secret_len > MD5_BLOCK_LEN) {
- EVP_DigestInit(ctx, EVP_md5());
- EVP_DigestUpdate(ctx, (const unsigned char*) password, secret_len);
- EVP_DigestFinal(ctx, secret, &secret_len);
- }
- else
- strncpy ((char *) secret, password, sizeof (secret));
-
- memset (ipad, 0, sizeof(ipad));
- memset (opad, 0, sizeof(opad));
- memcpy (ipad, secret, secret_len);
- memcpy (opad, secret, secret_len);
-
- for (i=0; i<MD5_BLOCK_LEN; i++) {
- ipad[i] ^= 0x36;
- opad[i] ^= 0x5c;
- }
-
- /* inner hash: challenge and ipadded secret */
- EVP_DigestInit(ctx, EVP_md5());
- EVP_DigestUpdate(ctx, ipad, MD5_BLOCK_LEN);
- EVP_DigestUpdate(ctx, (unsigned char*) challenge, chal_len);
- EVP_DigestFinal(ctx, response, NULL);
-
- /* outer hash: inner hash and opadded secret */
- EVP_DigestInit(ctx, EVP_md5());
- EVP_DigestUpdate(ctx, opad, MD5_BLOCK_LEN);
- EVP_DigestUpdate(ctx, response, MD5_DIGEST_LEN);
- EVP_DigestFinal(ctx, response, NULL);
-
- EVP_MD_CTX_destroy(ctx);
-}
diff --git a/libbalsa/imap/pop3.c b/libbalsa/imap/pop3.c
index a72ce61..de52327 100644
--- a/libbalsa/imap/pop3.c
+++ b/libbalsa/imap/pop3.c
@@ -28,7 +28,6 @@
#include <unistd.h>
#include <openssl/ssl.h>
-#include <openssl/evp.h>
#include <openssl/err.h>
#include "pop3.h"
@@ -310,26 +309,13 @@ get_apop_stamp(const char *greeting, char *stamp)
static void
compute_auth_hash(char *stamp, char *hash, const char *passwd)
{
- EVP_MD_CTX* ctx = EVP_MD_CTX_create();
- register unsigned char *dp;
- register char *cp;
- unsigned char *ep;
- unsigned char digest[16];
-
- EVP_DigestInit(ctx, EVP_md5());
- EVP_DigestUpdate(ctx, stamp, strlen(stamp));
- EVP_DigestUpdate(ctx, passwd, strlen(passwd));
- EVP_DigestFinal(ctx, digest, NULL);
- EVP_MD_CTX_destroy(ctx);
-
- cp = hash;
- dp = digest;
- for(ep = dp + sizeof(digest)/sizeof(digest[0]); dp < ep; cp += 2) {
- sprintf(cp, "%02x", *dp);
- dp++;
- }
-
- *cp = '\0';
+ GChecksum *ctx;
+
+ ctx = g_checksum_new(G_CHECKSUM_MD5);
+ g_checksum_update(ctx, (const guchar *) stamp, -1);
+ g_checksum_update(ctx, (const guchar *) passwd, -1);
+ strncpy(hash, g_checksum_get_string(ctx), POP_LINE_LEN);
+ g_checksum_free(ctx);
}
static ImapResult
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]