1ac21f333SMike Baucom /* SPDX-License-Identifier: BSD-3-Clause
2*e6e8f03eSRandy Schacher * Copyright(c) 2019-2023 Broadcom
3ac21f333SMike Baucom * All rights reserved.
4ac21f333SMike Baucom */
5ac21f333SMike Baucom
6ac21f333SMike Baucom #include "tf_hash.h"
7ac21f333SMike Baucom
8ac21f333SMike Baucom /* CRC polynomial 0xedb88320 */
9ac21f333SMike Baucom static const uint32_t tf_hash_crc32tbl[] = {
10ac21f333SMike Baucom 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
11ac21f333SMike Baucom 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
12ac21f333SMike Baucom 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
13ac21f333SMike Baucom 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
14ac21f333SMike Baucom 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
15ac21f333SMike Baucom 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
16ac21f333SMike Baucom 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
17ac21f333SMike Baucom 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
18ac21f333SMike Baucom 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
19ac21f333SMike Baucom 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
20ac21f333SMike Baucom 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
21ac21f333SMike Baucom 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
22ac21f333SMike Baucom 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
23ac21f333SMike Baucom 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
24ac21f333SMike Baucom 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
25ac21f333SMike Baucom 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
26ac21f333SMike Baucom 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
27ac21f333SMike Baucom 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
28ac21f333SMike Baucom 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
29ac21f333SMike Baucom 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
30ac21f333SMike Baucom 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
31ac21f333SMike Baucom 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
32ac21f333SMike Baucom 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
33ac21f333SMike Baucom 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
34ac21f333SMike Baucom 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
35ac21f333SMike Baucom 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
36ac21f333SMike Baucom 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
37ac21f333SMike Baucom 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
38ac21f333SMike Baucom 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
39ac21f333SMike Baucom 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
40ac21f333SMike Baucom 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
41ac21f333SMike Baucom 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
42ac21f333SMike Baucom 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
43ac21f333SMike Baucom 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
44ac21f333SMike Baucom 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
45ac21f333SMike Baucom 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
46ac21f333SMike Baucom 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
47ac21f333SMike Baucom 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
48ac21f333SMike Baucom 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
49ac21f333SMike Baucom 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
50ac21f333SMike Baucom 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
51ac21f333SMike Baucom 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
52ac21f333SMike Baucom 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
53ac21f333SMike Baucom 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
54ac21f333SMike Baucom 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
55ac21f333SMike Baucom 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
56ac21f333SMike Baucom 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
57ac21f333SMike Baucom 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
58ac21f333SMike Baucom 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
59ac21f333SMike Baucom 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
60ac21f333SMike Baucom 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
61ac21f333SMike Baucom 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
62ac21f333SMike Baucom 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
63ac21f333SMike Baucom 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
64ac21f333SMike Baucom 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
65ac21f333SMike Baucom 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
66ac21f333SMike Baucom 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
67ac21f333SMike Baucom 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
68ac21f333SMike Baucom 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
69ac21f333SMike Baucom 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
70ac21f333SMike Baucom 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
71ac21f333SMike Baucom 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
72ac21f333SMike Baucom 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
73ac21f333SMike Baucom 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
74ac21f333SMike Baucom };
75ac21f333SMike Baucom
76ac21f333SMike Baucom /**
77ac21f333SMike Baucom * Calculate a crc32 on the buffer with an initial value and len
78ac21f333SMike Baucom *
79ac21f333SMike Baucom * Returns the crc32
80ac21f333SMike Baucom */
81ac21f333SMike Baucom uint32_t
tf_hash_calc_crc32i(uint32_t init,uint8_t * buf,uint32_t len)82ac21f333SMike Baucom tf_hash_calc_crc32i(uint32_t init, uint8_t *buf, uint32_t len)
83ac21f333SMike Baucom {
84ac21f333SMike Baucom uint32_t crc = init;
85ac21f333SMike Baucom
86ac21f333SMike Baucom while (len--)
87ac21f333SMike Baucom crc = tf_hash_crc32tbl[(crc ^ buf[len]) & 0xff] ^
88ac21f333SMike Baucom (crc >> 8);
89ac21f333SMike Baucom
90ac21f333SMike Baucom return crc;
91ac21f333SMike Baucom }
92ac21f333SMike Baucom
93ac21f333SMike Baucom /**
94ac21f333SMike Baucom * Calculate a crc32 on the buffer with a default initial value
95ac21f333SMike Baucom *
96ac21f333SMike Baucom * Returns the crc32
97ac21f333SMike Baucom */
98ac21f333SMike Baucom uint32_t
tf_hash_calc_crc32(uint8_t * buf,uint32_t len)99ac21f333SMike Baucom tf_hash_calc_crc32(uint8_t *buf, uint32_t len)
100ac21f333SMike Baucom {
101ac21f333SMike Baucom uint32_t crc = ~0U;
102ac21f333SMike Baucom
103ac21f333SMike Baucom crc = tf_hash_calc_crc32i(crc, buf, len);
104ac21f333SMike Baucom
105ac21f333SMike Baucom return ~crc;
106ac21f333SMike Baucom }
107