void cf_blockwise_acc_pad(uint8_t *partial, size_t *npartial, size_t nblock, uint8_t fbyte, uint8_t mbyte, uint8_t lbyte, size_t nbytes, cf_blockwise_in_fn process, void *ctx) { switch (nbytes) { case 0: break; case 1: fbyte ^= lbyte; cf_blockwise_accumulate(partial, npartial, nblock, &fbyte, 1, process, ctx); break; case 2: cf_blockwise_accumulate(partial, npartial, nblock, &fbyte, 1, process, ctx); cf_blockwise_accumulate(partial, npartial, nblock, &lbyte, 1, process, ctx); break; default: cf_blockwise_accumulate(partial, npartial, nblock, &fbyte, 1, process, ctx); /* If the middle and last bytes differ, then process the last byte separately. * Otherwise, just extend the middle block size. */ if (lbyte != mbyte) { cf_blockwise_acc_byte(partial, npartial, nblock, mbyte, nbytes - 2, process, ctx); cf_blockwise_accumulate(partial, npartial, nblock, &lbyte, 1, process, ctx); } else { cf_blockwise_acc_byte(partial, npartial, nblock, mbyte, nbytes - 1, process, ctx); } break; } }
void cf_cbcmac_stream_update(cf_cbcmac_stream *ctx, const uint8_t *data, size_t len) { cf_blockwise_accumulate(ctx->buffer, &ctx->used, ctx->prp->blocksz, data, len, cbcmac_process, ctx); }
void cf_sha512_update(cf_sha512_context *ctx, const void *data, size_t nbytes) { cf_blockwise_accumulate(ctx->partial, &ctx->npartial, sizeof ctx->partial, data, nbytes, sha512_update_block, ctx); }