static void shavite_big_core(sph_shavite_big_context *sc, const void *data, size_t len) { unsigned char *buf; size_t ptr; buf = sc->buf; ptr = sc->ptr; while (len > 0) { size_t clen; clen = (sizeof sc->buf) - ptr; if (clen > len) clen = len; memcpy(buf + ptr, data, clen); data = (const unsigned char *)data + clen; ptr += clen; len -= clen; if (ptr == sizeof sc->buf) { if ((sc->count0 = SPH_T32(sc->count0 + 1024)) == 0) { sc->count1 = SPH_T32(sc->count1 + 1); if (sc->count1 == 0) { sc->count2 = SPH_T32(sc->count2 + 1); if (sc->count2 == 0) { sc->count3 = SPH_T32( sc->count3 + 1); } } } c512(sc, buf); ptr = 0; } } sc->ptr = ptr; }
static void shavite_big_close(sph_shavite_big_context *sc, unsigned ub, unsigned n, void *dst, size_t out_size_w32) { unsigned char *buf; size_t ptr, u; unsigned z; sph_u32 count0, count1, count2, count3; buf = sc->buf; ptr = sc->ptr; count0 = (sc->count0 += (ptr << 3) + n); count1 = sc->count1; count2 = sc->count2; count3 = sc->count3; z = 0x80 >> n; z = ((ub & -z) | z) & 0xFF; if (ptr == 0 && n == 0) { buf[0] = 0x80; memset(buf + 1, 0, 109); sc->count0 = sc->count1 = sc->count2 = sc->count3 = 0; } else if (ptr < 110) { buf[ptr ++] = z; memset(buf + ptr, 0, 110 - ptr); } else { buf[ptr ++] = z; memset(buf + ptr, 0, 128 - ptr); c512(sc, buf); memset(buf, 0, 110); sc->count0 = sc->count1 = sc->count2 = sc->count3 = 0; } sph_enc32le(buf + 110, count0); sph_enc32le(buf + 114, count1); sph_enc32le(buf + 118, count2); sph_enc32le(buf + 122, count3); buf[126] = out_size_w32 << 5; buf[127] = out_size_w32 >> 3; c512(sc, buf); for (u = 0; u < out_size_w32; u ++) sph_enc32le((unsigned char *)dst + (u << 2), sc->h[u]); }