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