crc.pas 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867
  1. unit crc;
  2. {$mode objfpc}
  3. {
  4. crc32.c -- compute the CRC-32 of a data stream
  5. Copyright (C) 1995-1998 Mark Adler
  6. Pascal tranlastion
  7. Copyright (C) 1998 by Jacques Nomssi Nzali
  8. For conditions of distribution and use, see copyright notice in readme.txt
  9. crc64.c -- compute the CRC-64 of a data stream
  10. By David T. Jones ([email protected]) - September 28th 2002
  11. Pascal tranlastion
  12. Copyright (C) 2009 by Ivo Steinmann
  13. }
  14. {.$DEFINE DYNAMIC_CRC_TABLE}
  15. interface
  16. (******************************************************************************
  17. * CRC32
  18. ******************************************************************************)
  19. function crc32(crc: cardinal; buf: Pbyte; len: cardinal): cardinal;
  20. { Update a running crc with the bytes buf[0..len-1] and return the updated
  21. crc. If buf is NULL, this function returns the required initial value
  22. for the crc. Pre- and post-conditioning (one's complement) is performed
  23. within this function so it shouldn't be done by the application.
  24. Usage example:
  25. var
  26. crc : cardinal;
  27. begin
  28. crc := crc32(0, nil, 0);
  29. while (read_buffer(buffer, length) <> EOF) do
  30. crc := crc32(crc, buffer, length);
  31. if (crc <> original_crc) then error();
  32. end;
  33. }
  34. function get_crc32_table: Pcardinal; { can be used by asm versions of crc32() }
  35. function get_crc_table: Pcardinal; external name 'get_crc32_table';
  36. (******************************************************************************
  37. * CRC64
  38. ******************************************************************************)
  39. function crc64(crc: qword; buf: Pbyte; len: cardinal) : qword;
  40. function get_crc64_table: PQword; { can be used by asm versions of crc64() }
  41. (******************************************************************************
  42. * CRC128
  43. ******************************************************************************)
  44. type
  45. pu128 = ^u128;
  46. u128 = packed record
  47. case Integer of
  48. 0: (lo, hi: qword);
  49. 1: (guid: tguid);
  50. end;
  51. operator := (v: qword): u128; inline;
  52. operator = (a, b: u128): boolean; inline;
  53. operator xor (const a: u128; const b: u128): u128; inline;
  54. operator xor (const a: u128; const b: byte): u128; inline;
  55. operator shr (const a: u128; const b: byte): u128; inline;
  56. operator shl (const a: u128; const b: byte): u128; inline;
  57. operator and (const a: u128; const b: u128): u128; inline;
  58. operator and (const a: u128; const b: qword): qword; inline;
  59. function crc128(crc: u128; buf: Pbyte; len: cardinal) : u128;
  60. function get_crc128_table: pu128;
  61. implementation
  62. (******************************************************************************
  63. * CRC32
  64. ******************************************************************************)
  65. {$IFDEF DYNAMIC_CRC_TABLE}
  66. {local}
  67. const
  68. crc32_table_empty : boolean = TRUE;
  69. {local}
  70. var
  71. crc32_table : array[Byte] of Longword;
  72. {
  73. Generate a table for a byte-wise 32-bit CRC calculation on the polynomial:
  74. x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.
  75. Polynomials over GF(2) are represented in binary, one bit per coefficient,
  76. with the lowest powers in the most significant bit. Then adding polynomials
  77. is just exclusive-or, and multiplying a polynomial by x is a right shift by
  78. one. If we call the above polynomial p, and represent a byte as the
  79. polynomial q, also with the lowest power in the most significant bit (so the
  80. byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,
  81. where a mod b means the remainder after dividing a by b.
  82. This calculation is done using the shift-register method of multiplying and
  83. taking the remainder. The register is initialized to zero, and for each
  84. incoming bit, x^32 is added mod p to the register if the bit is a one (where
  85. x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by
  86. x (which is shifting right by one and adding x^32 mod p if the bit shifted
  87. out is a one). We start with the highest power (least significant bit) of
  88. q and repeat for all eight bits of q.
  89. The table is simply the CRC of all possible eight bit values. This is all
  90. the information needed to generate CRC's on data a byte at a time for all
  91. combinations of CRC register values and incoming bytes.
  92. }
  93. {local}
  94. procedure make_crc32_table;
  95. var
  96. c : cardinal;
  97. n,k : integer;
  98. poly : cardinal; { polynomial exclusive-or pattern }
  99. const
  100. { terms of polynomial defining this crc (except x^32): }
  101. p: array [0..13] of Byte = (0,1,2,4,5,7,8,10,11,12,16,22,23,26);
  102. begin
  103. { make exclusive-or pattern from polynomial ($EDB88320) }
  104. poly := longint(0);
  105. for n := 0 to (sizeof(p) div sizeof(Byte))-1 do
  106. poly := poly or (longint(1) shl (31 - p[n]));
  107. for n := 0 to 255 do
  108. begin
  109. c := cardinal(n);
  110. for k := 0 to 7 do
  111. begin
  112. if (c and 1) <> 0 then
  113. c := poly xor (c shr 1)
  114. else
  115. c := (c shr 1);
  116. end;
  117. crc32_table[n] := c;
  118. end;
  119. crc32_table_empty := FALSE;
  120. end;
  121. {$ELSE}
  122. { ========================================================================
  123. Table of CRC-32's of all single-byte values (made by make_crc32_table) }
  124. {local}
  125. const
  126. crc32_table : array[Byte] of cardinal = (
  127. $00000000, $77073096, $ee0e612c, $990951ba, $076dc419,
  128. $706af48f, $e963a535, $9e6495a3, $0edb8832, $79dcb8a4,
  129. $e0d5e91e, $97d2d988, $09b64c2b, $7eb17cbd, $e7b82d07,
  130. $90bf1d91, $1db71064, $6ab020f2, $f3b97148, $84be41de,
  131. $1adad47d, $6ddde4eb, $f4d4b551, $83d385c7, $136c9856,
  132. $646ba8c0, $fd62f97a, $8a65c9ec, $14015c4f, $63066cd9,
  133. $fa0f3d63, $8d080df5, $3b6e20c8, $4c69105e, $d56041e4,
  134. $a2677172, $3c03e4d1, $4b04d447, $d20d85fd, $a50ab56b,
  135. $35b5a8fa, $42b2986c, $dbbbc9d6, $acbcf940, $32d86ce3,
  136. $45df5c75, $dcd60dcf, $abd13d59, $26d930ac, $51de003a,
  137. $c8d75180, $bfd06116, $21b4f4b5, $56b3c423, $cfba9599,
  138. $b8bda50f, $2802b89e, $5f058808, $c60cd9b2, $b10be924,
  139. $2f6f7c87, $58684c11, $c1611dab, $b6662d3d, $76dc4190,
  140. $01db7106, $98d220bc, $efd5102a, $71b18589, $06b6b51f,
  141. $9fbfe4a5, $e8b8d433, $7807c9a2, $0f00f934, $9609a88e,
  142. $e10e9818, $7f6a0dbb, $086d3d2d, $91646c97, $e6635c01,
  143. $6b6b51f4, $1c6c6162, $856530d8, $f262004e, $6c0695ed,
  144. $1b01a57b, $8208f4c1, $f50fc457, $65b0d9c6, $12b7e950,
  145. $8bbeb8ea, $fcb9887c, $62dd1ddf, $15da2d49, $8cd37cf3,
  146. $fbd44c65, $4db26158, $3ab551ce, $a3bc0074, $d4bb30e2,
  147. $4adfa541, $3dd895d7, $a4d1c46d, $d3d6f4fb, $4369e96a,
  148. $346ed9fc, $ad678846, $da60b8d0, $44042d73, $33031de5,
  149. $aa0a4c5f, $dd0d7cc9, $5005713c, $270241aa, $be0b1010,
  150. $c90c2086, $5768b525, $206f85b3, $b966d409, $ce61e49f,
  151. $5edef90e, $29d9c998, $b0d09822, $c7d7a8b4, $59b33d17,
  152. $2eb40d81, $b7bd5c3b, $c0ba6cad, $edb88320, $9abfb3b6,
  153. $03b6e20c, $74b1d29a, $ead54739, $9dd277af, $04db2615,
  154. $73dc1683, $e3630b12, $94643b84, $0d6d6a3e, $7a6a5aa8,
  155. $e40ecf0b, $9309ff9d, $0a00ae27, $7d079eb1, $f00f9344,
  156. $8708a3d2, $1e01f268, $6906c2fe, $f762575d, $806567cb,
  157. $196c3671, $6e6b06e7, $fed41b76, $89d32be0, $10da7a5a,
  158. $67dd4acc, $f9b9df6f, $8ebeeff9, $17b7be43, $60b08ed5,
  159. $d6d6a3e8, $a1d1937e, $38d8c2c4, $4fdff252, $d1bb67f1,
  160. $a6bc5767, $3fb506dd, $48b2364b, $d80d2bda, $af0a1b4c,
  161. $36034af6, $41047a60, $df60efc3, $a867df55, $316e8eef,
  162. $4669be79, $cb61b38c, $bc66831a, $256fd2a0, $5268e236,
  163. $cc0c7795, $bb0b4703, $220216b9, $5505262f, $c5ba3bbe,
  164. $b2bd0b28, $2bb45a92, $5cb36a04, $c2d7ffa7, $b5d0cf31,
  165. $2cd99e8b, $5bdeae1d, $9b64c2b0, $ec63f226, $756aa39c,
  166. $026d930a, $9c0906a9, $eb0e363f, $72076785, $05005713,
  167. $95bf4a82, $e2b87a14, $7bb12bae, $0cb61b38, $92d28e9b,
  168. $e5d5be0d, $7cdcefb7, $0bdbdf21, $86d3d2d4, $f1d4e242,
  169. $68ddb3f8, $1fda836e, $81be16cd, $f6b9265b, $6fb077e1,
  170. $18b74777, $88085ae6, $ff0f6a70, $66063bca, $11010b5c,
  171. $8f659eff, $f862ae69, $616bffd3, $166ccf45, $a00ae278,
  172. $d70dd2ee, $4e048354, $3903b3c2, $a7672661, $d06016f7,
  173. $4969474d, $3e6e77db, $aed16a4a, $d9d65adc, $40df0b66,
  174. $37d83bf0, $a9bcae53, $debb9ec5, $47b2cf7f, $30b5ffe9,
  175. $bdbdf21c, $cabac28a, $53b39330, $24b4a3a6, $bad03605,
  176. $cdd70693, $54de5729, $23d967bf, $b3667a2e, $c4614ab8,
  177. $5d681b02, $2a6f2b94, $b40bbe37, $c30c8ea1, $5a05df1b,
  178. $2d02ef8d);
  179. {$ENDIF}
  180. { =========================================================================
  181. This function can be used by asm versions of crc32() }
  182. function get_crc32_table : {const} Pcardinal; [public,alias:'get_crc32_table'];
  183. begin
  184. {$ifdef DYNAMIC_CRC_TABLE}
  185. if (crc32_table_empty) then
  186. make_crc32_table;
  187. {$endif}
  188. get_crc32_table := {const} Pcardinal(@crc32_table);
  189. end;
  190. { ========================================================================= }
  191. function crc32 (crc : cardinal; buf : Pbyte; len : cardinal): cardinal;
  192. begin
  193. if buf = nil then
  194. exit(0);
  195. {$IFDEF DYNAMIC_CRC_TABLE}
  196. if crc32_table_empty then
  197. make_crc32_table;
  198. {$ENDIF}
  199. crc := crc xor $FFFFFFFF;
  200. while (len >= 8) do
  201. begin
  202. crc := crc32_table[(crc xor buf^) and $ff] xor (crc shr 8);
  203. inc(buf);
  204. crc := crc32_table[(crc xor buf^) and $ff] xor (crc shr 8);
  205. inc(buf);
  206. crc := crc32_table[(crc xor buf^) and $ff] xor (crc shr 8);
  207. inc(buf);
  208. crc := crc32_table[(crc xor buf^) and $ff] xor (crc shr 8);
  209. inc(buf);
  210. crc := crc32_table[(crc xor buf^) and $ff] xor (crc shr 8);
  211. inc(buf);
  212. crc := crc32_table[(crc xor buf^) and $ff] xor (crc shr 8);
  213. inc(buf);
  214. crc := crc32_table[(crc xor buf^) and $ff] xor (crc shr 8);
  215. inc(buf);
  216. crc := crc32_table[(crc xor buf^) and $ff] xor (crc shr 8);
  217. inc(buf);
  218. dec(len, 8);
  219. end;
  220. while (len > 0) do
  221. begin
  222. crc := crc32_table[(crc xor buf^) and $ff] xor (crc shr 8);
  223. inc(buf);
  224. dec(len);
  225. end;
  226. result := crc xor $FFFFFFFF;
  227. end;
  228. (******************************************************************************
  229. * CRC64
  230. ******************************************************************************)
  231. const
  232. POLY64REV = QWord($95AC9329AC4BC9B5);
  233. INITIALCRC64 = QWord($FFFFFFFFFFFFFFFF);
  234. {$IFDEF DYNAMIC_CRC_TABLE}
  235. {local}
  236. const
  237. crc64_table_empty : boolean = TRUE;
  238. {local}
  239. var
  240. crc64_table : array[Byte] of QWord;
  241. {local}
  242. procedure make_crc64_table;
  243. var
  244. i,j: Integer;
  245. part: QWord;
  246. begin
  247. for i := 0 to 255 do
  248. begin
  249. part := i;
  250. for j := 0 to 7 do
  251. begin
  252. if part and $1 <> 0 then
  253. part := (part shr 1) xor POLY64REV
  254. else
  255. part := part shr 1;
  256. end;
  257. crc64_table[i] := part;
  258. end;
  259. crc64_table_empty := FALSE;
  260. end;
  261. {$ELSE}
  262. { ========================================================================
  263. Table of CRC-64's of all single-byte values (made by make_crc64_table) }
  264. {$push}
  265. {$r-}
  266. {$warnings off}
  267. {local}
  268. const
  269. crc64_table : array[Byte] of QWord = (
  270. $0000000000000000,$7AD870C830358979,$F5B0E190606B12F2,$8F689158505E9B8B,$C038E5739841B68F,$BAE095BBA8743FF6,
  271. $358804E3F82AA47D,$4F50742BC81F2D04,$AB28ECB46814FE75,$D1F09C7C5821770C,$5E980D24087FEC87,$24407DEC384A65FE,
  272. $6B1009C7F05548FA,$11C8790FC060C183,$9EA0E857903E5A08,$E478989FA00BD371,$7D08FF3B88BE6F81,$07D08FF3B88BE6F8,
  273. $88B81EABE8D57D73,$F2606E63D8E0F40A,$BD301A4810FFD90E,$C7E86A8020CA5077,$4880FBD87094CBFC,$32588B1040A14285,
  274. $D620138FE0AA91F4,$ACF86347D09F188D,$2390F21F80C18306,$594882D7B0F40A7F,$1618F6FC78EB277B,$6CC0863448DEAE02,
  275. $E3A8176C18803589,$997067A428B5BCF0,$FA11FE77117CDF02,$80C98EBF2149567B,$0FA11FE77117CDF0,$75796F2F41224489,
  276. $3A291B04893D698D,$40F16BCCB908E0F4,$CF99FA94E9567B7F,$B5418A5CD963F206,$513912C379682177,$2BE1620B495DA80E,
  277. $A489F35319033385,$DE51839B2936BAFC,$9101F7B0E12997F8,$EBD98778D11C1E81,$64B116208142850A,$1E6966E8B1770C73,
  278. $8719014C99C2B083,$FDC17184A9F739FA,$72A9E0DCF9A9A271,$08719014C99C2B08,$4721E43F0183060C,$3DF994F731B68F75,
  279. $B29105AF61E814FE,$C849756751DD9D87,$2C31EDF8F1D64EF6,$56E99D30C1E3C78F,$D9810C6891BD5C04,$A3597CA0A188D57D,
  280. $EC09088B6997F879,$96D1784359A27100,$19B9E91B09FCEA8B,$636199D339C963F2,$DF7ADABD7A6E2D6F,$A5A2AA754A5BA416,
  281. $2ACA3B2D1A053F9D,$50124BE52A30B6E4,$1F423FCEE22F9BE0,$659A4F06D21A1299,$EAF2DE5E82448912,$902AAE96B271006B,
  282. $74523609127AD31A,$0E8A46C1224F5A63,$81E2D7997211C1E8,$FB3AA75142244891,$B46AD37A8A3B6595,$CEB2A3B2BA0EECEC,
  283. $41DA32EAEA507767,$3B024222DA65FE1E,$A2722586F2D042EE,$D8AA554EC2E5CB97,$57C2C41692BB501C,$2D1AB4DEA28ED965,
  284. $624AC0F56A91F461,$1892B03D5AA47D18,$97FA21650AFAE693,$ED2251AD3ACF6FEA,$095AC9329AC4BC9B,$7382B9FAAAF135E2,
  285. $FCEA28A2FAAFAE69,$8632586ACA9A2710,$C9622C4102850A14,$B3BA5C8932B0836D,$3CD2CDD162EE18E6,$460ABD1952DB919F,
  286. $256B24CA6B12F26D,$5FB354025B277B14,$D0DBC55A0B79E09F,$AA03B5923B4C69E6,$E553C1B9F35344E2,$9F8BB171C366CD9B,
  287. $10E3202993385610,$6A3B50E1A30DDF69,$8E43C87E03060C18,$F49BB8B633338561,$7BF329EE636D1EEA,$012B592653589793,
  288. $4E7B2D0D9B47BA97,$34A35DC5AB7233EE,$BBCBCC9DFB2CA865,$C113BC55CB19211C,$5863DBF1E3AC9DEC,$22BBAB39D3991495,
  289. $ADD33A6183C78F1E,$D70B4AA9B3F20667,$985B3E827BED2B63,$E2834E4A4BD8A21A,$6DEBDF121B863991,$1733AFDA2BB3B0E8,
  290. $F34B37458BB86399,$8993478DBB8DEAE0,$06FBD6D5EBD3716B,$7C23A61DDBE6F812,$3373D23613F9D516,$49ABA2FE23CC5C6F,
  291. $C6C333A67392C7E4,$BC1B436E43A74E9D,$95AC9329AC4BC9B5,$EF74E3E19C7E40CC,$601C72B9CC20DB47,$1AC40271FC15523E,
  292. $5594765A340A7F3A,$2F4C0692043FF643,$A02497CA54616DC8,$DAFCE7026454E4B1,$3E847F9DC45F37C0,$445C0F55F46ABEB9,
  293. $CB349E0DA4342532,$B1ECEEC59401AC4B,$FEBC9AEE5C1E814F,$8464EA266C2B0836,$0B0C7B7E3C7593BD,$71D40BB60C401AC4,
  294. $E8A46C1224F5A634,$927C1CDA14C02F4D,$1D148D82449EB4C6,$67CCFD4A74AB3DBF,$289C8961BCB410BB,$5244F9A98C8199C2,
  295. $DD2C68F1DCDF0249,$A7F41839ECEA8B30,$438C80A64CE15841,$3954F06E7CD4D138,$B63C61362C8A4AB3,$CCE411FE1CBFC3CA,
  296. $83B465D5D4A0EECE,$F96C151DE49567B7,$76048445B4CBFC3C,$0CDCF48D84FE7545,$6FBD6D5EBD3716B7,$15651D968D029FCE,
  297. $9A0D8CCEDD5C0445,$E0D5FC06ED698D3C,$AF85882D2576A038,$D55DF8E515432941,$5A3569BD451DB2CA,$20ED197575283BB3,
  298. $C49581EAD523E8C2,$BE4DF122E51661BB,$3125607AB548FA30,$4BFD10B2857D7349,$04AD64994D625E4D,$7E7514517D57D734,
  299. $F11D85092D094CBF,$8BC5F5C11D3CC5C6,$12B5926535897936,$686DE2AD05BCF04F,$E70573F555E26BC4,$9DDD033D65D7E2BD,
  300. $D28D7716ADC8CFB9,$A85507DE9DFD46C0,$273D9686CDA3DD4B,$5DE5E64EFD965432,$B99D7ED15D9D8743,$C3450E196DA80E3A,
  301. $4C2D9F413DF695B1,$36F5EF890DC31CC8,$79A59BA2C5DC31CC,$037DEB6AF5E9B8B5,$8C157A32A5B7233E,$F6CD0AFA9582AA47,
  302. $4AD64994D625E4DA,$300E395CE6106DA3,$BF66A804B64EF628,$C5BED8CC867B7F51,$8AEEACE74E645255,$F036DC2F7E51DB2C,
  303. $7F5E4D772E0F40A7,$05863DBF1E3AC9DE,$E1FEA520BE311AAF,$9B26D5E88E0493D6,$144E44B0DE5A085D,$6E963478EE6F8124,
  304. $21C640532670AC20,$5B1E309B16452559,$D476A1C3461BBED2,$AEAED10B762E37AB,$37DEB6AF5E9B8B5B,$4D06C6676EAE0222,
  305. $C26E573F3EF099A9,$B8B627F70EC510D0,$F7E653DCC6DA3DD4,$8D3E2314F6EFB4AD,$0256B24CA6B12F26,$788EC2849684A65F,
  306. $9CF65A1B368F752E,$E62E2AD306BAFC57,$6946BB8B56E467DC,$139ECB4366D1EEA5,$5CCEBF68AECEC3A1,$2616CFA09EFB4AD8,
  307. $A97E5EF8CEA5D153,$D3A62E30FE90582A,$B0C7B7E3C7593BD8,$CA1FC72BF76CB2A1,$45775673A732292A,$3FAF26BB9707A053,
  308. $70FF52905F188D57,$0A2722586F2D042E,$854FB3003F739FA5,$FF97C3C80F4616DC,$1BEF5B57AF4DC5AD,$61372B9F9F784CD4,
  309. $EE5FBAC7CF26D75F,$9487CA0FFF135E26,$DBD7BE24370C7322,$A10FCEEC0739FA5B,$2E675FB4576761D0,$54BF2F7C6752E8A9,
  310. $CDCF48D84FE75459,$B71738107FD2DD20,$387FA9482F8C46AB,$42A7D9801FB9CFD2,$0DF7ADABD7A6E2D6,$772FDD63E7936BAF,
  311. $F8474C3BB7CDF024,$829F3CF387F8795D,$66E7A46C27F3AA2C,$1C3FD4A417C62355,$935745FC4798B8DE,$E98F353477AD31A7,
  312. $A6DF411FBFB21CA3,$DC0731D78F8795DA,$536FA08FDFD90E51,$29B7D047EFEC8728
  313. );
  314. {$pop}
  315. {$ENDIF}
  316. function get_crc64_table : {const} PQWord;
  317. begin
  318. {$ifdef DYNAMIC_CRC_TABLE}
  319. if (crc64_table_empty) then
  320. make_crc64_table;
  321. {$endif}
  322. get_crc64_table := {const} PQWord(@crc64_table);
  323. end;
  324. {void crc64(char *seq, char *res)
  325. int i, j, low, high;
  326. unsigned long long crc = INITIALCRC64, part;
  327. static int init = 0;
  328. static unsigned long long CRCTable[256];
  329. while (*seq)
  330. crc = CRCTable[(crc ^ *seq++) & 0xff] ^ (crc >> 8);
  331. /*
  332. The output is done in two parts to avoid problems with
  333. architecture-dependent word order
  334. */
  335. low = crc & 0xffffffff;
  336. high = (crc >> 32) & 0xffffffff;
  337. sprintf (res, "%08X%08X", high, low);
  338. return;
  339. }
  340. function crc64(crc: qword; buf: Pbyte; len: cardinal): qword;
  341. begin
  342. if (buf = nil) then
  343. exit(INITIALCRC64);
  344. {$IFDEF DYNAMIC_CRC_TABLE}
  345. if crc64_table_empty then
  346. make_crc64_table;
  347. {$ENDIF}
  348. while (len >= 8) do
  349. begin
  350. crc := crc64_table[(crc xor buf^) and $ff] xor (crc shr 8);
  351. inc(buf);
  352. crc := crc64_table[(crc xor buf^) and $ff] xor (crc shr 8);
  353. inc(buf);
  354. crc := crc64_table[(crc xor buf^) and $ff] xor (crc shr 8);
  355. inc(buf);
  356. crc := crc64_table[(crc xor buf^) and $ff] xor (crc shr 8);
  357. inc(buf);
  358. crc := crc64_table[(crc xor buf^) and $ff] xor (crc shr 8);
  359. inc(buf);
  360. crc := crc64_table[(crc xor buf^) and $ff] xor (crc shr 8);
  361. inc(buf);
  362. crc := crc64_table[(crc xor buf^) and $ff] xor (crc shr 8);
  363. inc(buf);
  364. crc := crc64_table[(crc xor buf^) and $ff] xor (crc shr 8);
  365. inc(buf);
  366. dec(len, 8);
  367. end;
  368. while (len > 0) do
  369. begin
  370. crc := crc64_table[(crc xor buf^) and $ff] xor (crc shr 8);
  371. inc(buf);
  372. dec(len);
  373. end;
  374. result := crc;
  375. end;
  376. (******************************************************************************
  377. * CRC128
  378. ******************************************************************************)
  379. {$push}
  380. {$r-}
  381. {$warnings off}
  382. const
  383. POLY128REV: u128 = (lo: $d5ca646569316db3; hi:$95AC9329AC4BC9B5);
  384. INITIALCRC128: u128 = (lo:$FFFFFFFFFFFFFFFF; hi:$FFFFFFFFFFFFFFFF);
  385. {$pop}
  386. operator := (v: qword): u128; inline;
  387. begin
  388. Result.lo := v;
  389. Result.hi := 0;
  390. end;
  391. operator = (a, b: u128): boolean; inline;
  392. begin
  393. Result := (a.lo=b.lo) and (a.hi=b.hi);
  394. end;
  395. operator xor (const a: u128; const b: u128): u128; inline;
  396. begin
  397. Result.lo := a.lo xor b.lo;
  398. Result.hi := a.hi xor b.hi;
  399. end;
  400. operator xor (const a: u128; const b: byte): u128; inline;
  401. begin
  402. Result.lo := a.lo xor b;
  403. Result.hi := a.hi xor 0;
  404. end;
  405. operator shr (const a: u128; const b: byte): u128; inline;
  406. begin
  407. Result.lo := (a.lo shr b) or (a.hi shl (64-b));
  408. Result.hi := a.hi shr b;
  409. end;
  410. operator shl (const a: u128; const b: byte): u128; inline;
  411. begin
  412. Result.lo := a.lo shl b;
  413. Result.hi := (a.hi shl b) or (a.lo shr (64-b));
  414. end;
  415. operator and (const a: u128; const b: u128): u128; inline;
  416. begin
  417. Result.lo := a.lo and b.lo;
  418. Result.hi := a.hi and b.hi;
  419. end;
  420. operator and (const a: u128; const b: qword): qword; inline;
  421. begin
  422. Result := a.lo and b;
  423. end;
  424. {$IFDEF DYNAMIC_CRC_TABLE}
  425. {local}
  426. const
  427. crc128_table_empty : boolean = TRUE;
  428. {local}
  429. var
  430. crc128_table : array[Byte] of u128;
  431. {local}
  432. procedure make_crc128_table;
  433. var
  434. i,j: Integer;
  435. part: u128;
  436. begin
  437. for i := 0 to 255 do
  438. begin
  439. part := i;
  440. for j := 0 to 7 do
  441. begin
  442. if part and $1 <> 0 then
  443. part := (part shr 1) xor POLY128REV
  444. else
  445. part := part shr 1;
  446. end;
  447. crc128_table[i] := part;
  448. end;
  449. crc128_table_empty := FALSE;
  450. end;
  451. {$ELSE}
  452. { ========================================================================
  453. Table of CRC-128's of all single-byte values (made by make_crc128_table) }
  454. {$push}
  455. {$r-}
  456. {$warnings off}
  457. {local}
  458. const
  459. crc128_table : array[Byte] of u128 = (
  460. (lo:$0000000000000000;hi:$0000000000000000),
  461. (lo:$2E6BCE8AFE8FC76C;hi:$3DF994F731B68F75),
  462. (lo:$5CD79D15FD1F8ED8;hi:$7BF329EE636D1EEA),
  463. (lo:$72BC539F039049B4;hi:$460ABD1952DB919F),
  464. (lo:$B9AF3A2BFA3F1DB0;hi:$F7E653DCC6DA3DD4),
  465. (lo:$97C4F4A104B0DADC;hi:$CA1FC72BF76CB2A1),
  466. (lo:$E578A73E07209368;hi:$8C157A32A5B7233E),
  467. (lo:$CB1369B4F9AF5404;hi:$B1ECEEC59401AC4B),
  468. (lo:$D8CABC9D261CE007;hi:$C49581EAD523E8C2),
  469. (lo:$F6A17217D893276B;hi:$F96C151DE49567B7),
  470. (lo:$841D2188DB036EDF;hi:$BF66A804B64EF628),
  471. (lo:$AA76EF02258CA9B3;hi:$829F3CF387F8795D),
  472. (lo:$616586B6DC23FDB7;hi:$3373D23613F9D516),
  473. (lo:$4F0E483C22AC3ADB;hi:$0E8A46C1224F5A63),
  474. (lo:$3DB21BA3213C736F;hi:$4880FBD87094CBFC),
  475. (lo:$13D9D529DFB3B403;hi:$75796F2F41224489),
  476. (lo:$1A01B1F09E5B1B69;hi:$A2722586F2D042EE),
  477. (lo:$346A7F7A60D4DC05;hi:$9F8BB171C366CD9B),
  478. (lo:$46D62CE5634495B1;hi:$D9810C6891BD5C04),
  479. (lo:$68BDE26F9DCB52DD;hi:$E478989FA00BD371),
  480. (lo:$A3AE8BDB646406D9;hi:$5594765A340A7F3A),
  481. (lo:$8DC545519AEBC1B5;hi:$686DE2AD05BCF04F),
  482. (lo:$FF7916CE997B8801;hi:$2E675FB4576761D0),
  483. (lo:$D112D84467F44F6D;hi:$139ECB4366D1EEA5),
  484. (lo:$C2CB0D6DB847FB6E;hi:$66E7A46C27F3AA2C),
  485. (lo:$ECA0C3E746C83C02;hi:$5B1E309B16452559),
  486. (lo:$9E1C9078455875B6;hi:$1D148D82449EB4C6),
  487. (lo:$B0775EF2BBD7B2DA;hi:$20ED197575283BB3),
  488. (lo:$7B6437464278E6DE;hi:$9101F7B0E12997F8),
  489. (lo:$550FF9CCBCF721B2;hi:$ACF86347D09F188D),
  490. (lo:$27B3AA53BF676806;hi:$EAF2DE5E82448912),
  491. (lo:$09D864D941E8AF6A;hi:$D70B4AA9B3F20667),
  492. (lo:$9F97AB2BEED4EDB5;hi:$6FBD6D5EBD3716B7),
  493. (lo:$B1FC65A1105B2AD9;hi:$5244F9A98C8199C2),
  494. (lo:$C340363E13CB636D;hi:$144E44B0DE5A085D),
  495. (lo:$ED2BF8B4ED44A401;hi:$29B7D047EFEC8728),
  496. (lo:$2638910014EBF005;hi:$985B3E827BED2B63),
  497. (lo:$08535F8AEA643769;hi:$A5A2AA754A5BA416),
  498. (lo:$7AEF0C15E9F47EDD;hi:$E3A8176C18803589),
  499. (lo:$5484C29F177BB9B1;hi:$DE51839B2936BAFC),
  500. (lo:$475D17B6C8C80DB2;hi:$AB28ECB46814FE75),
  501. (lo:$6936D93C3647CADE;hi:$96D1784359A27100),
  502. (lo:$1B8A8AA335D7836A;hi:$D0DBC55A0B79E09F),
  503. (lo:$35E14429CB584406;hi:$ED2251AD3ACF6FEA),
  504. (lo:$FEF22D9D32F71002;hi:$5CCEBF68AECEC3A1),
  505. (lo:$D099E317CC78D76E;hi:$61372B9F9F784CD4),
  506. (lo:$A225B088CFE89EDA;hi:$273D9686CDA3DD4B),
  507. (lo:$8C4E7E02316759B6;hi:$1AC40271FC15523E),
  508. (lo:$85961ADB708FF6DC;hi:$CDCF48D84FE75459),
  509. (lo:$ABFDD4518E0031B0;hi:$F036DC2F7E51DB2C),
  510. (lo:$D94187CE8D907804;hi:$B63C61362C8A4AB3),
  511. (lo:$F72A4944731FBF68;hi:$8BC5F5C11D3CC5C6),
  512. (lo:$3C3920F08AB0EB6C;hi:$3A291B04893D698D),
  513. (lo:$1252EE7A743F2C00;hi:$07D08FF3B88BE6F8),
  514. (lo:$60EEBDE577AF65B4;hi:$41DA32EAEA507767),
  515. (lo:$4E85736F8920A2D8;hi:$7C23A61DDBE6F812),
  516. (lo:$5D5CA646569316DB;hi:$095AC9329AC4BC9B),
  517. (lo:$733768CCA81CD1B7;hi:$34A35DC5AB7233EE),
  518. (lo:$018B3B53AB8C9803;hi:$72A9E0DCF9A9A271),
  519. (lo:$2FE0F5D955035F6F;hi:$4F50742BC81F2D04),
  520. (lo:$E4F39C6DACAC0B6B;hi:$FEBC9AEE5C1E814F),
  521. (lo:$CA9852E75223CC07;hi:$C3450E196DA80E3A),
  522. (lo:$B824017851B385B3;hi:$854FB3003F739FA5),
  523. (lo:$964FCFF2AF3C42DF;hi:$B8B627F70EC510D0),
  524. (lo:$3F2F5657DDA9DB6A;hi:$DF7ADABD7A6E2D6F),
  525. (lo:$114498DD23261C06;hi:$E2834E4A4BD8A21A),
  526. (lo:$63F8CB4220B655B2;hi:$A489F35319033385),
  527. (lo:$4D9305C8DE3992DE;hi:$997067A428B5BCF0),
  528. (lo:$86806C7C2796C6DA;hi:$289C8961BCB410BB),
  529. (lo:$A8EBA2F6D91901B6;hi:$15651D968D029FCE),
  530. (lo:$DA57F169DA894802;hi:$536FA08FDFD90E51),
  531. (lo:$F43C3FE324068F6E;hi:$6E963478EE6F8124),
  532. (lo:$E7E5EACAFBB53B6D;hi:$1BEF5B57AF4DC5AD),
  533. (lo:$C98E2440053AFC01;hi:$2616CFA09EFB4AD8),
  534. (lo:$BB3277DF06AAB5B5;hi:$601C72B9CC20DB47),
  535. (lo:$9559B955F82572D9;hi:$5DE5E64EFD965432),
  536. (lo:$5E4AD0E1018A26DD;hi:$EC09088B6997F879),
  537. (lo:$70211E6BFF05E1B1;hi:$D1F09C7C5821770C),
  538. (lo:$029D4DF4FC95A805;hi:$97FA21650AFAE693),
  539. (lo:$2CF6837E021A6F69;hi:$AA03B5923B4C69E6),
  540. (lo:$252EE7A743F2C003;hi:$7D08FF3B88BE6F81),
  541. (lo:$0B45292DBD7D076F;hi:$40F16BCCB908E0F4),
  542. (lo:$79F97AB2BEED4EDB;hi:$06FBD6D5EBD3716B),
  543. (lo:$5792B438406289B7;hi:$3B024222DA65FE1E),
  544. (lo:$9C81DD8CB9CDDDB3;hi:$8AEEACE74E645255),
  545. (lo:$B2EA130647421ADF;hi:$B71738107FD2DD20),
  546. (lo:$C056409944D2536B;hi:$F11D85092D094CBF),
  547. (lo:$EE3D8E13BA5D9407;hi:$CCE411FE1CBFC3CA),
  548. (lo:$FDE45B3A65EE2004;hi:$B99D7ED15D9D8743),
  549. (lo:$D38F95B09B61E768;hi:$8464EA266C2B0836),
  550. (lo:$A133C62F98F1AEDC;hi:$C26E573F3EF099A9),
  551. (lo:$8F5808A5667E69B0;hi:$FF97C3C80F4616DC),
  552. (lo:$444B61119FD13DB4;hi:$4E7B2D0D9B47BA97),
  553. (lo:$6A20AF9B615EFAD8;hi:$7382B9FAAAF135E2),
  554. (lo:$189CFC0462CEB36C;hi:$358804E3F82AA47D),
  555. (lo:$36F7328E9C417400;hi:$08719014C99C2B08),
  556. (lo:$A0B8FD7C337D36DF;hi:$B0C7B7E3C7593BD8),
  557. (lo:$8ED333F6CDF2F1B3;hi:$8D3E2314F6EFB4AD),
  558. (lo:$FC6F6069CE62B807;hi:$CB349E0DA4342532),
  559. (lo:$D204AEE330ED7F6B;hi:$F6CD0AFA9582AA47),
  560. (lo:$1917C757C9422B6F;hi:$4721E43F0183060C),
  561. (lo:$377C09DD37CDEC03;hi:$7AD870C830358979),
  562. (lo:$45C05A42345DA5B7;hi:$3CD2CDD162EE18E6),
  563. (lo:$6BAB94C8CAD262DB;hi:$012B592653589793),
  564. (lo:$787241E11561D6D8;hi:$74523609127AD31A),
  565. (lo:$56198F6BEBEE11B4;hi:$49ABA2FE23CC5C6F),
  566. (lo:$24A5DCF4E87E5800;hi:$0FA11FE77117CDF0),
  567. (lo:$0ACE127E16F19F6C;hi:$32588B1040A14285),
  568. (lo:$C1DD7BCAEF5ECB68;hi:$83B465D5D4A0EECE),
  569. (lo:$EFB6B54011D10C04;hi:$BE4DF122E51661BB),
  570. (lo:$9D0AE6DF124145B0;hi:$F8474C3BB7CDF024),
  571. (lo:$B3612855ECCE82DC;hi:$C5BED8CC867B7F51),
  572. (lo:$BAB94C8CAD262DB6;hi:$12B5926535897936),
  573. (lo:$94D2820653A9EADA;hi:$2F4C0692043FF643),
  574. (lo:$E66ED1995039A36E;hi:$6946BB8B56E467DC),
  575. (lo:$C8051F13AEB66402;hi:$54BF2F7C6752E8A9),
  576. (lo:$031676A757193006;hi:$E553C1B9F35344E2),
  577. (lo:$2D7DB82DA996F76A;hi:$D8AA554EC2E5CB97),
  578. (lo:$5FC1EBB2AA06BEDE;hi:$9EA0E857903E5A08),
  579. (lo:$71AA2538548979B2;hi:$A3597CA0A188D57D),
  580. (lo:$6273F0118B3ACDB1;hi:$D620138FE0AA91F4),
  581. (lo:$4C183E9B75B50ADD;hi:$EBD98778D11C1E81),
  582. (lo:$3EA46D0476254369;hi:$ADD33A6183C78F1E),
  583. (lo:$10CFA38E88AA8405;hi:$902AAE96B271006B),
  584. (lo:$DBDCCA3A7105D001;hi:$21C640532670AC20),
  585. (lo:$F5B704B08F8A176D;hi:$1C3FD4A417C62355),
  586. (lo:$870B572F8C1A5ED9;hi:$5A3569BD451DB2CA),
  587. (lo:$A96099A5729599B5;hi:$67CCFD4A74AB3DBF),
  588. (lo:$D5CA646569316DB3;hi:$95AC9329AC4BC9B5),
  589. (lo:$FBA1AAEF97BEAADF;hi:$A85507DE9DFD46C0),
  590. (lo:$891DF970942EE36B;hi:$EE5FBAC7CF26D75F),
  591. (lo:$A77637FA6AA12407;hi:$D3A62E30FE90582A),
  592. (lo:$6C655E4E930E7003;hi:$624AC0F56A91F461),
  593. (lo:$420E90C46D81B76F;hi:$5FB354025B277B14),
  594. (lo:$30B2C35B6E11FEDB;hi:$19B9E91B09FCEA8B),
  595. (lo:$1ED90DD1909E39B7;hi:$24407DEC384A65FE),
  596. (lo:$0D00D8F84F2D8DB4;hi:$513912C379682177),
  597. (lo:$236B1672B1A24AD8;hi:$6CC0863448DEAE02),
  598. (lo:$51D745EDB232036C;hi:$2ACA3B2D1A053F9D),
  599. (lo:$7FBC8B674CBDC400;hi:$1733AFDA2BB3B0E8),
  600. (lo:$B4AFE2D3B5129004;hi:$A6DF411FBFB21CA3),
  601. (lo:$9AC42C594B9D5768;hi:$9B26D5E88E0493D6),
  602. (lo:$E8787FC6480D1EDC;hi:$DD2C68F1DCDF0249),
  603. (lo:$C613B14CB682D9B0;hi:$E0D5FC06ED698D3C),
  604. (lo:$CFCBD595F76A76DA;hi:$37DEB6AF5E9B8B5B),
  605. (lo:$E1A01B1F09E5B1B6;hi:$0A2722586F2D042E),
  606. (lo:$931C48800A75F802;hi:$4C2D9F413DF695B1),
  607. (lo:$BD77860AF4FA3F6E;hi:$71D40BB60C401AC4),
  608. (lo:$7664EFBE0D556B6A;hi:$C038E5739841B68F),
  609. (lo:$580F2134F3DAAC06;hi:$FDC17184A9F739FA),
  610. (lo:$2AB372ABF04AE5B2;hi:$BBCBCC9DFB2CA865),
  611. (lo:$04D8BC210EC522DE;hi:$8632586ACA9A2710),
  612. (lo:$17016908D17696DD;hi:$F34B37458BB86399),
  613. (lo:$396AA7822FF951B1;hi:$CEB2A3B2BA0EECEC),
  614. (lo:$4BD6F41D2C691805;hi:$88B81EABE8D57D73),
  615. (lo:$65BD3A97D2E6DF69;hi:$B5418A5CD963F206),
  616. (lo:$AEAE53232B498B6D;hi:$04AD64994D625E4D),
  617. (lo:$80C59DA9D5C64C01;hi:$3954F06E7CD4D138),
  618. (lo:$F279CE36D65605B5;hi:$7F5E4D772E0F40A7),
  619. (lo:$DC1200BC28D9C2D9;hi:$42A7D9801FB9CFD2),
  620. (lo:$4A5DCF4E87E58006;hi:$FA11FE77117CDF02),
  621. (lo:$643601C4796A476A;hi:$C7E86A8020CA5077),
  622. (lo:$168A525B7AFA0EDE;hi:$81E2D7997211C1E8),
  623. (lo:$38E19CD18475C9B2;hi:$BC1B436E43A74E9D),
  624. (lo:$F3F2F5657DDA9DB6;hi:$0DF7ADABD7A6E2D6),
  625. (lo:$DD993BEF83555ADA;hi:$300E395CE6106DA3),
  626. (lo:$AF25687080C5136E;hi:$76048445B4CBFC3C),
  627. (lo:$814EA6FA7E4AD402;hi:$4BFD10B2857D7349),
  628. (lo:$929773D3A1F96001;hi:$3E847F9DC45F37C0),
  629. (lo:$BCFCBD595F76A76D;hi:$037DEB6AF5E9B8B5),
  630. (lo:$CE40EEC65CE6EED9;hi:$45775673A732292A),
  631. (lo:$E02B204CA26929B5;hi:$788EC2849684A65F),
  632. (lo:$2B3849F85BC67DB1;hi:$C9622C4102850A14),
  633. (lo:$05538772A549BADD;hi:$F49BB8B633338561),
  634. (lo:$77EFD4EDA6D9F369;hi:$B29105AF61E814FE),
  635. (lo:$59841A6758563405;hi:$8F689158505E9B8B),
  636. (lo:$505C7EBE19BE9B6F;hi:$5863DBF1E3AC9DEC),
  637. (lo:$7E37B034E7315C03;hi:$659A4F06D21A1299),
  638. (lo:$0C8BE3ABE4A115B7;hi:$2390F21F80C18306),
  639. (lo:$22E02D211A2ED2DB;hi:$1E6966E8B1770C73),
  640. (lo:$E9F34495E38186DF;hi:$AF85882D2576A038),
  641. (lo:$C7988A1F1D0E41B3;hi:$927C1CDA14C02F4D),
  642. (lo:$B524D9801E9E0807;hi:$D476A1C3461BBED2),
  643. (lo:$9B4F170AE011CF6B;hi:$E98F353477AD31A7),
  644. (lo:$8896C2233FA27B68;hi:$9CF65A1B368F752E),
  645. (lo:$A6FD0CA9C12DBC04;hi:$A10FCEEC0739FA5B),
  646. (lo:$D4415F36C2BDF5B0;hi:$E70573F555E26BC4),
  647. (lo:$FA2A91BC3C3232DC;hi:$DAFCE7026454E4B1),
  648. (lo:$3139F808C59D66D8;hi:$6B1009C7F05548FA),
  649. (lo:$1F5236823B12A1B4;hi:$56E99D30C1E3C78F),
  650. (lo:$6DEE651D3882E800;hi:$10E3202993385610),
  651. (lo:$4385AB97C60D2F6C;hi:$2D1AB4DEA28ED965),
  652. (lo:$EAE53232B498B6D9;hi:$4AD64994D625E4DA),
  653. (lo:$C48EFCB84A1771B5;hi:$772FDD63E7936BAF),
  654. (lo:$B632AF2749873801;hi:$3125607AB548FA30),
  655. (lo:$985961ADB708FF6D;hi:$0CDCF48D84FE7545),
  656. (lo:$534A08194EA7AB69;hi:$BD301A4810FFD90E),
  657. (lo:$7D21C693B0286C05;hi:$80C98EBF2149567B),
  658. (lo:$0F9D950CB3B825B1;hi:$C6C333A67392C7E4),
  659. (lo:$21F65B864D37E2DD;hi:$FB3AA75142244891),
  660. (lo:$322F8EAF928456DE;hi:$8E43C87E03060C18),
  661. (lo:$1C4440256C0B91B2;hi:$B3BA5C8932B0836D),
  662. (lo:$6EF813BA6F9BD806;hi:$F5B0E190606B12F2),
  663. (lo:$4093DD3091141F6A;hi:$C849756751DD9D87),
  664. (lo:$8B80B48468BB4B6E;hi:$79A59BA2C5DC31CC),
  665. (lo:$A5EB7A0E96348C02;hi:$445C0F55F46ABEB9),
  666. (lo:$D757299195A4C5B6;hi:$0256B24CA6B12F26),
  667. (lo:$F93CE71B6B2B02DA;hi:$3FAF26BB9707A053),
  668. (lo:$F0E483C22AC3ADB0;hi:$E8A46C1224F5A634),
  669. (lo:$DE8F4D48D44C6ADC;hi:$D55DF8E515432941),
  670. (lo:$AC331ED7D7DC2368;hi:$935745FC4798B8DE),
  671. (lo:$8258D05D2953E404;hi:$AEAED10B762E37AB),
  672. (lo:$494BB9E9D0FCB000;hi:$1F423FCEE22F9BE0),
  673. (lo:$672077632E73776C;hi:$22BBAB39D3991495),
  674. (lo:$159C24FC2DE33ED8;hi:$64B116208142850A),
  675. (lo:$3BF7EA76D36CF9B4;hi:$594882D7B0F40A7F),
  676. (lo:$282E3F5F0CDF4DB7;hi:$2C31EDF8F1D64EF6),
  677. (lo:$0645F1D5F2508ADB;hi:$11C8790FC060C183),
  678. (lo:$74F9A24AF1C0C36F;hi:$57C2C41692BB501C),
  679. (lo:$5A926CC00F4F0403;hi:$6A3B50E1A30DDF69),
  680. (lo:$91810574F6E05007;hi:$DBD7BE24370C7322),
  681. (lo:$BFEACBFE086F976B;hi:$E62E2AD306BAFC57),
  682. (lo:$CD5698610BFFDEDF;hi:$A02497CA54616DC8),
  683. (lo:$E33D56EBF57019B3;hi:$9DDD033D65D7E2BD),
  684. (lo:$757299195A4C5B6C;hi:$256B24CA6B12F26D),
  685. (lo:$5B195793A4C39C00;hi:$1892B03D5AA47D18),
  686. (lo:$29A5040CA753D5B4;hi:$5E980D24087FEC87),
  687. (lo:$07CECA8659DC12D8;hi:$636199D339C963F2),
  688. (lo:$CCDDA332A07346DC;hi:$D28D7716ADC8CFB9),
  689. (lo:$E2B66DB85EFC81B0;hi:$EF74E3E19C7E40CC),
  690. (lo:$900A3E275D6CC804;hi:$A97E5EF8CEA5D153),
  691. (lo:$BE61F0ADA3E30F68;hi:$9487CA0FFF135E26),
  692. (lo:$ADB825847C50BB6B;hi:$E1FEA520BE311AAF),
  693. (lo:$83D3EB0E82DF7C07;hi:$DC0731D78F8795DA),
  694. (lo:$F16FB891814F35B3;hi:$9A0D8CCEDD5C0445),
  695. (lo:$DF04761B7FC0F2DF;hi:$A7F41839ECEA8B30),
  696. (lo:$14171FAF866FA6DB;hi:$1618F6FC78EB277B),
  697. (lo:$3A7CD12578E061B7;hi:$2BE1620B495DA80E),
  698. (lo:$48C082BA7B702803;hi:$6DEBDF121B863991),
  699. (lo:$66AB4C3085FFEF6F;hi:$50124BE52A30B6E4),
  700. (lo:$6F7328E9C4174005;hi:$8719014C99C2B083),
  701. (lo:$4118E6633A988769;hi:$BAE095BBA8743FF6),
  702. (lo:$33A4B5FC3908CEDD;hi:$FCEA28A2FAAFAE69),
  703. (lo:$1DCF7B76C78709B1;hi:$C113BC55CB19211C),
  704. (lo:$D6DC12C23E285DB5;hi:$70FF52905F188D57),
  705. (lo:$F8B7DC48C0A79AD9;hi:$4D06C6676EAE0222),
  706. (lo:$8A0B8FD7C337D36D;hi:$0B0C7B7E3C7593BD),
  707. (lo:$A460415D3DB81401;hi:$36F5EF890DC31CC8),
  708. (lo:$B7B99474E20BA002;hi:$438C80A64CE15841),
  709. (lo:$99D25AFE1C84676E;hi:$7E7514517D57D734),
  710. (lo:$EB6E09611F142EDA;hi:$387FA9482F8C46AB),
  711. (lo:$C505C7EBE19BE9B6;hi:$05863DBF1E3AC9DE),
  712. (lo:$0E16AE5F1834BDB2;hi:$B46AD37A8A3B6595),
  713. (lo:$207D60D5E6BB7ADE;hi:$8993478DBB8DEAE0),
  714. (lo:$52C1334AE52B336A;hi:$CF99FA94E9567B7F),
  715. (lo:$7CAAFDC01BA4F406;hi:$F2606E63D8E0F40A)
  716. );
  717. {$pop}
  718. {$ENDIF}
  719. function get_crc128_table : {const} pu128;
  720. begin
  721. {$ifdef DYNAMIC_CRC_TABLE}
  722. if (crc128_table_empty) then
  723. make_crc128_table;
  724. {$endif}
  725. get_crc128_table := {const} pu128(@crc128_table);
  726. end;
  727. function crc128(crc: u128; buf: Pbyte; len: cardinal): u128;
  728. begin
  729. if (buf = nil) then
  730. exit(INITIALCRC128);
  731. {$IFDEF DYNAMIC_CRC_TABLE}
  732. if crc128_table_empty then
  733. make_crc128_table;
  734. {$ENDIF}
  735. while (len >= 8) do
  736. begin
  737. crc := crc128_table[(crc xor buf^) and $ff] xor (crc shr 8);
  738. inc(buf);
  739. crc := crc128_table[(crc xor buf^) and $ff] xor (crc shr 8);
  740. inc(buf);
  741. crc := crc128_table[(crc xor buf^) and $ff] xor (crc shr 8);
  742. inc(buf);
  743. crc := crc128_table[(crc xor buf^) and $ff] xor (crc shr 8);
  744. inc(buf);
  745. crc := crc128_table[(crc xor buf^) and $ff] xor (crc shr 8);
  746. inc(buf);
  747. crc := crc128_table[(crc xor buf^) and $ff] xor (crc shr 8);
  748. inc(buf);
  749. crc := crc128_table[(crc xor buf^) and $ff] xor (crc shr 8);
  750. inc(buf);
  751. crc := crc128_table[(crc xor buf^) and $ff] xor (crc shr 8);
  752. inc(buf);
  753. dec(len, 8);
  754. end;
  755. while (len > 0) do
  756. begin
  757. crc := crc128_table[(crc xor buf^) and $ff] xor (crc shr 8);
  758. inc(buf);
  759. dec(len);
  760. end;
  761. result := crc;
  762. end;
  763. end.