MCPcopy Create free account
hub / github.com/diasurgical/devilution / DecryptFileChunk

Function DecryptFileChunk

3rdParty/StormLib/src/FileStream.cpp:1914–2025  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1912}
1913
1914static 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);

Callers 2

MpqeStream_DetectFileKeyFunction · 0.85
MpqeStream_BlockReadFunction · 0.85

Calls 1

Rol32Function · 0.85

Tested by

no test coverage detected