pycryptodome.py 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. from typing import (
  2. Union,
  3. cast,
  4. )
  5. from Crypto.Hash import (
  6. keccak,
  7. )
  8. from eth_hash.abc import (
  9. BackendAPI,
  10. PreImageAPI,
  11. )
  12. class CryptodomePreimage(PreImageAPI):
  13. def __init__(self, prehash: bytes) -> None:
  14. self._hash = keccak.new(data=prehash, digest_bits=256, update_after_digest=True)
  15. # pycryptodome doesn't expose a `copy` mechanism for it's hash objects
  16. # so we keep a record of all of the parts for when/if we need to copy
  17. # them.
  18. self._parts = [prehash]
  19. def update(self, prehash: bytes) -> None:
  20. self._hash.update(prehash)
  21. self._parts.append(prehash)
  22. def digest(self) -> bytes:
  23. return cast(bytes, self._hash.digest())
  24. def copy(self) -> "CryptodomePreimage":
  25. return CryptodomePreimage(b"".join(self._parts))
  26. class CryptodomeBackend(BackendAPI):
  27. def keccak256(self, prehash: Union[bytearray, bytes]) -> bytes:
  28. hasher = keccak.new(data=prehash, digest_bits=256)
  29. return cast(bytes, hasher.digest())
  30. def preimage(self, prehash: Union[bytearray, bytes]) -> PreImageAPI:
  31. return CryptodomePreimage(prehash)
  32. backend = CryptodomeBackend()
  33. keccak256 = backend.keccak256
  34. preimage = backend.preimage