| 1912 | } |
| 1913 | |
| 1914 | static void DecryptFileChunk( |
| 1915 | DWORD * MpqData, |
| 1916 | LPBYTE pbKey, |
| 1917 | ULONGLONG ByteOffset, |
| 1918 | DWORD dwLength) |
| 1919 | { |
| 1920 | ULONGLONG ChunkOffset; |
| 1921 | DWORD KeyShuffled[0x10]; |
| 1922 | DWORD KeyMirror[0x10]; |
| 1923 | DWORD RoundCount = 0x14; |
| 1924 | |
| 1925 | // Prepare the key |
| 1926 | ChunkOffset = ByteOffset / MPQE_CHUNK_SIZE; |
| 1927 | memcpy(KeyMirror, pbKey, MPQE_CHUNK_SIZE); |
| 1928 | BSWAP_ARRAY32_UNSIGNED(KeyMirror, MPQE_CHUNK_SIZE); |
| 1929 | KeyMirror[0x05] = (DWORD)(ChunkOffset >> 32); |
| 1930 | KeyMirror[0x08] = (DWORD)(ChunkOffset); |
| 1931 | |
| 1932 | while(dwLength >= MPQE_CHUNK_SIZE) |
| 1933 | { |
| 1934 | // Shuffle the key - part 1 |
| 1935 | KeyShuffled[0x0E] = KeyMirror[0x00]; |
| 1936 | KeyShuffled[0x0C] = KeyMirror[0x01]; |
| 1937 | KeyShuffled[0x05] = KeyMirror[0x02]; |
| 1938 | KeyShuffled[0x0F] = KeyMirror[0x03]; |
| 1939 | KeyShuffled[0x0A] = KeyMirror[0x04]; |
| 1940 | KeyShuffled[0x07] = KeyMirror[0x05]; |
| 1941 | KeyShuffled[0x0B] = KeyMirror[0x06]; |
| 1942 | KeyShuffled[0x09] = KeyMirror[0x07]; |
| 1943 | KeyShuffled[0x03] = KeyMirror[0x08]; |
| 1944 | KeyShuffled[0x06] = KeyMirror[0x09]; |
| 1945 | KeyShuffled[0x08] = KeyMirror[0x0A]; |
| 1946 | KeyShuffled[0x0D] = KeyMirror[0x0B]; |
| 1947 | KeyShuffled[0x02] = KeyMirror[0x0C]; |
| 1948 | KeyShuffled[0x04] = KeyMirror[0x0D]; |
| 1949 | KeyShuffled[0x01] = KeyMirror[0x0E]; |
| 1950 | KeyShuffled[0x00] = KeyMirror[0x0F]; |
| 1951 | |
| 1952 | // Shuffle the key - part 2 |
| 1953 | for(DWORD i = 0; i < RoundCount; i += 2) |
| 1954 | { |
| 1955 | KeyShuffled[0x0A] = KeyShuffled[0x0A] ^ Rol32((KeyShuffled[0x0E] + KeyShuffled[0x02]), 0x07); |
| 1956 | KeyShuffled[0x03] = KeyShuffled[0x03] ^ Rol32((KeyShuffled[0x0A] + KeyShuffled[0x0E]), 0x09); |
| 1957 | KeyShuffled[0x02] = KeyShuffled[0x02] ^ Rol32((KeyShuffled[0x03] + KeyShuffled[0x0A]), 0x0D); |
| 1958 | KeyShuffled[0x0E] = KeyShuffled[0x0E] ^ Rol32((KeyShuffled[0x02] + KeyShuffled[0x03]), 0x12); |
| 1959 | |
| 1960 | KeyShuffled[0x07] = KeyShuffled[0x07] ^ Rol32((KeyShuffled[0x0C] + KeyShuffled[0x04]), 0x07); |
| 1961 | KeyShuffled[0x06] = KeyShuffled[0x06] ^ Rol32((KeyShuffled[0x07] + KeyShuffled[0x0C]), 0x09); |
| 1962 | KeyShuffled[0x04] = KeyShuffled[0x04] ^ Rol32((KeyShuffled[0x06] + KeyShuffled[0x07]), 0x0D); |
| 1963 | KeyShuffled[0x0C] = KeyShuffled[0x0C] ^ Rol32((KeyShuffled[0x04] + KeyShuffled[0x06]), 0x12); |
| 1964 | |
| 1965 | KeyShuffled[0x0B] = KeyShuffled[0x0B] ^ Rol32((KeyShuffled[0x05] + KeyShuffled[0x01]), 0x07); |
| 1966 | KeyShuffled[0x08] = KeyShuffled[0x08] ^ Rol32((KeyShuffled[0x0B] + KeyShuffled[0x05]), 0x09); |
| 1967 | KeyShuffled[0x01] = KeyShuffled[0x01] ^ Rol32((KeyShuffled[0x08] + KeyShuffled[0x0B]), 0x0D); |
| 1968 | KeyShuffled[0x05] = KeyShuffled[0x05] ^ Rol32((KeyShuffled[0x01] + KeyShuffled[0x08]), 0x12); |
| 1969 | |
| 1970 | KeyShuffled[0x09] = KeyShuffled[0x09] ^ Rol32((KeyShuffled[0x0F] + KeyShuffled[0x00]), 0x07); |
| 1971 | KeyShuffled[0x0D] = KeyShuffled[0x0D] ^ Rol32((KeyShuffled[0x09] + KeyShuffled[0x0F]), 0x09); |
no test coverage detected