summaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/Modules/sha3module.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/tools/python3/Modules/sha3module.c')
-rw-r--r--contrib/tools/python3/Modules/sha3module.c45
1 files changed, 26 insertions, 19 deletions
diff --git a/contrib/tools/python3/Modules/sha3module.c b/contrib/tools/python3/Modules/sha3module.c
index f3c6a7fced7..79146c2985e 100644
--- a/contrib/tools/python3/Modules/sha3module.c
+++ b/contrib/tools/python3/Modules/sha3module.c
@@ -61,8 +61,8 @@ class _sha3.shake_256 "SHA3object *" "&SHAKE256type"
typedef struct {
PyObject_HEAD
// Prevents undefined behavior via multiple threads entering the C API.
- // The lock will be NULL before threaded access has been enabled.
- PyThread_type_lock lock;
+ bool use_mutex;
+ PyMutex mutex;
Hacl_Hash_SHA3_state_t *hash_state;
} SHA3object;
@@ -76,7 +76,8 @@ newSHA3object(PyTypeObject *type)
if (newobj == NULL) {
return NULL;
}
- newobj->lock = NULL;
+ HASHLIB_INIT_MUTEX(newobj);
+
return newobj;
}
@@ -97,18 +98,25 @@ static void sha3_update(Hacl_Hash_SHA3_state_t *state, uint8_t *buf, Py_ssize_t
/*[clinic input]
@classmethod
_sha3.sha3_224.__new__ as py_sha3_new
- data: object(c_default="NULL") = b''
- /
+
+ data as data_obj: object(c_default="NULL") = b''
*
usedforsecurity: bool = True
+ string: object(c_default="NULL") = None
Return a new SHA3 hash object.
[clinic start generated code]*/
static PyObject *
-py_sha3_new_impl(PyTypeObject *type, PyObject *data, int usedforsecurity)
-/*[clinic end generated code: output=90409addc5d5e8b0 input=637e5f8f6a93982a]*/
+py_sha3_new_impl(PyTypeObject *type, PyObject *data_obj, int usedforsecurity,
+ PyObject *string)
+/*[clinic end generated code: output=dcec1eca20395f2a input=c106e0b4e2d67d58]*/
{
+ PyObject *data;
+ if (_Py_hashlib_data_argument(&data, data_obj, string) < 0) {
+ return NULL;
+ }
+
Py_buffer buf = {NULL, NULL};
SHA3State *state = _PyType_GetModuleState(type);
SHA3object *self = newSHA3object(type);
@@ -169,9 +177,6 @@ static void
SHA3_dealloc(SHA3object *self)
{
Hacl_Hash_SHA3_free(self->hash_state);
- if (self->lock != NULL) {
- PyThread_free_lock(self->lock);
- }
PyTypeObject *tp = Py_TYPE(self);
PyObject_Free(self);
Py_DECREF(tp);
@@ -257,19 +262,22 @@ _sha3_sha3_224_update(SHA3object *self, PyObject *data)
/*[clinic end generated code: output=d3223352286ed357 input=a887f54dcc4ae227]*/
{
Py_buffer buf;
+
GET_BUFFER_VIEW_OR_ERROUT(data, &buf);
- if (self->lock == NULL && buf.len >= HASHLIB_GIL_MINSIZE) {
- self->lock = PyThread_allocate_lock();
+
+ if (!self->use_mutex && buf.len >= HASHLIB_GIL_MINSIZE) {
+ self->use_mutex = true;
}
- if (self->lock != NULL) {
+ if (self->use_mutex) {
Py_BEGIN_ALLOW_THREADS
- PyThread_acquire_lock(self->lock, 1);
+ PyMutex_Lock(&self->mutex);
sha3_update(self->hash_state, buf.buf, buf.len);
- PyThread_release_lock(self->lock);
+ PyMutex_Unlock(&self->mutex);
Py_END_ALLOW_THREADS
} else {
sha3_update(self->hash_state, buf.buf, buf.len);
}
+
PyBuffer_Release(&buf);
Py_RETURN_NONE;
}
@@ -454,14 +462,13 @@ _SHAKE_digest(SHA3object *self, unsigned long digestlen, int hex)
_sha3.shake_128.digest
length: unsigned_long
- /
Return the digest value as a bytes object.
[clinic start generated code]*/
static PyObject *
_sha3_shake_128_digest_impl(SHA3object *self, unsigned long length)
-/*[clinic end generated code: output=2313605e2f87bb8f input=418ef6a36d2e6082]*/
+/*[clinic end generated code: output=2313605e2f87bb8f input=93d6d6ff32904f18]*/
{
return _SHAKE_digest(self, length, 0);
}
@@ -471,14 +478,13 @@ _sha3_shake_128_digest_impl(SHA3object *self, unsigned long length)
_sha3.shake_128.hexdigest
length: unsigned_long
- /
Return the digest value as a string of hexadecimal digits.
[clinic start generated code]*/
static PyObject *
_sha3_shake_128_hexdigest_impl(SHA3object *self, unsigned long length)
-/*[clinic end generated code: output=bf8e2f1e490944a8 input=69fb29b0926ae321]*/
+/*[clinic end generated code: output=bf8e2f1e490944a8 input=562d74e7060b56ab]*/
{
return _SHAKE_digest(self, length, 1);
}
@@ -601,6 +607,7 @@ _sha3_exec(PyObject *m)
static PyModuleDef_Slot _sha3_slots[] = {
{Py_mod_exec, _sha3_exec},
{Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
+ {Py_mod_gil, Py_MOD_GIL_NOT_USED},
{0, NULL}
};