From 6d5a1cb05e497701529b1f4eb3ff836780da63ec Mon Sep 17 00:00:00 2001 From: Stefan Becker Date: Mon, 29 Mar 2010 22:32:26 +0300 Subject: [PATCH] core cleanup: move MD4/MD5 digest calculation to backend --- src/api/sipe-backend.h | 9 ++++++++- src/core/sip-sec-ntlm.c | 20 ++------------------ src/core/sipe-ft.c | 8 ++++---- src/core/sipe-xml-tests.c | 8 +++----- src/core/uuid.c | 10 ++++++---- src/purple/purple-digest.c | 27 +++++++++++++++++++++------ 6 files changed, 44 insertions(+), 38 deletions(-) diff --git a/src/api/sipe-backend.h b/src/api/sipe-backend.h index ca7a808d..ed7d433e 100644 --- a/src/api/sipe-backend.h +++ b/src/api/sipe-backend.h @@ -53,7 +53,14 @@ void sipe_backend_debug(sipe_debug_level level, /** DIGEST *******************************************************************/ -const guchar *sipe_backend_digest_sha1(const guchar *data, gsize length); +#define SIPE_DIGEST_MD4_LENGTH 16 +void sipe_backend_digest_md4(const guchar *data, gsize length, guchar *digest); + +#define SIPE_DIGEST_MD5_LENGTH 16 +void sipe_backend_digest_md5(const guchar *data, gsize length, guchar *digest); + +#define SIPE_DIGEST_SHA1_LENGTH 20 +void sipe_backend_digest_sha1(const guchar *data, gsize length, guchar *digest); /** MARKUP *******************************************************************/ diff --git a/src/core/sip-sec-ntlm.c b/src/core/sip-sec-ntlm.c index ed2ba4f6..e865e877 100644 --- a/src/core/sip-sec-ntlm.c +++ b/src/core/sip-sec-ntlm.c @@ -183,8 +183,6 @@ struct version test_version; /* hard-coded in implementation */ #define NTLMSSP_LN_OR_NT_KEY_LEN 16 #define NTLMSSP_LM_RESP_LEN 24 #define NTLMSSP_SESSION_KEY_LEN 16 -#define MD4_DIGEST_LEN 16 -#define MD5_DIGEST_LEN 16 #define IS_FLAG(flags, flag) (((flags) & (flag)) == (flag)) @@ -428,24 +426,10 @@ RC4K (const unsigned char * k, unsigned long key_len, const unsigned char * d, i } /* out 16 bytes */ -static void -MD4 (const unsigned char * d, int len, unsigned char * result) -{ - PurpleCipherContext * context = purple_cipher_context_new_by_name("md4", NULL); - purple_cipher_context_append(context, (guchar*)d, len); - purple_cipher_context_digest(context, MD4_DIGEST_LEN, (guchar*)result, NULL); - purple_cipher_context_destroy(context); -} +#define MD4(d, len, result) sipe_backend_digest_md4((d), (len), (result)) /* out 16 bytes */ -static void -MD5 (const unsigned char * d, int len, unsigned char * result) -{ - PurpleCipherContext * context = purple_cipher_context_new_by_name("md5", NULL); - purple_cipher_context_append(context, (guchar*)d, len); - purple_cipher_context_digest(context, MD5_DIGEST_LEN, (guchar*)result, NULL); - purple_cipher_context_destroy(context); -} +#define MD5(d, len, result) sipe_backend_digest_md5((d), (len), (result)) /* out 16 bytes */ /* diff --git a/src/core/sipe-ft.c b/src/core/sipe-ft.c index 715cf3d7..2c976df5 100644 --- a/src/core/sipe-ft.c +++ b/src/core/sipe-ft.c @@ -840,10 +840,10 @@ static void sipe_cipher_context_init(PurpleCipherContext **rc4_context, const gu * 2.) Decrypt-Data = RC4 (Encrypt-Data, substr(SHA1-Key, 0, 15)); Decryption of encrypted data, used 16 bytes SHA1-Key; */ - const guchar *k2; + guchar k2[SIPE_DIGEST_SHA1_LENGTH]; /* 1.) SHA1 sum */ - k2 = sipe_backend_digest_sha1(enc_key, SIPE_FT_KEY_LENGTH); + sipe_backend_digest_sha1(enc_key, SIPE_FT_KEY_LENGTH, k2); /* 2.) RC4 decryption */ *rc4_context = purple_cipher_context_new_by_name("rc4", NULL); @@ -862,10 +862,10 @@ static void sipe_hmac_context_init(PurpleCipherContext **hmac_context, const guc * 2.) MAC = HMAC_SHA1 (Decrypt-Data, substr(HMAC-Key,0,15)); Digest of decrypted file and SHA1-Key (used again only 16 bytes) */ - const guchar *k2; + guchar k2[SIPE_DIGEST_SHA1_LENGTH]; /* 1.) SHA1 sum */ - k2 = sipe_backend_digest_sha1(hash_key, SIPE_FT_KEY_LENGTH); + sipe_backend_digest_sha1(hash_key, SIPE_FT_KEY_LENGTH, k2); /* 2.) HMAC (initialization only) */ *hmac_context = purple_cipher_context_new_by_name("hmac", NULL); diff --git a/src/core/sipe-xml-tests.c b/src/core/sipe-xml-tests.c index e0da552f..ecc39545 100644 --- a/src/core/sipe-xml-tests.c +++ b/src/core/sipe-xml-tests.c @@ -50,11 +50,9 @@ void sipe_backend_debug(sipe_debug_level level, g_free(msg); } -const guchar *sipe_backend_digest_sha1(SIPE_UNUSED_PARAMETER const guchar *data, - SIPE_UNUSED_PARAMETER gsize length) -{ - return(NULL); -} +void sipe_backend_digest_sha1(SIPE_UNUSED_PARAMETER const guchar *data, + SIPE_UNUSED_PARAMETER gsize length, + SIPE_UNUSED_PARAMETER guchar *digest) {} const gchar *sipe_backend_network_ip_address(void) { return(NULL); } /* test helpers */ diff --git a/src/core/uuid.c b/src/core/uuid.c index c5cca72a..3c9b7d5d 100644 --- a/src/core/uuid.c +++ b/src/core/uuid.c @@ -100,6 +100,7 @@ char *generateUUIDfromEPID(const gchar *epid) { uuid_t result; char buf[512]; + guchar digest[SIPE_DIGEST_SHA1_LENGTH]; readUUID(epid_ns_uuid, &result); @@ -110,8 +111,8 @@ char *generateUUIDfromEPID(const gchar *epid) memcpy(buf, &result, sizeof(uuid_t)); strcpy(&buf[sizeof(uuid_t)], epid); - createUUIDfromHash(&result, - sipe_backend_digest_sha1((guchar *)buf, strlen(buf))); + sipe_backend_digest_sha1((guchar *)buf, strlen(buf), digest); + createUUIDfromHash(&result, digest); result.time_low = GUINT32_TO_LE(result.time_low); result.time_mid = GUINT16_TO_LE(result.time_mid); @@ -136,14 +137,15 @@ char *sipe_get_epid(const char *self_sip_uri, { /* 6 last digits of hash */ #define SIPE_EPID_HASH_START 14 -#define SIPE_EPID_HASH_END 20 +#define SIPE_EPID_HASH_END SIPE_DIGEST_SHA1_LENGTH #define SIPE_EPID_LENGTH (2 * (SIPE_EPID_HASH_END - SIPE_EPID_HASH_START + 1)) int i,j; char out[SIPE_EPID_LENGTH + 1]; char *buf = g_strdup_printf("%s:%s:%s", self_sip_uri, hostname, ip_address); - const guchar *hash = sipe_backend_digest_sha1((guchar *) buf, strlen(buf)); + guchar hash[SIPE_DIGEST_SHA1_LENGTH]; + sipe_backend_digest_sha1((guchar *) buf, strlen(buf), hash); for (i = SIPE_EPID_HASH_START, j = 0; i < SIPE_EPID_HASH_END; i++, j += 2) { diff --git a/src/purple/purple-digest.c b/src/purple/purple-digest.c index 448208bb..72c88cf7 100644 --- a/src/purple/purple-digest.c +++ b/src/purple/purple-digest.c @@ -25,14 +25,29 @@ #include "sipe-backend.h" -const guchar *sipe_backend_digest_sha1(const guchar *data, gsize length) +static void purple_digest(const gchar *algorithm, + const guchar *data, gsize data_length, + guchar *digest, gsize digest_length) { - static guchar digest[20]; - PurpleCipherContext *ctx = purple_cipher_context_new_by_name("sha1", NULL); - purple_cipher_context_append(ctx, data, length); - purple_cipher_context_digest(ctx, sizeof(digest), digest, NULL); + PurpleCipherContext *ctx = purple_cipher_context_new_by_name(algorithm, NULL); + purple_cipher_context_append(ctx, data, data_length); + purple_cipher_context_digest(ctx, digest_length, digest, NULL); purple_cipher_context_destroy(ctx); - return(digest); +} + +void sipe_backend_digest_md4(const guchar *data, gsize length, guchar *digest) +{ + purple_digest("md4", data, length, digest, SIPE_DIGEST_MD4_LENGTH); +} + +void sipe_backend_digest_md5(const guchar *data, gsize length, guchar *digest) +{ + purple_digest("md5", data, length, digest, SIPE_DIGEST_MD5_LENGTH); +} + +void sipe_backend_digest_sha1(const guchar *data, gsize length, guchar *digest) +{ + purple_digest("sha1", data, length, digest, SIPE_DIGEST_SHA1_LENGTH); } /* -- 2.11.4.GIT