void ubi1024_lastBlock(ubi1024_ctx_t* ctx, const void* block, uint16_t length_b){ threefish1024_ctx_t tfctx; while(length_b>UBI1024_BLOCKSIZE){ ubi1024_nextBlock(ctx, block); block = (uint8_t*)block + UBI1024_BLOCKSIZE_B; length_b -= UBI1024_BLOCKSIZE; } ctx->tweak.v8[15] |= 0x80; ctx->tweak.v64[0] += (length_b+7)/8; if(length_b & 0x07) ctx->tweak.v8[14] |= 0x80; threefish1024_init(ctx->g, ctx->tweak.v8, &tfctx); memset(ctx->g, 0, UBI1024_BLOCKSIZE_B); memcpy(ctx->g, block, (length_b+7)/8); if(length_b & 0x07) ctx->g[(length_b+7)/8-1] |= 0x80>>(length_b&7); threefish1024_enc(ctx->g, &tfctx); memxor(ctx->g, block, (length_b+7)/8); if(length_b & 0x07){ ctx->g[((length_b+7)/8)-1] ^= 0x80>>(length_b&7); }
void skein1024_nextBlock(skein1024_ctx_t *ctx, const void *block){ ubi1024_nextBlock(&(ctx->ubictx), block); }