// Package evidence bildet die Beweiskette: Hashing von Assets und // Metadaten, RFC-3161-Zeitstempel über diesen Hash. Das Append-only- // Prinzip selbst wird von internal/store (Postgres-Trigger) erzwungen — // dieses Paket liefert nur die Bausteine, die evidence_package braucht. package evidence import ( "crypto/sha256" "encoding/json" "fmt" ) // HashBytes berechnet den SHA-256-Digest über beliebige Bytes, z. B. // ein Asset wie Screenshot oder Video. func HashBytes(data []byte) []byte { sum := sha256.Sum256(data) return sum[:] } // HashMetadata berechnet den SHA-256-Digest über die kanonisierte JSON- // Repräsentation von v. "Kanonisiert" heißt hier: encoding/json sortiert // Objektschlüssel bereits deterministisch, und Struct-Felder behalten // ihre Deklarationsreihenfolge — für unsere eigenen, fest definierten // Go-Typen ist das schon eine stabile, reproduzierbare Serialisierung, // ohne dass es eine eigene Kanonisierungs-Bibliothek bräuchte. func HashMetadata(v any) ([]byte, error) { data, err := json.Marshal(v) if err != nil { return nil, fmt.Errorf("evidence: metadata marshal: %w", err) } return HashBytes(data), nil }