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_pad_final(cf_cbcmac_stream *ctx, uint8_t out[CF_MAXBLOCK]) { uint8_t npad = ctx->prp->blocksz - ctx->used; cf_blockwise_acc_byte(ctx->buffer, &ctx->used, ctx->prp->blocksz, npad, npad, cbcmac_process, ctx); cf_cbcmac_stream_nopad_final(ctx, out); }