1 // SPDX-License-Identifier: GPL-2.0-only << 2 /* 1 /* 3 * linux/lib/crc-ccitt.c 2 * linux/lib/crc-ccitt.c >> 3 * >> 4 * This source code is licensed under the GNU General Public License, >> 5 * Version 2. See the file COPYING for more details. 4 */ 6 */ 5 7 6 #include <linux/types.h> 8 #include <linux/types.h> 7 #include <linux/module.h> 9 #include <linux/module.h> 8 #include <linux/crc-ccitt.h> 10 #include <linux/crc-ccitt.h> 9 11 10 /* 12 /* 11 * This mysterious table is just the CRC of ea 13 * This mysterious table is just the CRC of each possible byte. It can be 12 * computed using the standard bit-at-a-time m 14 * computed using the standard bit-at-a-time methods. The polynomial can 13 * be seen in entry 128, 0x8408. This correspo 15 * be seen in entry 128, 0x8408. This corresponds to x^0 + x^5 + x^12. 14 * Add the implicit x^16, and you have the sta 16 * Add the implicit x^16, and you have the standard CRC-CCITT. 15 */ 17 */ 16 u16 const crc_ccitt_table[256] = { 18 u16 const crc_ccitt_table[256] = { 17 0x0000, 0x1189, 0x2312, 0x329b, 0x4624 19 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, 18 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c 20 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, 19 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5 21 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, 20 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed 22 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, 21 0x2102, 0x308b, 0x0210, 0x1399, 0x6726 23 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, 22 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e 24 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5, 23 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7 25 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, 24 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef 26 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, 25 0x4204, 0x538d, 0x6116, 0x709f, 0x0420 27 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, 26 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868 28 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, 27 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1 29 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, 28 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9 30 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72, 29 0x6306, 0x728f, 0x4014, 0x519d, 0x2522 31 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, 30 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a 32 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, 31 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3 33 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, 32 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb 34 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, 33 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c 35 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, 34 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64 36 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff, 35 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad 37 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, 36 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5 38 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, 37 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e 39 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, 38 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66 40 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, 39 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af 41 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, 40 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7 42 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, 41 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028 43 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, 42 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60 44 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, 43 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9 45 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, 44 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1 46 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, 45 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a 47 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, 46 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62 48 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, 47 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab 49 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, 48 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3 50 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78 49 }; 51 }; 50 EXPORT_SYMBOL(crc_ccitt_table); 52 EXPORT_SYMBOL(crc_ccitt_table); 51 53 >> 54 /* >> 55 * Similar table to calculate CRC16 variant known as CRC-CCITT-FALSE >> 56 * Reflected bits order, does not augment final value. >> 57 */ >> 58 u16 const crc_ccitt_false_table[256] = { >> 59 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, >> 60 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, >> 61 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, >> 62 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, >> 63 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, >> 64 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, >> 65 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, >> 66 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, >> 67 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, >> 68 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, >> 69 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, >> 70 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, >> 71 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, >> 72 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, >> 73 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, >> 74 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, >> 75 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, >> 76 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, >> 77 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, >> 78 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, >> 79 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, >> 80 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, >> 81 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, >> 82 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, >> 83 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, >> 84 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, >> 85 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, >> 86 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, >> 87 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, >> 88 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, >> 89 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, >> 90 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 >> 91 }; >> 92 EXPORT_SYMBOL(crc_ccitt_false_table); >> 93 52 /** 94 /** 53 * crc_ccitt - recompute the CRC (CRC-CCI 95 * crc_ccitt - recompute the CRC (CRC-CCITT variant) for the data 54 * buffer 96 * buffer 55 * @crc: previous CRC value 97 * @crc: previous CRC value 56 * @buffer: data pointer 98 * @buffer: data pointer 57 * @len: number of bytes in the buffer 99 * @len: number of bytes in the buffer 58 */ 100 */ 59 u16 crc_ccitt(u16 crc, u8 const *buffer, size_ 101 u16 crc_ccitt(u16 crc, u8 const *buffer, size_t len) 60 { 102 { 61 while (len--) 103 while (len--) 62 crc = crc_ccitt_byte(crc, *buf 104 crc = crc_ccitt_byte(crc, *buffer++); 63 return crc; 105 return crc; 64 } 106 } 65 EXPORT_SYMBOL(crc_ccitt); 107 EXPORT_SYMBOL(crc_ccitt); >> 108 >> 109 /** >> 110 * crc_ccitt_false - recompute the CRC (CRC-CCITT-FALSE variant) >> 111 * for the data buffer >> 112 * @crc: previous CRC value >> 113 * @buffer: data pointer >> 114 * @len: number of bytes in the buffer >> 115 */ >> 116 u16 crc_ccitt_false(u16 crc, u8 const *buffer, size_t len) >> 117 { >> 118 while (len--) >> 119 crc = crc_ccitt_false_byte(crc, *buffer++); >> 120 return crc; >> 121 } >> 122 EXPORT_SYMBOL(crc_ccitt_false); 66 123 67 MODULE_DESCRIPTION("CRC-CCITT calculations"); 124 MODULE_DESCRIPTION("CRC-CCITT calculations"); 68 MODULE_LICENSE("GPL"); 125 MODULE_LICENSE("GPL"); 69 126
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.