void blake_small_lastBlock(blake_small_ctx_t* ctx, const void* msg, uint16_t length_b){ while(length_b>=BLAKE_SMALL_BLOCKSIZE){ blake_small_nextBlock(ctx, msg); msg = (uint8_t*)msg + BLAKE_SMALL_BLOCKSIZE_B; length_b -= BLAKE_SMALL_BLOCKSIZE; } uint8_t buffer[64]; uint32_t v[16]; union { uint64_t v64; uint32_t v32[2]; }ctr; ctr.v64 = ctx->counter*512+length_b; memset(buffer, 0, 64); memcpy(buffer, msg, (length_b+7)/8); buffer[length_b/8] |= 0x80 >> (length_b&0x7); blake_small_changeendian(buffer, buffer); blake_small_expand(v, ctx); if(length_b>512-64-2){ v[12] ^= ctr.v32[0]; v[13] ^= ctr.v32[0]; v[14] ^= ctr.v32[1]; v[15] ^= ctr.v32[1]; blake_small_compress(v, buffer); blake_small_collapse(ctx, v); memset(buffer, 0, 64-8); blake_small_expand(v, ctx); }else{ if(length_b){ v[12] ^= ctr.v32[0]; v[13] ^= ctr.v32[0]; v[14] ^= ctr.v32[1]; v[15] ^= ctr.v32[1]; } } if(ctx->appendone) buffer[64-8-4] |= 0x01; *((uint32_t*)(&(buffer[64-8]))) = ctr.v32[1]; *((uint32_t*)(&(buffer[64-4]))) = ctr.v32[0]; blake_small_compress(v, buffer); blake_small_collapse(ctx, v); }
void blake_small_nextBlock(blake_small_ctx_t *ctx, const void *msg) { uint32_t v[16]; uint32_t m[16]; union { uint64_t v64; uint32_t v32[2]; } ctr; blake_small_expand(v, ctx); ctx->counter++; ctr.v64 = ctx->counter * 512; v[12] ^= ctr.v32[0]; v[13] ^= ctr.v32[0]; v[14] ^= ctr.v32[1]; v[15] ^= ctr.v32[1]; blake_small_changeendian(m, msg); blake_small_compress(v, m); blake_small_collapse(ctx, v); }