1162852Sdes/* $OpenBSD: crc32.c,v 1.11 2006/04/22 18:29:33 stevesk Exp $ */
2113908Sdes
357429Smarkm/*
4113908Sdes * Copyright (c) 2003 Markus Friedl.  All rights reserved.
565668Skris *
6113908Sdes * Redistribution and use in source and binary forms, with or without
7113908Sdes * modification, are permitted provided that the following conditions
8113908Sdes * are met:
9113908Sdes * 1. Redistributions of source code must retain the above copyright
10113908Sdes *    notice, this list of conditions and the following disclaimer.
11113908Sdes * 2. Redistributions in binary form must reproduce the above copyright
12113908Sdes *    notice, this list of conditions and the following disclaimer in the
13113908Sdes *    documentation and/or other materials provided with the distribution.
1465668Skris *
15113908Sdes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16113908Sdes * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17113908Sdes * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18113908Sdes * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19113908Sdes * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20113908Sdes * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21113908Sdes * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22113908Sdes * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23113908Sdes * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24113908Sdes * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2557429Smarkm */
2657429Smarkm#include "includes.h"
2757429Smarkm#include "crc32.h"
2857429Smarkm
29113908Sdesstatic const u_int32_t crc32tab[] = {
30113908Sdes	0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL,
31113908Sdes	0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L,
32113908Sdes	0x0edb8832L, 0x79dcb8a4L, 0xe0d5e91eL, 0x97d2d988L,
33113908Sdes	0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, 0x90bf1d91L,
34113908Sdes	0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
35113908Sdes	0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L,
36113908Sdes	0x136c9856L, 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL,
37113908Sdes	0x14015c4fL, 0x63066cd9L, 0xfa0f3d63L, 0x8d080df5L,
38113908Sdes	0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, 0xa2677172L,
39113908Sdes	0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
40113908Sdes	0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L,
41113908Sdes	0x32d86ce3L, 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L,
42113908Sdes	0x26d930acL, 0x51de003aL, 0xc8d75180L, 0xbfd06116L,
43113908Sdes	0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, 0xb8bda50fL,
44113908Sdes	0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
45113908Sdes	0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL,
46113908Sdes	0x76dc4190L, 0x01db7106L, 0x98d220bcL, 0xefd5102aL,
47113908Sdes	0x71b18589L, 0x06b6b51fL, 0x9fbfe4a5L, 0xe8b8d433L,
48113908Sdes	0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, 0xe10e9818L,
49113908Sdes	0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
50113908Sdes	0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL,
51113908Sdes	0x6c0695edL, 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L,
52113908Sdes	0x65b0d9c6L, 0x12b7e950L, 0x8bbeb8eaL, 0xfcb9887cL,
53113908Sdes	0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, 0xfbd44c65L,
54113908Sdes	0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
55113908Sdes	0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL,
56113908Sdes	0x4369e96aL, 0x346ed9fcL, 0xad678846L, 0xda60b8d0L,
57113908Sdes	0x44042d73L, 0x33031de5L, 0xaa0a4c5fL, 0xdd0d7cc9L,
58113908Sdes	0x5005713cL, 0x270241aaL, 0xbe0b1010L, 0xc90c2086L,
59113908Sdes	0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
60113908Sdes	0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L,
61113908Sdes	0x59b33d17L, 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL,
62113908Sdes	0xedb88320L, 0x9abfb3b6L, 0x03b6e20cL, 0x74b1d29aL,
63113908Sdes	0xead54739L, 0x9dd277afL, 0x04db2615L, 0x73dc1683L,
64113908Sdes	0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
65113908Sdes	0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L,
66113908Sdes	0xf00f9344L, 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL,
67113908Sdes	0xf762575dL, 0x806567cbL, 0x196c3671L, 0x6e6b06e7L,
68113908Sdes	0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, 0x67dd4accL,
69113908Sdes	0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
70113908Sdes	0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L,
71113908Sdes	0xd1bb67f1L, 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL,
72113908Sdes	0xd80d2bdaL, 0xaf0a1b4cL, 0x36034af6L, 0x41047a60L,
73113908Sdes	0xdf60efc3L, 0xa867df55L, 0x316e8eefL, 0x4669be79L,
74113908Sdes	0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
75113908Sdes	0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL,
76113908Sdes	0xc5ba3bbeL, 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L,
77113908Sdes	0xc2d7ffa7L, 0xb5d0cf31L, 0x2cd99e8bL, 0x5bdeae1dL,
78113908Sdes	0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, 0x026d930aL,
79113908Sdes	0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
80113908Sdes	0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L,
81113908Sdes	0x92d28e9bL, 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L,
82113908Sdes	0x86d3d2d4L, 0xf1d4e242L, 0x68ddb3f8L, 0x1fda836eL,
83113908Sdes	0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, 0x18b74777L,
84113908Sdes	0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
85113908Sdes	0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L,
86113908Sdes	0xa00ae278L, 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L,
87113908Sdes	0xa7672661L, 0xd06016f7L, 0x4969474dL, 0x3e6e77dbL,
88113908Sdes	0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, 0x37d83bf0L,
89113908Sdes	0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
90113908Sdes	0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L,
91113908Sdes	0xbad03605L, 0xcdd70693L, 0x54de5729L, 0x23d967bfL,
92113908Sdes	0xb3667a2eL, 0xc4614ab8L, 0x5d681b02L, 0x2a6f2b94L,
93113908Sdes	0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, 0x2d02ef8dL
9457429Smarkm};
9557429Smarkm
96113908Sdesu_int32_t
97113908Sdesssh_crc32(const u_char *buf, u_int32_t size)
9857429Smarkm{
99113908Sdes	u_int32_t i, crc;
10057429Smarkm
101113908Sdes	crc = 0;
102162852Sdes	for (i = 0; i < size; i++)
103113908Sdes		crc = crc32tab[(crc ^ buf[i]) & 0xff] ^ (crc >> 8);
104113908Sdes	return crc;
10557429Smarkm}
106