bpo-40645: Deprecated internal details of hmac.HMAC (GH-20132) by tiran · Pull Request #20132 · python/cpython
__slots__ = ( "_digest_cons", "_inner", "_outer", "block_size", "digest_size" )
def __init__(self, key, msg=None, digestmod=''): """Create a new HMAC object.
if callable(digestmod): self.digest_cons = digestmod self._digest_cons = digestmod elif isinstance(digestmod, str): self.digest_cons = lambda d=b'': _hashlib.new(digestmod, d) self._digest_cons = lambda d=b'': _hashlib.new(digestmod, d) else: self.digest_cons = lambda d=b'': digestmod.new(d) self._digest_cons = lambda d=b'': digestmod.new(d)
self.outer = self.digest_cons() self.inner = self.digest_cons() self.digest_size = self.inner.digest_size self._outer = self._digest_cons() self._inner = self._digest_cons() self.digest_size = self._inner.digest_size
if hasattr(self.inner, 'block_size'): blocksize = self.inner.block_size if hasattr(self._inner, 'block_size'): blocksize = self._inner.block_size if blocksize < 16: _warnings.warn('block_size of %d seems too small; using our ' 'default of %d.' % (blocksize, self.blocksize),
if len(key) > blocksize: key = self.digest_cons(key).digest() key = self._digest_cons(key).digest()
key = key.ljust(blocksize, b'\0') self.outer.update(key.translate(trans_5C)) self.inner.update(key.translate(trans_36)) self._outer.update(key.translate(trans_5C)) self._inner.update(key.translate(trans_36)) if msg is not None: self.update(msg)
@property def name(self): return "hmac-" + self.inner.name return "hmac-" + self._inner.name
@property def digest_cons(self): return self._digest_cons
@property def inner(self): return self._inner
@property def outer(self): return self._outer
def update(self, msg): """Feed data from msg into this hashing object.""" self.inner.update(msg) self._inner.update(msg)
def copy(self): """Return a separate copy of this hashing object.
def _current(self): """Return a hash object for the current state.
To be used only internally with digest() and hexdigest(). """ h = self.outer.copy() h.update(self.inner.digest()) h = self._outer.copy() h.update(self._inner.digest()) return h
def digest(self):