"""توقيع Ed25519 لحزم الموديولات — تشغيل كود مرفوع يتطلب توثيقاً.
المفتاح الخاص على السحابة (يوقّع)، المفتاح العام على الحافة (يتحقق)."""
from cryptography.exceptions import InvalidSignature
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric.ed25519 import (
    Ed25519PrivateKey, Ed25519PublicKey)

_RAW = serialization.Encoding.Raw
_PRIV = serialization.PrivateFormat.Raw
_PUB = serialization.PublicFormat.Raw
_NOENC = serialization.NoEncryption()


def generate_keypair() -> tuple[bytes, bytes]:
    """(private_raw, public_raw) — 32 بايت لكلٍّ."""
    sk = Ed25519PrivateKey.generate()
    return (sk.private_bytes(_RAW, _PRIV, _NOENC),
            sk.public_key().public_bytes(_RAW, _PUB))


def sign(priv: bytes, data: bytes) -> bytes:
    return Ed25519PrivateKey.from_private_bytes(priv).sign(data)


def verify(pub: bytes, data: bytes, sig: bytes) -> bool:
    try:
        Ed25519PublicKey.from_public_bytes(pub).verify(sig, data)
        return True
    except (InvalidSignature, ValueError):
        return False
