1aaf4ece6Schristos /* adler32.c -- compute the Adler-32 checksum of a data stream 2c3423655Schristos * Copyright (C) 1995-2011, 2016 Mark Adler 3aaf4ece6Schristos * For conditions of distribution and use, see copyright notice in zlib.h 4aaf4ece6Schristos */ 5aaf4ece6Schristos 6dbdd0313Schristos /* @(#) Id */ 7aaf4ece6Schristos 8c3423655Schristos #include "zutil.h" 9aaf4ece6Schristos 10c3423655Schristos #define BASE 65521U /* largest prime smaller than 65536 */ 11aaf4ece6Schristos #define NMAX 5552 12aaf4ece6Schristos /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ 13aaf4ece6Schristos 14aaf4ece6Schristos #define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} 15aaf4ece6Schristos #define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); 16aaf4ece6Schristos #define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); 17aaf4ece6Schristos #define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); 18aaf4ece6Schristos #define DO16(buf) DO8(buf,0); DO8(buf,8); 19aaf4ece6Schristos 20c3423655Schristos /* use NO_DIVIDE if your processor does not do division in hardware -- 21c3423655Schristos try it both ways to see which is faster */ 22aaf4ece6Schristos #ifdef NO_DIVIDE 23c3423655Schristos /* note that this assumes BASE is 65521, where 65536 % 65521 == 15 24c3423655Schristos (thank you to John Reiser for pointing this out) */ 25c3423655Schristos # define CHOP(a) \ 26aaf4ece6Schristos do { \ 27c3423655Schristos unsigned long tmp = a >> 16; \ 28c3423655Schristos a &= 0xffffUL; \ 29c3423655Schristos a += (tmp << 4) - tmp; \ 30c3423655Schristos } while (0) 31c3423655Schristos # define MOD28(a) \ 32c3423655Schristos do { \ 33c3423655Schristos CHOP(a); \ 34aaf4ece6Schristos if (a >= BASE) a -= BASE; \ 35aaf4ece6Schristos } while (0) 36c3423655Schristos # define MOD(a) \ 37aaf4ece6Schristos do { \ 38c3423655Schristos CHOP(a); \ 39c3423655Schristos MOD28(a); \ 40c3423655Schristos } while (0) 41c3423655Schristos # define MOD63(a) \ 42c3423655Schristos do { /* this assumes a is not negative */ \ 43c3423655Schristos z_off64_t tmp = a >> 32; \ 44c3423655Schristos a &= 0xffffffffL; \ 45c3423655Schristos a += (tmp << 8) - (tmp << 5) + tmp; \ 46c3423655Schristos tmp = a >> 16; \ 47c3423655Schristos a &= 0xffffL; \ 48c3423655Schristos a += (tmp << 4) - tmp; \ 49c3423655Schristos tmp = a >> 16; \ 50c3423655Schristos a &= 0xffffL; \ 51c3423655Schristos a += (tmp << 4) - tmp; \ 52aaf4ece6Schristos if (a >= BASE) a -= BASE; \ 53aaf4ece6Schristos } while (0) 54aaf4ece6Schristos #else 55aaf4ece6Schristos # define MOD(a) a %= BASE 56c3423655Schristos # define MOD28(a) a %= BASE 57c3423655Schristos # define MOD63(a) a %= BASE 58aaf4ece6Schristos #endif 59aaf4ece6Schristos 60aaf4ece6Schristos /* ========================================================================= */ 61*b175d1c2Schristos uLong ZEXPORT adler32_z(uLong adler, const Bytef *buf, z_size_t len) { 62aaf4ece6Schristos unsigned long sum2; 63aaf4ece6Schristos unsigned n; 64aaf4ece6Schristos 65aaf4ece6Schristos /* split Adler-32 into component sums */ 66aaf4ece6Schristos sum2 = (adler >> 16) & 0xffff; 67aaf4ece6Schristos adler &= 0xffff; 68aaf4ece6Schristos 69aaf4ece6Schristos /* in case user likes doing a byte at a time, keep it fast */ 70aaf4ece6Schristos if (len == 1) { 71aaf4ece6Schristos adler += buf[0]; 72aaf4ece6Schristos if (adler >= BASE) 73aaf4ece6Schristos adler -= BASE; 74aaf4ece6Schristos sum2 += adler; 75aaf4ece6Schristos if (sum2 >= BASE) 76aaf4ece6Schristos sum2 -= BASE; 77aaf4ece6Schristos return adler | (sum2 << 16); 78aaf4ece6Schristos } 79aaf4ece6Schristos 80aaf4ece6Schristos /* initial Adler-32 value (deferred check for len == 1 speed) */ 81aaf4ece6Schristos if (buf == Z_NULL) 82aaf4ece6Schristos return 1L; 83aaf4ece6Schristos 84aaf4ece6Schristos /* in case short lengths are provided, keep it somewhat fast */ 85aaf4ece6Schristos if (len < 16) { 86aaf4ece6Schristos while (len--) { 87aaf4ece6Schristos adler += *buf++; 88aaf4ece6Schristos sum2 += adler; 89aaf4ece6Schristos } 90aaf4ece6Schristos if (adler >= BASE) 91aaf4ece6Schristos adler -= BASE; 92c3423655Schristos MOD28(sum2); /* only added so many BASE's */ 93aaf4ece6Schristos return adler | (sum2 << 16); 94aaf4ece6Schristos } 95aaf4ece6Schristos 96aaf4ece6Schristos /* do length NMAX blocks -- requires just one modulo operation */ 97aaf4ece6Schristos while (len >= NMAX) { 98aaf4ece6Schristos len -= NMAX; 99aaf4ece6Schristos n = NMAX / 16; /* NMAX is divisible by 16 */ 100aaf4ece6Schristos do { 101aaf4ece6Schristos DO16(buf); /* 16 sums unrolled */ 102aaf4ece6Schristos buf += 16; 103aaf4ece6Schristos } while (--n); 104aaf4ece6Schristos MOD(adler); 105aaf4ece6Schristos MOD(sum2); 106aaf4ece6Schristos } 107aaf4ece6Schristos 108aaf4ece6Schristos /* do remaining bytes (less than NMAX, still just one modulo) */ 109aaf4ece6Schristos if (len) { /* avoid modulos if none remaining */ 110aaf4ece6Schristos while (len >= 16) { 111aaf4ece6Schristos len -= 16; 112aaf4ece6Schristos DO16(buf); 113aaf4ece6Schristos buf += 16; 114aaf4ece6Schristos } 115aaf4ece6Schristos while (len--) { 116aaf4ece6Schristos adler += *buf++; 117aaf4ece6Schristos sum2 += adler; 118aaf4ece6Schristos } 119aaf4ece6Schristos MOD(adler); 120aaf4ece6Schristos MOD(sum2); 121aaf4ece6Schristos } 122aaf4ece6Schristos 123aaf4ece6Schristos /* return recombined sums */ 124aaf4ece6Schristos return adler | (sum2 << 16); 125aaf4ece6Schristos } 126aaf4ece6Schristos 127aaf4ece6Schristos /* ========================================================================= */ 128*b175d1c2Schristos uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len) { 129c3423655Schristos return adler32_z(adler, buf, len); 130c3423655Schristos } 131c3423655Schristos 132c3423655Schristos /* ========================================================================= */ 133*b175d1c2Schristos local uLong adler32_combine_(uLong adler1, uLong adler2, z_off64_t len2) { 134aaf4ece6Schristos unsigned long sum1; 135aaf4ece6Schristos unsigned long sum2; 136aaf4ece6Schristos unsigned rem; 137aaf4ece6Schristos 138c3423655Schristos /* for negative len, return invalid adler32 as a clue for debugging */ 139c3423655Schristos if (len2 < 0) 140c3423655Schristos return 0xffffffffUL; 141c3423655Schristos 142aaf4ece6Schristos /* the derivation of this formula is left as an exercise for the reader */ 143c3423655Schristos MOD63(len2); /* assumes len2 >= 0 */ 144c3423655Schristos rem = (unsigned)len2; 145aaf4ece6Schristos sum1 = adler1 & 0xffff; 146aaf4ece6Schristos sum2 = rem * sum1; 147aaf4ece6Schristos MOD(sum2); 148aaf4ece6Schristos sum1 += (adler2 & 0xffff) + BASE - 1; 149aaf4ece6Schristos sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; 150c3423655Schristos if (sum1 >= BASE) sum1 -= BASE; 151c3423655Schristos if (sum1 >= BASE) sum1 -= BASE; 152c3423655Schristos if (sum2 >= ((unsigned long)BASE << 1)) sum2 -= ((unsigned long)BASE << 1); 153c3423655Schristos if (sum2 >= BASE) sum2 -= BASE; 154aaf4ece6Schristos return sum1 | (sum2 << 16); 155aaf4ece6Schristos } 156c3423655Schristos 157c3423655Schristos /* ========================================================================= */ 158*b175d1c2Schristos uLong ZEXPORT adler32_combine(uLong adler1, uLong adler2, z_off_t len2) { 159c3423655Schristos return adler32_combine_(adler1, adler2, len2); 160c3423655Schristos } 161c3423655Schristos 162*b175d1c2Schristos uLong ZEXPORT adler32_combine64(uLong adler1, uLong adler2, z_off64_t len2) { 163c3423655Schristos return adler32_combine_(adler1, adler2, len2); 164c3423655Schristos } 165