The `Modules/hashlib.h` helper file is now removed and split into multiple files: * `Modules/_hashlib/hashlib_buffer.[ch]` -- Utilities for getting a buffer view and handling buffer inputs. * `Modules/_hashlib/hashlib_fetch.h` -- Utilities used when fetching a message digest from a digest-like identifier. Currently, this file only contains common error messages as the fetching API is not yet implemented. * `Modules/_hashlib/hashlib_mutex.h` -- Utilities for managing the lock on cryptographic hash objects.
66 lines
2.0 KiB
C
66 lines
2.0 KiB
C
#include "hashlib_buffer.h"
|
|
|
|
int
|
|
_Py_hashlib_data_argument(PyObject **res, PyObject *data, PyObject *string)
|
|
{
|
|
if (data != NULL && string == NULL) {
|
|
// called as H(data) or H(data=...)
|
|
*res = data;
|
|
return 1;
|
|
}
|
|
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;
|
|
}
|
|
else if (data == NULL && string == NULL) {
|
|
// fast path when no data is given
|
|
assert(!PyErr_Occurred());
|
|
*res = NULL;
|
|
return 0;
|
|
}
|
|
else {
|
|
// called as H(data=..., string)
|
|
*res = NULL;
|
|
PyErr_SetString(PyExc_TypeError,
|
|
"'data' and 'string' are mutually exclusive "
|
|
"and support for 'string' keyword parameter "
|
|
"is slated for removal in a future version.");
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
int
|
|
_Py_hashlib_get_buffer_view(PyObject *obj, Py_buffer *view)
|
|
{
|
|
if (PyUnicode_Check(obj)) {
|
|
PyErr_SetString(PyExc_TypeError,
|
|
"Strings must be encoded before hashing");
|
|
return -1;
|
|
}
|
|
if (!PyObject_CheckBuffer(obj)) {
|
|
PyErr_SetString(PyExc_TypeError,
|
|
"object supporting the buffer API required");
|
|
return -1;
|
|
}
|
|
if (PyObject_GetBuffer(obj, view, PyBUF_SIMPLE) == -1) {
|
|
return -1;
|
|
}
|
|
if (view->ndim > 1) {
|
|
PyErr_SetString(PyExc_BufferError,
|
|
"Buffer must be single dimension");
|
|
PyBuffer_Release(view);
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|