From 4774f0c7fc4771b7963ed83916d49bc7075ba90d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Mon, 23 Dec 2024 14:32:58 +0100 Subject: [PATCH 01/12] fix UBSan failures in `sha3module.c` --- Modules/sha3module.c | 62 +++++++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 27 deletions(-) diff --git a/Modules/sha3module.c b/Modules/sha3module.c index b13e6a9de10114..e12479575d8e77 100644 --- a/Modules/sha3module.c +++ b/Modules/sha3module.c @@ -66,6 +66,8 @@ typedef struct { Hacl_Hash_SHA3_state_t *hash_state; } SHA3object; +#define _SHA3object_CAST(op) ((SHA3object *)(op)) + #include "clinic/sha3module.c.h" static SHA3object * @@ -167,8 +169,9 @@ py_sha3_new_impl(PyTypeObject *type, PyObject *data, int usedforsecurity) /* Internal methods for a hash object */ static int -SHA3_clear(SHA3object *self) +SHA3_clear(PyObject *op) { + SHA3object *self = _SHA3object_CAST(op); if (self->hash_state != NULL) { Hacl_Hash_SHA3_free(self->hash_state); self->hash_state = NULL; @@ -177,7 +180,7 @@ SHA3_clear(SHA3object *self) } static void -SHA3_dealloc(SHA3object *self) +SHA3_dealloc(PyObject *self) { PyTypeObject *tp = Py_TYPE(self); PyObject_GC_UnTrack(self); @@ -303,15 +306,16 @@ static PyMethodDef SHA3_methods[] = { static PyObject * -SHA3_get_block_size(SHA3object *self, void *closure) +SHA3_get_block_size(PyObject *op, void *closure) { + SHA3object *self = _SHA3object_CAST(op); uint32_t rate = Hacl_Hash_SHA3_block_len(self->hash_state); return PyLong_FromLong(rate); } static PyObject * -SHA3_get_name(SHA3object *self, void *closure) +SHA3_get_name(PyObject *self, void *closure) { PyTypeObject *type = Py_TYPE(self); @@ -338,9 +342,10 @@ SHA3_get_name(SHA3object *self, void *closure) static PyObject * -SHA3_get_digest_size(SHA3object *self, void *closure) +SHA3_get_digest_size(PyObject *op, void *closure) { // Preserving previous behavior: variable-length algorithms return 0 + SHA3object *self = _SHA3object_CAST(op); if (Hacl_Hash_SHA3_is_shake(self->hash_state)) return PyLong_FromLong(0); else @@ -349,8 +354,9 @@ SHA3_get_digest_size(SHA3object *self, void *closure) static PyObject * -SHA3_get_capacity_bits(SHA3object *self, void *closure) +SHA3_get_capacity_bits(PyObject *op, void *closure) { + SHA3object *self = _SHA3object_CAST(op); uint32_t rate = Hacl_Hash_SHA3_block_len(self->hash_state) * 8; assert(rate <= 1600); int capacity = 1600 - rate; @@ -359,27 +365,28 @@ SHA3_get_capacity_bits(SHA3object *self, void *closure) static PyObject * -SHA3_get_rate_bits(SHA3object *self, void *closure) +SHA3_get_rate_bits(PyObject *op, void *closure) { + SHA3object *self = _SHA3object_CAST(op); uint32_t rate = Hacl_Hash_SHA3_block_len(self->hash_state) * 8; return PyLong_FromLong(rate); } static PyObject * -SHA3_get_suffix(SHA3object *self, void *closure) +SHA3_get_suffix(PyObject *self, void *closure) { unsigned char suffix[2] = {0x06, 0}; return PyBytes_FromStringAndSize((const char *)suffix, 1); } static PyGetSetDef SHA3_getseters[] = { - {"block_size", (getter)SHA3_get_block_size, NULL, NULL, NULL}, - {"name", (getter)SHA3_get_name, NULL, NULL, NULL}, - {"digest_size", (getter)SHA3_get_digest_size, NULL, NULL, NULL}, - {"_capacity_bits", (getter)SHA3_get_capacity_bits, NULL, NULL, NULL}, - {"_rate_bits", (getter)SHA3_get_rate_bits, NULL, NULL, NULL}, - {"_suffix", (getter)SHA3_get_suffix, NULL, NULL, NULL}, - {NULL} /* Sentinel */ + {"block_size", SHA3_get_block_size, NULL, NULL, NULL}, + {"name", SHA3_get_name, NULL, NULL, NULL}, + {"digest_size", SHA3_get_digest_size, NULL, NULL, NULL}, + {"_capacity_bits", SHA3_get_capacity_bits, NULL, NULL, NULL}, + {"_rate_bits", SHA3_get_rate_bits, NULL, NULL, NULL}, + {"_suffix", SHA3_get_suffix, NULL, NULL, NULL}, + {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ }; #define SHA3_TYPE_SLOTS(type_slots_obj, type_doc, type_methods, type_getseters) \ @@ -438,10 +445,11 @@ SHA3_TYPE_SLOTS(sha3_512_slots, sha3_512__doc__, SHA3_methods, SHA3_getseters); SHA3_TYPE_SPEC(sha3_512_spec, "sha3_512", sha3_512_slots); static PyObject * -_SHAKE_digest(SHA3object *self, unsigned long digestlen, int hex) +_SHAKE_digest(PyObject *op, unsigned long digestlen, int hex) { unsigned char *digest = NULL; PyObject *result = NULL; + SHA3object *self = _SHA3object_CAST(op); if (digestlen >= (1 << 29)) { PyErr_SetString(PyExc_ValueError, "length is too large"); @@ -483,7 +491,7 @@ static PyObject * _sha3_shake_128_digest_impl(SHA3object *self, unsigned long length) /*[clinic end generated code: output=2313605e2f87bb8f input=418ef6a36d2e6082]*/ { - return _SHAKE_digest(self, length, 0); + return _SHAKE_digest((PyObject *)self, length, 0); } @@ -500,17 +508,17 @@ static PyObject * _sha3_shake_128_hexdigest_impl(SHA3object *self, unsigned long length) /*[clinic end generated code: output=bf8e2f1e490944a8 input=69fb29b0926ae321]*/ { - return _SHAKE_digest(self, length, 1); + return _SHAKE_digest((PyObject *)self, length, 1); } static PyObject * -SHAKE_get_digest_size(SHA3object *self, void *closure) +SHAKE_get_digest_size(PyObject *self, void *closure) { return PyLong_FromLong(0); } static PyObject * -SHAKE_get_suffix(SHA3object *self, void *closure) +SHAKE_get_suffix(PyObject *self, void *closure) { unsigned char suffix[2] = {0x1f, 0}; return PyBytes_FromStringAndSize((const char *)suffix, 1); @@ -518,13 +526,13 @@ SHAKE_get_suffix(SHA3object *self, void *closure) static PyGetSetDef SHAKE_getseters[] = { - {"block_size", (getter)SHA3_get_block_size, NULL, NULL, NULL}, - {"name", (getter)SHA3_get_name, NULL, NULL, NULL}, - {"digest_size", (getter)SHAKE_get_digest_size, NULL, NULL, NULL}, - {"_capacity_bits", (getter)SHA3_get_capacity_bits, NULL, NULL, NULL}, - {"_rate_bits", (getter)SHA3_get_rate_bits, NULL, NULL, NULL}, - {"_suffix", (getter)SHAKE_get_suffix, NULL, NULL, NULL}, - {NULL} /* Sentinel */ + {"block_size", SHA3_get_block_size, NULL, NULL, NULL}, + {"name", SHA3_get_name, NULL, NULL, NULL}, + {"digest_size", SHAKE_get_digest_size, NULL, NULL, NULL}, + {"_capacity_bits", SHA3_get_capacity_bits, NULL, NULL, NULL}, + {"_rate_bits", SHA3_get_rate_bits, NULL, NULL, NULL}, + {"_suffix", SHAKE_get_suffix, NULL, NULL, NULL}, + {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ }; From d4179e19c0944645cdbb5df4e676c7d6a13c4036 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Mon, 23 Dec 2024 14:37:48 +0100 Subject: [PATCH 02/12] fix UBSan failures in `sha2module.c` --- Modules/sha2module.c | 55 ++++++++++++++++++-------------------------- 1 file changed, 23 insertions(+), 32 deletions(-) diff --git a/Modules/sha2module.c b/Modules/sha2module.c index 7d6a1e40243f9d..70e5d3824b3c42 100644 --- a/Modules/sha2module.c +++ b/Modules/sha2module.c @@ -67,6 +67,9 @@ typedef struct { Hacl_Hash_SHA2_state_t_512 *state; } SHA512object; +#define _SHA256object_CAST(op) ((SHA256object *)(op)) +#define _SHA512object_CAST(op) ((SHA512object *)(op)) + #include "clinic/sha2module.c.h" /* We shall use run-time type information in the remainder of this module to @@ -164,8 +167,9 @@ SHA2_traverse(PyObject *ptr, visitproc visit, void *arg) } static void -SHA256_dealloc(SHA256object *ptr) +SHA256_dealloc(PyObject *op) { + SHA256object *ptr = _SHA256object_CAST(op); Hacl_Hash_SHA2_free_256(ptr->state); PyTypeObject *tp = Py_TYPE(ptr); PyObject_GC_UnTrack(ptr); @@ -174,8 +178,9 @@ SHA256_dealloc(SHA256object *ptr) } static void -SHA512_dealloc(SHA512object *ptr) +SHA512_dealloc(PyObject *op) { + SHA512object *ptr = _SHA512object_CAST(op); Hacl_Hash_SHA2_free_512(ptr->state); PyTypeObject *tp = Py_TYPE(ptr); PyObject_GC_UnTrack(ptr); @@ -454,20 +459,23 @@ SHA512_get_block_size(PyObject *self, void *closure) } static PyObject * -SHA256_get_digest_size(SHA256object *self, void *closure) +SHA256_get_digest_size(PyObject *op, void *closure) { + SHA256object *self = _SHA256object_CAST(op); return PyLong_FromLong(self->digestsize); } static PyObject * -SHA512_get_digest_size(SHA512object *self, void *closure) +SHA512_get_digest_size(PyObject *op, void *closure) { + SHA512object *self = _SHA512object_CAST(op); return PyLong_FromLong(self->digestsize); } static PyObject * -SHA256_get_name(SHA256object *self, void *closure) +SHA256_get_name(PyObject *op, void *closure) { + SHA256object *self = _SHA256object_CAST(op); if (self->digestsize == 28) { return PyUnicode_FromStringAndSize("sha224", 6); } @@ -475,8 +483,9 @@ SHA256_get_name(SHA256object *self, void *closure) } static PyObject * -SHA512_get_name(SHA512object *self, void *closure) +SHA512_get_name(PyObject *op, void *closure) { + SHA512object *self = _SHA512object_CAST(op); if (self->digestsize == 64) { return PyUnicode_FromStringAndSize("sha512", 6); } @@ -484,35 +493,17 @@ SHA512_get_name(SHA512object *self, void *closure) } static PyGetSetDef SHA256_getseters[] = { - {"block_size", - (getter)SHA256_get_block_size, NULL, - NULL, - NULL}, - {"name", - (getter)SHA256_get_name, NULL, - NULL, - NULL}, - {"digest_size", - (getter)SHA256_get_digest_size, NULL, - NULL, - NULL}, - {NULL} /* Sentinel */ + {"block_size", SHA256_get_block_size, NULL, NULL, NULL}, + {"name", SHA256_get_name, NULL, NULL, NULL}, + {"digest_size", SHA256_get_digest_size, NULL, NULL, NULL}, + {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ }; static PyGetSetDef SHA512_getseters[] = { - {"block_size", - (getter)SHA512_get_block_size, NULL, - NULL, - NULL}, - {"name", - (getter)SHA512_get_name, NULL, - NULL, - NULL}, - {"digest_size", - (getter)SHA512_get_digest_size, NULL, - NULL, - NULL}, - {NULL} /* Sentinel */ + {"block_size", SHA512_get_block_size, NULL, NULL, NULL}, + {"name", SHA512_get_name, NULL, NULL, NULL}, + {"digest_size", SHA512_get_digest_size, NULL, NULL, NULL}, + {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ }; static PyType_Slot sha256_types_slots[] = { From 83b696b88ecef8c96ad6372fd5699042401cd428 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Mon, 23 Dec 2024 14:44:24 +0100 Subject: [PATCH 03/12] fix UBSan failures in `sha1module.c` --- Modules/sha1module.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/Modules/sha1module.c b/Modules/sha1module.c index 34a427a39b5cf8..9c9a0175bc4c00 100644 --- a/Modules/sha1module.c +++ b/Modules/sha1module.c @@ -55,6 +55,8 @@ typedef struct { Hacl_Hash_SHA1_state_t *hash_state; } SHA1object; +#define _SHA1object_CAST(op) ((SHA1object *)(op)) + #include "clinic/sha1module.c.h" @@ -93,8 +95,9 @@ SHA1_traverse(PyObject *ptr, visitproc visit, void *arg) } static void -SHA1_dealloc(SHA1object *ptr) +SHA1_dealloc(PyObject *op) { + SHA1object *ptr = _SHA1object_CAST(op); Hacl_Hash_SHA1_free(ptr->hash_state); PyTypeObject *tp = Py_TYPE(ptr); PyObject_GC_UnTrack(ptr); @@ -235,19 +238,10 @@ sha1_get_digest_size(PyObject *self, void *closure) } static PyGetSetDef SHA1_getseters[] = { - {"block_size", - (getter)SHA1_get_block_size, NULL, - NULL, - NULL}, - {"name", - (getter)SHA1_get_name, NULL, - NULL, - NULL}, - {"digest_size", - (getter)sha1_get_digest_size, NULL, - NULL, - NULL}, - {NULL} /* Sentinel */ + {"block_size", SHA1_get_block_size, NULL, NULL, NULL}, + {"name", SHA1_get_name, NULL, NULL, NULL}, + {"digest_size", sha1_get_digest_size, NULL, NULL, NULL}, + {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ }; static PyType_Slot sha1_type_slots[] = { From a0e2b2ad226f9d19e15313f6890b5001d9d58458 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Mon, 23 Dec 2024 14:58:22 +0100 Subject: [PATCH 04/12] fix UBSan failures in `md5module.c` --- Modules/md5module.c | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/Modules/md5module.c b/Modules/md5module.c index ef9163e8be5b6c..0200731d1c73b5 100644 --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -54,6 +54,8 @@ typedef struct { Hacl_Hash_MD5_state_t *hash_state; } MD5object; +#define _MD5object_CAST(op) ((MD5object *)(op)) + #include "clinic/md5module.c.h" @@ -91,10 +93,11 @@ MD5_traverse(PyObject *ptr, visitproc visit, void *arg) } static void -MD5_dealloc(MD5object *ptr) +MD5_dealloc(PyObject *op) { + MD5object *ptr = _MD5object_CAST(op); Hacl_Hash_MD5_free(ptr->hash_state); - PyTypeObject *tp = Py_TYPE((PyObject*)ptr); + PyTypeObject *tp = Py_TYPE(op); PyObject_GC_UnTrack(ptr); PyObject_GC_Del(ptr); Py_DECREF(tp); @@ -242,19 +245,10 @@ md5_get_digest_size(PyObject *self, void *closure) } static PyGetSetDef MD5_getseters[] = { - {"block_size", - (getter)MD5_get_block_size, NULL, - NULL, - NULL}, - {"name", - (getter)MD5_get_name, NULL, - NULL, - NULL}, - {"digest_size", - (getter)md5_get_digest_size, NULL, - NULL, - NULL}, - {NULL} /* Sentinel */ + {"block_size", MD5_get_block_size, NULL, NULL, NULL}, + {"name", MD5_get_name, NULL, NULL, NULL}, + {"digest_size", md5_get_digest_size, NULL, NULL, NULL}, + {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ }; static PyType_Slot md5_type_slots[] = { From e43effb2493042b01fd388cc94f7fd4bbe27d33d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Mon, 23 Dec 2024 14:39:14 +0100 Subject: [PATCH 05/12] suppress unused return values --- Modules/sha1module.c | 2 +- Modules/sha2module.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/sha1module.c b/Modules/sha1module.c index 9c9a0175bc4c00..3569d2ccc89fa9 100644 --- a/Modules/sha1module.c +++ b/Modules/sha1module.c @@ -340,7 +340,7 @@ _sha1_clear(PyObject *module) static void _sha1_free(void *module) { - _sha1_clear((PyObject *)module); + (void)_sha1_clear((PyObject *)module); } static int diff --git a/Modules/sha2module.c b/Modules/sha2module.c index 70e5d3824b3c42..59fce7ad694936 100644 --- a/Modules/sha2module.c +++ b/Modules/sha2module.c @@ -809,7 +809,7 @@ _sha2_clear(PyObject *module) static void _sha2_free(void *module) { - _sha2_clear((PyObject *)module); + (void)_sha2_clear((PyObject *)module); } /* Initialize this module. */ From ecf78f9337d64d95b53459eed543ae5eba3024e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Mon, 23 Dec 2024 14:53:19 +0100 Subject: [PATCH 06/12] remove redundant casts in constructors --- Modules/md5module.c | 2 +- Modules/sha1module.c | 2 +- Modules/sha2module.c | 12 ++++-------- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/Modules/md5module.c b/Modules/md5module.c index 0200731d1c73b5..b1b575b04c6681 100644 --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -74,7 +74,7 @@ md5_get_state(PyObject *module) static MD5object * newMD5object(MD5State * st) { - MD5object *md5 = (MD5object *)PyObject_GC_New(MD5object, st->md5_type); + MD5object *md5 = PyObject_GC_New(MD5object, st->md5_type); if (!md5) { return NULL; } diff --git a/Modules/sha1module.c b/Modules/sha1module.c index 3569d2ccc89fa9..43b67697c88e76 100644 --- a/Modules/sha1module.c +++ b/Modules/sha1module.c @@ -75,7 +75,7 @@ sha1_get_state(PyObject *module) static SHA1object * newSHA1object(SHA1State *st) { - SHA1object *sha = (SHA1object *)PyObject_GC_New(SHA1object, st->sha1_type); + SHA1object *sha = PyObject_GC_New(SHA1object, st->sha1_type); if (sha == NULL) { return NULL; } diff --git a/Modules/sha2module.c b/Modules/sha2module.c index 59fce7ad694936..bd92ccbdf8ebe6 100644 --- a/Modules/sha2module.c +++ b/Modules/sha2module.c @@ -104,8 +104,7 @@ static void SHA512copy(SHA512object *src, SHA512object *dest) static SHA256object * newSHA224object(sha2_state *state) { - SHA256object *sha = (SHA256object *)PyObject_GC_New( - SHA256object, state->sha224_type); + SHA256object *sha = PyObject_GC_New(SHA256object, state->sha224_type); if (!sha) { return NULL; } @@ -118,8 +117,7 @@ newSHA224object(sha2_state *state) static SHA256object * newSHA256object(sha2_state *state) { - SHA256object *sha = (SHA256object *)PyObject_GC_New( - SHA256object, state->sha256_type); + SHA256object *sha = PyObject_GC_New(SHA256object, state->sha256_type); if (!sha) { return NULL; } @@ -132,8 +130,7 @@ newSHA256object(sha2_state *state) static SHA512object * newSHA384object(sha2_state *state) { - SHA512object *sha = (SHA512object *)PyObject_GC_New( - SHA512object, state->sha384_type); + SHA512object *sha = PyObject_GC_New(SHA512object, state->sha384_type); if (!sha) { return NULL; } @@ -146,8 +143,7 @@ newSHA384object(sha2_state *state) static SHA512object * newSHA512object(sha2_state *state) { - SHA512object *sha = (SHA512object *)PyObject_GC_New( - SHA512object, state->sha512_type); + SHA512object *sha = PyObject_GC_New(SHA512object, state->sha512_type); if (!sha) { return NULL; } From d9452e87109498fb79cf81a4a8f875d2cc65922f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Mon, 23 Dec 2024 15:06:55 +0100 Subject: [PATCH 07/12] suppress unused parameters in `{md5,sha*}module.c` --- Modules/md5module.c | 6 +++--- Modules/sha1module.c | 6 +++--- Modules/sha2module.c | 12 ++++++------ Modules/sha3module.c | 16 ++++++++-------- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/Modules/md5module.c b/Modules/md5module.c index b1b575b04c6681..bec3a1fae7791b 100644 --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -227,19 +227,19 @@ static PyMethodDef MD5_methods[] = { }; static PyObject * -MD5_get_block_size(PyObject *self, void *closure) +MD5_get_block_size(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure)) { return PyLong_FromLong(MD5_BLOCKSIZE); } static PyObject * -MD5_get_name(PyObject *self, void *closure) +MD5_get_name(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure)) { return PyUnicode_FromStringAndSize("md5", 3); } static PyObject * -md5_get_digest_size(PyObject *self, void *closure) +md5_get_digest_size(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure)) { return PyLong_FromLong(MD5_DIGESTSIZE); } diff --git a/Modules/sha1module.c b/Modules/sha1module.c index 43b67697c88e76..945a3bc112a24a 100644 --- a/Modules/sha1module.c +++ b/Modules/sha1module.c @@ -220,19 +220,19 @@ static PyMethodDef SHA1_methods[] = { }; static PyObject * -SHA1_get_block_size(PyObject *self, void *closure) +SHA1_get_block_size(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure)) { return PyLong_FromLong(SHA1_BLOCKSIZE); } static PyObject * -SHA1_get_name(PyObject *self, void *closure) +SHA1_get_name(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure)) { return PyUnicode_FromStringAndSize("sha1", 4); } static PyObject * -sha1_get_digest_size(PyObject *self, void *closure) +sha1_get_digest_size(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure)) { return PyLong_FromLong(SHA1_DIGESTSIZE); } diff --git a/Modules/sha2module.c b/Modules/sha2module.c index bd92ccbdf8ebe6..5fe6e66bae494b 100644 --- a/Modules/sha2module.c +++ b/Modules/sha2module.c @@ -443,33 +443,33 @@ static PyMethodDef SHA512_methods[] = { }; static PyObject * -SHA256_get_block_size(PyObject *self, void *closure) +SHA256_get_block_size(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure)) { return PyLong_FromLong(SHA256_BLOCKSIZE); } static PyObject * -SHA512_get_block_size(PyObject *self, void *closure) +SHA512_get_block_size(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure)) { return PyLong_FromLong(SHA512_BLOCKSIZE); } static PyObject * -SHA256_get_digest_size(PyObject *op, void *closure) +SHA256_get_digest_size(PyObject *op, void *Py_UNUSED(closure)) { SHA256object *self = _SHA256object_CAST(op); return PyLong_FromLong(self->digestsize); } static PyObject * -SHA512_get_digest_size(PyObject *op, void *closure) +SHA512_get_digest_size(PyObject *op, void *Py_UNUSED(closure)) { SHA512object *self = _SHA512object_CAST(op); return PyLong_FromLong(self->digestsize); } static PyObject * -SHA256_get_name(PyObject *op, void *closure) +SHA256_get_name(PyObject *op, void *Py_UNUSED(closure)) { SHA256object *self = _SHA256object_CAST(op); if (self->digestsize == 28) { @@ -479,7 +479,7 @@ SHA256_get_name(PyObject *op, void *closure) } static PyObject * -SHA512_get_name(PyObject *op, void *closure) +SHA512_get_name(PyObject *op, void *Py_UNUSED(closure)) { SHA512object *self = _SHA512object_CAST(op); if (self->digestsize == 64) { diff --git a/Modules/sha3module.c b/Modules/sha3module.c index e12479575d8e77..bd234033e0b43c 100644 --- a/Modules/sha3module.c +++ b/Modules/sha3module.c @@ -306,7 +306,7 @@ static PyMethodDef SHA3_methods[] = { static PyObject * -SHA3_get_block_size(PyObject *op, void *closure) +SHA3_get_block_size(PyObject *op, void *Py_UNUSED(closure)) { SHA3object *self = _SHA3object_CAST(op); uint32_t rate = Hacl_Hash_SHA3_block_len(self->hash_state); @@ -315,7 +315,7 @@ SHA3_get_block_size(PyObject *op, void *closure) static PyObject * -SHA3_get_name(PyObject *self, void *closure) +SHA3_get_name(PyObject *self, void *Py_UNUSED(closure)) { PyTypeObject *type = Py_TYPE(self); @@ -342,7 +342,7 @@ SHA3_get_name(PyObject *self, void *closure) static PyObject * -SHA3_get_digest_size(PyObject *op, void *closure) +SHA3_get_digest_size(PyObject *op, void *Py_UNUSED(closure)) { // Preserving previous behavior: variable-length algorithms return 0 SHA3object *self = _SHA3object_CAST(op); @@ -354,7 +354,7 @@ SHA3_get_digest_size(PyObject *op, void *closure) static PyObject * -SHA3_get_capacity_bits(PyObject *op, void *closure) +SHA3_get_capacity_bits(PyObject *op, void *Py_UNUSED(closure)) { SHA3object *self = _SHA3object_CAST(op); uint32_t rate = Hacl_Hash_SHA3_block_len(self->hash_state) * 8; @@ -365,7 +365,7 @@ SHA3_get_capacity_bits(PyObject *op, void *closure) static PyObject * -SHA3_get_rate_bits(PyObject *op, void *closure) +SHA3_get_rate_bits(PyObject *op, void *Py_UNUSED(closure)) { SHA3object *self = _SHA3object_CAST(op); uint32_t rate = Hacl_Hash_SHA3_block_len(self->hash_state) * 8; @@ -373,7 +373,7 @@ SHA3_get_rate_bits(PyObject *op, void *closure) } static PyObject * -SHA3_get_suffix(PyObject *self, void *closure) +SHA3_get_suffix(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure)) { unsigned char suffix[2] = {0x06, 0}; return PyBytes_FromStringAndSize((const char *)suffix, 1); @@ -512,13 +512,13 @@ _sha3_shake_128_hexdigest_impl(SHA3object *self, unsigned long length) } static PyObject * -SHAKE_get_digest_size(PyObject *self, void *closure) +SHAKE_get_digest_size(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure)) { return PyLong_FromLong(0); } static PyObject * -SHAKE_get_suffix(PyObject *self, void *closure) +SHAKE_get_suffix(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure)) { unsigned char suffix[2] = {0x1f, 0}; return PyBytes_FromStringAndSize((const char *)suffix, 1); From 61a0de8e6dafe8e89d1dc8cd07d459a2d9eddaf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Wed, 25 Dec 2024 12:59:14 +0100 Subject: [PATCH 08/12] fix UBSan failures for `blake2module.c` --- Modules/blake2module.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/Modules/blake2module.c b/Modules/blake2module.c index 94cdfe7fd2e962..ea9d0437fc0f32 100644 --- a/Modules/blake2module.c +++ b/Modules/blake2module.c @@ -366,6 +366,8 @@ typedef struct { PyMutex mutex; } Blake2Object; +#define _Blake2Object_CAST(op) ((Blake2Object *)(op)) + #include "clinic/blake2module.c.h" /*[clinic input] @@ -828,24 +830,27 @@ static PyMethodDef py_blake2b_methods[] = { static PyObject * -py_blake2b_get_name(Blake2Object *self, void *closure) +py_blake2b_get_name(PyObject *op, void *closure) { + Blake2Object *self = _Blake2Object_CAST(op); return PyUnicode_FromString(is_blake2b(self->impl) ? "blake2b" : "blake2s"); } static PyObject * -py_blake2b_get_block_size(Blake2Object *self, void *closure) +py_blake2b_get_block_size(PyObject *op, void *closure) { + Blake2Object *self = _Blake2Object_CAST(op); return PyLong_FromLong(is_blake2b(self->impl) ? HACL_HASH_BLAKE2B_BLOCK_BYTES : HACL_HASH_BLAKE2S_BLOCK_BYTES); } static PyObject * -py_blake2b_get_digest_size(Blake2Object *self, void *closure) +py_blake2b_get_digest_size(PyObject *op, void *closure) { + Blake2Object *self = _Blake2Object_CAST(op); switch (self->impl) { #if HACL_CAN_COMPILE_SIMD256 case Blake2b_256: @@ -866,19 +871,17 @@ py_blake2b_get_digest_size(Blake2Object *self, void *closure) static PyGetSetDef py_blake2b_getsetters[] = { - {"name", (getter)py_blake2b_get_name, - NULL, NULL, NULL}, - {"block_size", (getter)py_blake2b_get_block_size, - NULL, NULL, NULL}, - {"digest_size", (getter)py_blake2b_get_digest_size, - NULL, NULL, NULL}, - {NULL} + {"name", py_blake2b_get_name, NULL, NULL, NULL}, + {"block_size", py_blake2b_get_block_size, NULL, NULL, NULL}, + {"digest_size", py_blake2b_get_digest_size, NULL, NULL, NULL}, + {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ }; static void -py_blake2b_dealloc(Blake2Object *self) +py_blake2b_dealloc(PyObject *op) { + Blake2Object *self = _Blake2Object_CAST(op); switch (self->impl) { #if HACL_CAN_COMPILE_SIMD256 case Blake2b_256: From 568bff8f836ac2882ada8731f44995b8685a0701 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Wed, 25 Dec 2024 13:02:15 +0100 Subject: [PATCH 09/12] suppress unused parameters in `blake2module.c` --- Modules/blake2module.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/blake2module.c b/Modules/blake2module.c index ea9d0437fc0f32..ac0797d23fd424 100644 --- a/Modules/blake2module.c +++ b/Modules/blake2module.c @@ -830,7 +830,7 @@ static PyMethodDef py_blake2b_methods[] = { static PyObject * -py_blake2b_get_name(PyObject *op, void *closure) +py_blake2b_get_name(PyObject *op, void *Py_UNUSED(closure)) { Blake2Object *self = _Blake2Object_CAST(op); return PyUnicode_FromString(is_blake2b(self->impl) ? "blake2b" : "blake2s"); @@ -839,7 +839,7 @@ py_blake2b_get_name(PyObject *op, void *closure) static PyObject * -py_blake2b_get_block_size(PyObject *op, void *closure) +py_blake2b_get_block_size(PyObject *op, void *Py_UNUSED(closure)) { Blake2Object *self = _Blake2Object_CAST(op); return PyLong_FromLong(is_blake2b(self->impl) ? HACL_HASH_BLAKE2B_BLOCK_BYTES : HACL_HASH_BLAKE2S_BLOCK_BYTES); @@ -848,7 +848,7 @@ py_blake2b_get_block_size(PyObject *op, void *closure) static PyObject * -py_blake2b_get_digest_size(PyObject *op, void *closure) +py_blake2b_get_digest_size(PyObject *op, void *Py_UNUSED(closure)) { Blake2Object *self = _Blake2Object_CAST(op); switch (self->impl) { From 3d856908e83fb6b4753f3a5bf4c7f01c429b7988 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Tue, 14 Jan 2025 12:05:37 +0100 Subject: [PATCH 10/12] reduce diff --- Modules/blake2module.c | 2 +- Modules/md5module.c | 2 +- Modules/sha1module.c | 2 +- Modules/sha2module.c | 4 ++-- Modules/sha3module.c | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Modules/blake2module.c b/Modules/blake2module.c index bb5aae74a3f381..016c834c01bbe2 100644 --- a/Modules/blake2module.c +++ b/Modules/blake2module.c @@ -895,7 +895,7 @@ static PyGetSetDef py_blake2b_getsetters[] = { {"name", py_blake2b_get_name, NULL, NULL, NULL}, {"block_size", py_blake2b_get_block_size, NULL, NULL, NULL}, {"digest_size", py_blake2b_get_digest_size, NULL, NULL, NULL}, - {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ + {NULL} /* Sentinel */ }; diff --git a/Modules/md5module.c b/Modules/md5module.c index bec3a1fae7791b..c294c58561db15 100644 --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -248,7 +248,7 @@ static PyGetSetDef MD5_getseters[] = { {"block_size", MD5_get_block_size, NULL, NULL, NULL}, {"name", MD5_get_name, NULL, NULL, NULL}, {"digest_size", md5_get_digest_size, NULL, NULL, NULL}, - {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ + {NULL} /* Sentinel */ }; static PyType_Slot md5_type_slots[] = { diff --git a/Modules/sha1module.c b/Modules/sha1module.c index 945a3bc112a24a..d0b1e8250770d0 100644 --- a/Modules/sha1module.c +++ b/Modules/sha1module.c @@ -241,7 +241,7 @@ static PyGetSetDef SHA1_getseters[] = { {"block_size", SHA1_get_block_size, NULL, NULL, NULL}, {"name", SHA1_get_name, NULL, NULL, NULL}, {"digest_size", sha1_get_digest_size, NULL, NULL, NULL}, - {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ + {NULL} /* Sentinel */ }; static PyType_Slot sha1_type_slots[] = { diff --git a/Modules/sha2module.c b/Modules/sha2module.c index 5fe6e66bae494b..45fa120cf76758 100644 --- a/Modules/sha2module.c +++ b/Modules/sha2module.c @@ -492,14 +492,14 @@ static PyGetSetDef SHA256_getseters[] = { {"block_size", SHA256_get_block_size, NULL, NULL, NULL}, {"name", SHA256_get_name, NULL, NULL, NULL}, {"digest_size", SHA256_get_digest_size, NULL, NULL, NULL}, - {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ + {NULL} /* Sentinel */ }; static PyGetSetDef SHA512_getseters[] = { {"block_size", SHA512_get_block_size, NULL, NULL, NULL}, {"name", SHA512_get_name, NULL, NULL, NULL}, {"digest_size", SHA512_get_digest_size, NULL, NULL, NULL}, - {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ + {NULL} /* Sentinel */ }; static PyType_Slot sha256_types_slots[] = { diff --git a/Modules/sha3module.c b/Modules/sha3module.c index bd234033e0b43c..ee28cd36ad726c 100644 --- a/Modules/sha3module.c +++ b/Modules/sha3module.c @@ -386,7 +386,7 @@ static PyGetSetDef SHA3_getseters[] = { {"_capacity_bits", SHA3_get_capacity_bits, NULL, NULL, NULL}, {"_rate_bits", SHA3_get_rate_bits, NULL, NULL, NULL}, {"_suffix", SHA3_get_suffix, NULL, NULL, NULL}, - {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ + {NULL} /* Sentinel */ }; #define SHA3_TYPE_SLOTS(type_slots_obj, type_doc, type_methods, type_getseters) \ From 34e8b55d30ef418281e1b5598a3a5b09848bf1b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Tue, 14 Jan 2025 12:06:18 +0100 Subject: [PATCH 11/12] reduce diff --- Modules/md5module.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/md5module.c b/Modules/md5module.c index c294c58561db15..d86c8e555012d7 100644 --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -248,7 +248,7 @@ static PyGetSetDef MD5_getseters[] = { {"block_size", MD5_get_block_size, NULL, NULL, NULL}, {"name", MD5_get_name, NULL, NULL, NULL}, {"digest_size", md5_get_digest_size, NULL, NULL, NULL}, - {NULL} /* Sentinel */ + {NULL} /* Sentinel */ }; static PyType_Slot md5_type_slots[] = { From 20bf303173c5690a90e79edb89cb28a735f71f97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Tue, 14 Jan 2025 12:44:59 +0100 Subject: [PATCH 12/12] reduce diff --- Modules/sha3module.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/sha3module.c b/Modules/sha3module.c index ee28cd36ad726c..72a11602b0e1fd 100644 --- a/Modules/sha3module.c +++ b/Modules/sha3module.c @@ -532,7 +532,7 @@ static PyGetSetDef SHAKE_getseters[] = { {"_capacity_bits", SHA3_get_capacity_bits, NULL, NULL, NULL}, {"_rate_bits", SHA3_get_rate_bits, NULL, NULL, NULL}, {"_suffix", SHAKE_get_suffix, NULL, NULL, NULL}, - {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ + {NULL} /* Sentinel */ };