libnm: refactor loop in crypto_md5_hash()

Break the loop in the middle and avoid g_checksum_reset() call.
In many cases, we only want one MD5 sum, not a longer digest.
This commit is contained in:
Thomas Haller 2016-11-09 12:03:34 +01:00
parent 30c66b6f79
commit fedee13c37

View file

@ -771,11 +771,10 @@ crypto_md5_hash (const char *salt,
gsize buflen)
{
GChecksum *ctx;
int nkey = buflen;
gsize digest_len;
int count = 0;
char digest[16];
char *p = buffer;
gsize bufidx = 0;
int i;
nm_assert (g_checksum_type_get_length (G_CHECKSUM_MD5) == sizeof (digest));
@ -791,12 +790,7 @@ crypto_md5_hash (const char *salt,
if (password_len < 0)
password_len = strlen (password);
while (nkey > 0) {
int i = 0;
g_checksum_reset (ctx);
if (count++)
g_checksum_update (ctx, (const guchar *) digest, sizeof (digest));
for (;;) {
if (password_len > 0)
g_checksum_update (ctx, (const guchar *) password, password_len);
if (salt_len > 0)
@ -806,12 +800,17 @@ crypto_md5_hash (const char *salt,
g_checksum_get_digest (ctx, (guchar *) digest, &digest_len);
nm_assert (digest_len == sizeof (digest));
while (nkey && (i < sizeof (digest))) {
*(p++) = digest[i++];
nkey--;
for (i = 0; i < sizeof (digest); i++) {
if (bufidx >= buflen)
goto done;
buffer[bufidx++] = digest[i];
}
g_checksum_reset (ctx);
g_checksum_update (ctx, (const guchar *) digest, sizeof (digest));
}
done:
memset (digest, 0, sizeof (digest));
g_checksum_free (ctx);
}