Validation - Hash Utilities

Canonical content hashing utilities used by the validation suite.

PY37 lines1.0 KBSHA-256 801243a09e12...validationpython
from __future__ import annotations

import hashlib
import json
from pathlib import Path
from typing import Any


def sha256_text(text: str) -> str:
 """Hash exact UTF-8 text."""
 return "sha256:" + hashlib.sha256(text.encode("utf-8")).hexdigest()


def canonical_json_bytes(value: Any) -> bytes:
 """Canonical JSON v1 used by the example package.

 Object keys are sorted, arrays retain order, insignificant whitespace is
 removed, Unicode is encoded as UTF-8, and JSON numbers use Python's normal
 JSON serialization. Production systems that need cross-language numeric
 canonicalization should adopt a stricter standard and version it.
 """
 return json.dumps(
 value,
 ensure_ascii=False,
 sort_keys=True,
 separators=(",", ":"),
 allow_nan=False,
 ).encode("utf-8")


def sha256_json(value: Any) -> str:
 return "sha256:" + hashlib.sha256(canonical_json_bytes(value)).hexdigest()


def load_json(path: Path) -> Any:
 with path.open("r", encoding="utf-8") as handle:
 return json.load(handle)