51 lines
1.4 KiB
Python
51 lines
1.4 KiB
Python
from abc import ABCMeta
|
|
from abc import abstractmethod
|
|
|
|
from pygost.utils import hexenc
|
|
|
|
|
|
# This function is taken from six package as is
|
|
def add_metaclass(metaclass):
|
|
"""Class decorator for creating a class with a metaclass."""
|
|
def wrapper(cls):
|
|
orig_vars = cls.__dict__.copy()
|
|
slots = orig_vars.get("__slots__")
|
|
if slots is not None:
|
|
if isinstance(slots, str):
|
|
slots = [slots]
|
|
for slots_var in slots:
|
|
orig_vars.pop(slots_var)
|
|
orig_vars.pop("__dict__", None)
|
|
orig_vars.pop("__weakref__", None)
|
|
return metaclass(cls.__name__, cls.__bases__, orig_vars)
|
|
return wrapper
|
|
|
|
|
|
@add_metaclass(ABCMeta)
|
|
class PEP247(object):
|
|
@property
|
|
@abstractmethod
|
|
def digest_size(self):
|
|
"""The size of the digest produced by the hashing objects.
|
|
"""
|
|
|
|
@abstractmethod
|
|
def copy(self):
|
|
"""Return a separate copy of this hashing object.
|
|
"""
|
|
|
|
@abstractmethod
|
|
def update(self, data):
|
|
"""Hash data into the current state of the hashing object.
|
|
"""
|
|
|
|
@abstractmethod
|
|
def digest(self):
|
|
"""Return the hash value as a string containing 8-bit data.
|
|
"""
|
|
|
|
def hexdigest(self):
|
|
"""Return the hash value as a string containing hexadecimal digits.
|
|
"""
|
|
return hexenc(self.digest())
|