crc.pas 31 KB

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