Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20150508115831.GA6499@openwall.com>
Date: Fri, 8 May 2015 14:58:31 +0300
From: Aleksey Cherepanov <lyosha@...nwall.com>
To: john-dev@...ts.openwall.com
Subject: Re: get_binary_*() and get_hash_*() methods

On Tue, May 05, 2015 at 10:40:24PM +0200, magnum wrote:
> On 2015-05-05 21:53, Aleksey Cherepanov wrote:
> >Does binary_hash_6() and get_hash_6() functions have to return the
> >same values for the same hashes?
> 
> Yes that's the whole point of these functions, and the self-tests tries to
> verify this.

In dummy.c:

static int get_hash_0(int index)
{
	ARCH_WORD_32 hash = string_hash(saved_key[index]);
	hash ^= hash >> 8;
	return (hash ^ (hash >> 4)) & 0xf;
}
[...]
static int get_hash_4(int index)
{
	return string_hash(saved_key[index]) & 0xfffff;
}

So I think it is ok to have different algorithms in get_hash*() methods.


As Solar Designer told, get_hash*() methods are slow for bitslice.

DES_bs.c:

int DES_bs_get_hash_0(int index)
{
	return DES_bs_get_hash(index, 4, 0);
}
int DES_bs_get_hash_1(int index)
{
	return DES_bs_get_hash(index, 8, 0);
}

static MAYBE_INLINE int DES_bs_get_hash(int index, int count, int trip)
[...]
	result = GET_BIT(0);
	result |= MOVE_BIT(1);
	result |= MOVE_BIT(2);
	result |= MOVE_BIT(3);
	if (count == 4) return result;

	result |= MOVE_BIT(4);
	result |= MOVE_BIT(5);
	result |= MOVE_BIT(6);
	b += trip; /* for tripcodes, skip bit 7 */
	result |= MOVE_BIT(7);
	if (count == 8) return result;

DES_bs_get_hash() collects 'count' bits starting from 0. Though we may
just return bits 0-3 from get_hash_1(), bits 4-7 from get_hash_2()
(i.e. without bits 0-3) and so on not collecting the whole chain of 27
bits (or like that, most probably starting with fewer operators). Or
is it required to return a hash with ~31 bits of information about the
hash from get_hash_6? Or the question may sound differently: are
get_hash[]() methods called sequentially for each binary like the
following algo?

for each index
    if not table_0[get_hash[0](index)]
        next index
    end if
    if not table_1[get_hash[1](index)]
        next index
    end if
    ...
    if not table_6[get_hash[6](index)]
        next index
    end if
    ... most probably hash is matching ...
end for

Thanks!

-- 
Regards,
Aleksey Cherepanov

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.