Skip to content

Commit 3e5d7e1

Browse files
authored
[V-GUARD] Add finalization_hasher.py for TOCTOU defense
Signed-off-by: vocoder-na <[email protected]>
1 parent 96bb235 commit 3e5d7e1

File tree

1 file changed

+48
-0
lines changed

1 file changed

+48
-0
lines changed

tools/finalization_hasher.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import hashlib
2+
import os
3+
import sys
4+
5+
# Алгоритм хешування
6+
HASH_ALGORITHM = "sha256"
7+
8+
def calculate_simple_hash(file_content):
9+
"""
10+
Обчислює простий хеш для забезпечення цілісності файлів.
11+
"""
12+
return hashlib.new(HASH_ALGORITHM, file_content.encode('utf-8')).hexdigest()
13+
14+
def main():
15+
"""
16+
Обчислює єдиний Фіналізаційний Хеш для всіх файлів KERNEL.
17+
Цей хеш використовується для перевірки, що код не змінювався
18+
між моментом перевірки V-Криптографом та моментом об'єднання.
19+
"""
20+
all_hashes = []
21+
22+
# Скануємо всі файли проекту
23+
for root, _, files in os.walk("."):
24+
# Ігноруємо .git та .github/workflows, оскільки вони керують процесом,
25+
# а не є продуктивним кодом, який треба захищати від TOCTOU
26+
if '.git' in root or '.github/workflows' in root:
27+
continue
28+
29+
for file_name in files:
30+
# Обробляємо лише файли Python та YML
31+
if file_name.endswith((".py", ".yml", ".md")):
32+
file_path = os.path.join(root, file_name)
33+
34+
with open(file_path, 'r', encoding='utf-8') as f:
35+
content = f.read()
36+
37+
file_hash = calculate_simple_hash(content)
38+
all_hashes.append(f"{file_path}:{file_hash}")
39+
40+
# Фінальний Merkle-хеш
41+
final_data = "\n".join(sorted(all_hashes)).encode('utf-8')
42+
final_hash = hashlib.new(HASH_ALGORITHM, final_data).hexdigest()
43+
44+
# Виводимо фінальний хеш для використання у GitHub Actions
45+
print(final_hash)
46+
47+
if __name__ == "__main__":
48+
main()

0 commit comments

Comments
 (0)