1 /* adler32.c -- compute the Adler-32 checksum of a data stream 2 * Copyright (C) 1995-2004 Mark Adler 3 * For conditions of distribution and use, see copyright notice in zlib.h 4 */ 5 6 /* @(#) $Id$ */ 7 8 #define ZLIB_INTERNAL 9 #include "zlib.h" 10 11 #define BASE 65521UL /* largest prime smaller than 65536 */ 12 #define NMAX 5552 13 /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ 14 15 #define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} 16 #define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); 17 #define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); 18 #define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); 19 #define DO16(buf) DO8(buf,0); DO8(buf,8); 20 21 /* use NO_DIVIDE if your processor does not do division in hardware */ 22 #ifdef NO_DIVIDE 23 # define MOD(a) \ 24 do { \ 25 if (a >= (BASE << 16)) a -= (BASE << 16); \ 26 if (a >= (BASE << 15)) a -= (BASE << 15); \ 27 if (a >= (BASE << 14)) a -= (BASE << 14); \ 28 if (a >= (BASE << 13)) a -= (BASE << 13); \ 29 if (a >= (BASE << 12)) a -= (BASE << 12); \ 30 if (a >= (BASE << 11)) a -= (BASE << 11); \ 31 if (a >= (BASE << 10)) a -= (BASE << 10); \ 32 if (a >= (BASE << 9)) a -= (BASE << 9); \ 33 if (a >= (BASE << 8)) a -= (BASE << 8); \ 34 if (a >= (BASE << 7)) a -= (BASE << 7); \ 35 if (a >= (BASE << 6)) a -= (BASE << 6); \ 36 if (a >= (BASE << 5)) a -= (BASE << 5); \ 37 if (a >= (BASE << 4)) a -= (BASE << 4); \ 38 if (a >= (BASE << 3)) a -= (BASE << 3); \ 39 if (a >= (BASE << 2)) a -= (BASE << 2); \ 40 if (a >= (BASE << 1)) a -= (BASE << 1); \ 41 if (a >= BASE) a -= BASE; \ 42 } while (0) 43 # define MOD4(a) \ 44 do { \ 45 if (a >= (BASE << 4)) a -= (BASE << 4); \ 46 if (a >= (BASE << 3)) a -= (BASE << 3); \ 47 if (a >= (BASE << 2)) a -= (BASE << 2); \ 48 if (a >= (BASE << 1)) a -= (BASE << 1); \ 49 if (a >= BASE) a -= BASE; \ 50 } while (0) 51 #else 52 # define MOD(a) a %= BASE 53 # define MOD4(a) a %= BASE 54 #endif 55 56 /* ========================================================================= */ 57 58 /* 59 The adler32 code below computes, in effect, 60 61 uLong high = 0; 62 uLong low = 1; 63 for (j = 0; j < len; j++) { 64 low = (low + buf[j]) % BASE; 65 high = (high + low) % BASE; 66 } 67 checksum = (high << 16) | low; 68 69 Both 16-bit halves of the checksum are between 0 and BASE-1 (inclusive). 70 Hence, the minimum possible checksum value is 0, and the maximum is 71 ((BASE-1) << 16) | (BASE-1). Applications may have reserved values 72 outside this range to carry special meanings. 73 74 NOTE: If adler32() is changed in ANY way, be absolutely sure that the 75 change will NOT cause checksums previously stored to not match the data 76 they were originally intended to match, or expand the range in such a 77 way that values reserved by applications to carry special meanings now 78 become checksums of valid data. Also, be sure to change adler32_range() 79 accordingly. 80 81 This explanation and adler32_range() are not part of original software 82 distribution. They are added at Google (2006) in accordance with the 83 copyright notice in zlib.h, which permits alteration and redistribution 84 of the original software provided, among other things, that altered 85 source versions must be plainly marked as such and not misrepresented as 86 being the original software. 87 */ 88 89 void ZEXPORT adler32_range(min, max) 90 uLong *min; 91 uLong *max; 92 { 93 *min = 0L; 94 *max = ((BASE-1) << 16) | (BASE-1); 95 } 96 97 uLong ZEXPORT adler32(adler, buf, len) 98 uLong adler; 99 const Bytef *buf; 100 uInt len; 101 { 102 unsigned long sum2; 103 unsigned n; 104 105 /* split Adler-32 into component sums */ 106 sum2 = (adler >> 16) & 0xffff; 107 adler &= 0xffff; 108 109 /* in case user likes doing a byte at a time, keep it fast */ 110 if (len == 1) { 111 adler += buf[0]; 112 if (adler >= BASE) 113 adler -= BASE; 114 sum2 += adler; 115 if (sum2 >= BASE) 116 sum2 -= BASE; 117 return adler | (sum2 << 16); 118 } 119 120 /* initial Adler-32 value (deferred check for len == 1 speed) */ 121 if (buf == Z_NULL) 122 return 1L; 123 124 /* in case short lengths are provided, keep it somewhat fast */ 125 if (len < 16) { 126 while (len--) { 127 adler += *buf++; 128 sum2 += adler; 129 } 130 if (adler >= BASE) 131 adler -= BASE; 132 MOD4(sum2); /* only added so many BASE's */ 133 return adler | (sum2 << 16); 134 } 135 136 /* do length NMAX blocks -- requires just one modulo operation */ 137 while (len >= NMAX) { 138 len -= NMAX; 139 n = NMAX / 16; /* NMAX is divisible by 16 */ 140 do { 141 DO16(buf); /* 16 sums unrolled */ 142 buf += 16; 143 } while (--n); 144 MOD(adler); 145 MOD(sum2); 146 } 147 148 /* do remaining bytes (less than NMAX, still just one modulo) */ 149 if (len) { /* avoid modulos if none remaining */ 150 while (len >= 16) { 151 len -= 16; 152 DO16(buf); 153 buf += 16; 154 } 155 while (len--) { 156 adler += *buf++; 157 sum2 += adler; 158 } 159 MOD(adler); 160 MOD(sum2); 161 } 162 163 /* return recombined sums */ 164 return adler | (sum2 << 16); 165 } 166 167 /* ========================================================================= */ 168 uLong ZEXPORT adler32_combine(adler1, adler2, len2) 169 uLong adler1; 170 uLong adler2; 171 z_off_t len2; 172 { 173 unsigned long sum1; 174 unsigned long sum2; 175 unsigned rem; 176 177 /* the derivation of this formula is left as an exercise for the reader */ 178 rem = (unsigned)(len2 % BASE); 179 sum1 = adler1 & 0xffff; 180 sum2 = rem * sum1; 181 MOD(sum2); 182 sum1 += (adler2 & 0xffff) + BASE - 1; 183 sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; 184 if (sum1 >= BASE) sum1 -= BASE; 185 if (sum1 >= BASE) sum1 -= BASE; 186 if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1); 187 if (sum2 >= BASE) sum2 -= BASE; 188 return sum1 | (sum2 << 16); 189 } 190