diff --git a/src/se050_blake2s.c b/src/se050_blake2s.c index 0803384..12ad37e 100644 --- a/src/se050_blake2s.c +++ b/src/se050_blake2s.c @@ -140,13 +140,9 @@ int se050_blake2s_update(se050_blake2s_ctx_t *ctx, const void *data, size_t len) if (!ctx || !data) return -1; if (len > 0) { size_t left = inner->buflen, fill = 64 - left; - if (len > fill) { - memcpy(inner->buf + left, in, fill); - inner->buflen = 0; - inner->t[0] += 64; - if (inner->t[0] < 64) inner->t[1]++; - blake2s_compress(inner, inner->buf); - in += fill; len -= fill; + + /* If buffer is empty, process full blocks directly */ + if (left == 0) { while (len > 64) { inner->t[0] += 64; if (inner->t[0] < 64) inner->t[1]++; @@ -154,6 +150,25 @@ int se050_blake2s_update(se050_blake2s_ctx_t *ctx, const void *data, size_t len) in += 64; len -= 64; } } + /* If we can fill the buffer (including exact fill), do it */ + else if (len >= fill) { + memcpy(inner->buf + left, in, fill); + inner->buflen = 0; + inner->t[0] += 64; + if (inner->t[0] < 64) inner->t[1]++; + blake2s_compress(inner, inner->buf); + in += fill; len -= fill; + + /* Process remaining full blocks */ + while (len > 64) { + inner->t[0] += 64; + if (inner->t[0] < 64) inner->t[1]++; + blake2s_compress(inner, in); + in += 64; len -= 64; + } + } + + /* Store remaining data in buffer */ memcpy(inner->buf + inner->buflen, in, len); inner->buflen += len; }