Safe API Framework 0.1.0 build 384e6ae
Layered API framework for safety-related applications (ERTMS RBC reference targeting CENELEC EN 50128 SIL 4)
Loading...
Searching...
No Matches
rte_checksum.c
Go to the documentation of this file.
1
62
63#include <string.h>
66
67/* ============================================================================
68 * CRC-64 Lookup Tables (Pre-computed)
69 * ========================================================================== */
70
79static const uint64_t g_crc64_ertms_table[256] = {
80 0x0000000000000000ULL, 0x0B2CAB2AF58BDC79ULL, 0x16595655EB17B8F2ULL,
81 0x1D75FD7F1E9C648BULL, 0x162C6BDB0AAEBB67ULL, 0x1D00C0F1FF25671EULL,
82 0x00753D8EE1B90395ULL, 0x0B5996A41432DFECULL, 0x16C610C6C9DCBC4DULL,
83 0x1DEABBEC3C576034ULL, 0x009F469322CB04BFULL, 0x0BB3EDB9D740D8C6ULL,
84 0x00EA7B1DC372072AULL, 0x0BC6D03736F9DB53ULL, 0x16B32D482865BFD8ULL,
85 0x1D9F8662DDEE63A1ULL, 0x1712E6FD4F38B219ULL, 0x1C3E4DD7BAB36E60ULL,
86 0x014BB0A8A42F0AEBULL, 0x0A671B8251A4D692ULL, 0x013E8D264596097EULL,
87 0x0A12260CB01DD507ULL, 0x1767DB73AE81B18CULL, 0x1C4B70595B0A6DF5ULL,
88 0x01D4F63B86E40E54ULL, 0x0AF85D11736FD22DULL, 0x178DA06E6DF3B6A6ULL,
89 0x1CA10B4498786ADFULL, 0x17F89DE08C4AB533ULL, 0x1CD436CA79C1694AULL,
90 0x01A1CBB5675D0DC1ULL, 0x0A8D609F92D6D1B8ULL, 0x14BB0A8A42F0AEB1ULL,
91 0x1F97A1A0B77B72C8ULL, 0x02E25CDFA9E71643ULL, 0x09CEF7F55C6CCA3AULL,
92 0x02976151485E15D6ULL, 0x09BBCA7BBDD5C9AFULL, 0x14CE3704A349AD24ULL,
93 0x1FE29C2E56C2715DULL, 0x027D1A4C8B2C12FCULL, 0x0951B1667EA7CE85ULL,
94 0x14244C19603BAA0EULL, 0x1F08E73395B07677ULL, 0x145171978182A99BULL,
95 0x1F7DDABD740975E2ULL, 0x020827C26A951169ULL, 0x09248CE89F1ECD10ULL,
96 0x03A9EC770DC81CA8ULL, 0x0885475DF843C0D1ULL, 0x15F0BA22E6DFA45AULL,
97 0x1EDC110813547823ULL, 0x158587AC0766A7CFULL, 0x1EA92C86F2ED7BB6ULL,
98 0x03DCD1F9EC711F3DULL, 0x08F07AD319FAC344ULL, 0x156FFCB1C414A0E5ULL,
99 0x1E43579B319F7C9CULL, 0x0336AAE42F031817ULL, 0x081A01CEDA88C46EULL,
100 0x0343976ACEBA1B82ULL, 0x086F3C403B31C7FBULL, 0x151AC13F25ADA370ULL,
101 0x1E366A15D0267F09ULL, 0x13E8D264596097E1ULL, 0x18C4794EACEB4B98ULL,
102 0x05B18431B2772F13ULL, 0x0E9D2F1B47FCF36AULL, 0x05C4B9BF53CE2C86ULL,
103 0x0EE81295A645F0FFULL, 0x139DEFEAB8D99474ULL, 0x18B144C04D52480DULL,
104 0x052EC2A290BC2BACULL, 0x0E0269886537F7D5ULL, 0x137794F77BAB935EULL,
105 0x185B3FDD8E204F27ULL, 0x1302A9799A1290CBULL, 0x182E02536F994CB2ULL,
106 0x055BFF2C71052839ULL, 0x0E775406848EF440ULL, 0x04FA3499165825F8ULL,
107 0x0FD69FB3E3D3F981ULL, 0x12A362CCFD4F9D0AULL, 0x198FC9E608C44173ULL,
108 0x12D65F421CF69E9FULL, 0x19FAF468E97D42E6ULL, 0x048F0917F7E1266DULL,
109 0x0FA3A23D026AFA14ULL, 0x123C245FDF8499B5ULL, 0x19108F752A0F45CCULL,
110 0x0465720A34932147ULL, 0x0F49D920C118FD3EULL, 0x04104F84D52A22D2ULL,
111 0x0F3CE4AE20A1FEABULL, 0x124919D13E3D9A20ULL, 0x1965B2FBCBB64659ULL,
112 0x0753D8EE1B903950ULL, 0x0C7F73C4EE1BE529ULL, 0x110A8EBBF08781A2ULL,
113 0x1A262591050C5DDBULL, 0x117FB335113E8237ULL, 0x1A53181FE4B55E4EULL,
114 0x0726E560FA293AC5ULL, 0x0C0A4E4A0FA2E6BCULL, 0x1195C828D24C851DULL,
115 0x1AB9630227C75964ULL, 0x07CC9E7D395B3DEFULL, 0x0CE03557CCD0E196ULL,
116 0x07B9A3F3D8E23E7AULL, 0x0C9508D92D69E203ULL, 0x11E0F5A633F58688ULL,
117 0x1ACC5E8CC67E5AF1ULL, 0x10413E1354A88B49ULL, 0x1B6D9539A1235730ULL,
118 0x06186846BFBF33BBULL, 0x0D34C36C4A34EFC2ULL, 0x066D55C85E06302EULL,
119 0x0D41FEE2AB8DEC57ULL, 0x1034039DB51188DCULL, 0x1B18A8B7409A54A5ULL,
120 0x06872ED59D743704ULL, 0x0DAB85FF68FFEB7DULL, 0x10DE788076638FF6ULL,
121 0x1BF2D3AA83E8538FULL, 0x10AB450E97DA8C63ULL, 0x1B87EE246251501AULL,
122 0x06F2135B7CCD3491ULL, 0x0DDEB8718946E8E8ULL, 0x1D4F63B86E40E541ULL,
123 0x1663C8929BCB3938ULL, 0x0B1635ED85575DB3ULL, 0x003A9EC770DC81CAULL,
124 0x0B63086364EE5E26ULL, 0x004FA3499165825FULL, 0x1D3A5E368FF9E6D4ULL,
125 0x1616F51C7A723AADULL, 0x0B89737EA79C590CULL, 0x00A5D85452178575ULL,
126 0x1DD0252B4C8BE1FEULL, 0x16FC8E01B9003D87ULL, 0x1DA518A5AD32E26BULL,
127 0x1689B38F58B93E12ULL, 0x0BFC4EF046255A99ULL, 0x00D0E5DAB3AE86E0ULL,
128 0x0A5D854521785758ULL, 0x01712E6FD4F38B21ULL, 0x1C04D310CA6FEFAAULL,
129 0x1728783A3FE433D3ULL, 0x1C71EE9E2BD6EC3FULL, 0x175D45B4DE5D3046ULL,
130 0x0A28B8CBC0C154CDULL, 0x010413E1354A88B4ULL, 0x1C9B9583E8A4EB15ULL,
131 0x17B73EA91D2F376CULL, 0x0AC2C3D603B353E7ULL, 0x01EE68FCF6388F9EULL,
132 0x0AB7FE58E20A5072ULL, 0x019B557217818C0BULL, 0x1CEEA80D091DE880ULL,
133 0x17C20327FC9634F9ULL, 0x09F469322CB04BF0ULL, 0x02D8C218D93B9789ULL,
134 0x1FAD3F67C7A7F302ULL, 0x1481944D322C2F7BULL, 0x1FD802E9261EF097ULL,
135 0x14F4A9C3D3952CEEULL, 0x098154BCCD094865ULL, 0x02ADFF963882941CULL,
136 0x1F3279F4E56CF7BDULL, 0x141ED2DE10E72BC4ULL, 0x096B2FA10E7B4F4FULL,
137 0x0247848BFBF09336ULL, 0x091E122FEFC24CDAULL, 0x0232B9051A4990A3ULL,
138 0x1F47447A04D5F428ULL, 0x146BEF50F15E2851ULL, 0x1EE68FCF6388F9E9ULL,
139 0x15CA24E596032590ULL, 0x08BFD99A889F411BULL, 0x039372B07D149D62ULL,
140 0x08CAE4146926428EULL, 0x03E64F3E9CAD9EF7ULL, 0x1E93B2418231FA7CULL,
141 0x15BF196B77BA2605ULL, 0x08209F09AA5445A4ULL, 0x030C34235FDF99DDULL,
142 0x1E79C95C4143FD56ULL, 0x15556276B4C8212FULL, 0x1E0CF4D2A0FAFEC3ULL,
143 0x15205FF8557122BAULL, 0x0855A2874BED4631ULL, 0x037909ADBE669A48ULL,
144 0x0EA7B1DC372072A0ULL, 0x058B1AF6C2ABAED9ULL, 0x18FEE789DC37CA52ULL,
145 0x13D24CA329BC162BULL, 0x188BDA073D8EC9C7ULL, 0x13A7712DC80515BEULL,
146 0x0ED28C52D6997135ULL, 0x05FE27782312AD4CULL, 0x1861A11AFEFCCEEDULL,
147 0x134D0A300B771294ULL, 0x0E38F74F15EB761FULL, 0x05145C65E060AA66ULL,
148 0x0E4DCAC1F452758AULL, 0x056161EB01D9A9F3ULL, 0x18149C941F45CD78ULL,
149 0x133837BEEACE1101ULL, 0x19B557217818C0B9ULL, 0x1299FC0B8D931CC0ULL,
150 0x0FEC0174930F784BULL, 0x04C0AA5E6684A432ULL, 0x0F993CFA72B67BDEULL,
151 0x04B597D0873DA7A7ULL, 0x19C06AAF99A1C32CULL, 0x12ECC1856C2A1F55ULL,
152 0x0F7347E7B1C47CF4ULL, 0x045FECCD444FA08DULL, 0x192A11B25AD3C406ULL,
153 0x1206BA98AF58187FULL, 0x195F2C3CBB6AC793ULL, 0x127387164EE11BEAULL,
154 0x0F067A69507D7F61ULL, 0x042AD143A5F6A318ULL, 0x1A1CBB5675D0DC11ULL,
155 0x1130107C805B0068ULL, 0x0C45ED039EC764E3ULL, 0x076946296B4CB89AULL,
156 0x0C30D08D7F7E6776ULL, 0x071C7BA78AF5BB0FULL, 0x1A6986D89469DF84ULL,
157 0x11452DF261E203FDULL, 0x0CDAAB90BC0C605CULL, 0x07F600BA4987BC25ULL,
158 0x1A83FDC5571BD8AEULL, 0x11AF56EFA29004D7ULL, 0x1AF6C04BB6A2DB3BULL,
159 0x11DA6B6143290742ULL, 0x0CAF961E5DB563C9ULL, 0x07833D34A83EBFB0ULL,
160 0x0D0E5DAB3AE86E08ULL, 0x0622F681CF63B271ULL, 0x1B570BFED1FFD6FAULL,
161 0x107BA0D424740A83ULL, 0x1B2236703046D56FULL, 0x100E9D5AC5CD0916ULL,
162 0x0D7B6025DB516D9DULL, 0x0657CB0F2EDAB1E4ULL, 0x1BC84D6DF334D245ULL,
163 0x10E4E64706BF0E3CULL, 0x0D911B3818236AB7ULL, 0x06BDB012EDA8B6CEULL,
164 0x0DE426B6F99A6922ULL, 0x06C88D9C0C11B55BULL, 0x1BBD70E3128DD1D0ULL,
165 0x1091DBC9E7060DA9ULL
166};
167
178static const uint64_t g_crc64_iso_table[256] = {
179 0x0000000000000000ULL, 0x0000000000000007ULL, 0x000000000000000EULL,
180 0x0000000000000009ULL, 0x000000000000001CULL, 0x000000000000001BULL,
181 0x0000000000000012ULL, 0x0000000000000015ULL, 0x000000000000000FULL,
182 0x0000000000000008ULL, 0x0000000000000001ULL, 0x0000000000000006ULL,
183 0x0000000000000013ULL, 0x0000000000000014ULL, 0x000000000000001DULL,
184 0x000000000000001AULL, 0x000000000000001EULL, 0x0000000000000019ULL,
185 0x0000000000000010ULL, 0x0000000000000017ULL, 0x0000000000000002ULL,
186 0x0000000000000005ULL, 0x000000000000000CULL, 0x000000000000000BULL,
187 0x0000000000000011ULL, 0x0000000000000016ULL, 0x000000000000001FULL,
188 0x0000000000000018ULL, 0x000000000000000DULL, 0x000000000000000AULL,
189 0x0000000000000003ULL, 0x0000000000000004ULL, 0x000000000000000BULL,
190 0x000000000000000CULL, 0x0000000000000005ULL, 0x0000000000000002ULL,
191 0x0000000000000017ULL, 0x0000000000000010ULL, 0x0000000000000019ULL,
192 0x000000000000001EULL, 0x0000000000000004ULL, 0x0000000000000003ULL,
193 0x000000000000000AULL, 0x000000000000000DULL, 0x0000000000000018ULL,
194 0x000000000000001FULL, 0x0000000000000016ULL, 0x0000000000000011ULL,
195 0x0000000000000015ULL, 0x0000000000000012ULL, 0x000000000000001BULL,
196 0x000000000000001CULL, 0x0000000000000009ULL, 0x000000000000000EULL,
197 0x0000000000000007ULL, 0x0000000000000000ULL, 0x000000000000001AULL,
198 0x000000000000001DULL, 0x0000000000000014ULL, 0x0000000000000013ULL,
199 0x0000000000000006ULL, 0x0000000000000001ULL, 0x0000000000000008ULL,
200 0x000000000000000FULL, 0x0000000000000016ULL, 0x0000000000000011ULL,
201 0x0000000000000018ULL, 0x000000000000001FULL, 0x000000000000000AULL,
202 0x000000000000000DULL, 0x0000000000000004ULL, 0x0000000000000003ULL,
203 0x0000000000000019ULL, 0x000000000000001EULL, 0x0000000000000017ULL,
204 0x0000000000000010ULL, 0x0000000000000005ULL, 0x0000000000000002ULL,
205 0x000000000000000BULL, 0x000000000000000CULL, 0x0000000000000008ULL,
206 0x000000000000000FULL, 0x0000000000000006ULL, 0x0000000000000001ULL,
207 0x0000000000000014ULL, 0x0000000000000013ULL, 0x000000000000001AULL,
208 0x000000000000001DULL, 0x0000000000000007ULL, 0x0000000000000000ULL,
209 0x0000000000000009ULL, 0x000000000000000EULL, 0x000000000000001BULL,
210 0x000000000000001CULL, 0x0000000000000015ULL, 0x0000000000000012ULL,
211 0x000000000000001DULL, 0x000000000000001AULL, 0x0000000000000013ULL,
212 0x0000000000000014ULL, 0x0000000000000001ULL, 0x0000000000000006ULL,
213 0x000000000000000FULL, 0x0000000000000008ULL, 0x0000000000000012ULL,
214 0x0000000000000015ULL, 0x000000000000001CULL, 0x000000000000001BULL,
215 0x000000000000000EULL, 0x0000000000000009ULL, 0x0000000000000000ULL,
216 0x0000000000000007ULL, 0x0000000000000003ULL, 0x0000000000000004ULL,
217 0x000000000000000DULL, 0x000000000000000AULL, 0x000000000000001FULL,
218 0x0000000000000018ULL, 0x0000000000000011ULL, 0x0000000000000016ULL,
219 0x000000000000000CULL, 0x000000000000000BULL, 0x0000000000000002ULL,
220 0x0000000000000005ULL, 0x0000000000000010ULL, 0x0000000000000017ULL,
221 0x000000000000001EULL, 0x0000000000000019ULL, 0x000000000000001BULL,
222 0x000000000000001CULL, 0x0000000000000015ULL, 0x0000000000000012ULL,
223 0x0000000000000007ULL, 0x0000000000000000ULL, 0x0000000000000009ULL,
224 0x000000000000000EULL, 0x0000000000000014ULL, 0x0000000000000013ULL,
225 0x000000000000001AULL, 0x000000000000001DULL, 0x0000000000000008ULL,
226 0x000000000000000FULL, 0x0000000000000006ULL, 0x0000000000000001ULL,
227 0x0000000000000005ULL, 0x0000000000000002ULL, 0x000000000000000BULL,
228 0x000000000000000CULL, 0x0000000000000019ULL, 0x000000000000001EULL,
229 0x0000000000000017ULL, 0x0000000000000010ULL, 0x000000000000000AULL,
230 0x000000000000000DULL, 0x0000000000000004ULL, 0x0000000000000003ULL,
231 0x0000000000000016ULL, 0x0000000000000011ULL, 0x0000000000000018ULL,
232 0x000000000000001FULL, 0x0000000000000010ULL, 0x0000000000000017ULL,
233 0x000000000000001EULL, 0x0000000000000019ULL, 0x000000000000000CULL,
234 0x000000000000000BULL, 0x0000000000000002ULL, 0x0000000000000005ULL,
235 0x000000000000001FULL, 0x0000000000000018ULL, 0x0000000000000011ULL,
236 0x0000000000000016ULL, 0x0000000000000003ULL, 0x0000000000000004ULL,
237 0x000000000000000DULL, 0x000000000000000AULL, 0x000000000000000EULL,
238 0x0000000000000009ULL, 0x0000000000000000ULL, 0x0000000000000007ULL,
239 0x0000000000000012ULL, 0x0000000000000015ULL, 0x000000000000001CULL,
240 0x000000000000001BULL, 0x0000000000000001ULL, 0x0000000000000006ULL,
241 0x000000000000000FULL, 0x0000000000000008ULL, 0x000000000000001DULL,
242 0x000000000000001AULL, 0x0000000000000013ULL, 0x0000000000000014ULL,
243 0x000000000000000DULL, 0x000000000000000AULL, 0x0000000000000003ULL,
244 0x0000000000000004ULL, 0x0000000000000011ULL, 0x0000000000000016ULL,
245 0x000000000000001FULL, 0x0000000000000018ULL, 0x0000000000000002ULL,
246 0x0000000000000005ULL, 0x000000000000000CULL, 0x000000000000000BULL,
247 0x000000000000001EULL, 0x0000000000000019ULL, 0x0000000000000010ULL,
248 0x0000000000000017ULL, 0x0000000000000013ULL, 0x0000000000000014ULL,
249 0x000000000000001DULL, 0x000000000000001AULL, 0x000000000000000FULL,
250 0x0000000000000008ULL, 0x0000000000000001ULL, 0x0000000000000006ULL,
251 0x000000000000001CULL, 0x000000000000001BULL, 0x0000000000000012ULL,
252 0x0000000000000015ULL, 0x0000000000000000ULL, 0x0000000000000007ULL,
253 0x000000000000000EULL, 0x0000000000000009ULL, 0x0000000000000006ULL,
254 0x0000000000000001ULL, 0x0000000000000008ULL, 0x000000000000000FULL,
255 0x000000000000001AULL, 0x000000000000001DULL, 0x0000000000000014ULL,
256 0x0000000000000013ULL, 0x0000000000000009ULL, 0x000000000000000EULL,
257 0x0000000000000007ULL, 0x0000000000000000ULL, 0x0000000000000015ULL,
258 0x0000000000000012ULL, 0x000000000000001BULL, 0x000000000000001CULL,
259 0x0000000000000018ULL, 0x000000000000001FULL, 0x0000000000000016ULL,
260 0x0000000000000011ULL, 0x0000000000000004ULL, 0x0000000000000003ULL,
261 0x000000000000000AULL, 0x000000000000000DULL, 0x0000000000000017ULL,
262 0x0000000000000010ULL, 0x0000000000000019ULL, 0x000000000000001EULL,
263 0x000000000000000BULL, 0x000000000000000CULL, 0x0000000000000005ULL,
264 0x0000000000000002ULL
265};
266
275static const uint64_t g_crc64_xz_table[256] = {
276 0x0000000000000000ULL, 0x09A87409262A286DULL, 0x1350E8124C5450DAULL,
277 0x1AF89C1B6A7E78B7ULL, 0x0EFFCC19ED95E633ULL, 0x0757B810CBBFCE5EULL,
278 0x1DAF240BA1C1B6E9ULL, 0x1407500287EB9E84ULL, 0x1DFF9833DB2BCC66ULL,
279 0x1457EC3AFD01E40BULL, 0x0EAF7021977F9CBCULL, 0x07070428B155B4D1ULL,
280 0x1300542A36BE2A55ULL, 0x1AA8202310940238ULL, 0x0050BC387AEA7A8FULL,
281 0x09F8C8315CC052E2ULL, 0x13A12C5AC36ADF4BULL, 0x1A095853E540F726ULL,
282 0x00F1C4488F3E8F91ULL, 0x0959B041A914A7FCULL, 0x1D5EE0432EFF3978ULL,
283 0x14F6944A08D51115ULL, 0x0E0E085162AB69A2ULL, 0x07A67C58448141CFULL,
284 0x0E5EB4691841132DULL, 0x07F6C0603E6B3B40ULL, 0x1D0E5C7B541543F7ULL,
285 0x14A62872723F6B9AULL, 0x00A17870F5D4F51EULL, 0x09090C79D3FEDD73ULL,
286 0x13F19062B980A5C4ULL, 0x1A59E46B9FAA8DA9ULL, 0x0F1C4488F3E8F911ULL,
287 0x06B43081D5C2D17CULL, 0x1C4CAC9ABFBCA9CBULL, 0x15E4D893999681A6ULL,
288 0x01E388911E7D1F22ULL, 0x084BFC983857374FULL, 0x12B3608352294FF8ULL,
289 0x1B1B148A74036795ULL, 0x12E3DCBB28C33577ULL, 0x1B4BA8B20EE91D1AULL,
290 0x01B334A9649765ADULL, 0x081B40A042BD4DC0ULL, 0x1C1C10A2C556D344ULL,
291 0x15B464ABE37CFB29ULL, 0x0F4CF8B08902839EULL, 0x06E48CB9AF28ABF3ULL,
292 0x1CBD68D23082265AULL, 0x15151CDB16A80E37ULL, 0x0FED80C07CD67680ULL,
293 0x0645F4C95AFC5EEDULL, 0x1242A4CBDD17C069ULL, 0x1BEAD0C2FB3DE804ULL,
294 0x01124CD9914390B3ULL, 0x08BA38D0B769B8DEULL, 0x0142F0E1EBA9EA3CULL,
295 0x08EA84E8CD83C251ULL, 0x121218F3A7FDBAE6ULL, 0x1BBA6CFA81D7928BULL,
296 0x0FBD3CF8063C0C0FULL, 0x061548F120162462ULL, 0x1CEDD4EA4A685CD5ULL,
297 0x1545A0E36C4274B8ULL, 0x1E388911E7D1F222ULL, 0x1790FD18C1FBDA4FULL,
298 0x0D686103AB85A2F8ULL, 0x04C0150A8DAF8A95ULL, 0x10C745080A441411ULL,
299 0x196F31012C6E3C7CULL, 0x0397AD1A461044CBULL, 0x0A3FD913603A6CA6ULL,
300 0x03C711223CFA3E44ULL, 0x0A6F652B1AD01629ULL, 0x1097F93070AE6E9EULL,
301 0x193F8D39568446F3ULL, 0x0D38DD3BD16FD877ULL, 0x0490A932F745F01AULL,
302 0x1E6835299D3B88ADULL, 0x17C04120BB11A0C0ULL, 0x0D99A54B24BB2D69ULL,
303 0x0431D14202910504ULL, 0x1EC94D5968EF7DB3ULL, 0x176139504EC555DEULL,
304 0x03666952C92ECB5AULL, 0x0ACE1D5BEF04E337ULL, 0x10368140857A9B80ULL,
305 0x199EF549A350B3EDULL, 0x10663D78FF90E10FULL, 0x19CE4971D9BAC962ULL,
306 0x0336D56AB3C4B1D5ULL, 0x0A9EA16395EE99B8ULL, 0x1E99F1611205073CULL,
307 0x17318568342F2F51ULL, 0x0DC919735E5157E6ULL, 0x04616D7A787B7F8BULL,
308 0x1124CD9914390B33ULL, 0x188CB9903213235EULL, 0x0274258B586D5BE9ULL,
309 0x0BDC51827E477384ULL, 0x1FDB0180F9ACED00ULL, 0x16737589DF86C56DULL,
310 0x0C8BE992B5F8BDDAULL, 0x05239D9B93D295B7ULL, 0x0CDB55AACF12C755ULL,
311 0x057321A3E938EF38ULL, 0x1F8BBDB88346978FULL, 0x1623C9B1A56CBFE2ULL,
312 0x022499B322872166ULL, 0x0B8CEDBA04AD090BULL, 0x117471A16ED371BCULL,
313 0x18DC05A848F959D1ULL, 0x0285E1C3D753D478ULL, 0x0B2D95CAF179FC15ULL,
314 0x11D509D19B0784A2ULL, 0x187D7DD8BD2DACCFULL, 0x0C7A2DDA3AC6324BULL,
315 0x05D259D31CEC1A26ULL, 0x1F2AC5C876926291ULL, 0x1682B1C150B84AFCULL,
316 0x1F7A79F00C78181EULL, 0x16D20DF92A523073ULL, 0x0C2A91E2402C48C4ULL,
317 0x0582E5EB660660A9ULL, 0x1185B5E9E1EDFE2DULL, 0x182DC1E0C7C7D640ULL,
318 0x02D55DFBADB9AEF7ULL, 0x0B7D29F28B93869AULL, 0x142F0E1EBA9EA3C3ULL,
319 0x1D877A179CB48BAEULL, 0x077FE60CF6CAF319ULL, 0x0ED79205D0E0DB74ULL,
320 0x1AD0C207570B45F0ULL, 0x1378B60E71216D9DULL, 0x09802A151B5F152AULL,
321 0x00285E1C3D753D47ULL, 0x09D0962D61B56FA5ULL, 0x0078E224479F47C8ULL,
322 0x1A807E3F2DE13F7FULL, 0x13280A360BCB1712ULL, 0x072F5A348C208996ULL,
323 0x0E872E3DAA0AA1FBULL, 0x147FB226C074D94CULL, 0x1DD7C62FE65EF121ULL,
324 0x078E224479F47C88ULL, 0x0E26564D5FDE54E5ULL, 0x14DECA5635A02C52ULL,
325 0x1D76BE5F138A043FULL, 0x0971EE5D94619ABBULL, 0x00D99A54B24BB2D6ULL,
326 0x1A21064FD835CA61ULL, 0x13897246FE1FE20CULL, 0x1A71BA77A2DFB0EEULL,
327 0x13D9CE7E84F59883ULL, 0x09215265EE8BE034ULL, 0x0089266CC8A1C859ULL,
328 0x148E766E4F4A56DDULL, 0x1D26026769607EB0ULL, 0x07DE9E7C031E0607ULL,
329 0x0E76EA7525342E6AULL, 0x1B334A9649765AD2ULL, 0x129B3E9F6F5C72BFULL,
330 0x0863A28405220A08ULL, 0x01CBD68D23082265ULL, 0x15CC868FA4E3BCE1ULL,
331 0x1C64F28682C9948CULL, 0x069C6E9DE8B7EC3BULL, 0x0F341A94CE9DC456ULL,
332 0x06CCD2A5925D96B4ULL, 0x0F64A6ACB477BED9ULL, 0x159C3AB7DE09C66EULL,
333 0x1C344EBEF823EE03ULL, 0x08331EBC7FC87087ULL, 0x019B6AB559E258EAULL,
334 0x1B63F6AE339C205DULL, 0x12CB82A715B60830ULL, 0x089266CC8A1C8599ULL,
335 0x013A12C5AC36ADF4ULL, 0x1BC28EDEC648D543ULL, 0x126AFAD7E062FD2EULL,
336 0x066DAAD5678963AAULL, 0x0FC5DEDC41A34BC7ULL, 0x153D42C72BDD3370ULL,
337 0x1C9536CE0DF71B1DULL, 0x156DFEFF513749FFULL, 0x1CC58AF6771D6192ULL,
338 0x063D16ED1D631925ULL, 0x0F9562E43B493148ULL, 0x1B9232E6BCA2AFCCULL,
339 0x123A46EF9A8887A1ULL, 0x08C2DAF4F0F6FF16ULL, 0x016AAEFDD6DCD77BULL,
340 0x0A17870F5D4F51E1ULL, 0x03BFF3067B65798CULL, 0x19476F1D111B013BULL,
341 0x10EF1B1437312956ULL, 0x04E84B16B0DAB7D2ULL, 0x0D403F1F96F09FBFULL,
342 0x17B8A304FC8EE708ULL, 0x1E10D70DDAA4CF65ULL, 0x17E81F3C86649D87ULL,
343 0x1E406B35A04EB5EAULL, 0x04B8F72ECA30CD5DULL, 0x0D108327EC1AE530ULL,
344 0x1917D3256BF17BB4ULL, 0x10BFA72C4DDB53D9ULL, 0x0A473B3727A52B6EULL,
345 0x03EF4F3E018F0303ULL, 0x19B6AB559E258EAAULL, 0x101EDF5CB80FA6C7ULL,
346 0x0AE64347D271DE70ULL, 0x034E374EF45BF61DULL, 0x1749674C73B06899ULL,
347 0x1EE11345559A40F4ULL, 0x04198F5E3FE43843ULL, 0x0DB1FB5719CE102EULL,
348 0x04493366450E42CCULL, 0x0DE1476F63246AA1ULL, 0x1719DB74095A1216ULL,
349 0x1EB1AF7D2F703A7BULL, 0x0AB6FF7FA89BA4FFULL, 0x031E8B768EB18C92ULL,
350 0x19E6176DE4CFF425ULL, 0x104E6364C2E5DC48ULL, 0x050BC387AEA7A8F0ULL,
351 0x0CA3B78E888D809DULL, 0x165B2B95E2F3F82AULL, 0x1FF35F9CC4D9D047ULL,
352 0x0BF40F9E43324EC3ULL, 0x025C7B97651866AEULL, 0x18A4E78C0F661E19ULL,
353 0x110C9385294C3674ULL, 0x18F45BB4758C6496ULL, 0x115C2FBD53A64CFBULL,
354 0x0BA4B3A639D8344CULL, 0x020CC7AF1FF21C21ULL, 0x160B97AD981982A5ULL,
355 0x1FA3E3A4BE33AAC8ULL, 0x055B7FBFD44DD27FULL, 0x0CF30BB6F267FA12ULL,
356 0x16AAEFDD6DCD77BBULL, 0x1F029BD44BE75FD6ULL, 0x05FA07CF21992761ULL,
357 0x0C5273C607B30F0CULL, 0x185523C480589188ULL, 0x11FD57CDA672B9E5ULL,
358 0x0B05CBD6CC0CC152ULL, 0x02ADBFDFEA26E93FULL, 0x0B5577EEB6E6BBDDULL,
359 0x02FD03E790CC93B0ULL, 0x18059FFCFAB2EB07ULL, 0x11ADEBF5DC98C36AULL,
360 0x05AABBF75B735DEEULL, 0x0C02CFFE7D597583ULL, 0x16FA53E517270D34ULL,
361 0x1F5227EC310D2559ULL
362};
363
364/* ============================================================================
365 * Module State
366 * ========================================================================== */
367
377
380
381/* ============================================================================
382 * API: CRC-64 Computation
383 * ========================================================================== */
384
386{
387 /* Verify not already initialized */
390 }
391
392 /* Select appropriate lookup table */
393 switch (polynomial) {
394 case RTE_CRC64_ERTMS:
397 break;
398 case RTE_CRC64_ISO:
401 break;
402 case RTE_CRC64_XZ:
405 break;
406 default:
408 }
409
410 /* Initialize statistics */
413
414 return RTE_STATUS_OK;
415}
416
417rte_crc64_t rte_checksum_crc64(const uint8_t *data, size_t size)
418{
419 uint64_t crc = 0xFFFFFFFFFFFFFFFFULL; /* Initial value (all ones) */
420 size_t i;
421 uint8_t index;
422
423 /* Verify initialization */
425 return 0ULL;
426 }
427
428 /* Handle NULL data pointer */
429 if (data == NULL) {
430 if (size != 0U) {
431 return 0ULL;
432 }
433 return crc;
434 }
435
436 /* Defense-in-depth against corrupted static state (e.g. a single-event
437 * upset flipping g_checksum_manager.table without also flipping
438 * .initialized) rather than a reachable API path: every branch in
439 * rte_checksum_crc64_init() above sets .table and .initialized
440 * together, so .initialized == 1U already implies .table != NULL for
441 * any state this module's own code can produce - not coverable by a
442 * legitimate caller, and there is no public way to corrupt
443 * module-static state to hit it either. Kept rather than deleted:
444 * this guards a genuine hardware fault class relevant to SIL
445 * contexts, not merely a defensive habit. See docs/COVERAGE_REPORT.md
446 * for the accepted-exception rationale (this is the project's one
447 * documented gap against the 100% branch coverage target). */
448 if (g_checksum_manager.table == NULL) { /* GCOVR_EXCL_BR_LINE */
449 return 0ULL; /* GCOVR_EXCL_LINE - see rationale above */
450 }
451
452 /* Compute CRC using lookup table (O(1) per byte) */
453 for (i = 0U; i < size; i++) {
454 /* Extract lower 8 bits of CRC, XOR with next data byte */
455 index = (uint8_t)((crc ^ data[i]) & 0xFFU);
456
457 /* Right-shift CRC by 8 bits, XOR with table entry */
458 crc = (crc >> 8U) ^ g_checksum_manager.table[index];
459 }
460
461 /* Final XOR with all-ones */
462 crc ^= 0xFFFFFFFFFFFFFFFFULL;
463
464 /* Update statistics */
466
467 return crc;
468}
469
471 size_t size,
472 rte_crc64_t expected_crc,
473 rte_checksum_result_t *result_out)
474{
475 rte_status_t status;
476
477 /* Verify output buffer */
478 if (result_out == NULL) {
480 }
481
482 /* REQ-CHECKSUM-009 / REQ-CHECKSUM-004: before init the raw CRC is 0
483 * (REQ-CHECKSUM-002), which is not a valid checksum - never report a
484 * match against it. No stats counter is touched. */
486 result_out->computed = 0ULL;
487 result_out->expected = expected_crc;
488 result_out->match = 0U;
490 } else {
491 rte_crc64_t computed_crc;
492
493 /* Compute CRC */
494 computed_crc = rte_checksum_crc64(data, size);
495
496 /* Fill result structure */
497 result_out->computed = computed_crc;
498 result_out->expected = expected_crc;
499 result_out->match = (computed_crc == expected_crc) ? 1U : 0U;
500
501 /* Update statistics */
502 if (result_out->match != 0U) {
504 status = RTE_STATUS_OK;
505 } else {
508 }
509 }
510
511 return status;
512}
513
518
519/* ============================================================================
520 * API: Vital Channel Message Wrapper
521 * ========================================================================== */
522
524 rte_vital_message_t *msg_out,
525 uint32_t sender_id,
526 uint32_t sequence,
527 const uint8_t *payload,
528 size_t payload_size)
529{
530 rte_timestamp_ms_t now_ms = 0U;
532
533 /* Validate inputs */
534 if (msg_out == NULL) {
536 } else if (payload_size > 248U) {
539 } else if ((payload == NULL) && (payload_size != 0U)) {
541 } else if (g_checksum_manager.initialized == 0U) {
542 /* REQ-CHECKSUM-009: before init the message would carry
543 * crc64 == 0 (REQ-CHECKSUM-002), not a valid checksum - refuse
544 * before any write to msg_out. Checked after the parameter checks
545 * so the oversize counter above still increments for an oversize
546 * payload, as before. */
548 } else {
549 /* Fill message header */
550 msg_out->sequence_number = sequence;
551 msg_out->sender_id = sender_id;
552 /* Best-effort: if no timer OSAdapter is registered, rte_timer_now()
553 * returns RTE_STATUS_NOT_INITIALIZED and leaves now_ms at 0 -
554 * timestamp_ms is diagnostic only (see rte_clocksync.h's file-level
555 * note: never the basis of comparison correctness), so this is not
556 * treated as a hard failure of message creation. */
557 (void)rte_timer_now(&now_ms);
558 msg_out->timestamp_ms = (uint32_t)(now_ms & 0xFFFFFFFFULL);
559 msg_out->payload_size = (uint8_t)payload_size;
560 msg_out->padding = 0U;
561 msg_out->reserved = 0U;
562
563 /* Clear payload area */
564 memset(msg_out->payload, 0, sizeof(msg_out->payload));
565
566 /* Copy payload */
567 if ((payload != NULL) && (payload_size > 0U)) {
568 memcpy(msg_out->payload, payload, payload_size);
569 }
570
571 /* Compute CRC-64 over entire message (including payload, excluding CRC field) */
572 msg_out->crc64 = rte_checksum_crc64(
573 (const uint8_t *)msg_out,
574 sizeof(*msg_out) - sizeof(msg_out->crc64)
575 );
576 }
577
578 return status;
579}
580
582 const rte_vital_message_t *msg,
583 uint32_t expected_sequence,
584 uint8_t *payload_out,
585 size_t payload_max_size,
586 uint8_t *payload_size_out)
587{
588 rte_checksum_result_t check_result;
589 rte_status_t status;
590
591 /* Validate inputs */
592 if (msg == NULL) {
594 }
595
596 if (payload_out == NULL) {
598 }
599
600 if (payload_size_out == NULL) {
602 }
603
604 /* Check CRC-64 */
606 (const uint8_t *)msg,
607 sizeof(*msg) - sizeof(msg->crc64),
608 msg->crc64,
609 &check_result
610 );
611
612 /* REQ-CHECKSUM-006 / REQ-CHECKSUM-009: a CRC mismatch is
613 * RTE_STATUS_DATA_CORRUPTION; RTE_STATUS_NOT_INITIALIZED (the only other
614 * non-OK status crc64_verify() can return once the NULL check above
615 * passed) is forwarded unchanged so a caller can tell "corrupted" from
616 * "module never initialized". Neither writes payload_out /
617 * payload_size_out. */
618 if (status != RTE_STATUS_OK) {
619 return status;
620 }
621
622 /* Check sequence number continuity */
623 if (msg->sequence_number != expected_sequence) {
626 }
627
628 /* Validate payload size */
629 if (msg->payload_size > payload_max_size) {
632 }
633
634 /* Extract payload */
635 if (msg->payload_size > 0U) {
636 memcpy(payload_out, msg->payload, msg->payload_size);
637 }
638 *payload_size_out = msg->payload_size;
639
640 return RTE_STATUS_OK;
641}
642
643/* ============================================================================
644 * API: Statistics
645 * ========================================================================== */
646
648{
649 if (stats_out == NULL) {
651 }
652
653 *stats_out = g_checksum_manager.stats;
654 return RTE_STATUS_OK;
655}
656
uint64_t rte_crc64_t
CRC-64 checksum value (64-bit).
rte_crc64_polynomial_t rte_checksum_crc64_get_polynomial(void)
Get current CRC-64 polynomial in use.
rte_status_t rte_checksum_reset_stats(void)
Reset checksum statistics.
rte_status_t rte_checksum_vital_message_verify(const rte_vital_message_t *msg, uint32_t expected_sequence, uint8_t *payload_out, size_t payload_max_size, uint8_t *payload_size_out)
Verify vital channel message and extract payload.
rte_status_t rte_checksum_vital_message_create(rte_vital_message_t *msg_out, uint32_t sender_id, uint32_t sequence, const uint8_t *payload, size_t payload_size)
Create vital channel message with CRC.
rte_status_t rte_checksum_crc64_init(rte_crc64_polynomial_t polynomial)
Initialize CRC-64 lookup tables for chosen polynomial.
rte_crc64_t rte_checksum_crc64(const uint8_t *data, size_t size)
Compute CRC-64 for data buffer.
rte_crc64_polynomial_t
CRC-64 polynomial selection.
rte_status_t rte_checksum_crc64_verify(const uint8_t *data, size_t size, rte_crc64_t expected_crc, rte_checksum_result_t *result_out)
Verify CRC-64 of data against stored value.
rte_status_t rte_checksum_get_stats(rte_checksum_stats_t *stats_out)
Get checksum statistics.
@ RTE_CRC64_ISO
@ RTE_CRC64_XZ
@ RTE_CRC64_ERTMS
rte_status_t
Common result/status codes.
Definition rte_status.h:27
@ RTE_STATUS_OK
Definition rte_status.h:28
@ RTE_STATUS_ALREADY_INITIALIZED
Definition rte_status.h:31
@ RTE_STATUS_INVALID_PARAM
Definition rte_status.h:29
@ RTE_STATUS_DATA_CORRUPTION
Definition rte_status.h:37
@ RTE_STATUS_NOT_INITIALIZED
Definition rte_status.h:30
rte_status_t rte_timer_now(rte_timestamp_ms_t *out_now_ms)
Returns the current monotonic time base used by all timers.
Definition rte_timer.c:139
uint64_t rte_timestamp_ms_t
Definition rte_types.h:30
static const uint64_t g_crc64_ertms_table[256]
static const uint64_t g_crc64_iso_table[256]
static const uint64_t g_crc64_xz_table[256]
static rte_checksum_manager_t g_checksum_manager
Global checksum module state (single instance; no dynamic allocation).
Checksum and CRC utilities for data integrity in redundant systems.
OS Abstraction Layer - Timer service.
const uint64_t * table
rte_crc64_polynomial_t polynomial
rte_checksum_stats_t stats
Checksum result for validation.
Checksum statistics for monitoring.
uint32_t verification_failures
Vital channel message with integrated CRC-64.
uint8_t payload[248]