Skip to content

gh-134978: deprecate string keyword parameter for hash function constructors #134979

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions Doc/deprecations/pending-removal-in-3.19.rst
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,19 @@ Pending removal in Python 3.19
* Implicitly switching to the MSVC-compatible struct layout by setting
:attr:`~ctypes.Structure._pack_` but not :attr:`~ctypes.Structure._layout_`
on non-Windows platforms.

* :mod:`hashlib`:

- In hash function constructors such as :func:`~hashlib.new` or the
direct hash-named constructors such as :func:`~hashlib.md5` and
:func:`~hashlib.sha256`, their optional initial data parameter could
also be passed a keyword argument named ``data=`` or ``string=`` in
various :mod:`!hashlib` implementations.

Support for the ``string`` keyword argument name is now deprecated
and slated for removal in Python 3.19.

Before Python 3.13, the ``string`` keyword parameter was not correctly
supported depending on the backend implementation of hash functions.
Prefer passing the initial data as a positional argument for maximum
backwards compatibility.
7 changes: 7 additions & 0 deletions Doc/library/hashlib.rst
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,13 @@ accessible by name via :func:`new`. See :data:`algorithms_available`.
OpenSSL does not provide we fall back to a verified implementation from
the `HACL\* project`_.

.. deprecated-removed:: 3.15 3.19
The undocumented ``string`` keyword parameter in :func:`!_hashlib.new`
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This deprecation note is about the private interface (except for the public hashlib.sha3_*, 'string' was only present in private functions), so I still mentioned this here. There were too many situations where people complained that a deprecation note was only in present in the What's New or changelog, but not in the page documenting the functions (though in this case, the only documented functions being affected are sha3_* or hashlib.new + sha3 + HACL*)

and hash-named constructors such as :func:`!_md5.md5` is deprecated.
Prefer passing the initial data as a positional argument for maximum
backwards compatibility.


Usage
-----

Expand Down
16 changes: 14 additions & 2 deletions Doc/whatsnew/3.15.rst
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,20 @@ module_name
Deprecated
==========

* module_name:
TODO
hashlib
-------

* In hash function constructors such as :func:`~hashlib.new` or the
direct hash-named constructors such as :func:`~hashlib.md5` and
:func:`~hashlib.sha256`, their optional initial data parameter could
also be passed a keyword argument named ``data=`` or ``string=`` in
various :mod:`hashlib` implementations.

Support for the ``string`` keyword argument name is now deprecated and
is slated for removal in Python 3.19. Prefer passing the initial data as
a positional argument for maximum backwards compatibility.

(Contributed by Bénédikt Tran in :gh:`134978`.)


.. Add deprecations above alphabetically, not here at the end.
Expand Down
20 changes: 17 additions & 3 deletions Lib/test/test_hashlib.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,14 @@ def read_vectors(hash_name):
yield parts


DEPRECATED_STRING_PARAMETER = re.escape(
"the 'string' keyword parameter is deprecated since "
"Python 3.15 and slated for removal in Python 3.19; "
"use the 'data' keyword parameter or pass the data "
"to hash as a positional argument instead"
)


class HashLibTestCase(unittest.TestCase):
supported_hash_names = ( 'md5', 'MD5', 'sha1', 'SHA1',
'sha224', 'SHA224', 'sha256', 'SHA256',
Expand Down Expand Up @@ -255,17 +263,23 @@ def test_clinic_signature(self):
with self.subTest(constructor.__name__):
constructor(b'')
constructor(data=b'')
constructor(string=b'') # should be deprecated in the future
with self.assertWarnsRegex(DeprecationWarning,
DEPRECATED_STRING_PARAMETER):
constructor(string=b'')

digest_name = constructor(b'').name
with self.subTest(digest_name):
hashlib.new(digest_name, b'')
hashlib.new(digest_name, data=b'')
hashlib.new(digest_name, string=b'')
with self.assertWarnsRegex(DeprecationWarning,
DEPRECATED_STRING_PARAMETER):
hashlib.new(digest_name, string=b'')
if self._hashlib:
self._hashlib.new(digest_name, b'')
self._hashlib.new(digest_name, data=b'')
self._hashlib.new(digest_name, string=b'')
with self.assertWarnsRegex(DeprecationWarning,
DEPRECATED_STRING_PARAMETER):
self._hashlib.new(digest_name, string=b'')

@unittest.skipIf(get_fips_mode(), "skip in FIPS mode")
def test_clinic_signature_errors(self):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
:mod:`hashlib`: Supporting the ``string`` keyword parameter in hash function
constructors such as :func:`~hashlib.new` or the direct hash-named constructors
such as :func:`~hashlib.md5` and :func:`~hashlib.sha256` is now deprecated and
slated for removal in Python 3.19.
Prefer passing the initial data as a positional argument for maximum backwards
compatibility.
Patch by Bénédikt Tran.
9 changes: 9 additions & 0 deletions Modules/hashlib.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,15 @@ _Py_hashlib_data_argument(PyObject **res, PyObject *data, PyObject *string)
}
else if (data == NULL && string != NULL) {
// called as H(string=...)
if (PyErr_WarnEx(PyExc_DeprecationWarning,
"the 'string' keyword parameter is deprecated since "
"Python 3.15 and slated for removal in Python 3.19; "
"use the 'data' keyword parameter or pass the data "
"to hash as a positional argument instead", 1) < 0)
{
*res = NULL;
return -1;
}
*res = string;
return 1;
}
Expand Down
Loading