xref: /freebsd/contrib/wpa/src/utils/crc32.c (revision a90b9d0159070121c221b966469c3e36d912bf82)
185732ac8SCy Schubert /*
285732ac8SCy Schubert  * 32-bit CRC for FCS calculation
385732ac8SCy Schubert  * Copyright (c) 2010, Jouni Malinen <j@w1.fi>
485732ac8SCy Schubert  *
585732ac8SCy Schubert  * This software may be distributed under the terms of the BSD license.
685732ac8SCy Schubert  * See README for more details.
785732ac8SCy Schubert  */
885732ac8SCy Schubert 
985732ac8SCy Schubert #include "utils/includes.h"
1085732ac8SCy Schubert 
1185732ac8SCy Schubert #include "utils/common.h"
1285732ac8SCy Schubert #include "utils/crc32.h"
1385732ac8SCy Schubert 
1485732ac8SCy Schubert /*
1585732ac8SCy Schubert  * IEEE 802.11 FCS CRC32
1685732ac8SCy Schubert  * G(x) = x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 +
1785732ac8SCy Schubert  *        x^5 + x^4 + x^2 + x + 1
1885732ac8SCy Schubert  */
1985732ac8SCy Schubert static const u32 crc32_table[256] = {
2085732ac8SCy Schubert 	0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
2185732ac8SCy Schubert 	0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
2285732ac8SCy Schubert 	0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
2385732ac8SCy Schubert 	0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
2485732ac8SCy Schubert 	0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
2585732ac8SCy Schubert 	0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
2685732ac8SCy Schubert 	0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
2785732ac8SCy Schubert 	0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
2885732ac8SCy Schubert 	0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
2985732ac8SCy Schubert 	0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
3085732ac8SCy Schubert 	0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
3185732ac8SCy Schubert 	0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
3285732ac8SCy Schubert 	0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
3385732ac8SCy Schubert 	0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
3485732ac8SCy Schubert 	0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
3585732ac8SCy Schubert 	0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
3685732ac8SCy Schubert 	0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
3785732ac8SCy Schubert 	0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
3885732ac8SCy Schubert 	0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
3985732ac8SCy Schubert 	0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
4085732ac8SCy Schubert 	0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
4185732ac8SCy Schubert 	0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
4285732ac8SCy Schubert 	0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
4385732ac8SCy Schubert 	0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
4485732ac8SCy Schubert 	0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
4585732ac8SCy Schubert 	0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
4685732ac8SCy Schubert 	0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
4785732ac8SCy Schubert 	0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
4885732ac8SCy Schubert 	0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
4985732ac8SCy Schubert 	0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
5085732ac8SCy Schubert 	0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
5185732ac8SCy Schubert 	0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
5285732ac8SCy Schubert 	0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
5385732ac8SCy Schubert 	0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
5485732ac8SCy Schubert 	0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
5585732ac8SCy Schubert 	0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
5685732ac8SCy Schubert 	0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
5785732ac8SCy Schubert 	0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
5885732ac8SCy Schubert 	0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
5985732ac8SCy Schubert 	0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
6085732ac8SCy Schubert 	0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
6185732ac8SCy Schubert 	0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
6285732ac8SCy Schubert 	0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
6385732ac8SCy Schubert 	0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
6485732ac8SCy Schubert 	0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
6585732ac8SCy Schubert 	0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
6685732ac8SCy Schubert 	0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
6785732ac8SCy Schubert 	0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
6885732ac8SCy Schubert 	0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
6985732ac8SCy Schubert 	0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
7085732ac8SCy Schubert 	0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
7185732ac8SCy Schubert 	0x2d02ef8d
7285732ac8SCy Schubert };
7385732ac8SCy Schubert 
7485732ac8SCy Schubert 
ieee80211_crc32(const u8 * frame,size_t frame_len)75*a90b9d01SCy Schubert u32 ieee80211_crc32(const u8 *frame, size_t frame_len)
7685732ac8SCy Schubert {
7785732ac8SCy Schubert 	size_t i;
7885732ac8SCy Schubert 	u32 crc;
7985732ac8SCy Schubert 
8085732ac8SCy Schubert 	crc = 0xFFFFFFFF;
8185732ac8SCy Schubert 	for (i = 0; i < frame_len; i++)
8285732ac8SCy Schubert 		crc = crc32_table[(crc ^ frame[i]) & 0xff] ^ (crc >> 8);
8385732ac8SCy Schubert 
8485732ac8SCy Schubert 	return ~crc;
8585732ac8SCy Schubert }
86