"""Hash verify / sidecar tests for gost_util.""" from __future__ import annotations import hashlib import tempfile import unittest from pathlib import Path from proxy_chain_manager import gost_util class TestVerifyZipSha256(unittest.TestCase): def test_matching_hash_passes(self) -> None: data = b"hello world" digest = hashlib.sha256(data).hexdigest() gost_util._verify_zip_sha256(data, digest) # must not raise def test_wrong_hash_raises(self) -> None: data = b"hello world" with self.assertRaises(RuntimeError) as ctx: gost_util._verify_zip_sha256(data, "0" * 64) self.assertIn("supply-chain", str(ctx.exception).lower()) def test_case_insensitive_match(self) -> None: data = b"PROXYGOD" digest = hashlib.sha256(data).hexdigest().upper() gost_util._verify_zip_sha256(data, digest) class TestExeHashSidecar(unittest.TestCase): def test_sidecar_round_trip(self) -> None: with tempfile.TemporaryDirectory() as tmp: exe = Path(tmp) / "gost.exe" exe.write_bytes(b"\x90" * 1024) digest = gost_util._hash_file(exe) gost_util._write_pinned_exe_hash(exe, digest) self.assertEqual(gost_util._read_pinned_exe_hash(exe), digest) def test_missing_sidecar_returns_none(self) -> None: with tempfile.TemporaryDirectory() as tmp: exe = Path(tmp) / "gost.exe" exe.write_bytes(b"x") self.assertIsNone(gost_util._read_pinned_exe_hash(exe)) def test_hash_file_matches_python_hashlib(self) -> None: with tempfile.NamedTemporaryFile(delete=False) as f: f.write(b"some payload bytes") f.flush() p = Path(f.name) try: self.assertEqual( gost_util._hash_file(p), hashlib.sha256(b"some payload bytes").hexdigest(), ) finally: p.unlink(missing_ok=True) if __name__ == "__main__": unittest.main()