1
// This CRC function is based on Intel Slicing-by-8 algorithm.
3
// Original Intel Slicing-by-8 code is available here:
5
// http://sourceforge.net/projects/slicing-by-8/
7
// Original Intel Slicing-by-8 code is licensed as:
9
// Copyright (c) 2004-2006 Intel Corporation - All Rights Reserved
11
// This software program is licensed subject to the BSD License,
12
// available at http://www.opensource.org/licenses/bsd-license.html
17
// CRCTab duplicates crc_tables[0], but we still need it to decrypt
18
// old version RAR archives. GUI code might use it for ZIP encryption.
21
static uint crc_tables[8][256]; // Tables for Slicing-by-8.
7
for (int I=0;I<256;I++)
25
for (uint I=0;I<256;I++) // Build the classic CRC32 lookup table.
28
for (uint J=0;J<8;J++)
11
29
C=(C & 1) ? (C>>1)^0xEDB88320L : (C>>1);
30
CRCTab[I]=crc_tables[0][I]=C;
33
for (uint I=0;I<=256;I++) // Build additional lookup tables.
35
uint C=crc_tables[0][I];
36
for (uint J=1;J<8;J++)
38
C=crc_tables[0][(byte)C]^(C>>8);
21
49
byte *Data=(byte *)Addr;
23
#if defined(LITTLE_ENDIAN) && defined(PRESENT_INT32) && defined(ALLOW_NOT_ALIGNED_INT)
24
while (Size>0 && ((long)Data & 7))
26
StartCRC=CRCTab[(byte)(StartCRC^Data[0])]^(StartCRC>>8);
32
StartCRC^=*(uint32 *)Data;
33
StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
34
StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
35
StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
36
StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
37
StartCRC^=*(uint32 *)(Data+4);
38
StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
39
StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
40
StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
41
StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
51
// Align Data to 8 for better performance.
52
for (;Size>0 && ((long)Data & 7);Size--,Data++)
53
StartCRC=crc_tables[0][(byte)(StartCRC^Data[0])]^(StartCRC>>8);
55
for (;Size>=8;Size-=8,Data+=8)
58
StartCRC ^= Data[0]|(Data[1] << 8)|(Data[2] << 16)|(Data[3] << 24);
60
StartCRC ^= *(uint32 *) Data;
47
for (size_t I=0;I<Size;I++)
48
StartCRC=CRCTab[(byte)(StartCRC^Data[I])]^(StartCRC>>8);
62
StartCRC = crc_tables[7][(byte) StartCRC ] ^
63
crc_tables[6][(byte)(StartCRC >> 8) ] ^
64
crc_tables[5][(byte)(StartCRC >> 16)] ^
65
crc_tables[4][(byte)(StartCRC >> 24)] ^
66
crc_tables[3][Data[4]] ^
67
crc_tables[2][Data[5]] ^
68
crc_tables[1][Data[6]] ^
69
crc_tables[0][Data[7]];
72
for (;Size>0;Size--,Data++) // Process left data.
73
StartCRC=crc_tables[0][(byte)(StartCRC^Data[0])]^(StartCRC>>8);
80
// For RAR 1.4 archives in case somebody still has them.
53
81
ushort OldCRC(ushort StartCRC,const void *Addr,size_t Size)
55
83
byte *Data=(byte *)Addr;