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]); }
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); } }