diff --git a/lib/tfw/crypto.py b/lib/tfw/crypto.py new file mode 100644 index 0000000..413a1d6 --- /dev/null +++ b/lib/tfw/crypto.py @@ -0,0 +1,47 @@ +# Copyright (C) 2018 Avatao.com Innovative Learning Kft. +# All Rights Reserved. See LICENSE file for details. + +from functools import wraps + +from cryptography.hazmat.backends import default_backend +from cryptography.hazmat.primitives.hashes import SHA256 +from cryptography.hazmat.primitives.hmac import HMAC as _HMAC +from cryptography.exceptions import InvalidSignature + + +class HMAC: + def __init__(self, key, message): + self.key = key + self.message = message + self._hmac = _HMAC( + key=key, + algorithm=SHA256(), + backend=default_backend() + ) + + def _reload_if_finalized(f): + # pylint: disable=no-self-argument,not-callable + @wraps(f) + def wrapped(instance, *args, **kwargs): + if getattr(instance, '_finalized', False): + instance.__init__(instance.key, instance.message) + ret_val = f(instance, *args, **kwargs) + setattr(instance, '_finalized', True) + return ret_val + return wrapped + + @property + @_reload_if_finalized + def signature(self): + self._hmac.update(self.message) + signature = self._hmac.finalize() + return signature + + @_reload_if_finalized + def verify(self, signature): + self._hmac.update(self.message) + try: + self._hmac.verify(signature) + return True + except InvalidSignature: + return False diff --git a/requirements.txt b/requirements.txt index 4d3a900..2f133de 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,3 +5,4 @@ terminado==0.8.1 watchdog==0.8.3 PyYAML==3.12 Jinja2==2.10 +cryptography==2.2.2