xref: /linux/lib/crc/crc-itu-t.c (revision a578dd095dfe8b56c167201d9aea43e47d27f807)
189a51591SEric Biggers // SPDX-License-Identifier: GPL-2.0-only
289a51591SEric Biggers /*
389a51591SEric Biggers  *      crc-itu-t.c
489a51591SEric Biggers  */
589a51591SEric Biggers 
689a51591SEric Biggers #include <linux/crc-itu-t.h>
7*1a822ea5SEric Biggers #include <linux/export.h>
8*1a822ea5SEric Biggers #include <linux/module.h>
9*1a822ea5SEric Biggers #include <linux/types.h>
1089a51591SEric Biggers 
1189a51591SEric Biggers /* CRC table for the CRC ITU-T V.41 0x1021 (x^16 + x^12 + x^5 + 1) */
1289a51591SEric Biggers const u16 crc_itu_t_table[256] = {
1389a51591SEric Biggers 	0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
1489a51591SEric Biggers 	0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
1589a51591SEric Biggers 	0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
1689a51591SEric Biggers 	0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
1789a51591SEric Biggers 	0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
1889a51591SEric Biggers 	0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
1989a51591SEric Biggers 	0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
2089a51591SEric Biggers 	0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
2189a51591SEric Biggers 	0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
2289a51591SEric Biggers 	0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
2389a51591SEric Biggers 	0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
2489a51591SEric Biggers 	0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
2589a51591SEric Biggers 	0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
2689a51591SEric Biggers 	0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
2789a51591SEric Biggers 	0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
2889a51591SEric Biggers 	0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
2989a51591SEric Biggers 	0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
3089a51591SEric Biggers 	0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
3189a51591SEric Biggers 	0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
3289a51591SEric Biggers 	0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
3389a51591SEric Biggers 	0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
3489a51591SEric Biggers 	0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
3589a51591SEric Biggers 	0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
3689a51591SEric Biggers 	0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
3789a51591SEric Biggers 	0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
3889a51591SEric Biggers 	0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
3989a51591SEric Biggers 	0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
4089a51591SEric Biggers 	0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
4189a51591SEric Biggers 	0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
4289a51591SEric Biggers 	0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
4389a51591SEric Biggers 	0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
4489a51591SEric Biggers 	0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
4589a51591SEric Biggers };
4689a51591SEric Biggers 
4789a51591SEric Biggers EXPORT_SYMBOL(crc_itu_t_table);
4889a51591SEric Biggers 
4989a51591SEric Biggers /**
5089a51591SEric Biggers  * crc_itu_t - Compute the CRC-ITU-T for the data buffer
5189a51591SEric Biggers  *
5289a51591SEric Biggers  * @crc:     previous CRC value
5389a51591SEric Biggers  * @buffer:  data pointer
5489a51591SEric Biggers  * @len:     number of bytes in the buffer
5589a51591SEric Biggers  *
5689a51591SEric Biggers  * Returns the updated CRC value
5789a51591SEric Biggers  */
crc_itu_t(u16 crc,const u8 * buffer,size_t len)5889a51591SEric Biggers u16 crc_itu_t(u16 crc, const u8 *buffer, size_t len)
5989a51591SEric Biggers {
6089a51591SEric Biggers 	while (len--)
6189a51591SEric Biggers 		crc = crc_itu_t_byte(crc, *buffer++);
6289a51591SEric Biggers 	return crc;
6389a51591SEric Biggers }
6489a51591SEric Biggers EXPORT_SYMBOL(crc_itu_t);
6589a51591SEric Biggers 
6689a51591SEric Biggers MODULE_DESCRIPTION("CRC ITU-T V.41 calculations");
6789a51591SEric Biggers MODULE_LICENSE("GPL");
6889a51591SEric Biggers 
69