xref: /third_party/python/Doc/library/hashlib.rst (revision 7db96d56)
17db96d56Sopenharmony_ci:mod:`hashlib` --- Secure hashes and message digests
27db96d56Sopenharmony_ci====================================================
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci.. module:: hashlib
57db96d56Sopenharmony_ci   :synopsis: Secure hash and message digest algorithms.
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci.. moduleauthor:: Gregory P. Smith <greg@krypto.org>
87db96d56Sopenharmony_ci.. sectionauthor:: Gregory P. Smith <greg@krypto.org>
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci**Source code:** :source:`Lib/hashlib.py`
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ci.. index::
137db96d56Sopenharmony_ci   single: message digest, MD5
147db96d56Sopenharmony_ci   single: secure hash algorithm, SHA1, SHA224, SHA256, SHA384, SHA512
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ci.. testsetup::
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ci   import hashlib
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci--------------
227db96d56Sopenharmony_ci
237db96d56Sopenharmony_ciThis module implements a common interface to many different secure hash and
247db96d56Sopenharmony_cimessage digest algorithms.  Included are the FIPS secure hash algorithms SHA1,
257db96d56Sopenharmony_ciSHA224, SHA256, SHA384, and SHA512 (defined in FIPS 180-2) as well as RSA's MD5
267db96d56Sopenharmony_cialgorithm (defined in internet :rfc:`1321`).  The terms "secure hash" and
277db96d56Sopenharmony_ci"message digest" are interchangeable.  Older algorithms were called message
287db96d56Sopenharmony_cidigests.  The modern term is secure hash.
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_ci.. note::
317db96d56Sopenharmony_ci
327db96d56Sopenharmony_ci   If you want the adler32 or crc32 hash functions, they are available in
337db96d56Sopenharmony_ci   the :mod:`zlib` module.
347db96d56Sopenharmony_ci
357db96d56Sopenharmony_ci.. warning::
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ci   Some algorithms have known hash collision weaknesses, refer to the "See
387db96d56Sopenharmony_ci   also" section at the end.
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci
417db96d56Sopenharmony_ci.. _hash-algorithms:
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_ciHash algorithms
447db96d56Sopenharmony_ci---------------
457db96d56Sopenharmony_ci
467db96d56Sopenharmony_ciThere is one constructor method named for each type of :dfn:`hash`.  All return
477db96d56Sopenharmony_cia hash object with the same simple interface. For example: use :func:`sha256` to
487db96d56Sopenharmony_cicreate a SHA-256 hash object. You can now feed this object with :term:`bytes-like
497db96d56Sopenharmony_ciobjects <bytes-like object>` (normally :class:`bytes`) using the :meth:`update` method.
507db96d56Sopenharmony_ciAt any point you can ask it for the :dfn:`digest` of the
517db96d56Sopenharmony_ciconcatenation of the data fed to it so far using the :meth:`digest` or
527db96d56Sopenharmony_ci:meth:`hexdigest` methods.
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_ci.. note::
557db96d56Sopenharmony_ci
567db96d56Sopenharmony_ci   For better multithreading performance, the Python :term:`GIL` is released for
577db96d56Sopenharmony_ci   data larger than 2047 bytes at object creation or on update.
587db96d56Sopenharmony_ci
597db96d56Sopenharmony_ci.. note::
607db96d56Sopenharmony_ci
617db96d56Sopenharmony_ci   Feeding string objects into :meth:`update` is not supported, as hashes work
627db96d56Sopenharmony_ci   on bytes, not on characters.
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ci.. index:: single: OpenSSL; (use in module hashlib)
657db96d56Sopenharmony_ci
667db96d56Sopenharmony_ciConstructors for hash algorithms that are always present in this module are
677db96d56Sopenharmony_ci:func:`sha1`, :func:`sha224`, :func:`sha256`, :func:`sha384`,
687db96d56Sopenharmony_ci:func:`sha512`, :func:`blake2b`, and :func:`blake2s`.
697db96d56Sopenharmony_ci:func:`md5` is normally available as well, though it
707db96d56Sopenharmony_cimay be missing or blocked if you are using a rare "FIPS compliant" build of Python.
717db96d56Sopenharmony_ciAdditional algorithms may also be available depending upon the OpenSSL
727db96d56Sopenharmony_cilibrary that Python uses on your platform. On most platforms the
737db96d56Sopenharmony_ci:func:`sha3_224`, :func:`sha3_256`, :func:`sha3_384`, :func:`sha3_512`,
747db96d56Sopenharmony_ci:func:`shake_128`, :func:`shake_256` are also available.
757db96d56Sopenharmony_ci
767db96d56Sopenharmony_ci.. versionadded:: 3.6
777db96d56Sopenharmony_ci   SHA3 (Keccak) and SHAKE constructors :func:`sha3_224`, :func:`sha3_256`,
787db96d56Sopenharmony_ci   :func:`sha3_384`, :func:`sha3_512`, :func:`shake_128`, :func:`shake_256`.
797db96d56Sopenharmony_ci
807db96d56Sopenharmony_ci.. versionadded:: 3.6
817db96d56Sopenharmony_ci   :func:`blake2b` and :func:`blake2s` were added.
827db96d56Sopenharmony_ci
837db96d56Sopenharmony_ci.. _hashlib-usedforsecurity:
847db96d56Sopenharmony_ci
857db96d56Sopenharmony_ci.. versionchanged:: 3.9
867db96d56Sopenharmony_ci   All hashlib constructors take a keyword-only argument *usedforsecurity*
877db96d56Sopenharmony_ci   with default value ``True``. A false value allows the use of insecure and
887db96d56Sopenharmony_ci   blocked hashing algorithms in restricted environments. ``False`` indicates
897db96d56Sopenharmony_ci   that the hashing algorithm is not used in a security context, e.g. as a
907db96d56Sopenharmony_ci   non-cryptographic one-way compression function.
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_ci   Hashlib now uses SHA3 and SHAKE from OpenSSL 1.1.1 and newer.
937db96d56Sopenharmony_ci
947db96d56Sopenharmony_ciFor example, to obtain the digest of the byte string ``b"Nobody inspects the
957db96d56Sopenharmony_cispammish repetition"``::
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_ci   >>> import hashlib
987db96d56Sopenharmony_ci   >>> m = hashlib.sha256()
997db96d56Sopenharmony_ci   >>> m.update(b"Nobody inspects")
1007db96d56Sopenharmony_ci   >>> m.update(b" the spammish repetition")
1017db96d56Sopenharmony_ci   >>> m.digest()
1027db96d56Sopenharmony_ci   b'\x03\x1e\xdd}Ae\x15\x93\xc5\xfe\\\x00o\xa5u+7\xfd\xdf\xf7\xbcN\x84:\xa6\xaf\x0c\x95\x0fK\x94\x06'
1037db96d56Sopenharmony_ci   >>> m.hexdigest()
1047db96d56Sopenharmony_ci   '031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
1057db96d56Sopenharmony_ci
1067db96d56Sopenharmony_ciMore condensed:
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_ci   >>> hashlib.sha256(b"Nobody inspects the spammish repetition").hexdigest()
1097db96d56Sopenharmony_ci   '031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
1107db96d56Sopenharmony_ci
1117db96d56Sopenharmony_ci.. function:: new(name[, data], *, usedforsecurity=True)
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci   Is a generic constructor that takes the string *name* of the desired
1147db96d56Sopenharmony_ci   algorithm as its first parameter.  It also exists to allow access to the
1157db96d56Sopenharmony_ci   above listed hashes as well as any other algorithms that your OpenSSL
1167db96d56Sopenharmony_ci   library may offer.  The named constructors are much faster than :func:`new`
1177db96d56Sopenharmony_ci   and should be preferred.
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_ciUsing :func:`new` with an algorithm provided by OpenSSL:
1207db96d56Sopenharmony_ci
1217db96d56Sopenharmony_ci   >>> h = hashlib.new('sha256')
1227db96d56Sopenharmony_ci   >>> h.update(b"Nobody inspects the spammish repetition")
1237db96d56Sopenharmony_ci   >>> h.hexdigest()
1247db96d56Sopenharmony_ci   '031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
1257db96d56Sopenharmony_ci
1267db96d56Sopenharmony_ciHashlib provides the following constant attributes:
1277db96d56Sopenharmony_ci
1287db96d56Sopenharmony_ci.. data:: algorithms_guaranteed
1297db96d56Sopenharmony_ci
1307db96d56Sopenharmony_ci   A set containing the names of the hash algorithms guaranteed to be supported
1317db96d56Sopenharmony_ci   by this module on all platforms.  Note that 'md5' is in this list despite
1327db96d56Sopenharmony_ci   some upstream vendors offering an odd "FIPS compliant" Python build that
1337db96d56Sopenharmony_ci   excludes it.
1347db96d56Sopenharmony_ci
1357db96d56Sopenharmony_ci   .. versionadded:: 3.2
1367db96d56Sopenharmony_ci
1377db96d56Sopenharmony_ci.. data:: algorithms_available
1387db96d56Sopenharmony_ci
1397db96d56Sopenharmony_ci   A set containing the names of the hash algorithms that are available in the
1407db96d56Sopenharmony_ci   running Python interpreter.  These names will be recognized when passed to
1417db96d56Sopenharmony_ci   :func:`new`.  :attr:`algorithms_guaranteed` will always be a subset.  The
1427db96d56Sopenharmony_ci   same algorithm may appear multiple times in this set under different names
1437db96d56Sopenharmony_ci   (thanks to OpenSSL).
1447db96d56Sopenharmony_ci
1457db96d56Sopenharmony_ci   .. versionadded:: 3.2
1467db96d56Sopenharmony_ci
1477db96d56Sopenharmony_ciThe following values are provided as constant attributes of the hash objects
1487db96d56Sopenharmony_cireturned by the constructors:
1497db96d56Sopenharmony_ci
1507db96d56Sopenharmony_ci
1517db96d56Sopenharmony_ci.. data:: hash.digest_size
1527db96d56Sopenharmony_ci
1537db96d56Sopenharmony_ci   The size of the resulting hash in bytes.
1547db96d56Sopenharmony_ci
1557db96d56Sopenharmony_ci.. data:: hash.block_size
1567db96d56Sopenharmony_ci
1577db96d56Sopenharmony_ci   The internal block size of the hash algorithm in bytes.
1587db96d56Sopenharmony_ci
1597db96d56Sopenharmony_ciA hash object has the following attributes:
1607db96d56Sopenharmony_ci
1617db96d56Sopenharmony_ci.. attribute:: hash.name
1627db96d56Sopenharmony_ci
1637db96d56Sopenharmony_ci   The canonical name of this hash, always lowercase and always suitable as a
1647db96d56Sopenharmony_ci   parameter to :func:`new` to create another hash of this type.
1657db96d56Sopenharmony_ci
1667db96d56Sopenharmony_ci   .. versionchanged:: 3.4
1677db96d56Sopenharmony_ci      The name attribute has been present in CPython since its inception, but
1687db96d56Sopenharmony_ci      until Python 3.4 was not formally specified, so may not exist on some
1697db96d56Sopenharmony_ci      platforms.
1707db96d56Sopenharmony_ci
1717db96d56Sopenharmony_ciA hash object has the following methods:
1727db96d56Sopenharmony_ci
1737db96d56Sopenharmony_ci
1747db96d56Sopenharmony_ci.. method:: hash.update(data)
1757db96d56Sopenharmony_ci
1767db96d56Sopenharmony_ci   Update the hash object with the :term:`bytes-like object`.
1777db96d56Sopenharmony_ci   Repeated calls are equivalent to a single call with the
1787db96d56Sopenharmony_ci   concatenation of all the arguments: ``m.update(a); m.update(b)`` is
1797db96d56Sopenharmony_ci   equivalent to ``m.update(a+b)``.
1807db96d56Sopenharmony_ci
1817db96d56Sopenharmony_ci   .. versionchanged:: 3.1
1827db96d56Sopenharmony_ci      The Python GIL is released to allow other threads to run while hash
1837db96d56Sopenharmony_ci      updates on data larger than 2047 bytes is taking place when using hash
1847db96d56Sopenharmony_ci      algorithms supplied by OpenSSL.
1857db96d56Sopenharmony_ci
1867db96d56Sopenharmony_ci
1877db96d56Sopenharmony_ci.. method:: hash.digest()
1887db96d56Sopenharmony_ci
1897db96d56Sopenharmony_ci   Return the digest of the data passed to the :meth:`update` method so far.
1907db96d56Sopenharmony_ci   This is a bytes object of size :attr:`digest_size` which may contain bytes in
1917db96d56Sopenharmony_ci   the whole range from 0 to 255.
1927db96d56Sopenharmony_ci
1937db96d56Sopenharmony_ci
1947db96d56Sopenharmony_ci.. method:: hash.hexdigest()
1957db96d56Sopenharmony_ci
1967db96d56Sopenharmony_ci   Like :meth:`digest` except the digest is returned as a string object of
1977db96d56Sopenharmony_ci   double length, containing only hexadecimal digits.  This may be used to
1987db96d56Sopenharmony_ci   exchange the value safely in email or other non-binary environments.
1997db96d56Sopenharmony_ci
2007db96d56Sopenharmony_ci
2017db96d56Sopenharmony_ci.. method:: hash.copy()
2027db96d56Sopenharmony_ci
2037db96d56Sopenharmony_ci   Return a copy ("clone") of the hash object.  This can be used to efficiently
2047db96d56Sopenharmony_ci   compute the digests of data sharing a common initial substring.
2057db96d56Sopenharmony_ci
2067db96d56Sopenharmony_ci
2077db96d56Sopenharmony_ciSHAKE variable length digests
2087db96d56Sopenharmony_ci-----------------------------
2097db96d56Sopenharmony_ci
2107db96d56Sopenharmony_ciThe :func:`shake_128` and :func:`shake_256` algorithms provide variable
2117db96d56Sopenharmony_cilength digests with length_in_bits//2 up to 128 or 256 bits of security.
2127db96d56Sopenharmony_ciAs such, their digest methods require a length. Maximum length is not limited
2137db96d56Sopenharmony_ciby the SHAKE algorithm.
2147db96d56Sopenharmony_ci
2157db96d56Sopenharmony_ci.. method:: shake.digest(length)
2167db96d56Sopenharmony_ci
2177db96d56Sopenharmony_ci   Return the digest of the data passed to the :meth:`update` method so far.
2187db96d56Sopenharmony_ci   This is a bytes object of size *length* which may contain bytes in
2197db96d56Sopenharmony_ci   the whole range from 0 to 255.
2207db96d56Sopenharmony_ci
2217db96d56Sopenharmony_ci
2227db96d56Sopenharmony_ci.. method:: shake.hexdigest(length)
2237db96d56Sopenharmony_ci
2247db96d56Sopenharmony_ci   Like :meth:`digest` except the digest is returned as a string object of
2257db96d56Sopenharmony_ci   double length, containing only hexadecimal digits.  This may be used to
2267db96d56Sopenharmony_ci   exchange the value safely in email or other non-binary environments.
2277db96d56Sopenharmony_ci
2287db96d56Sopenharmony_ci
2297db96d56Sopenharmony_ciFile hashing
2307db96d56Sopenharmony_ci------------
2317db96d56Sopenharmony_ci
2327db96d56Sopenharmony_ciThe hashlib module provides a helper function for efficient hashing of
2337db96d56Sopenharmony_cia file or file-like object.
2347db96d56Sopenharmony_ci
2357db96d56Sopenharmony_ci.. function:: file_digest(fileobj, digest, /)
2367db96d56Sopenharmony_ci
2377db96d56Sopenharmony_ci   Return a digest object that has been updated with contents of file object.
2387db96d56Sopenharmony_ci
2397db96d56Sopenharmony_ci   *fileobj* must be a file-like object opened for reading in binary mode.
2407db96d56Sopenharmony_ci   It accepts file objects from  builtin :func:`open`, :class:`~io.BytesIO`
2417db96d56Sopenharmony_ci   instances, SocketIO objects from :meth:`socket.socket.makefile`, and
2427db96d56Sopenharmony_ci   similar. The function may bypass Python's I/O and use the file descriptor
2437db96d56Sopenharmony_ci   from :meth:`~io.IOBase.fileno` directly. *fileobj* must be assumed to be
2447db96d56Sopenharmony_ci   in an unknown state after this function returns or raises. It is up to
2457db96d56Sopenharmony_ci   the caller to close *fileobj*.
2467db96d56Sopenharmony_ci
2477db96d56Sopenharmony_ci   *digest* must either be a hash algorithm name as a *str*, a hash
2487db96d56Sopenharmony_ci   constructor, or a callable that returns a hash object.
2497db96d56Sopenharmony_ci
2507db96d56Sopenharmony_ci   Example:
2517db96d56Sopenharmony_ci
2527db96d56Sopenharmony_ci      >>> import io, hashlib, hmac
2537db96d56Sopenharmony_ci      >>> with open(hashlib.__file__, "rb") as f:
2547db96d56Sopenharmony_ci      ...     digest = hashlib.file_digest(f, "sha256")
2557db96d56Sopenharmony_ci      ...
2567db96d56Sopenharmony_ci      >>> digest.hexdigest()  # doctest: +ELLIPSIS
2577db96d56Sopenharmony_ci      '...'
2587db96d56Sopenharmony_ci
2597db96d56Sopenharmony_ci      >>> buf = io.BytesIO(b"somedata")
2607db96d56Sopenharmony_ci      >>> mac1 = hmac.HMAC(b"key", digestmod=hashlib.sha512)
2617db96d56Sopenharmony_ci      >>> digest = hashlib.file_digest(buf, lambda: mac1)
2627db96d56Sopenharmony_ci
2637db96d56Sopenharmony_ci      >>> digest is mac1
2647db96d56Sopenharmony_ci      True
2657db96d56Sopenharmony_ci      >>> mac2 = hmac.HMAC(b"key", b"somedata", digestmod=hashlib.sha512)
2667db96d56Sopenharmony_ci      >>> mac1.digest() == mac2.digest()
2677db96d56Sopenharmony_ci      True
2687db96d56Sopenharmony_ci
2697db96d56Sopenharmony_ci   .. versionadded:: 3.11
2707db96d56Sopenharmony_ci
2717db96d56Sopenharmony_ci
2727db96d56Sopenharmony_ciKey derivation
2737db96d56Sopenharmony_ci--------------
2747db96d56Sopenharmony_ci
2757db96d56Sopenharmony_ciKey derivation and key stretching algorithms are designed for secure password
2767db96d56Sopenharmony_cihashing. Naive algorithms such as ``sha1(password)`` are not resistant against
2777db96d56Sopenharmony_cibrute-force attacks. A good password hashing function must be tunable, slow, and
2787db96d56Sopenharmony_ciinclude a `salt <https://en.wikipedia.org/wiki/Salt_%28cryptography%29>`_.
2797db96d56Sopenharmony_ci
2807db96d56Sopenharmony_ci
2817db96d56Sopenharmony_ci.. function:: pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None)
2827db96d56Sopenharmony_ci
2837db96d56Sopenharmony_ci   The function provides PKCS#5 password-based key derivation function 2. It
2847db96d56Sopenharmony_ci   uses HMAC as pseudorandom function.
2857db96d56Sopenharmony_ci
2867db96d56Sopenharmony_ci   The string *hash_name* is the desired name of the hash digest algorithm for
2877db96d56Sopenharmony_ci   HMAC, e.g. 'sha1' or 'sha256'. *password* and *salt* are interpreted as
2887db96d56Sopenharmony_ci   buffers of bytes. Applications and libraries should limit *password* to
2897db96d56Sopenharmony_ci   a sensible length (e.g. 1024). *salt* should be about 16 or more bytes from
2907db96d56Sopenharmony_ci   a proper source, e.g. :func:`os.urandom`.
2917db96d56Sopenharmony_ci
2927db96d56Sopenharmony_ci   The number of *iterations* should be chosen based on the hash algorithm and
2937db96d56Sopenharmony_ci   computing power. As of 2022, hundreds of thousands of iterations of SHA-256
2947db96d56Sopenharmony_ci   are suggested. For rationale as to why and how to choose what is best for
2957db96d56Sopenharmony_ci   your application, read *Appendix A.2.2* of NIST-SP-800-132_. The answers
2967db96d56Sopenharmony_ci   on the `stackexchange pbkdf2 iterations question`_ explain in detail.
2977db96d56Sopenharmony_ci
2987db96d56Sopenharmony_ci   *dklen* is the length of the derived key. If *dklen* is ``None`` then the
2997db96d56Sopenharmony_ci   digest size of the hash algorithm *hash_name* is used, e.g. 64 for SHA-512.
3007db96d56Sopenharmony_ci
3017db96d56Sopenharmony_ci   >>> from hashlib import pbkdf2_hmac
3027db96d56Sopenharmony_ci   >>> our_app_iters = 500_000  # Application specific, read above.
3037db96d56Sopenharmony_ci   >>> dk = pbkdf2_hmac('sha256', b'password', b'bad salt'*2, our_app_iters)
3047db96d56Sopenharmony_ci   >>> dk.hex()
3057db96d56Sopenharmony_ci   '15530bba69924174860db778f2c6f8104d3aaf9d26241840c8c4a641c8d000a9'
3067db96d56Sopenharmony_ci
3077db96d56Sopenharmony_ci   .. versionadded:: 3.4
3087db96d56Sopenharmony_ci
3097db96d56Sopenharmony_ci   .. note::
3107db96d56Sopenharmony_ci
3117db96d56Sopenharmony_ci      A fast implementation of *pbkdf2_hmac* is available with OpenSSL.  The
3127db96d56Sopenharmony_ci      Python implementation uses an inline version of :mod:`hmac`. It is about
3137db96d56Sopenharmony_ci      three times slower and doesn't release the GIL.
3147db96d56Sopenharmony_ci
3157db96d56Sopenharmony_ci   .. deprecated:: 3.10
3167db96d56Sopenharmony_ci
3177db96d56Sopenharmony_ci      Slow Python implementation of *pbkdf2_hmac* is deprecated. In the
3187db96d56Sopenharmony_ci      future the function will only be available when Python is compiled
3197db96d56Sopenharmony_ci      with OpenSSL.
3207db96d56Sopenharmony_ci
3217db96d56Sopenharmony_ci.. function:: scrypt(password, *, salt, n, r, p, maxmem=0, dklen=64)
3227db96d56Sopenharmony_ci
3237db96d56Sopenharmony_ci   The function provides scrypt password-based key derivation function as
3247db96d56Sopenharmony_ci   defined in :rfc:`7914`.
3257db96d56Sopenharmony_ci
3267db96d56Sopenharmony_ci   *password* and *salt* must be :term:`bytes-like objects
3277db96d56Sopenharmony_ci   <bytes-like object>`.  Applications and libraries should limit *password*
3287db96d56Sopenharmony_ci   to a sensible length (e.g. 1024).  *salt* should be about 16 or more
3297db96d56Sopenharmony_ci   bytes from a proper source, e.g. :func:`os.urandom`.
3307db96d56Sopenharmony_ci
3317db96d56Sopenharmony_ci   *n* is the CPU/Memory cost factor, *r* the block size, *p* parallelization
3327db96d56Sopenharmony_ci   factor and *maxmem* limits memory (OpenSSL 1.1.0 defaults to 32 MiB).
3337db96d56Sopenharmony_ci   *dklen* is the length of the derived key.
3347db96d56Sopenharmony_ci
3357db96d56Sopenharmony_ci   .. versionadded:: 3.6
3367db96d56Sopenharmony_ci
3377db96d56Sopenharmony_ci
3387db96d56Sopenharmony_ciBLAKE2
3397db96d56Sopenharmony_ci------
3407db96d56Sopenharmony_ci
3417db96d56Sopenharmony_ci.. sectionauthor:: Dmitry Chestnykh
3427db96d56Sopenharmony_ci
3437db96d56Sopenharmony_ci.. index::
3447db96d56Sopenharmony_ci   single: blake2b, blake2s
3457db96d56Sopenharmony_ci
3467db96d56Sopenharmony_ciBLAKE2_ is a cryptographic hash function defined in :rfc:`7693` that comes in two
3477db96d56Sopenharmony_ciflavors:
3487db96d56Sopenharmony_ci
3497db96d56Sopenharmony_ci* **BLAKE2b**, optimized for 64-bit platforms and produces digests of any size
3507db96d56Sopenharmony_ci  between 1 and 64 bytes,
3517db96d56Sopenharmony_ci
3527db96d56Sopenharmony_ci* **BLAKE2s**, optimized for 8- to 32-bit platforms and produces digests of any
3537db96d56Sopenharmony_ci  size between 1 and 32 bytes.
3547db96d56Sopenharmony_ci
3557db96d56Sopenharmony_ciBLAKE2 supports **keyed mode** (a faster and simpler replacement for HMAC_),
3567db96d56Sopenharmony_ci**salted hashing**, **personalization**, and **tree hashing**.
3577db96d56Sopenharmony_ci
3587db96d56Sopenharmony_ciHash objects from this module follow the API of standard library's
3597db96d56Sopenharmony_ci:mod:`hashlib` objects.
3607db96d56Sopenharmony_ci
3617db96d56Sopenharmony_ci
3627db96d56Sopenharmony_ciCreating hash objects
3637db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^
3647db96d56Sopenharmony_ci
3657db96d56Sopenharmony_ciNew hash objects are created by calling constructor functions:
3667db96d56Sopenharmony_ci
3677db96d56Sopenharmony_ci
3687db96d56Sopenharmony_ci.. function:: blake2b(data=b'', *, digest_size=64, key=b'', salt=b'', \
3697db96d56Sopenharmony_ci                person=b'', fanout=1, depth=1, leaf_size=0, node_offset=0,  \
3707db96d56Sopenharmony_ci                node_depth=0, inner_size=0, last_node=False, \
3717db96d56Sopenharmony_ci                usedforsecurity=True)
3727db96d56Sopenharmony_ci
3737db96d56Sopenharmony_ci.. function:: blake2s(data=b'', *, digest_size=32, key=b'', salt=b'', \
3747db96d56Sopenharmony_ci                person=b'', fanout=1, depth=1, leaf_size=0, node_offset=0,  \
3757db96d56Sopenharmony_ci                node_depth=0, inner_size=0, last_node=False, \
3767db96d56Sopenharmony_ci                usedforsecurity=True)
3777db96d56Sopenharmony_ci
3787db96d56Sopenharmony_ci
3797db96d56Sopenharmony_ciThese functions return the corresponding hash objects for calculating
3807db96d56Sopenharmony_ciBLAKE2b or BLAKE2s. They optionally take these general parameters:
3817db96d56Sopenharmony_ci
3827db96d56Sopenharmony_ci* *data*: initial chunk of data to hash, which must be
3837db96d56Sopenharmony_ci  :term:`bytes-like object`.  It can be passed only as positional argument.
3847db96d56Sopenharmony_ci
3857db96d56Sopenharmony_ci* *digest_size*: size of output digest in bytes.
3867db96d56Sopenharmony_ci
3877db96d56Sopenharmony_ci* *key*: key for keyed hashing (up to 64 bytes for BLAKE2b, up to 32 bytes for
3887db96d56Sopenharmony_ci  BLAKE2s).
3897db96d56Sopenharmony_ci
3907db96d56Sopenharmony_ci* *salt*: salt for randomized hashing (up to 16 bytes for BLAKE2b, up to 8
3917db96d56Sopenharmony_ci  bytes for BLAKE2s).
3927db96d56Sopenharmony_ci
3937db96d56Sopenharmony_ci* *person*: personalization string (up to 16 bytes for BLAKE2b, up to 8 bytes
3947db96d56Sopenharmony_ci  for BLAKE2s).
3957db96d56Sopenharmony_ci
3967db96d56Sopenharmony_ciThe following table shows limits for general parameters (in bytes):
3977db96d56Sopenharmony_ci
3987db96d56Sopenharmony_ci======= =========== ======== ========= ===========
3997db96d56Sopenharmony_ciHash    digest_size len(key) len(salt) len(person)
4007db96d56Sopenharmony_ci======= =========== ======== ========= ===========
4017db96d56Sopenharmony_ciBLAKE2b     64         64       16        16
4027db96d56Sopenharmony_ciBLAKE2s     32         32       8         8
4037db96d56Sopenharmony_ci======= =========== ======== ========= ===========
4047db96d56Sopenharmony_ci
4057db96d56Sopenharmony_ci.. note::
4067db96d56Sopenharmony_ci
4077db96d56Sopenharmony_ci    BLAKE2 specification defines constant lengths for salt and personalization
4087db96d56Sopenharmony_ci    parameters, however, for convenience, this implementation accepts byte
4097db96d56Sopenharmony_ci    strings of any size up to the specified length. If the length of the
4107db96d56Sopenharmony_ci    parameter is less than specified, it is padded with zeros, thus, for
4117db96d56Sopenharmony_ci    example, ``b'salt'`` and ``b'salt\x00'`` is the same value. (This is not
4127db96d56Sopenharmony_ci    the case for *key*.)
4137db96d56Sopenharmony_ci
4147db96d56Sopenharmony_ciThese sizes are available as module `constants`_ described below.
4157db96d56Sopenharmony_ci
4167db96d56Sopenharmony_ciConstructor functions also accept the following tree hashing parameters:
4177db96d56Sopenharmony_ci
4187db96d56Sopenharmony_ci* *fanout*: fanout (0 to 255, 0 if unlimited, 1 in sequential mode).
4197db96d56Sopenharmony_ci
4207db96d56Sopenharmony_ci* *depth*: maximal depth of tree (1 to 255, 255 if unlimited, 1 in
4217db96d56Sopenharmony_ci  sequential mode).
4227db96d56Sopenharmony_ci
4237db96d56Sopenharmony_ci* *leaf_size*: maximal byte length of leaf (0 to ``2**32-1``, 0 if unlimited or in
4247db96d56Sopenharmony_ci  sequential mode).
4257db96d56Sopenharmony_ci
4267db96d56Sopenharmony_ci* *node_offset*: node offset (0 to ``2**64-1`` for BLAKE2b, 0 to ``2**48-1`` for
4277db96d56Sopenharmony_ci  BLAKE2s, 0 for the first, leftmost, leaf, or in sequential mode).
4287db96d56Sopenharmony_ci
4297db96d56Sopenharmony_ci* *node_depth*: node depth (0 to 255, 0 for leaves, or in sequential mode).
4307db96d56Sopenharmony_ci
4317db96d56Sopenharmony_ci* *inner_size*: inner digest size (0 to 64 for BLAKE2b, 0 to 32 for
4327db96d56Sopenharmony_ci  BLAKE2s, 0 in sequential mode).
4337db96d56Sopenharmony_ci
4347db96d56Sopenharmony_ci* *last_node*: boolean indicating whether the processed node is the last
4357db96d56Sopenharmony_ci  one (``False`` for sequential mode).
4367db96d56Sopenharmony_ci
4377db96d56Sopenharmony_ci.. figure:: hashlib-blake2-tree.png
4387db96d56Sopenharmony_ci   :alt: Explanation of tree mode parameters.
4397db96d56Sopenharmony_ci   :class: invert-in-dark-mode
4407db96d56Sopenharmony_ci
4417db96d56Sopenharmony_ciSee section 2.10 in `BLAKE2 specification
4427db96d56Sopenharmony_ci<https://www.blake2.net/blake2_20130129.pdf>`_ for comprehensive review of tree
4437db96d56Sopenharmony_cihashing.
4447db96d56Sopenharmony_ci
4457db96d56Sopenharmony_ci
4467db96d56Sopenharmony_ciConstants
4477db96d56Sopenharmony_ci^^^^^^^^^
4487db96d56Sopenharmony_ci
4497db96d56Sopenharmony_ci.. data:: blake2b.SALT_SIZE
4507db96d56Sopenharmony_ci.. data:: blake2s.SALT_SIZE
4517db96d56Sopenharmony_ci
4527db96d56Sopenharmony_ciSalt length (maximum length accepted by constructors).
4537db96d56Sopenharmony_ci
4547db96d56Sopenharmony_ci
4557db96d56Sopenharmony_ci.. data:: blake2b.PERSON_SIZE
4567db96d56Sopenharmony_ci.. data:: blake2s.PERSON_SIZE
4577db96d56Sopenharmony_ci
4587db96d56Sopenharmony_ciPersonalization string length (maximum length accepted by constructors).
4597db96d56Sopenharmony_ci
4607db96d56Sopenharmony_ci
4617db96d56Sopenharmony_ci.. data:: blake2b.MAX_KEY_SIZE
4627db96d56Sopenharmony_ci.. data:: blake2s.MAX_KEY_SIZE
4637db96d56Sopenharmony_ci
4647db96d56Sopenharmony_ciMaximum key size.
4657db96d56Sopenharmony_ci
4667db96d56Sopenharmony_ci
4677db96d56Sopenharmony_ci.. data:: blake2b.MAX_DIGEST_SIZE
4687db96d56Sopenharmony_ci.. data:: blake2s.MAX_DIGEST_SIZE
4697db96d56Sopenharmony_ci
4707db96d56Sopenharmony_ciMaximum digest size that the hash function can output.
4717db96d56Sopenharmony_ci
4727db96d56Sopenharmony_ci
4737db96d56Sopenharmony_ciExamples
4747db96d56Sopenharmony_ci^^^^^^^^
4757db96d56Sopenharmony_ci
4767db96d56Sopenharmony_ciSimple hashing
4777db96d56Sopenharmony_ci""""""""""""""
4787db96d56Sopenharmony_ci
4797db96d56Sopenharmony_ciTo calculate hash of some data, you should first construct a hash object by
4807db96d56Sopenharmony_cicalling the appropriate constructor function (:func:`blake2b` or
4817db96d56Sopenharmony_ci:func:`blake2s`), then update it with the data by calling :meth:`update` on the
4827db96d56Sopenharmony_ciobject, and, finally, get the digest out of the object by calling
4837db96d56Sopenharmony_ci:meth:`digest` (or :meth:`hexdigest` for hex-encoded string).
4847db96d56Sopenharmony_ci
4857db96d56Sopenharmony_ci    >>> from hashlib import blake2b
4867db96d56Sopenharmony_ci    >>> h = blake2b()
4877db96d56Sopenharmony_ci    >>> h.update(b'Hello world')
4887db96d56Sopenharmony_ci    >>> h.hexdigest()
4897db96d56Sopenharmony_ci    '6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'
4907db96d56Sopenharmony_ci
4917db96d56Sopenharmony_ci
4927db96d56Sopenharmony_ciAs a shortcut, you can pass the first chunk of data to update directly to the
4937db96d56Sopenharmony_ciconstructor as the positional argument:
4947db96d56Sopenharmony_ci
4957db96d56Sopenharmony_ci    >>> from hashlib import blake2b
4967db96d56Sopenharmony_ci    >>> blake2b(b'Hello world').hexdigest()
4977db96d56Sopenharmony_ci    '6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'
4987db96d56Sopenharmony_ci
4997db96d56Sopenharmony_ciYou can call :meth:`hash.update` as many times as you need to iteratively
5007db96d56Sopenharmony_ciupdate the hash:
5017db96d56Sopenharmony_ci
5027db96d56Sopenharmony_ci    >>> from hashlib import blake2b
5037db96d56Sopenharmony_ci    >>> items = [b'Hello', b' ', b'world']
5047db96d56Sopenharmony_ci    >>> h = blake2b()
5057db96d56Sopenharmony_ci    >>> for item in items:
5067db96d56Sopenharmony_ci    ...     h.update(item)
5077db96d56Sopenharmony_ci    >>> h.hexdigest()
5087db96d56Sopenharmony_ci    '6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'
5097db96d56Sopenharmony_ci
5107db96d56Sopenharmony_ci
5117db96d56Sopenharmony_ciUsing different digest sizes
5127db96d56Sopenharmony_ci""""""""""""""""""""""""""""
5137db96d56Sopenharmony_ci
5147db96d56Sopenharmony_ciBLAKE2 has configurable size of digests up to 64 bytes for BLAKE2b and up to 32
5157db96d56Sopenharmony_cibytes for BLAKE2s. For example, to replace SHA-1 with BLAKE2b without changing
5167db96d56Sopenharmony_cithe size of output, we can tell BLAKE2b to produce 20-byte digests:
5177db96d56Sopenharmony_ci
5187db96d56Sopenharmony_ci    >>> from hashlib import blake2b
5197db96d56Sopenharmony_ci    >>> h = blake2b(digest_size=20)
5207db96d56Sopenharmony_ci    >>> h.update(b'Replacing SHA1 with the more secure function')
5217db96d56Sopenharmony_ci    >>> h.hexdigest()
5227db96d56Sopenharmony_ci    'd24f26cf8de66472d58d4e1b1774b4c9158b1f4c'
5237db96d56Sopenharmony_ci    >>> h.digest_size
5247db96d56Sopenharmony_ci    20
5257db96d56Sopenharmony_ci    >>> len(h.digest())
5267db96d56Sopenharmony_ci    20
5277db96d56Sopenharmony_ci
5287db96d56Sopenharmony_ciHash objects with different digest sizes have completely different outputs
5297db96d56Sopenharmony_ci(shorter hashes are *not* prefixes of longer hashes); BLAKE2b and BLAKE2s
5307db96d56Sopenharmony_ciproduce different outputs even if the output length is the same:
5317db96d56Sopenharmony_ci
5327db96d56Sopenharmony_ci    >>> from hashlib import blake2b, blake2s
5337db96d56Sopenharmony_ci    >>> blake2b(digest_size=10).hexdigest()
5347db96d56Sopenharmony_ci    '6fa1d8fcfd719046d762'
5357db96d56Sopenharmony_ci    >>> blake2b(digest_size=11).hexdigest()
5367db96d56Sopenharmony_ci    'eb6ec15daf9546254f0809'
5377db96d56Sopenharmony_ci    >>> blake2s(digest_size=10).hexdigest()
5387db96d56Sopenharmony_ci    '1bf21a98c78a1c376ae9'
5397db96d56Sopenharmony_ci    >>> blake2s(digest_size=11).hexdigest()
5407db96d56Sopenharmony_ci    '567004bf96e4a25773ebf4'
5417db96d56Sopenharmony_ci
5427db96d56Sopenharmony_ci
5437db96d56Sopenharmony_ciKeyed hashing
5447db96d56Sopenharmony_ci"""""""""""""
5457db96d56Sopenharmony_ci
5467db96d56Sopenharmony_ciKeyed hashing can be used for authentication as a faster and simpler
5477db96d56Sopenharmony_cireplacement for `Hash-based message authentication code
5487db96d56Sopenharmony_ci<https://en.wikipedia.org/wiki/HMAC>`_ (HMAC).
5497db96d56Sopenharmony_ciBLAKE2 can be securely used in prefix-MAC mode thanks to the
5507db96d56Sopenharmony_ciindifferentiability property inherited from BLAKE.
5517db96d56Sopenharmony_ci
5527db96d56Sopenharmony_ciThis example shows how to get a (hex-encoded) 128-bit authentication code for
5537db96d56Sopenharmony_cimessage ``b'message data'`` with key ``b'pseudorandom key'``::
5547db96d56Sopenharmony_ci
5557db96d56Sopenharmony_ci    >>> from hashlib import blake2b
5567db96d56Sopenharmony_ci    >>> h = blake2b(key=b'pseudorandom key', digest_size=16)
5577db96d56Sopenharmony_ci    >>> h.update(b'message data')
5587db96d56Sopenharmony_ci    >>> h.hexdigest()
5597db96d56Sopenharmony_ci    '3d363ff7401e02026f4a4687d4863ced'
5607db96d56Sopenharmony_ci
5617db96d56Sopenharmony_ci
5627db96d56Sopenharmony_ciAs a practical example, a web application can symmetrically sign cookies sent
5637db96d56Sopenharmony_cito users and later verify them to make sure they weren't tampered with::
5647db96d56Sopenharmony_ci
5657db96d56Sopenharmony_ci    >>> from hashlib import blake2b
5667db96d56Sopenharmony_ci    >>> from hmac import compare_digest
5677db96d56Sopenharmony_ci    >>>
5687db96d56Sopenharmony_ci    >>> SECRET_KEY = b'pseudorandomly generated server secret key'
5697db96d56Sopenharmony_ci    >>> AUTH_SIZE = 16
5707db96d56Sopenharmony_ci    >>>
5717db96d56Sopenharmony_ci    >>> def sign(cookie):
5727db96d56Sopenharmony_ci    ...     h = blake2b(digest_size=AUTH_SIZE, key=SECRET_KEY)
5737db96d56Sopenharmony_ci    ...     h.update(cookie)
5747db96d56Sopenharmony_ci    ...     return h.hexdigest().encode('utf-8')
5757db96d56Sopenharmony_ci    >>>
5767db96d56Sopenharmony_ci    >>> def verify(cookie, sig):
5777db96d56Sopenharmony_ci    ...     good_sig = sign(cookie)
5787db96d56Sopenharmony_ci    ...     return compare_digest(good_sig, sig)
5797db96d56Sopenharmony_ci    >>>
5807db96d56Sopenharmony_ci    >>> cookie = b'user-alice'
5817db96d56Sopenharmony_ci    >>> sig = sign(cookie)
5827db96d56Sopenharmony_ci    >>> print("{0},{1}".format(cookie.decode('utf-8'), sig))
5837db96d56Sopenharmony_ci    user-alice,b'43b3c982cf697e0c5ab22172d1ca7421'
5847db96d56Sopenharmony_ci    >>> verify(cookie, sig)
5857db96d56Sopenharmony_ci    True
5867db96d56Sopenharmony_ci    >>> verify(b'user-bob', sig)
5877db96d56Sopenharmony_ci    False
5887db96d56Sopenharmony_ci    >>> verify(cookie, b'0102030405060708090a0b0c0d0e0f00')
5897db96d56Sopenharmony_ci    False
5907db96d56Sopenharmony_ci
5917db96d56Sopenharmony_ciEven though there's a native keyed hashing mode, BLAKE2 can, of course, be used
5927db96d56Sopenharmony_ciin HMAC construction with :mod:`hmac` module::
5937db96d56Sopenharmony_ci
5947db96d56Sopenharmony_ci    >>> import hmac, hashlib
5957db96d56Sopenharmony_ci    >>> m = hmac.new(b'secret key', digestmod=hashlib.blake2s)
5967db96d56Sopenharmony_ci    >>> m.update(b'message')
5977db96d56Sopenharmony_ci    >>> m.hexdigest()
5987db96d56Sopenharmony_ci    'e3c8102868d28b5ff85fc35dda07329970d1a01e273c37481326fe0c861c8142'
5997db96d56Sopenharmony_ci
6007db96d56Sopenharmony_ci
6017db96d56Sopenharmony_ciRandomized hashing
6027db96d56Sopenharmony_ci""""""""""""""""""
6037db96d56Sopenharmony_ci
6047db96d56Sopenharmony_ciBy setting *salt* parameter users can introduce randomization to the hash
6057db96d56Sopenharmony_cifunction. Randomized hashing is useful for protecting against collision attacks
6067db96d56Sopenharmony_cion the hash function used in digital signatures.
6077db96d56Sopenharmony_ci
6087db96d56Sopenharmony_ci    Randomized hashing is designed for situations where one party, the message
6097db96d56Sopenharmony_ci    preparer, generates all or part of a message to be signed by a second
6107db96d56Sopenharmony_ci    party, the message signer. If the message preparer is able to find
6117db96d56Sopenharmony_ci    cryptographic hash function collisions (i.e., two messages producing the
6127db96d56Sopenharmony_ci    same hash value), then they might prepare meaningful versions of the message
6137db96d56Sopenharmony_ci    that would produce the same hash value and digital signature, but with
6147db96d56Sopenharmony_ci    different results (e.g., transferring $1,000,000 to an account, rather than
6157db96d56Sopenharmony_ci    $10). Cryptographic hash functions have been designed with collision
6167db96d56Sopenharmony_ci    resistance as a major goal, but the current concentration on attacking
6177db96d56Sopenharmony_ci    cryptographic hash functions may result in a given cryptographic hash
6187db96d56Sopenharmony_ci    function providing less collision resistance than expected. Randomized
6197db96d56Sopenharmony_ci    hashing offers the signer additional protection by reducing the likelihood
6207db96d56Sopenharmony_ci    that a preparer can generate two or more messages that ultimately yield the
6217db96d56Sopenharmony_ci    same hash value during the digital signature generation process --- even if
6227db96d56Sopenharmony_ci    it is practical to find collisions for the hash function. However, the use
6237db96d56Sopenharmony_ci    of randomized hashing may reduce the amount of security provided by a
6247db96d56Sopenharmony_ci    digital signature when all portions of the message are prepared
6257db96d56Sopenharmony_ci    by the signer.
6267db96d56Sopenharmony_ci
6277db96d56Sopenharmony_ci    (`NIST SP-800-106 "Randomized Hashing for Digital Signatures"
6287db96d56Sopenharmony_ci    <https://csrc.nist.gov/publications/detail/sp/800-106/archive/2009-02-25>`_)
6297db96d56Sopenharmony_ci
6307db96d56Sopenharmony_ciIn BLAKE2 the salt is processed as a one-time input to the hash function during
6317db96d56Sopenharmony_ciinitialization, rather than as an input to each compression function.
6327db96d56Sopenharmony_ci
6337db96d56Sopenharmony_ci.. warning::
6347db96d56Sopenharmony_ci
6357db96d56Sopenharmony_ci    *Salted hashing* (or just hashing) with BLAKE2 or any other general-purpose
6367db96d56Sopenharmony_ci    cryptographic hash function, such as SHA-256, is not suitable for hashing
6377db96d56Sopenharmony_ci    passwords.  See `BLAKE2 FAQ <https://www.blake2.net/#qa>`_ for more
6387db96d56Sopenharmony_ci    information.
6397db96d56Sopenharmony_ci..
6407db96d56Sopenharmony_ci
6417db96d56Sopenharmony_ci    >>> import os
6427db96d56Sopenharmony_ci    >>> from hashlib import blake2b
6437db96d56Sopenharmony_ci    >>> msg = b'some message'
6447db96d56Sopenharmony_ci    >>> # Calculate the first hash with a random salt.
6457db96d56Sopenharmony_ci    >>> salt1 = os.urandom(blake2b.SALT_SIZE)
6467db96d56Sopenharmony_ci    >>> h1 = blake2b(salt=salt1)
6477db96d56Sopenharmony_ci    >>> h1.update(msg)
6487db96d56Sopenharmony_ci    >>> # Calculate the second hash with a different random salt.
6497db96d56Sopenharmony_ci    >>> salt2 = os.urandom(blake2b.SALT_SIZE)
6507db96d56Sopenharmony_ci    >>> h2 = blake2b(salt=salt2)
6517db96d56Sopenharmony_ci    >>> h2.update(msg)
6527db96d56Sopenharmony_ci    >>> # The digests are different.
6537db96d56Sopenharmony_ci    >>> h1.digest() != h2.digest()
6547db96d56Sopenharmony_ci    True
6557db96d56Sopenharmony_ci
6567db96d56Sopenharmony_ci
6577db96d56Sopenharmony_ciPersonalization
6587db96d56Sopenharmony_ci"""""""""""""""
6597db96d56Sopenharmony_ci
6607db96d56Sopenharmony_ciSometimes it is useful to force hash function to produce different digests for
6617db96d56Sopenharmony_cithe same input for different purposes. Quoting the authors of the Skein hash
6627db96d56Sopenharmony_cifunction:
6637db96d56Sopenharmony_ci
6647db96d56Sopenharmony_ci    We recommend that all application designers seriously consider doing this;
6657db96d56Sopenharmony_ci    we have seen many protocols where a hash that is computed in one part of
6667db96d56Sopenharmony_ci    the protocol can be used in an entirely different part because two hash
6677db96d56Sopenharmony_ci    computations were done on similar or related data, and the attacker can
6687db96d56Sopenharmony_ci    force the application to make the hash inputs the same. Personalizing each
6697db96d56Sopenharmony_ci    hash function used in the protocol summarily stops this type of attack.
6707db96d56Sopenharmony_ci
6717db96d56Sopenharmony_ci    (`The Skein Hash Function Family
6727db96d56Sopenharmony_ci    <https://www.schneier.com/wp-content/uploads/2016/02/skein.pdf>`_,
6737db96d56Sopenharmony_ci    p. 21)
6747db96d56Sopenharmony_ci
6757db96d56Sopenharmony_ciBLAKE2 can be personalized by passing bytes to the *person* argument::
6767db96d56Sopenharmony_ci
6777db96d56Sopenharmony_ci    >>> from hashlib import blake2b
6787db96d56Sopenharmony_ci    >>> FILES_HASH_PERSON = b'MyApp Files Hash'
6797db96d56Sopenharmony_ci    >>> BLOCK_HASH_PERSON = b'MyApp Block Hash'
6807db96d56Sopenharmony_ci    >>> h = blake2b(digest_size=32, person=FILES_HASH_PERSON)
6817db96d56Sopenharmony_ci    >>> h.update(b'the same content')
6827db96d56Sopenharmony_ci    >>> h.hexdigest()
6837db96d56Sopenharmony_ci    '20d9cd024d4fb086aae819a1432dd2466de12947831b75c5a30cf2676095d3b4'
6847db96d56Sopenharmony_ci    >>> h = blake2b(digest_size=32, person=BLOCK_HASH_PERSON)
6857db96d56Sopenharmony_ci    >>> h.update(b'the same content')
6867db96d56Sopenharmony_ci    >>> h.hexdigest()
6877db96d56Sopenharmony_ci    'cf68fb5761b9c44e7878bfb2c4c9aea52264a80b75005e65619778de59f383a3'
6887db96d56Sopenharmony_ci
6897db96d56Sopenharmony_ciPersonalization together with the keyed mode can also be used to derive different
6907db96d56Sopenharmony_cikeys from a single one.
6917db96d56Sopenharmony_ci
6927db96d56Sopenharmony_ci    >>> from hashlib import blake2s
6937db96d56Sopenharmony_ci    >>> from base64 import b64decode, b64encode
6947db96d56Sopenharmony_ci    >>> orig_key = b64decode(b'Rm5EPJai72qcK3RGBpW3vPNfZy5OZothY+kHY6h21KM=')
6957db96d56Sopenharmony_ci    >>> enc_key = blake2s(key=orig_key, person=b'kEncrypt').digest()
6967db96d56Sopenharmony_ci    >>> mac_key = blake2s(key=orig_key, person=b'kMAC').digest()
6977db96d56Sopenharmony_ci    >>> print(b64encode(enc_key).decode('utf-8'))
6987db96d56Sopenharmony_ci    rbPb15S/Z9t+agffno5wuhB77VbRi6F9Iv2qIxU7WHw=
6997db96d56Sopenharmony_ci    >>> print(b64encode(mac_key).decode('utf-8'))
7007db96d56Sopenharmony_ci    G9GtHFE1YluXY1zWPlYk1e/nWfu0WSEb0KRcjhDeP/o=
7017db96d56Sopenharmony_ci
7027db96d56Sopenharmony_ciTree mode
7037db96d56Sopenharmony_ci"""""""""
7047db96d56Sopenharmony_ci
7057db96d56Sopenharmony_ciHere's an example of hashing a minimal tree with two leaf nodes::
7067db96d56Sopenharmony_ci
7077db96d56Sopenharmony_ci       10
7087db96d56Sopenharmony_ci      /  \
7097db96d56Sopenharmony_ci     00  01
7107db96d56Sopenharmony_ci
7117db96d56Sopenharmony_ciThis example uses 64-byte internal digests, and returns the 32-byte final
7127db96d56Sopenharmony_cidigest::
7137db96d56Sopenharmony_ci
7147db96d56Sopenharmony_ci    >>> from hashlib import blake2b
7157db96d56Sopenharmony_ci    >>>
7167db96d56Sopenharmony_ci    >>> FANOUT = 2
7177db96d56Sopenharmony_ci    >>> DEPTH = 2
7187db96d56Sopenharmony_ci    >>> LEAF_SIZE = 4096
7197db96d56Sopenharmony_ci    >>> INNER_SIZE = 64
7207db96d56Sopenharmony_ci    >>>
7217db96d56Sopenharmony_ci    >>> buf = bytearray(6000)
7227db96d56Sopenharmony_ci    >>>
7237db96d56Sopenharmony_ci    >>> # Left leaf
7247db96d56Sopenharmony_ci    ... h00 = blake2b(buf[0:LEAF_SIZE], fanout=FANOUT, depth=DEPTH,
7257db96d56Sopenharmony_ci    ...               leaf_size=LEAF_SIZE, inner_size=INNER_SIZE,
7267db96d56Sopenharmony_ci    ...               node_offset=0, node_depth=0, last_node=False)
7277db96d56Sopenharmony_ci    >>> # Right leaf
7287db96d56Sopenharmony_ci    ... h01 = blake2b(buf[LEAF_SIZE:], fanout=FANOUT, depth=DEPTH,
7297db96d56Sopenharmony_ci    ...               leaf_size=LEAF_SIZE, inner_size=INNER_SIZE,
7307db96d56Sopenharmony_ci    ...               node_offset=1, node_depth=0, last_node=True)
7317db96d56Sopenharmony_ci    >>> # Root node
7327db96d56Sopenharmony_ci    ... h10 = blake2b(digest_size=32, fanout=FANOUT, depth=DEPTH,
7337db96d56Sopenharmony_ci    ...               leaf_size=LEAF_SIZE, inner_size=INNER_SIZE,
7347db96d56Sopenharmony_ci    ...               node_offset=0, node_depth=1, last_node=True)
7357db96d56Sopenharmony_ci    >>> h10.update(h00.digest())
7367db96d56Sopenharmony_ci    >>> h10.update(h01.digest())
7377db96d56Sopenharmony_ci    >>> h10.hexdigest()
7387db96d56Sopenharmony_ci    '3ad2a9b37c6070e374c7a8c508fe20ca86b6ed54e286e93a0318e95e881db5aa'
7397db96d56Sopenharmony_ci
7407db96d56Sopenharmony_ciCredits
7417db96d56Sopenharmony_ci^^^^^^^
7427db96d56Sopenharmony_ci
7437db96d56Sopenharmony_ciBLAKE2_ was designed by *Jean-Philippe Aumasson*, *Samuel Neves*, *Zooko
7447db96d56Sopenharmony_ciWilcox-O'Hearn*, and *Christian Winnerlein* based on SHA-3_ finalist BLAKE_
7457db96d56Sopenharmony_cicreated by *Jean-Philippe Aumasson*, *Luca Henzen*, *Willi Meier*, and
7467db96d56Sopenharmony_ci*Raphael C.-W. Phan*.
7477db96d56Sopenharmony_ci
7487db96d56Sopenharmony_ciIt uses core algorithm from ChaCha_ cipher designed by *Daniel J.  Bernstein*.
7497db96d56Sopenharmony_ci
7507db96d56Sopenharmony_ciThe stdlib implementation is based on pyblake2_ module. It was written by
7517db96d56Sopenharmony_ci*Dmitry Chestnykh* based on C implementation written by *Samuel Neves*. The
7527db96d56Sopenharmony_cidocumentation was copied from pyblake2_ and written by *Dmitry Chestnykh*.
7537db96d56Sopenharmony_ci
7547db96d56Sopenharmony_ciThe C code was partly rewritten for Python by *Christian Heimes*.
7557db96d56Sopenharmony_ci
7567db96d56Sopenharmony_ciThe following public domain dedication applies for both C hash function
7577db96d56Sopenharmony_ciimplementation, extension code, and this documentation:
7587db96d56Sopenharmony_ci
7597db96d56Sopenharmony_ci   To the extent possible under law, the author(s) have dedicated all copyright
7607db96d56Sopenharmony_ci   and related and neighboring rights to this software to the public domain
7617db96d56Sopenharmony_ci   worldwide. This software is distributed without any warranty.
7627db96d56Sopenharmony_ci
7637db96d56Sopenharmony_ci   You should have received a copy of the CC0 Public Domain Dedication along
7647db96d56Sopenharmony_ci   with this software. If not, see
7657db96d56Sopenharmony_ci   https://creativecommons.org/publicdomain/zero/1.0/.
7667db96d56Sopenharmony_ci
7677db96d56Sopenharmony_ciThe following people have helped with development or contributed their changes
7687db96d56Sopenharmony_cito the project and the public domain according to the Creative Commons Public
7697db96d56Sopenharmony_ciDomain Dedication 1.0 Universal:
7707db96d56Sopenharmony_ci
7717db96d56Sopenharmony_ci* *Alexandr Sokolovskiy*
7727db96d56Sopenharmony_ci
7737db96d56Sopenharmony_ci.. _BLAKE2: https://www.blake2.net
7747db96d56Sopenharmony_ci.. _HMAC: https://en.wikipedia.org/wiki/Hash-based_message_authentication_code
7757db96d56Sopenharmony_ci.. _BLAKE: https://web.archive.org/web/20200918190133/https://131002.net/blake/
7767db96d56Sopenharmony_ci.. _SHA-3: https://en.wikipedia.org/wiki/NIST_hash_function_competition
7777db96d56Sopenharmony_ci.. _ChaCha: https://cr.yp.to/chacha.html
7787db96d56Sopenharmony_ci.. _pyblake2: https://pythonhosted.org/pyblake2/
7797db96d56Sopenharmony_ci.. _NIST-SP-800-132: https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf
7807db96d56Sopenharmony_ci.. _stackexchange pbkdf2 iterations question: https://security.stackexchange.com/questions/3959/recommended-of-iterations-when-using-pbkdf2-sha256/
7817db96d56Sopenharmony_ci
7827db96d56Sopenharmony_ci
7837db96d56Sopenharmony_ci.. seealso::
7847db96d56Sopenharmony_ci
7857db96d56Sopenharmony_ci   Module :mod:`hmac`
7867db96d56Sopenharmony_ci      A module to generate message authentication codes using hashes.
7877db96d56Sopenharmony_ci
7887db96d56Sopenharmony_ci   Module :mod:`base64`
7897db96d56Sopenharmony_ci      Another way to encode binary hashes for non-binary environments.
7907db96d56Sopenharmony_ci
7917db96d56Sopenharmony_ci   https://www.blake2.net
7927db96d56Sopenharmony_ci      Official BLAKE2 website.
7937db96d56Sopenharmony_ci
7947db96d56Sopenharmony_ci   https://csrc.nist.gov/csrc/media/publications/fips/180/2/archive/2002-08-01/documents/fips180-2.pdf
7957db96d56Sopenharmony_ci      The FIPS 180-2 publication on Secure Hash Algorithms.
7967db96d56Sopenharmony_ci
7977db96d56Sopenharmony_ci   https://en.wikipedia.org/wiki/Cryptographic_hash_function#Cryptographic_hash_algorithms
7987db96d56Sopenharmony_ci      Wikipedia article with information on which algorithms have known issues and
7997db96d56Sopenharmony_ci      what that means regarding their use.
8007db96d56Sopenharmony_ci
8017db96d56Sopenharmony_ci   https://www.ietf.org/rfc/rfc8018.txt
8027db96d56Sopenharmony_ci      PKCS #5: Password-Based Cryptography Specification Version 2.1
8037db96d56Sopenharmony_ci
8047db96d56Sopenharmony_ci   https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf
8057db96d56Sopenharmony_ci      NIST Recommendation for Password-Based Key Derivation.
806