audit-labs/evidence-seal

Tamper-evident seals and chain of custody for audit evidence.

clone: git clone https://gitbay.org/audit-labs/evidence-seal.git

v1.0.0: tests/test_hashing.py · raw

 1"""Tests for file hashing and the Merkle root."""
 2
 3from evidence_seal.hashing import hash_bytes, hash_file, merkle_root
 4
 5
 6def test_hash_file_matches_known_sha256(tmp_path):
 7    f = tmp_path / "x.txt"
 8    f.write_bytes(b"hello")
 9    # Known SHA-256 of "hello".
10    assert hash_file(f) == "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"
11    assert hash_bytes(b"hello") == hash_file(f)
12
13
14def test_merkle_root_is_order_independent():
15    a = {"a": "1", "b": "2", "c": "3"}
16    b = {"c": "3", "a": "1", "b": "2"}
17    assert merkle_root(a) == merkle_root(b)
18
19
20def test_merkle_root_changes_on_content():
21    base = {"a": "1", "b": "2"}
22    changed = {"a": "1", "b": "changed"}
23    assert merkle_root(base) != merkle_root(changed)
24
25
26def test_merkle_root_changes_on_rename():
27    # Same content hash, different path -> different root (path is bound in).
28    assert merkle_root({"a": "1"}) != merkle_root({"b": "1"})
29
30
31def test_empty_root_is_defined_and_distinct():
32    assert merkle_root({}) == hash_bytes(b"empty")
33    assert merkle_root({}) != merkle_root({"a": "1"})
34
35
36def test_odd_number_of_leaves():
37    # Three leaves exercises the duplicate-last branch; just needs to be stable.
38    entries = {"a": "1", "b": "2", "c": "3"}
39    assert merkle_root(entries) == merkle_root(dict(entries))