|
|
Message-ID: <CABtNtWG8jsHMR1WpHP006u21sArsUc9eWef8JoXOOUrJOhupPA@mail.gmail.com>
Date: Sat, 22 Aug 2015 09:00:42 +0800
From: Kai Zhao <loverszhao@...il.com>
To: john-dev@...ts.openwall.com
Subject: Re: The cmp_all() of cq
Hi Alexander,
On Sat, Aug 22, 2015 at 2:38 AM, Solar Designer <solar@...nwall.com> wrote:
> Kai,
>
> On Sat, Aug 22, 2015 at 12:26:42AM +0800, Kai Zhao wrote:
>> On Sat, Aug 22, 2015 at 12:23 AM, JimF <jfoug@....net> wrote:
>> > On Fri, 21 Aug 2015 11:14:57 -0500, Kai Zhao <loverszhao@...il.com> wrote:
>> >
>> >> The cmp_all() of cq seems never return 0. Is this right ?
>> >>
>> >> static int cmp_all(void *binary, int count)
>> >> {
>> >> int i = 0;
>> >>
>> >> #if defined(_OPENMP) || MAX_KEYS_PER_CRYPT > 1
>> >> for (i = 0; i < count; ++i)
>> >> #endif
>> >> {
>> >> if ((*(unsigned int*)binary) == *(unsigned
>> >> int*)crypt_key[i])
>> >> return 1;
>> >> }
>> >>
>> >> return count;
>> >> }
>> >
>> >
>> > That looks like a bug to me. self-test does not catch this?!
>>
>> The original --test did not catch this. The new --test-full option
>> catches this.
>
> The above is a real bug (thank you for finding it!), but:
>
> Are you getting many false positives when trying to catch potential
> issues like this?
Yes. There is really false positive. But I only found one that is openssl-enc.
> cmp_all() doesn't necessarily imply that any passwords were cracked.
> It only says that some _might_ have been cracked. So a non-zero return
> when you didn't pass any correct passwords doesn't always indicate that
> there's a bug.
Thanks for explanation. When I test every index with incorrect passwords,
I should check cmp_one() ? If there is one cmp_one() return 1 in this case,
I will report a warning. Is this right ?
Here maybe another bug with keyring. I think the cmp_all() is always return 1.
static int crypt_all(int *pcount, struct db_salt *salt)
{
const int count = *pcount;
int index = 0;
if (any_cracked) {
memset(cracked, 0, cracked_size);
any_cracked = 0;
}
#ifdef _OPENMP
#pragma omp parallel for
#endif
for (index = 0; index < count; index+=MAX_KEYS_PER_CRYPT)
{
int i;
unsigned char (*buffers)[sizeof(cur_salt->ct)];
// This is too big to be on stack. See #1292.
buffers = mem_alloc(MAX_KEYS_PER_CRYPT * sizeof(*buffers));
decrypt_buffer(buffers, index);
for (i = 0; i < MAX_KEYS_PER_CRYPT; ++i) {
if (verify_decrypted_buffer(buffers[i],
cur_salt->crypto_size)) {
cracked[index+i] = 1;
}
#ifdef _OPENMP
#pragma omp atomic
#endif
any_cracked |= 1;
}
MEM_FREE(buffers);
}
return count;
}
static int cmp_all(void *binary, int count)
{
return any_cracked;
}
Thanks,
Kai
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.