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