eddsa.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. from typing import Type
  2. from cryptography.hazmat.primitives import serialization
  3. from cryptography.hazmat.primitives.asymmetric import ed448, ed25519
  4. from dns.dnssecalgs.cryptography import CryptographyPrivateKey, CryptographyPublicKey
  5. from dns.dnssectypes import Algorithm
  6. from dns.rdtypes.ANY.DNSKEY import DNSKEY
  7. class PublicEDDSA(CryptographyPublicKey):
  8. def verify(self, signature: bytes, data: bytes) -> None:
  9. self.key.verify(signature, data)
  10. def encode_key_bytes(self) -> bytes:
  11. """Encode a public key per RFC 8080, section 3."""
  12. return self.key.public_bytes(
  13. encoding=serialization.Encoding.Raw, format=serialization.PublicFormat.Raw
  14. )
  15. @classmethod
  16. def from_dnskey(cls, key: DNSKEY) -> "PublicEDDSA":
  17. cls._ensure_algorithm_key_combination(key)
  18. return cls(
  19. key=cls.key_cls.from_public_bytes(key.key),
  20. )
  21. class PrivateEDDSA(CryptographyPrivateKey):
  22. public_cls: Type[PublicEDDSA]
  23. def sign(
  24. self,
  25. data: bytes,
  26. verify: bool = False,
  27. deterministic: bool = True,
  28. ) -> bytes:
  29. """Sign using a private key per RFC 8080, section 4."""
  30. signature = self.key.sign(data)
  31. if verify:
  32. self.public_key().verify(signature, data)
  33. return signature
  34. @classmethod
  35. def generate(cls) -> "PrivateEDDSA":
  36. return cls(key=cls.key_cls.generate())
  37. class PublicED25519(PublicEDDSA):
  38. key: ed25519.Ed25519PublicKey
  39. key_cls = ed25519.Ed25519PublicKey
  40. algorithm = Algorithm.ED25519
  41. class PrivateED25519(PrivateEDDSA):
  42. key: ed25519.Ed25519PrivateKey
  43. key_cls = ed25519.Ed25519PrivateKey
  44. public_cls = PublicED25519
  45. class PublicED448(PublicEDDSA):
  46. key: ed448.Ed448PublicKey
  47. key_cls = ed448.Ed448PublicKey
  48. algorithm = Algorithm.ED448
  49. class PrivateED448(PrivateEDDSA):
  50. key: ed448.Ed448PrivateKey
  51. key_cls = ed448.Ed448PrivateKey
  52. public_cls = PublicED448