diff -urp john-1.7.9.6-c2/src/DES_bs_b.c john-1.7.9.6/src/DES_bs_b.c --- john-1.7.9.6-c2/src/DES_bs_b.c 2012-07-18 03:51:00 +0000 +++ john-1.7.9.6/src/DES_bs_b.c 2012-07-18 09:03:48 +0000 @@ -1455,11 +1455,12 @@ static MAYBE_INLINE void DES_bs_finalize int DES_bs_crypt_LM(int keys_count, struct db_salt *salt) { #if DES_bs_mt + int retval = (salt && salt->bitmap) ? 0 : keys_count; int t, n = (keys_count + (DES_BS_DEPTH - 1)) / DES_BS_DEPTH; #endif #ifdef _OPENMP -#pragma omp parallel for default(none) private(t) shared(n, DES_bs_all_p, keys_count) +#pragma omp parallel for default(none) private(t) shared(retval, n, DES_bs_all_p, keys_count, salt) #endif for_each_t(n) { ARCH_WORD **k; @@ -1558,8 +1559,44 @@ int DES_bs_crypt_LM(int keys_count, stru k += 96; } while (--rounds); + +#if DES_bs_mt + if (!retval) { + int index, start, end; + start = t; +#ifdef __GNUC__ +/* This integer division may be slow - need to revise */ + start /= DES_bs_all_size; +#endif + start *= DES_BS_DEPTH; + end = start + DES_BS_DEPTH; + if (end > keys_count) + end = keys_count; + for (index = start; index < end; index++) { + unsigned int hash = salt->index(index); + if (salt->bitmap[hash / (sizeof(*salt->bitmap) * 8)] & + (1U << (hash % (sizeof(*salt->bitmap) * 8)))) { + struct db_password *pw; + pw = salt->hash[hash >> PASSWORD_HASH_SHR]; + do { + if (DES_bs_cmp_one(pw->binary, 64, index)) { +#pragma omp critical + retval = keys_count; + goto done; + } + } while ((pw = pw->next_hash)); + } + } +done: + ; + } +#endif } +#if DES_bs_mt + return retval; +#else return keys_count; +#endif } #endif