Compare commits

..

No commits in common. "8896624acc966a307dbbcdd530b3cd3c7bbb492b" and "6b0fbed103e216e841357a2d7ac069041296d20a" have entirely different histories.

8 changed files with 287 additions and 15 deletions

137
ChunkManager.cpp Normal file
View file

@ -0,0 +1,137 @@
/*
* This file is part of VoidArchiveTool.
*
* Copyright (C) 2025 Yanczi
*
* Void Archive Toolis free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include "ChunkManager.h"
ChunkManager::ChunkManager(EncryptionManager& em)
:eman(em)
{ }
ChunkManager::~ChunkManager()
{ }
//-----------------------------------------------------------------------------
// Kompresja blokowa
//
// Dzielenie vectora na chunki dok³adnie po 128KB
// Kompresowanie chunków bez nag³ówka
//-----------------------------------------------------------------------------
std::vector<char> ChunkManager::chunked(const std::vector<char>& raw, const bool& compress, const bool& encrypt)
{
//std::vector<BlockSize> blockSizes;
// Maksymalny rozmiar chunka
const size_t maxBlockSize = BLOCK_SIZE;
const size_t rawSize = raw.size();
uint32_t blockLen = 0;
uint32_t lastChunkRawSize;
std::vector<char> compressedBlocks;
for (size_t offset = 0; offset < rawSize; offset += maxBlockSize)
{
// Rozmiar chunka
const size_t chunkSize = std::min(maxBlockSize, rawSize - offset);
auto begin = raw.begin() + offset;
auto end = begin + chunkSize;
// Skopiuj fragment danych do chunka
std::vector<char> chunk(begin, end);
std::vector<char> outChunk;
// Przetwórz chunki i przetwórz
if (compress)
{
// Zaszyfruj i skompresuj lub tylko skompresuj
outChunk = encrypt ? eman.encrypt(cman.compress(chunk)) : cman.compress(chunk);
}
else
{
// Zaszyfruj lub skopiuj
outChunk = encrypt ? eman.encrypt(chunk) : std::move(chunk);
}
uint32_t chs = static_cast<uint32_t>(chunk.size());
uint32_t zch = static_cast<uint32_t>(outChunk.size());
//addIntToVector<uint32_t>(compressedBlocks, chs);
lastChunkRawSize = chs;
addIntToVector<uint32_t>(compressedBlocks, zch);
compressedBlocks.insert(compressedBlocks.end(), outChunk.begin(), outChunk.end());
blockLen++;
}
std::vector<char> zip;
// Wstaw liczbê o iloœci bloków do vectora;
// Przekonpwertuj usigned int32 na ci¹g znkaów
// uint16_t blockLen = blockSizes .size();
addIntToVector<uint32_t>(zip, blockLen);
addIntToVector<uint32_t>(zip, maxBlockSize);
addIntToVector<uint32_t>(zip, lastChunkRawSize);
// Dodaj skompresowane dane
zip.insert(zip.end(), compressedBlocks.begin(), compressedBlocks.end());
return zip;
}
//////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------
// Dekompresja blokowa
//-----------------------------------------------------------------------------
std::vector<char> ChunkManager::dechunked(const std::vector<char>& zip, const bool& compress, const bool& encrypt)
{
size_t offset = 0;
const uint32_t chunkLen = getIntFromVector<uint32_t>(zip, offset);
const uint32_t chunkBeforeSize = getIntFromVector<uint32_t>(zip, offset);
const uint32_t chunkLastSize = getIntFromVector<uint32_t>(zip, offset);
std::cout << "Q: " << chunkLen << std::endl;
std::cout << "C: " << chunkBeforeSize << std::endl;
std::cout << "L: " << chunkBeforeSize << std::endl;
std::vector<char> chunksString;
// Dekompresja bloków
for (size_t i = 0; i < chunkLen; ++i)
{
// Pobierz rozmiar chunków przed i po skompresowaniem
uint32_t chunkSize = i < chunkLen - 1 ? chunkBeforeSize : chunkLastSize;
uint32_t chunkZipSize = getIntFromVector<uint32_t>(zip, offset);
// Pobierz blok chunka
std::vector<char> inChunk(chunkZipSize);
std::memcpy(inChunk.data(), zip.data() + offset, chunkZipSize);
offset += chunkZipSize;
// Jeœli flaga encrypt jest aktywna najpierw zdeszyfruj blok
std::vector<char> zipChunk = encrypt ? eman.decrypt(inChunk) : std::move(inChunk);
// Zdeklarój pusty chunk
std::vector<char> chunk = compress ? cman.decompress(zipChunk, chunkSize) : std::move(zipChunk);
// Scal chunki
chunksString.insert(chunksString.end(), chunk.begin(), chunk.end());
}
return chunksString;
}

70
ChunkManager.h Normal file
View file

@ -0,0 +1,70 @@
/*
* This file is part of VoidArchiveTool.
*
* Copyright (C) 2025 Yanczi
*
* Void Archive Toolis free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#pragma once
#include <vector>
#include <cstdint>
#include <cstring>
#include <stdexcept>
#include <algorithm>
#include <iostream>
#include "EncryptionManager.h"
#include "CompressionManager.h"
#define BLOCK_SIZE 131072 // 128KB
class ChunkManager
{
public:
ChunkManager(EncryptionManager& em);
~ChunkManager();
// Podzia³ na chunki
std::vector<char> chunked(const std::vector<char>&, const bool&, const bool&);
// Zcalanie chunków
std::vector<char> dechunked(const std::vector<char>&, const bool&, const bool&);
private:
EncryptionManager eman;
CompressionManager cman;
// Przekonwertuj zmienn¹ na ci¹g na vector
template <typename T>
void addIntToVector(std::vector<char>& vec, const T& val)
{
size_t tmpSize = vec.size();
vec.resize(tmpSize + sizeof(val));
std::memcpy(vec.data() + tmpSize, &val, sizeof(val));
}
// Pobierz zmienn¹ z vectora
template <typename T>
T getIntFromVector(const std::vector<char>& vec, size_t& offset)
{
T tmp{};
std::memcpy(&tmp, vec.data() + offset, sizeof(tmp));
offset += sizeof(tmp);
return tmp;
}
};

View file

@ -241,6 +241,7 @@ std::vector<FilesTable> CreateCargo::ComputingHeadFiles()
// Dodaj do kontenera konfiguracjê chunków // Dodaj do kontenera konfiguracjê chunków
if (file.parameter != flag::raw) if (file.parameter != flag::raw)
{ {
std::cout << "CHUNK PARAM" << std::endl;
cargo.write(reinterpret_cast<const char*>(&quantity), sizeof(quantity)); cargo.write(reinterpret_cast<const char*>(&quantity), sizeof(quantity));
cargo.write(reinterpret_cast<const char*>(&chunkBlockSize), sizeof(chunkBlockSize)); cargo.write(reinterpret_cast<const char*>(&chunkBlockSize), sizeof(chunkBlockSize));
cargo.write(reinterpret_cast<const char*>(&lastChunkSize), sizeof(lastChunkSize)); cargo.write(reinterpret_cast<const char*>(&lastChunkSize), sizeof(lastChunkSize));
@ -287,7 +288,8 @@ std::vector<FilesTable> CreateCargo::ComputingHeadFiles()
else else
{ {
// Zaszyfruj lub skopiuj // Zaszyfruj lub skopiuj
outChunk = eman.encrypt(chunk); outChunk = (file.parameter & flag::enc) == flag::enc ?
eman.encrypt(cman.compress(chunk)) : cman.compress(chunk);
} }
const uint32_t outSize = outChunk.size(); const uint32_t outSize = outChunk.size();
@ -298,11 +300,19 @@ std::vector<FilesTable> CreateCargo::ComputingHeadFiles()
cargo.write(reinterpret_cast<const char*>(outChunk.data()), outChunk.size()); cargo.write(reinterpret_cast<const char*>(outChunk.data()), outChunk.size());
sizeFile += outSize; sizeFile += outSize;
} }
std::cout << "SIZE: " << sizeFile << std::endl;
} }
} }
f.close(); f.close();
//Tworzenie hashu CRC
//const uint64_t crc = XXH64(buffer.data(), buffer.size(), 0);
//Kompresjia
//std::vector<char> pakBuffer;
//computingBytes(file.parameter, buffer, pakBuffer);
FilesTable ft; FilesTable ft;
ft.nameFile = path; ft.nameFile = path;
ft.nameLen = path.length(); ft.nameLen = path.length();
@ -311,6 +321,8 @@ std::vector<FilesTable> CreateCargo::ComputingHeadFiles()
ft.flag = file.parameter; ft.flag = file.parameter;
ft.crc = XXH64_digest(xxhState); ft.crc = XXH64_digest(xxhState);
//cargo.write(reinterpret_cast<const char*>(pakBuffer.data()), pakBuffer.size());
filesTable.push_back(ft); filesTable.push_back(ft);
offset += sizeFile; offset += sizeFile;
} }

View file

@ -33,6 +33,7 @@
#include <nlohmann/json.hpp> #include <nlohmann/json.hpp>
#include "DataStruct.h" #include "DataStruct.h"
#include "ChunkManager.h"
#include "EncryptionManager.h" #include "EncryptionManager.h"
#include "CompressionManager.h" #include "CompressionManager.h"

View file

@ -110,6 +110,51 @@ bool ExtractCargo::CheckCargoFile()
return true; return true;
} }
//-----------------------------------------------------------------------------
// Sprawdzanie sumy kontrolnej
//-----------------------------------------------------------------------------
bool ExtractCargo::HashValid(const std::vector<char>& data, const uint64_t& crc)
{
uint64_t actualCrc = XXH64(data.data(), data.size(), 0);
if (actualCrc != crc)
{
return false;
}
return true;
}
//-----------------------------------------------------------------------------
// Magiczna funkcja do dekompresji i deszyfracji danych
//-----------------------------------------------------------------------------
void ExtractCargo::computingBytes(const std::vector<char>& input, std::vector<char>& output, const uint8_t& flag)
{
ChunkManager cm(eman);
std::cout << static_cast<int>(flag) << std::endl;
switch (flag)
{
case FILE_FLAG_COMPRESS:
output = cm.dechunked(input, true, false);
break;
case FILE_FLAG_ENCRYPT:
output = cm.dechunked(input, false, true);
break;
case FILE_FLAG_ZIPENC:
output = cm.dechunked(input, true, true);
std::cout << "DENC" << std::endl;
break;
default:
output = input;
break;
}
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Pobieranie nag³ówków plików // Pobieranie nag³ówków plików
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -130,6 +175,9 @@ void ExtractCargo::LoadFilesTable()
cargoFile.read(reinterpret_cast<char*>(&fhTmp.crc), sizeof(fhTmp.crc)); cargoFile.read(reinterpret_cast<char*>(&fhTmp.crc), sizeof(fhTmp.crc));
cargoFile.read(reinterpret_cast<char*>(&fhTmp.flag), sizeof(fhTmp.flag)); cargoFile.read(reinterpret_cast<char*>(&fhTmp.flag), sizeof(fhTmp.flag));
std::cout << tablePosition << std::endl;
std::cout << "Size: " << fhTmp.size << std::endl;
filesHeads.push_back(fhTmp); filesHeads.push_back(fhTmp);
} }
} }
@ -143,13 +191,10 @@ void ExtractCargo::ExtractingFilesFromCargo()
{ {
std::filesystem::path dir = cargoFileName.stem() / fh.nameFile; std::filesystem::path dir = cargoFileName.stem() / fh.nameFile;
CreateDirections(dir); CreateDirections(dir);
std::cout << dir.string() << std::endl;
std::ofstream file(dir, std::ios::binary); std::ofstream file(dir, std::ios::binary);
cargoFile.seekg(fh.offset);
XXH64_reset(xxhState, 0); std::cout << fh.size << std::endl;
cargoFile.seekg(fh.offset);
// Strumieñ wyci¹gaj¹cy // Strumieñ wyci¹gaj¹cy
if (fh.flag == flag::raw) if (fh.flag == flag::raw)
@ -160,7 +205,6 @@ void ExtractCargo::ExtractingFilesFromCargo()
std::vector<char> buffer(streamChunk); std::vector<char> buffer(streamChunk);
cargoFile.read(buffer.data(), streamChunk); cargoFile.read(buffer.data(), streamChunk);
XXH64_update(xxhState, buffer.data(), buffer.size());
file.write(reinterpret_cast<const char*>(buffer.data()), streamChunk); file.write(reinterpret_cast<const char*>(buffer.data()), streamChunk);
} }
} }
@ -193,7 +237,7 @@ void ExtractCargo::ExtractingFilesFromCargo()
if ((fh.flag & flag::zip) == flag::zip) if ((fh.flag & flag::zip) == flag::zip)
{ {
rawBuffer = (fh.flag & flag::enc) == flag::enc ? rawBuffer = (fh.flag & flag::enc) == flag::enc ?
cman.decompress(eman.decrypt(buffer), chunkSize) : eman.decrypt(cman.decompress(buffer, chunkSize)) :
cman.decompress(buffer, chunkSize); cman.decompress(buffer, chunkSize);
} }
else else
@ -201,18 +245,11 @@ void ExtractCargo::ExtractingFilesFromCargo()
rawBuffer = eman.decrypt(buffer); rawBuffer = eman.decrypt(buffer);
} }
XXH64_update(xxhState, rawBuffer.data(), rawBuffer.size());
file.write(reinterpret_cast<const char*>(rawBuffer.data()), chunkSize); file.write(reinterpret_cast<const char*>(rawBuffer.data()), chunkSize);
} }
} }
file.close(); file.close();
if (XXH64_digest(xxhState) != fh.crc)
{
std::cerr << dir.string() << " Error: Corrupted data integration CRC" << std::endl;
}
} }
std::cout << "Unpacking complete!" << std::endl; std::cout << "Unpacking complete!" << std::endl;

View file

@ -32,6 +32,7 @@
#include <xxhash.h> #include <xxhash.h>
#include "DataStruct.h" #include "DataStruct.h"
#include "ChunkManager.h"
#include "EncryptionManager.h" #include "EncryptionManager.h"
#include "CompressionManager.h" #include "CompressionManager.h"
@ -69,7 +70,13 @@ private:
// Pobieranie nag³ówków plików // Pobieranie nag³ówków plików
void LoadFilesTable(); void LoadFilesTable();
// Sprawdzanie sumy kontrolnej
bool HashValid(const std::vector<char>&, const uint64_t&);
// Utwórz katalog // Utwórz katalog
void CreateDirections(std::filesystem::path); void CreateDirections(std::filesystem::path);
// Magiczna funkcja do dekompresji i deszyfracji danych
void computingBytes(const std::vector<char>&, std::vector<char>&, const uint8_t&);
}; };

View file

@ -132,6 +132,7 @@
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="ChunkManager.cpp" />
<ClCompile Include="CompressionManager.cpp" /> <ClCompile Include="CompressionManager.cpp" />
<ClCompile Include="CreateCargo.cpp" /> <ClCompile Include="CreateCargo.cpp" />
<ClCompile Include="EncryptionManager.cpp" /> <ClCompile Include="EncryptionManager.cpp" />
@ -140,6 +141,7 @@
<ClCompile Include="voidcmd.cpp" /> <ClCompile Include="voidcmd.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="ChunkManager.h" />
<ClInclude Include="CompressionManager.h" /> <ClInclude Include="CompressionManager.h" />
<ClInclude Include="CreateCargo.h" /> <ClInclude Include="CreateCargo.h" />
<ClInclude Include="DataStruct.h" /> <ClInclude Include="DataStruct.h" />

View file

@ -27,6 +27,9 @@
<ClCompile Include="ViewCargo.cpp"> <ClCompile Include="ViewCargo.cpp">
<Filter>Pliki źródłowe</Filter> <Filter>Pliki źródłowe</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="ChunkManager.cpp">
<Filter>Pliki źródłowe</Filter>
</ClCompile>
<ClCompile Include="EncryptionManager.cpp"> <ClCompile Include="EncryptionManager.cpp">
<Filter>Pliki źródłowe</Filter> <Filter>Pliki źródłowe</Filter>
</ClCompile> </ClCompile>
@ -47,6 +50,9 @@
<ClInclude Include="DataStruct.h"> <ClInclude Include="DataStruct.h">
<Filter>Pliki nagłówkowe</Filter> <Filter>Pliki nagłówkowe</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="ChunkManager.h">
<Filter>Pliki nagłówkowe</Filter>
</ClInclude>
<ClInclude Include="EncryptionManager.h"> <ClInclude Include="EncryptionManager.h">
<Filter>Pliki nagłówkowe</Filter> <Filter>Pliki nagłówkowe</Filter>
</ClInclude> </ClInclude>