Coverage Report

Created: 2025-06-22 06:56

/src/util-linux/lib/crc64.c
Line
Count
Source (jump to first uncovered line)
1
/* SPDX-License-Identifier: MIT */
2
/*
3
 * Library: libcrc
4
 * File:    src/crc64.c
5
 * Author:  Lammert Bies
6
 *
7
 * This file is licensed under the MIT License as stated below
8
 *
9
 * Copyright (c) 2016 Lammert Bies
10
 *
11
 * Permission is hereby granted, free of charge, to any person obtaining a copy
12
 * of this software and associated documentation files (the "Software"), to deal
13
 * in the Software without restriction, including without limitation the rights
14
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15
 * copies of the Software, and to permit persons to whom the Software is
16
 * furnished to do so, subject to the following conditions:
17
 *
18
 * The above copyright notice and this permission notice shall be included in all
19
 * copies or substantial portions of the Software.
20
 * 
21
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27
 * SOFTWARE.
28
 *
29
 * Description
30
 * -----------
31
 * The source file contains the routines which are needed to
32
 * calculate a 64 bit CRC value of a sequence of bytes.
33
 */
34
35
#include <stdbool.h>
36
#include <stdlib.h>
37
38
#include "crc64.h"
39
40
0
#define   CRC_START_64_ECMA 0x0000000000000000ull
41
71
#define   CRC_START_64_WE   0xFFFFFFFFFFFFFFFFull
42
43
const uint64_t crc_tab64[256] = {
44
  0x0000000000000000ull,
45
  0x42F0E1EBA9EA3693ull,
46
  0x85E1C3D753D46D26ull,
47
  0xC711223CFA3E5BB5ull,
48
  0x493366450E42ECDFull,
49
  0x0BC387AEA7A8DA4Cull,
50
  0xCCD2A5925D9681F9ull,
51
  0x8E224479F47CB76Aull,
52
  0x9266CC8A1C85D9BEull,
53
  0xD0962D61B56FEF2Dull,
54
  0x17870F5D4F51B498ull,
55
  0x5577EEB6E6BB820Bull,
56
  0xDB55AACF12C73561ull,
57
  0x99A54B24BB2D03F2ull,
58
  0x5EB4691841135847ull,
59
  0x1C4488F3E8F96ED4ull,
60
  0x663D78FF90E185EFull,
61
  0x24CD9914390BB37Cull,
62
  0xE3DCBB28C335E8C9ull,
63
  0xA12C5AC36ADFDE5Aull,
64
  0x2F0E1EBA9EA36930ull,
65
  0x6DFEFF5137495FA3ull,
66
  0xAAEFDD6DCD770416ull,
67
  0xE81F3C86649D3285ull,
68
  0xF45BB4758C645C51ull,
69
  0xB6AB559E258E6AC2ull,
70
  0x71BA77A2DFB03177ull,
71
  0x334A9649765A07E4ull,
72
  0xBD68D2308226B08Eull,
73
  0xFF9833DB2BCC861Dull,
74
  0x388911E7D1F2DDA8ull,
75
  0x7A79F00C7818EB3Bull,
76
  0xCC7AF1FF21C30BDEull,
77
  0x8E8A101488293D4Dull,
78
  0x499B3228721766F8ull,
79
  0x0B6BD3C3DBFD506Bull,
80
  0x854997BA2F81E701ull,
81
  0xC7B97651866BD192ull,
82
  0x00A8546D7C558A27ull,
83
  0x4258B586D5BFBCB4ull,
84
  0x5E1C3D753D46D260ull,
85
  0x1CECDC9E94ACE4F3ull,
86
  0xDBFDFEA26E92BF46ull,
87
  0x990D1F49C77889D5ull,
88
  0x172F5B3033043EBFull,
89
  0x55DFBADB9AEE082Cull,
90
  0x92CE98E760D05399ull,
91
  0xD03E790CC93A650Aull,
92
  0xAA478900B1228E31ull,
93
  0xE8B768EB18C8B8A2ull,
94
  0x2FA64AD7E2F6E317ull,
95
  0x6D56AB3C4B1CD584ull,
96
  0xE374EF45BF6062EEull,
97
  0xA1840EAE168A547Dull,
98
  0x66952C92ECB40FC8ull,
99
  0x2465CD79455E395Bull,
100
  0x3821458AADA7578Full,
101
  0x7AD1A461044D611Cull,
102
  0xBDC0865DFE733AA9ull,
103
  0xFF3067B657990C3Aull,
104
  0x711223CFA3E5BB50ull,
105
  0x33E2C2240A0F8DC3ull,
106
  0xF4F3E018F031D676ull,
107
  0xB60301F359DBE0E5ull,
108
  0xDA050215EA6C212Full,
109
  0x98F5E3FE438617BCull,
110
  0x5FE4C1C2B9B84C09ull,
111
  0x1D14202910527A9Aull,
112
  0x93366450E42ECDF0ull,
113
  0xD1C685BB4DC4FB63ull,
114
  0x16D7A787B7FAA0D6ull,
115
  0x5427466C1E109645ull,
116
  0x4863CE9FF6E9F891ull,
117
  0x0A932F745F03CE02ull,
118
  0xCD820D48A53D95B7ull,
119
  0x8F72ECA30CD7A324ull,
120
  0x0150A8DAF8AB144Eull,
121
  0x43A04931514122DDull,
122
  0x84B16B0DAB7F7968ull,
123
  0xC6418AE602954FFBull,
124
  0xBC387AEA7A8DA4C0ull,
125
  0xFEC89B01D3679253ull,
126
  0x39D9B93D2959C9E6ull,
127
  0x7B2958D680B3FF75ull,
128
  0xF50B1CAF74CF481Full,
129
  0xB7FBFD44DD257E8Cull,
130
  0x70EADF78271B2539ull,
131
  0x321A3E938EF113AAull,
132
  0x2E5EB66066087D7Eull,
133
  0x6CAE578BCFE24BEDull,
134
  0xABBF75B735DC1058ull,
135
  0xE94F945C9C3626CBull,
136
  0x676DD025684A91A1ull,
137
  0x259D31CEC1A0A732ull,
138
  0xE28C13F23B9EFC87ull,
139
  0xA07CF2199274CA14ull,
140
  0x167FF3EACBAF2AF1ull,
141
  0x548F120162451C62ull,
142
  0x939E303D987B47D7ull,
143
  0xD16ED1D631917144ull,
144
  0x5F4C95AFC5EDC62Eull,
145
  0x1DBC74446C07F0BDull,
146
  0xDAAD56789639AB08ull,
147
  0x985DB7933FD39D9Bull,
148
  0x84193F60D72AF34Full,
149
  0xC6E9DE8B7EC0C5DCull,
150
  0x01F8FCB784FE9E69ull,
151
  0x43081D5C2D14A8FAull,
152
  0xCD2A5925D9681F90ull,
153
  0x8FDAB8CE70822903ull,
154
  0x48CB9AF28ABC72B6ull,
155
  0x0A3B7B1923564425ull,
156
  0x70428B155B4EAF1Eull,
157
  0x32B26AFEF2A4998Dull,
158
  0xF5A348C2089AC238ull,
159
  0xB753A929A170F4ABull,
160
  0x3971ED50550C43C1ull,
161
  0x7B810CBBFCE67552ull,
162
  0xBC902E8706D82EE7ull,
163
  0xFE60CF6CAF321874ull,
164
  0xE224479F47CB76A0ull,
165
  0xA0D4A674EE214033ull,
166
  0x67C58448141F1B86ull,
167
  0x253565A3BDF52D15ull,
168
  0xAB1721DA49899A7Full,
169
  0xE9E7C031E063ACECull,
170
  0x2EF6E20D1A5DF759ull,
171
  0x6C0603E6B3B7C1CAull,
172
  0xF6FAE5C07D3274CDull,
173
  0xB40A042BD4D8425Eull,
174
  0x731B26172EE619EBull,
175
  0x31EBC7FC870C2F78ull,
176
  0xBFC9838573709812ull,
177
  0xFD39626EDA9AAE81ull,
178
  0x3A28405220A4F534ull,
179
  0x78D8A1B9894EC3A7ull,
180
  0x649C294A61B7AD73ull,
181
  0x266CC8A1C85D9BE0ull,
182
  0xE17DEA9D3263C055ull,
183
  0xA38D0B769B89F6C6ull,
184
  0x2DAF4F0F6FF541ACull,
185
  0x6F5FAEE4C61F773Full,
186
  0xA84E8CD83C212C8Aull,
187
  0xEABE6D3395CB1A19ull,
188
  0x90C79D3FEDD3F122ull,
189
  0xD2377CD44439C7B1ull,
190
  0x15265EE8BE079C04ull,
191
  0x57D6BF0317EDAA97ull,
192
  0xD9F4FB7AE3911DFDull,
193
  0x9B041A914A7B2B6Eull,
194
  0x5C1538ADB04570DBull,
195
  0x1EE5D94619AF4648ull,
196
  0x02A151B5F156289Cull,
197
  0x4051B05E58BC1E0Full,
198
  0x87409262A28245BAull,
199
  0xC5B073890B687329ull,
200
  0x4B9237F0FF14C443ull,
201
  0x0962D61B56FEF2D0ull,
202
  0xCE73F427ACC0A965ull,
203
  0x8C8315CC052A9FF6ull,
204
  0x3A80143F5CF17F13ull,
205
  0x7870F5D4F51B4980ull,
206
  0xBF61D7E80F251235ull,
207
  0xFD913603A6CF24A6ull,
208
  0x73B3727A52B393CCull,
209
  0x31439391FB59A55Full,
210
  0xF652B1AD0167FEEAull,
211
  0xB4A25046A88DC879ull,
212
  0xA8E6D8B54074A6ADull,
213
  0xEA16395EE99E903Eull,
214
  0x2D071B6213A0CB8Bull,
215
  0x6FF7FA89BA4AFD18ull,
216
  0xE1D5BEF04E364A72ull,
217
  0xA3255F1BE7DC7CE1ull,
218
  0x64347D271DE22754ull,
219
  0x26C49CCCB40811C7ull,
220
  0x5CBD6CC0CC10FAFCull,
221
  0x1E4D8D2B65FACC6Full,
222
  0xD95CAF179FC497DAull,
223
  0x9BAC4EFC362EA149ull,
224
  0x158E0A85C2521623ull,
225
  0x577EEB6E6BB820B0ull,
226
  0x906FC95291867B05ull,
227
  0xD29F28B9386C4D96ull,
228
  0xCEDBA04AD0952342ull,
229
  0x8C2B41A1797F15D1ull,
230
  0x4B3A639D83414E64ull,
231
  0x09CA82762AAB78F7ull,
232
  0x87E8C60FDED7CF9Dull,
233
  0xC51827E4773DF90Eull,
234
  0x020905D88D03A2BBull,
235
  0x40F9E43324E99428ull,
236
  0x2CFFE7D5975E55E2ull,
237
  0x6E0F063E3EB46371ull,
238
  0xA91E2402C48A38C4ull,
239
  0xEBEEC5E96D600E57ull,
240
  0x65CC8190991CB93Dull,
241
  0x273C607B30F68FAEull,
242
  0xE02D4247CAC8D41Bull,
243
  0xA2DDA3AC6322E288ull,
244
  0xBE992B5F8BDB8C5Cull,
245
  0xFC69CAB42231BACFull,
246
  0x3B78E888D80FE17Aull,
247
  0x7988096371E5D7E9ull,
248
  0xF7AA4D1A85996083ull,
249
  0xB55AACF12C735610ull,
250
  0x724B8ECDD64D0DA5ull,
251
  0x30BB6F267FA73B36ull,
252
  0x4AC29F2A07BFD00Dull,
253
  0x08327EC1AE55E69Eull,
254
  0xCF235CFD546BBD2Bull,
255
  0x8DD3BD16FD818BB8ull,
256
  0x03F1F96F09FD3CD2ull,
257
  0x41011884A0170A41ull,
258
  0x86103AB85A2951F4ull,
259
  0xC4E0DB53F3C36767ull,
260
  0xD8A453A01B3A09B3ull,
261
  0x9A54B24BB2D03F20ull,
262
  0x5D45907748EE6495ull,
263
  0x1FB5719CE1045206ull,
264
  0x919735E51578E56Cull,
265
  0xD367D40EBC92D3FFull,
266
  0x1476F63246AC884Aull,
267
  0x568617D9EF46BED9ull,
268
  0xE085162AB69D5E3Cull,
269
  0xA275F7C11F7768AFull,
270
  0x6564D5FDE549331Aull,
271
  0x279434164CA30589ull,
272
  0xA9B6706FB8DFB2E3ull,
273
  0xEB46918411358470ull,
274
  0x2C57B3B8EB0BDFC5ull,
275
  0x6EA7525342E1E956ull,
276
  0x72E3DAA0AA188782ull,
277
  0x30133B4B03F2B111ull,
278
  0xF7021977F9CCEAA4ull,
279
  0xB5F2F89C5026DC37ull,
280
  0x3BD0BCE5A45A6B5Dull,
281
  0x79205D0E0DB05DCEull,
282
  0xBE317F32F78E067Bull,
283
  0xFCC19ED95E6430E8ull,
284
  0x86B86ED5267CDBD3ull,
285
  0xC4488F3E8F96ED40ull,
286
  0x0359AD0275A8B6F5ull,
287
  0x41A94CE9DC428066ull,
288
  0xCF8B0890283E370Cull,
289
  0x8D7BE97B81D4019Full,
290
  0x4A6ACB477BEA5A2Aull,
291
  0x089A2AACD2006CB9ull,
292
  0x14DEA25F3AF9026Dull,
293
  0x562E43B4931334FEull,
294
  0x913F6188692D6F4Bull,
295
  0xD3CF8063C0C759D8ull,
296
  0x5DEDC41A34BBEEB2ull,
297
  0x1F1D25F19D51D821ull,
298
  0xD80C07CD676F8394ull,
299
  0x9AFCE626CE85B507ull
300
};
301
302
303
/*
304
 * uint64_t crc_64_ecma( const unsigned char *input_str, size_t num_bytes );
305
 *
306
 * The function crc_64_ecma() calculates in one pass the ECMA 64 bit CRC value
307
 * for a byte string that is passed to the function together with a parameter
308
 * indicating the length.
309
 */
