Ejemplo n.º 1
0
void cryptonite_sha3_update(struct sha3_ctx *ctx, const uint8_t *data, uint32_t len)
{
	uint32_t to_fill;

	to_fill = ctx->bufsz - ctx->bufindex;

	if (ctx->bufindex == ctx->bufsz) {
		sha3_do_chunk(ctx->state, (uint64_t *) ctx->buf, ctx->bufsz / 8);
		ctx->bufindex = 0;
	}

	/* process partial buffer if there's enough data to make a block */
	if (ctx->bufindex && len >= to_fill) {
		memcpy(ctx->buf + ctx->bufindex, data, to_fill);
		sha3_do_chunk(ctx->state, (uint64_t *) ctx->buf, ctx->bufsz / 8);
		len -= to_fill;
		data += to_fill;
		ctx->bufindex = 0;
	}

	/* process as much ctx->bufsz-block */
	for (; len >= ctx->bufsz; len -= ctx->bufsz, data += ctx->bufsz)
		sha3_do_chunk(ctx->state, (uint64_t *) data, ctx->bufsz / 8);

	/* append data into buf */
	if (len) {
		memcpy(ctx->buf + ctx->bufindex, data, len);
		ctx->bufindex += len;
	}
}
Ejemplo n.º 2
0
void cryptonite_sha3_finalize(struct sha3_ctx *ctx, uint8_t *out)
{
	uint64_t w[25];

	/* process full buffer if needed */
	if (ctx->bufindex == ctx->bufsz) {
		sha3_do_chunk(ctx->state, (uint64_t *) ctx->buf, ctx->bufsz / 8);
		ctx->bufindex = 0;
	}

	/* add the 10*1 padding */
	ctx->buf[ctx->bufindex++] = 0x06;
	memset(ctx->buf + ctx->bufindex, 0, ctx->bufsz - ctx->bufindex);
	ctx->buf[ctx->bufsz - 1] |= 0x80;

	/* process */
	sha3_do_chunk(ctx->state, (uint64_t *) ctx->buf, ctx->bufsz / 8);

	/* output */
	cpu_to_le64_array(w, ctx->state, 25);
	memcpy(out, w, ctx->hashlen);
}
Ejemplo n.º 3
0
void sha3_finalize(struct sha3_ctx *ctx, uint8_t *out)
{
	/* add the 10*1 padding */
	ctx->buf[ctx->bufindex++] = 1;
	memset(ctx->buf + ctx->bufindex, 0, ctx->bufsz - ctx->bufindex);
	ctx->buf[ctx->bufsz - 1] |= 0x80;

	/* process */
	sha3_do_chunk(ctx->state, (uint64_t *) ctx->buf, ctx->bufsz / 8);

	/* output */
	memcpy(out, ctx->state, ctx->hashlen);
}