mirror of
https://github.com/trustedsec/hate_crack.git
synced 2026-04-28 12:03:11 -07:00
94 lines
3.4 KiB
Python
94 lines
3.4 KiB
Python
"""Tests for optimized kernel system - covers gaps not in test_main_utils.py::TestOptimizedKernel."""
|
|
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
import pytest
|
|
|
|
|
|
@pytest.fixture
|
|
def main_module(hc_module):
|
|
return hc_module._main
|
|
|
|
|
|
class TestOptimizedKernelMissingNames:
|
|
"""Covers the two DEFAULT_OPTIMIZED_ATTACKS names missing from test_main_utils.py."""
|
|
|
|
@pytest.mark.parametrize(
|
|
"attack_name",
|
|
[
|
|
"hcatAdHocMask",
|
|
"hcatMarkovBruteForce",
|
|
],
|
|
)
|
|
def test_optimized_attacks_return_true(self, main_module, attack_name):
|
|
assert main_module._should_use_optimized_kernel(attack_name) is True
|
|
|
|
|
|
class TestOptimizedKernelNonMembers:
|
|
"""Covers False cases not already parametrized in test_main_utils.py."""
|
|
|
|
@pytest.mark.parametrize(
|
|
"attack_name",
|
|
[
|
|
"hcatOllama",
|
|
"hcatNgramX",
|
|
"hcatGenerateRules",
|
|
"hcatMarkovTrain",
|
|
"hcatOmenTrain",
|
|
"unknown_attack",
|
|
],
|
|
)
|
|
def test_non_optimized_attacks_return_false(self, main_module, attack_name):
|
|
assert main_module._should_use_optimized_kernel(attack_name) is False
|
|
|
|
|
|
class TestHcatFingerprintOptimizedFlag:
|
|
"""End-to-end mock test verifying hcatFingerprint passes -O to hashcat."""
|
|
|
|
def test_fingerprint_includes_optimized_flag(self, main_module, tmp_path):
|
|
hash_file = tmp_path / "hashes.txt"
|
|
hash_file.write_text("")
|
|
(tmp_path / "hashes.txt.out").write_text("")
|
|
# hcatFingerprint opens .working and .expanded inside the loop; create them.
|
|
(tmp_path / "hashes.txt.working").write_text("")
|
|
(tmp_path / "hashes.txt.expanded").write_text("")
|
|
|
|
captured_cmds = []
|
|
|
|
def fake_popen(cmd, **kwargs):
|
|
captured_cmds.append(list(cmd))
|
|
proc = MagicMock()
|
|
proc.stdout = MagicMock()
|
|
proc.pid = 1234
|
|
proc.wait.return_value = 0
|
|
return proc
|
|
|
|
# lineCount call sequence:
|
|
# call 1 (initial, before loop): 1 -> crackedBefore=1, crackedAfter=0 -> enter loop
|
|
# call 2 (top of loop body): 1 -> crackedBefore=1
|
|
# call 3 (bottom of loop body): 1 -> crackedAfter=1 -> exit loop (1==1)
|
|
# call 4 (final hcatFingerprintCount assignment): 1
|
|
with (
|
|
patch("hate_crack.main.subprocess.Popen", side_effect=fake_popen),
|
|
patch.object(main_module, "hcatBin", "hashcat"),
|
|
patch.object(main_module, "hcatTuning", ""),
|
|
patch.object(main_module, "hcatPotfilePath", ""),
|
|
patch.object(main_module, "hate_path", str(tmp_path)),
|
|
patch.object(main_module, "hcatExpanderBin", "expander.bin"),
|
|
patch.object(main_module, "hcatHashCracked", 0),
|
|
patch("hate_crack.main.lineCount", side_effect=[1, 1, 1, 1]),
|
|
patch("hate_crack.main._write_delimited_field"),
|
|
patch("hate_crack.main.ensure_binary"),
|
|
patch("hate_crack.main.generate_session_id", return_value="test_session"),
|
|
):
|
|
main_module.hcatFingerprint(
|
|
hcatHashType="1000",
|
|
hcatHashFile=str(hash_file),
|
|
)
|
|
|
|
hashcat_cmds = [cmd for cmd in captured_cmds if cmd and cmd[0] == "hashcat"]
|
|
assert hashcat_cmds, "No hashcat Popen calls captured"
|
|
assert any("-O" in cmd for cmd in hashcat_cmds), (
|
|
f"Expected -O in hashcat cmd, got: {hashcat_cmds}"
|
|
)
|