/ciphey/basemods/Decoders/bases.py

https://github.com/Ciphey/Ciphey
Python | 48 lines | 36 code | 12 blank | 0 comment | 3 complexity | de2363af729464cb64d0e424663327e7 MD5 | raw file
  1. import base64
  2. import types
  3. import ciphey
  4. import binascii
  5. from typing import Callable, Optional, Any, Dict
  6. from loguru import logger
  7. def _dispatch(self: Any, ctext: str, func: Callable[[str], bytes]) -> Optional[bytes]:
  8. logger.trace(f"Attempting {self.getTarget()}")
  9. try:
  10. result = func(ctext)
  11. logger.debug(f"{self.getTarget()} successful, returning {result}")
  12. return result
  13. except ValueError:
  14. logger.trace(f"Failed to decode {self.getTarget()}")
  15. return None
  16. _bases = {
  17. "base16": (base64.b16decode, 0.4),
  18. "base32": (base64.b32decode, 0.01),
  19. "base64": (base64.b64decode, 0.4),
  20. "base85": (base64.b85decode, 0.01),
  21. "ascii85": (base64.a85decode, 0.1),
  22. }
  23. def gen_class(name, decoder, priority, ns):
  24. ns["_get_func"] = ciphey.common.id_lambda(decoder)
  25. ns["decode"] = lambda self, ctext: _dispatch(self, ctext, self._get_func())
  26. ns["getParams"] = ciphey.common.id_lambda(None)
  27. ns["getTarget"] = ciphey.common.id_lambda(name)
  28. ns["priority"] = ciphey.common.id_lambda(priority)
  29. ns["__init__"] = lambda self, config: super(type(self), self).__init__(config)
  30. for name, (decoder, priority) in _bases.items():
  31. t = types.new_class(
  32. name,
  33. (ciphey.iface.Decoder[str, bytes],),
  34. exec_body=lambda x: gen_class(name, decoder, priority, x),
  35. )
  36. ciphey.iface.registry.register(t)