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