static void
blake32_close(sph_blake_small_context *sc,
	unsigned ub, unsigned n, void *dst, size_t out_size_w32)
{
	union {
		unsigned char buf[64];
		sph_u32 dummy;
	} u;
	size_t ptr, k;
	unsigned bit_len;
	unsigned z;
	sph_u32 th, tl;
	unsigned char *out;

	ptr = sc->ptr;
	bit_len = ((unsigned)ptr << 3) + n;
	z = 0x80 >> n;
	u.buf[ptr] = ((ub & -z) | z) & 0xFF;
	tl = sc->T0 + bit_len;
	th = sc->T1;
	if (ptr == 0 && n == 0) {
		sc->T0 = SPH_C32(0xFFFFFE00);
		sc->T1 = SPH_C32(0xFFFFFFFF);
	} else if (sc->T0 == 0) {
		sc->T0 = SPH_C32(0xFFFFFE00) + bit_len;
		sc->T1 = SPH_T32(sc->T1 - 1);
	} else {
		sc->T0 -= 512 - bit_len;
	}
	if (bit_len <= 446) {
		memset(u.buf + ptr + 1, 0, 55 - ptr);
		if (out_size_w32 == 8)
			u.buf[55] |= 1;
		sph_enc32be_aligned(u.buf + 56, th);
		sph_enc32be_aligned(u.buf + 60, tl);
		blake32(sc, u.buf + ptr, 64 - ptr);
	} else {
		memset(u.buf + ptr + 1, 0, 63 - ptr);
		blake32(sc, u.buf + ptr, 64 - ptr);
		sc->T0 = SPH_C32(0xFFFFFE00);
		sc->T1 = SPH_C32(0xFFFFFFFF);
		memset(u.buf, 0, 56);
		if (out_size_w32 == 8)
			u.buf[55] = 1;
		sph_enc32be_aligned(u.buf + 56, th);
		sph_enc32be_aligned(u.buf + 60, tl);
		blake32(sc, u.buf, 64);
	}
	out = dst;
	for (k = 0; k < out_size_w32; k ++)
		sph_enc32be(out + (k << 2), sc->H[k]);
}
Exemple #2
0
static void
test_types32(void)
{
	unsigned i;
	union {
		unsigned char bytes[64];
		sph_u32 v32;
	} u;

#if SPH_LITTLE_ENDIAN || SPH_BIG_ENDIAN
	ASSERT(sizeof(sph_u32) == 4);
#else
	ASSERT(sizeof(sph_u32) >= 4);
#endif

	for (i = 0; i < sizeof u.bytes; i ++)
		u.bytes[i] = i;
	for (i = 0; (i + 3) < sizeof u.bytes; i ++) {
		sph_u32 v, w;

		v = ((sph_u32)i << 24)
			| ((sph_u32)(i + 1) << 16)
			| ((sph_u32)(i + 2) << 8)
			| (sph_u32)(i + 3);
		w = ((sph_u32)(i + 3) << 24)
			| ((sph_u32)(i + 2) << 16)
			| ((sph_u32)(i + 1) << 8)
			| (sph_u32)i;
		ASSERT(sph_dec32be(u.bytes + i) == v);
		ASSERT(sph_dec32le(u.bytes + i) == w);
		if (i % 4 == 0) {
			ASSERT(sph_dec32be_aligned(u.bytes + i) == v);
			ASSERT(sph_dec32le_aligned(u.bytes + i) == w);
		}
	}
	memset(u.bytes, 0, sizeof u.bytes);
	for (i = 0; (i + 3) < sizeof u.bytes; i ++) {
		sph_u32 v, w;

		v = ((sph_u32)i << 24)
			| ((sph_u32)(i + 1) << 16)
			| ((sph_u32)(i + 2) << 8)
			| (sph_u32)(i + 3);
		w = ((sph_u32)(i + 3) << 24)
			| ((sph_u32)(i + 2) << 16)
			| ((sph_u32)(i + 1) << 8)
			| (sph_u32)i;
		if (i % 4 == 0) {
			sph_enc32be_aligned(u.bytes + i, v);
		} else {
			sph_enc32be(u.bytes + i, v);
		}
		ASSERT(u.bytes[i + 0] == i + 0);
		ASSERT(u.bytes[i + 1] == i + 1);
		ASSERT(u.bytes[i + 2] == i + 2);
		ASSERT(u.bytes[i + 3] == i + 3);
		memset(u.bytes, 0, sizeof u.bytes);
		if (i % 4 == 0) {
			sph_enc32le_aligned(u.bytes + i, w);
		} else {
			sph_enc32le(u.bytes + i, w);
		}
		ASSERT(u.bytes[i + 0] == i + 0);
		ASSERT(u.bytes[i + 1] == i + 1);
		ASSERT(u.bytes[i + 2] == i + 2);
		ASSERT(u.bytes[i + 3] == i + 3);
	}
}