32 lines
1.0 KiB
Python
32 lines
1.0 KiB
Python
from __future__ import annotations
|
|
|
|
import json
|
|
import time
|
|
import hmac
|
|
import hashlib
|
|
|
|
class GovernanceLedger:
|
|
def __init__(self, key: bytes):
|
|
self.key = key
|
|
self.entries = [] # list of dicts
|
|
|
|
def attest(self, data: dict) -> dict:
|
|
# produce a simple HMAC signature over the serialized data
|
|
payload = json.dumps(data, sort_keys=True).encode("utf-8")
|
|
signature = hmac.new(self.key, payload, hashlib.sha256).hexdigest()
|
|
entry = {"timestamp": time.time(), "data": data, "signature": signature}
|
|
self.entries.append(entry)
|
|
return entry
|
|
|
|
def verify(self, entry: dict) -> bool:
|
|
payload = json.dumps(entry["data"], sort_keys=True).encode("utf-8")
|
|
expected = hmac.new(self.key, payload, hashlib.sha256).hexdigest()
|
|
return hmac.compare_digest(expected, entry.get("signature", ""))
|
|
|
|
def to_json(self) -> str:
|
|
return json.dumps(self.entries, default=str)
|
|
|
|
|
|
def create_attestation(ledger: GovernanceLedger, data: dict) -> dict:
|
|
return ledger.attest(data)
|