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())
 |