xref: /openbmc/linux/crypto/crct10dif_common.c (revision 26052f9b)
126052f9bSHerbert Xu /*
226052f9bSHerbert Xu  * Cryptographic API.
326052f9bSHerbert Xu  *
426052f9bSHerbert Xu  * T10 Data Integrity Field CRC16 Crypto Transform
526052f9bSHerbert Xu  *
626052f9bSHerbert Xu  * Copyright (c) 2007 Oracle Corporation.  All rights reserved.
726052f9bSHerbert Xu  * Written by Martin K. Petersen <martin.petersen@oracle.com>
826052f9bSHerbert Xu  * Copyright (C) 2013 Intel Corporation
926052f9bSHerbert Xu  * Author: Tim Chen <tim.c.chen@linux.intel.com>
1026052f9bSHerbert Xu  *
1126052f9bSHerbert Xu  * This program is free software; you can redistribute it and/or modify it
1226052f9bSHerbert Xu  * under the terms of the GNU General Public License as published by the Free
1326052f9bSHerbert Xu  * Software Foundation; either version 2 of the License, or (at your option)
1426052f9bSHerbert Xu  * any later version.
1526052f9bSHerbert Xu  *
1626052f9bSHerbert Xu  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1726052f9bSHerbert Xu  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1826052f9bSHerbert Xu  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
1926052f9bSHerbert Xu  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
2026052f9bSHerbert Xu  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
2126052f9bSHerbert Xu  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
2226052f9bSHerbert Xu  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2326052f9bSHerbert Xu  * SOFTWARE.
2426052f9bSHerbert Xu  *
2526052f9bSHerbert Xu  */
2626052f9bSHerbert Xu 
2726052f9bSHerbert Xu #include <linux/crc-t10dif.h>
2826052f9bSHerbert Xu #include <linux/module.h>
2926052f9bSHerbert Xu #include <linux/kernel.h>
3026052f9bSHerbert Xu 
3126052f9bSHerbert Xu /* Table generated using the following polynomium:
3226052f9bSHerbert Xu  * x^16 + x^15 + x^11 + x^9 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1
3326052f9bSHerbert Xu  * gt: 0x8bb7
3426052f9bSHerbert Xu  */
3526052f9bSHerbert Xu static const __u16 t10_dif_crc_table[256] = {
3626052f9bSHerbert Xu 	0x0000, 0x8BB7, 0x9CD9, 0x176E, 0xB205, 0x39B2, 0x2EDC, 0xA56B,
3726052f9bSHerbert Xu 	0xEFBD, 0x640A, 0x7364, 0xF8D3, 0x5DB8, 0xD60F, 0xC161, 0x4AD6,
3826052f9bSHerbert Xu 	0x54CD, 0xDF7A, 0xC814, 0x43A3, 0xE6C8, 0x6D7F, 0x7A11, 0xF1A6,
3926052f9bSHerbert Xu 	0xBB70, 0x30C7, 0x27A9, 0xAC1E, 0x0975, 0x82C2, 0x95AC, 0x1E1B,
4026052f9bSHerbert Xu 	0xA99A, 0x222D, 0x3543, 0xBEF4, 0x1B9F, 0x9028, 0x8746, 0x0CF1,
4126052f9bSHerbert Xu 	0x4627, 0xCD90, 0xDAFE, 0x5149, 0xF422, 0x7F95, 0x68FB, 0xE34C,
4226052f9bSHerbert Xu 	0xFD57, 0x76E0, 0x618E, 0xEA39, 0x4F52, 0xC4E5, 0xD38B, 0x583C,
4326052f9bSHerbert Xu 	0x12EA, 0x995D, 0x8E33, 0x0584, 0xA0EF, 0x2B58, 0x3C36, 0xB781,
4426052f9bSHerbert Xu 	0xD883, 0x5334, 0x445A, 0xCFED, 0x6A86, 0xE131, 0xF65F, 0x7DE8,
4526052f9bSHerbert Xu 	0x373E, 0xBC89, 0xABE7, 0x2050, 0x853B, 0x0E8C, 0x19E2, 0x9255,
4626052f9bSHerbert Xu 	0x8C4E, 0x07F9, 0x1097, 0x9B20, 0x3E4B, 0xB5FC, 0xA292, 0x2925,
4726052f9bSHerbert Xu 	0x63F3, 0xE844, 0xFF2A, 0x749D, 0xD1F6, 0x5A41, 0x4D2F, 0xC698,
4826052f9bSHerbert Xu 	0x7119, 0xFAAE, 0xEDC0, 0x6677, 0xC31C, 0x48AB, 0x5FC5, 0xD472,
4926052f9bSHerbert Xu 	0x9EA4, 0x1513, 0x027D, 0x89CA, 0x2CA1, 0xA716, 0xB078, 0x3BCF,
5026052f9bSHerbert Xu 	0x25D4, 0xAE63, 0xB90D, 0x32BA, 0x97D1, 0x1C66, 0x0B08, 0x80BF,
5126052f9bSHerbert Xu 	0xCA69, 0x41DE, 0x56B0, 0xDD07, 0x786C, 0xF3DB, 0xE4B5, 0x6F02,
5226052f9bSHerbert Xu 	0x3AB1, 0xB106, 0xA668, 0x2DDF, 0x88B4, 0x0303, 0x146D, 0x9FDA,
5326052f9bSHerbert Xu 	0xD50C, 0x5EBB, 0x49D5, 0xC262, 0x6709, 0xECBE, 0xFBD0, 0x7067,
5426052f9bSHerbert Xu 	0x6E7C, 0xE5CB, 0xF2A5, 0x7912, 0xDC79, 0x57CE, 0x40A0, 0xCB17,
5526052f9bSHerbert Xu 	0x81C1, 0x0A76, 0x1D18, 0x96AF, 0x33C4, 0xB873, 0xAF1D, 0x24AA,
5626052f9bSHerbert Xu 	0x932B, 0x189C, 0x0FF2, 0x8445, 0x212E, 0xAA99, 0xBDF7, 0x3640,
5726052f9bSHerbert Xu 	0x7C96, 0xF721, 0xE04F, 0x6BF8, 0xCE93, 0x4524, 0x524A, 0xD9FD,
5826052f9bSHerbert Xu 	0xC7E6, 0x4C51, 0x5B3F, 0xD088, 0x75E3, 0xFE54, 0xE93A, 0x628D,
5926052f9bSHerbert Xu 	0x285B, 0xA3EC, 0xB482, 0x3F35, 0x9A5E, 0x11E9, 0x0687, 0x8D30,
6026052f9bSHerbert Xu 	0xE232, 0x6985, 0x7EEB, 0xF55C, 0x5037, 0xDB80, 0xCCEE, 0x4759,
6126052f9bSHerbert Xu 	0x0D8F, 0x8638, 0x9156, 0x1AE1, 0xBF8A, 0x343D, 0x2353, 0xA8E4,
6226052f9bSHerbert Xu 	0xB6FF, 0x3D48, 0x2A26, 0xA191, 0x04FA, 0x8F4D, 0x9823, 0x1394,
6326052f9bSHerbert Xu 	0x5942, 0xD2F5, 0xC59B, 0x4E2C, 0xEB47, 0x60F0, 0x779E, 0xFC29,
6426052f9bSHerbert Xu 	0x4BA8, 0xC01F, 0xD771, 0x5CC6, 0xF9AD, 0x721A, 0x6574, 0xEEC3,
6526052f9bSHerbert Xu 	0xA415, 0x2FA2, 0x38CC, 0xB37B, 0x1610, 0x9DA7, 0x8AC9, 0x017E,
6626052f9bSHerbert Xu 	0x1F65, 0x94D2, 0x83BC, 0x080B, 0xAD60, 0x26D7, 0x31B9, 0xBA0E,
6726052f9bSHerbert Xu 	0xF0D8, 0x7B6F, 0x6C01, 0xE7B6, 0x42DD, 0xC96A, 0xDE04, 0x55B3
6826052f9bSHerbert Xu };
6926052f9bSHerbert Xu 
crc_t10dif_generic(__u16 crc,const unsigned char * buffer,size_t len)7026052f9bSHerbert Xu __u16 crc_t10dif_generic(__u16 crc, const unsigned char *buffer, size_t len)
7126052f9bSHerbert Xu {
7226052f9bSHerbert Xu 	unsigned int i;
7326052f9bSHerbert Xu 
7426052f9bSHerbert Xu 	for (i = 0 ; i < len ; i++)
7526052f9bSHerbert Xu 		crc = (crc << 8) ^ t10_dif_crc_table[((crc >> 8) ^ buffer[i]) & 0xff];
7626052f9bSHerbert Xu 
7726052f9bSHerbert Xu 	return crc;
7826052f9bSHerbert Xu }
7926052f9bSHerbert Xu EXPORT_SYMBOL(crc_t10dif_generic);
8026052f9bSHerbert Xu 
8126052f9bSHerbert Xu MODULE_DESCRIPTION("T10 DIF CRC calculation common code");
8226052f9bSHerbert Xu MODULE_LICENSE("GPL");
83