xref: /netbsd-src/external/bsd/wpa/dist/src/utils/crc32.c (revision bb6183629cf165db498d8e1f4e2de129f7efb21c)
10a73ee0aSchristos /*
20a73ee0aSchristos  * 32-bit CRC for FCS calculation
30a73ee0aSchristos  * Copyright (c) 2010, Jouni Malinen <j@w1.fi>
40a73ee0aSchristos  *
50a73ee0aSchristos  * This software may be distributed under the terms of the BSD license.
60a73ee0aSchristos  * See README for more details.
70a73ee0aSchristos  */
80a73ee0aSchristos 
90a73ee0aSchristos #include "utils/includes.h"
100a73ee0aSchristos 
110a73ee0aSchristos #include "utils/common.h"
120a73ee0aSchristos #include "utils/crc32.h"
130a73ee0aSchristos 
140a73ee0aSchristos /*
150a73ee0aSchristos  * IEEE 802.11 FCS CRC32
160a73ee0aSchristos  * G(x) = x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 +
170a73ee0aSchristos  *        x^5 + x^4 + x^2 + x + 1
180a73ee0aSchristos  */
190a73ee0aSchristos static const u32 crc32_table[256] = {
200a73ee0aSchristos 	0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
210a73ee0aSchristos 	0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
220a73ee0aSchristos 	0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
230a73ee0aSchristos 	0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
240a73ee0aSchristos 	0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
250a73ee0aSchristos 	0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
260a73ee0aSchristos 	0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
270a73ee0aSchristos 	0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
280a73ee0aSchristos 	0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
290a73ee0aSchristos 	0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
300a73ee0aSchristos 	0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
310a73ee0aSchristos 	0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
320a73ee0aSchristos 	0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
330a73ee0aSchristos 	0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
340a73ee0aSchristos 	0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
350a73ee0aSchristos 	0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
360a73ee0aSchristos 	0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
370a73ee0aSchristos 	0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
380a73ee0aSchristos 	0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
390a73ee0aSchristos 	0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
400a73ee0aSchristos 	0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
410a73ee0aSchristos 	0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
420a73ee0aSchristos 	0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
430a73ee0aSchristos 	0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
440a73ee0aSchristos 	0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
450a73ee0aSchristos 	0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
460a73ee0aSchristos 	0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
470a73ee0aSchristos 	0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
480a73ee0aSchristos 	0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
490a73ee0aSchristos 	0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
500a73ee0aSchristos 	0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
510a73ee0aSchristos 	0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
520a73ee0aSchristos 	0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
530a73ee0aSchristos 	0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
540a73ee0aSchristos 	0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
550a73ee0aSchristos 	0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
560a73ee0aSchristos 	0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
570a73ee0aSchristos 	0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
580a73ee0aSchristos 	0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
590a73ee0aSchristos 	0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
600a73ee0aSchristos 	0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
610a73ee0aSchristos 	0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
620a73ee0aSchristos 	0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
630a73ee0aSchristos 	0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
640a73ee0aSchristos 	0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
650a73ee0aSchristos 	0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
660a73ee0aSchristos 	0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
670a73ee0aSchristos 	0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
680a73ee0aSchristos 	0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
690a73ee0aSchristos 	0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
700a73ee0aSchristos 	0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
710a73ee0aSchristos 	0x2d02ef8d
720a73ee0aSchristos };
730a73ee0aSchristos 
740a73ee0aSchristos 
75*bb618362Schristos u32 ieee80211_crc32(const u8 *frame, size_t frame_len)
760a73ee0aSchristos {
770a73ee0aSchristos 	size_t i;
780a73ee0aSchristos 	u32 crc;
790a73ee0aSchristos 
800a73ee0aSchristos 	crc = 0xFFFFFFFF;
810a73ee0aSchristos 	for (i = 0; i < frame_len; i++)
820a73ee0aSchristos 		crc = crc32_table[(crc ^ frame[i]) & 0xff] ^ (crc >> 8);
830a73ee0aSchristos 
840a73ee0aSchristos 	return ~crc;
850a73ee0aSchristos }
86