mirror of
https://github.com/python/cpython.git
synced 2025-12-31 04:23:37 +00:00
gh-111178: fix UBSan failures in Modules/{blake2,md5,sha1,sha2,sha3}module.c (GH-128248)
- fix UBSan failures in `blake2module.c`
- fix UBSan failures in `md5module.c`
- fix UBSan failures in `sha1module.c`
- fix UBSan failures in `sha2module.c`
- fix UBSan failures in `sha3module.c`
Cosmetics:
- suppress unused return values
- remove redundant casts in constructors
- suppress unused parameters in `{md5,sha*,blake2}module.c`
This commit is contained in:
parent
735f25c5e3
commit
922cfecbce
5 changed files with 98 additions and 112 deletions
|
|
@ -366,6 +366,8 @@ typedef struct {
|
|||
PyMutex mutex;
|
||||
} Blake2Object;
|
||||
|
||||
#define _Blake2Object_CAST(op) ((Blake2Object *)(op))
|
||||
|
||||
#include "clinic/blake2module.c.h"
|
||||
|
||||
/*[clinic input]
|
||||
|
|
@ -849,24 +851,27 @@ static PyMethodDef py_blake2b_methods[] = {
|
|||
|
||||
|
||||
static PyObject *
|
||||
py_blake2b_get_name(Blake2Object *self, 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");
|
||||
}
|
||||
|
||||
|
||||
|
||||
static PyObject *
|
||||
py_blake2b_get_block_size(Blake2Object *self, 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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static PyObject *
|
||||
py_blake2b_get_digest_size(Blake2Object *self, void *closure)
|
||||
py_blake2b_get_digest_size(PyObject *op, void *Py_UNUSED(closure))
|
||||
{
|
||||
Blake2Object *self = _Blake2Object_CAST(op);
|
||||
switch (self->impl) {
|
||||
#if HACL_CAN_COMPILE_SIMD256
|
||||
case Blake2b_256:
|
||||
|
|
@ -887,15 +892,13 @@ 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} /* Sentinel */
|
||||
};
|
||||
|
||||
|
||||
static int
|
||||
py_blake2_clear(PyObject *op)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
||||
|
|
@ -72,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;
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
|
@ -224,36 +227,27 @@ 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);
|
||||
}
|
||||
|
||||
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},
|
||||
{"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 */
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
||||
|
|
@ -73,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;
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
|
@ -217,36 +220,27 @@ 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);
|
||||
}
|
||||
|
||||
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},
|
||||
{"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} /* Sentinel */
|
||||
};
|
||||
|
||||
|
|
@ -346,7 +340,7 @@ _sha1_clear(PyObject *module)
|
|||
static void
|
||||
_sha1_free(void *module)
|
||||
{
|
||||
_sha1_clear((PyObject *)module);
|
||||
(void)_sha1_clear((PyObject *)module);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -101,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;
|
||||
}
|
||||
|
|
@ -115,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;
|
||||
}
|
||||
|
|
@ -129,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;
|
||||
}
|
||||
|
|
@ -143,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;
|
||||
}
|
||||
|
|
@ -164,8 +163,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 +174,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);
|
||||
|
|
@ -442,32 +443,35 @@ 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(SHA256object *self, 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(SHA512object *self, 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(SHA256object *self, void *closure)
|
||||
SHA256_get_name(PyObject *op, void *Py_UNUSED(closure))
|
||||
{
|
||||
SHA256object *self = _SHA256object_CAST(op);
|
||||
if (self->digestsize == 28) {
|
||||
return PyUnicode_FromStringAndSize("sha224", 6);
|
||||
}
|
||||
|
|
@ -475,8 +479,9 @@ SHA256_get_name(SHA256object *self, void *closure)
|
|||
}
|
||||
|
||||
static PyObject *
|
||||
SHA512_get_name(SHA512object *self, void *closure)
|
||||
SHA512_get_name(PyObject *op, void *Py_UNUSED(closure))
|
||||
{
|
||||
SHA512object *self = _SHA512object_CAST(op);
|
||||
if (self->digestsize == 64) {
|
||||
return PyUnicode_FromStringAndSize("sha512", 6);
|
||||
}
|
||||
|
|
@ -484,34 +489,16 @@ 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},
|
||||
{"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} /* 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},
|
||||
{"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} /* Sentinel */
|
||||
};
|
||||
|
||||
|
|
@ -818,7 +805,7 @@ _sha2_clear(PyObject *module)
|
|||
static void
|
||||
_sha2_free(void *module)
|
||||
{
|
||||
_sha2_clear((PyObject *)module);
|
||||
(void)_sha2_clear((PyObject *)module);
|
||||
}
|
||||
|
||||
/* Initialize this module. */
|
||||
|
|
|
|||
|
|
@ -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 *Py_UNUSED(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 *Py_UNUSED(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 *Py_UNUSED(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 *Py_UNUSED(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,26 +365,27 @@ 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 *Py_UNUSED(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 *Py_UNUSED(self), void *Py_UNUSED(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},
|
||||
{"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} /* Sentinel */
|
||||
};
|
||||
|
||||
|
|
@ -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 *Py_UNUSED(self), void *Py_UNUSED(closure))
|
||||
{
|
||||
return PyLong_FromLong(0);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
SHAKE_get_suffix(SHA3object *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);
|
||||
|
|
@ -518,12 +526,12 @@ 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},
|
||||
{"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} /* Sentinel */
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue