void blake_large_lastBlock(blake_large_ctx_t* ctx, const void* msg, uint16_t length_b){ while(length_b>=BLAKE_LARGE_BLOCKSIZE){ blake_large_nextBlock(ctx, msg); msg = (uint8_t*)msg + BLAKE_LARGE_BLOCKSIZE_B; length_b -= BLAKE_LARGE_BLOCKSIZE; } uint8_t buffer[128]; uint64_t v[16]; uint64_t ctr; ctr = ctx->counter*1024+length_b; memset(buffer, 0, 128); memcpy(buffer, msg, (length_b+7)/8); buffer[length_b/8] |= 0x80 >> (length_b&0x7); blake_large_changeendian(buffer, buffer); blake_large_expand(v, ctx); if(length_b>1024-128-2){ v[12] ^= ctr; v[13] ^= ctr; blake_large_compress(v, buffer); blake_large_collapse(ctx, v); memset(buffer, 0, 128-8); blake_large_expand(v, ctx); } else { if(length_b){ v[12] ^= ctr; v[13] ^= ctr; } } if(ctx->appendone) buffer[128-16-8] |= 0x01; *((uint64_t*)(&(buffer[128-8]))) = ctr; blake_large_compress(v, buffer); blake_large_collapse(ctx, v); }
void blake384(void *dest, const void *msg, uint32_t length_b){ blake_large_ctx_t ctx; blake384_init(&ctx); while(length_b>=BLAKE_LARGE_BLOCKSIZE){ blake_large_nextBlock(&ctx, msg); msg = (uint8_t*)msg + BLAKE_LARGE_BLOCKSIZE_B; length_b -= BLAKE_LARGE_BLOCKSIZE; } blake_large_lastBlock(&ctx, msg, length_b); blake384_ctx2hash(dest, &ctx); }
void blake384_nextBlock(blake384_ctx_t *ctx, const void *block){ blake_large_nextBlock(ctx, block); }