From e611872dcad8de4b5ce8c8e447d533635f90bb42 Mon Sep 17 00:00:00 2001 From: "Peter D. Gray" Date: Fri, 5 Feb 2021 09:34:36 -0500 Subject: [PATCH] extmod/moduhashlib: allow multiple calls to digest() method --- extmod/moduhashlib.c | 6 ++++-- tests/extmod/uhashlib_sha256.py | 18 +++++++++--------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/extmod/moduhashlib.c b/extmod/moduhashlib.c index 195a24334..372a12718 100644 --- a/extmod/moduhashlib.c +++ b/extmod/moduhashlib.c @@ -98,7 +98,8 @@ STATIC mp_obj_t uhashlib_sha256_digest(mp_obj_t self_in) { mp_obj_hash_t *self = MP_OBJ_TO_PTR(self_in); vstr_t vstr; vstr_init_len(&vstr, 32); - mbedtls_sha256_finish_ret((mbedtls_sha256_context *)&self->state, (unsigned char *)vstr.buf); + mbedtls_sha256_context tmp_ctx = *(mbedtls_sha256_context *)self->state; + mbedtls_sha256_finish_ret(&tmp_ctx, (unsigned char *)vstr.buf); return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); } @@ -129,7 +130,8 @@ STATIC mp_obj_t uhashlib_sha256_digest(mp_obj_t self_in) { mp_obj_hash_t *self = MP_OBJ_TO_PTR(self_in); vstr_t vstr; vstr_init_len(&vstr, SHA256_BLOCK_SIZE); - sha256_final((CRYAL_SHA256_CTX *)self->state, (byte *)vstr.buf); + CRYAL_SHA256_CTX tmp_ctx = *(CRYAL_SHA256_CTX *)self->state; + sha256_final(&tmp_ctx, (byte *)vstr.buf); return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); } #endif diff --git a/tests/extmod/uhashlib_sha256.py b/tests/extmod/uhashlib_sha256.py index 2e6df7df1..60c3b54ef 100644 --- a/tests/extmod/uhashlib_sha256.py +++ b/tests/extmod/uhashlib_sha256.py @@ -26,13 +26,13 @@ print(hashlib.sha256(b"\xff" * 64).digest()) # 56 bytes is a boundary case in the algorithm print(hashlib.sha256(b"\xff" * 56).digest()) -# TODO: running .digest() several times in row is not supported() -# h = hashlib.sha256(b'123') -# print(h.digest()) -# print(h.digest()) +# running .digest() several times in row is now supported +h = hashlib.sha256(b'123') +print(h.digest()) +print(h.digest()) -# TODO: partial digests are not supported -# h = hashlib.sha256(b'123') -# print(h.digest()) -# h.update(b'456') -# print(h.digest()) +# partial digests are supported +h = hashlib.sha256(b'123') +print(h.digest()) +h.update(b'456') +print(h.digest())