void blake224(void* dest, const void* msg, uint32_t length_b){
	blake_small_ctx_t ctx;
	blake224_init(&ctx);
	while(length_b>=BLAKE_SMALL_BLOCKSIZE){
		blake_small_nextBlock(&ctx, msg);
		msg = (uint8_t*)msg + BLAKE_SMALL_BLOCKSIZE_B;
		length_b -= BLAKE_SMALL_BLOCKSIZE;
	}
	blake_small_lastBlock(&ctx, msg, length_b);
	blake224_ctx2hash(dest, &ctx);
}
Exemplo n.º 2
0
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;
    }
    union {
        uint8_t v8[64];
        uint32_t v32[16];
    } buffer;
    uint32_t v[16];
    union {
        uint64_t v64;
        uint32_t v32[2];
    } ctr;
    ctr.v64 = ctx->counter * 512 + length_b;
    memset(buffer.v8, 0, 64);
    memcpy(buffer.v8, msg, (length_b + 7) / 8);
    buffer.v8[length_b / 8] |= 0x80 >> (length_b & 0x7);
    blake_small_changeendian(buffer.v8, buffer.v8);
    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.v8);
        blake_small_collapse(ctx, v);
        memset(buffer.v8, 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.v8[64 - 8 - 4] |= 0x01;
    buffer.v32[14] = ctr.v32[1];
    buffer.v32[15] = ctr.v32[0];
    blake_small_compress(v, buffer.v8);
    blake_small_collapse(ctx, v);

}
void blake224_nextBlock(blake224_ctx_t* ctx, const void* block){
	blake_small_nextBlock(ctx, block);
}