310
311
0
uint64_t ul_crc64_ecma( const unsigned char *input_str, size_t num_bytes ) {
312
313
0
  uint64_t crc;
314
0
  const unsigned char *ptr;
315
0
  size_t a;
316
317
0
  crc = CRC_START_64_ECMA;
318
0
  ptr = input_str;
319
320
0
  if ( ptr != NULL ) for (a=0; a<num_bytes; a++) {
321
322
0
    crc = (crc << 8) ^ crc_tab64[ ((crc >> 56) ^ (uint64_t) *ptr++) & 0x00000000000000FFull ];
323
0
  }
324
325
0
  return crc;
326
327
0
}  /* crc_64_ecma */
328
329
/*
330
 * uint64_t ul_crc64_we( const unsigned char *input_str, size_t num_bytes );
331
 *
332
 * The function crc_64_we() calculates in one pass the CRC64-WE 64 bit CRC
333
 * value for a byte string that is passed to the function together with a
334
 * parameter indicating the length.
335
 */
336
337
71
uint64_t ul_crc64_we( const unsigned char *input_str, size_t num_bytes ) {
338
339
71
  uint64_t crc;
340
71
  const unsigned char *ptr;
341
71
  size_t a;
342
343
71
  crc = CRC_START_64_WE;
344
71
  ptr = input_str;
345
346
412k
  if ( ptr != NULL ) for (a=0; a<num_bytes; a++) {
347
348
412k
    crc = (crc << 8) ^ crc_tab64[ ((crc >> 56) ^ (uint64_t) *ptr++) & 0x00000000000000FFull ];
349
412k
  }
350
351
71
  return crc ^ 0xFFFFFFFFFFFFFFFFull;
352
353
71
}  /* crc_64_we */
354
355
/*
356
 * uint64_t ul_update_crc64( uint64_t crc, unsigned char c );
357
 *
358
 * The function update_crc_64() calculates a new CRC-64 value based on the
359
 * previous value of the CRC and the next byte of the data to be checked.
360
 */
361
362
0
uint64_t ul_update_crc64( uint64_t crc, unsigned char c ) {
363
364
0
  return (crc << 8) ^ crc_tab64[ ((crc >> 56) ^ (uint64_t) c) & 0x00000000000000FFull ];
365
366
0
}  /* update_crc_64 */