128 lines
No EOL
3.5 KiB
C++
128 lines
No EOL
3.5 KiB
C++
#include "EncryptionManager.h"
|
|
|
|
EncryptionManager::EncryptionManager()
|
|
:keyReady(false)
|
|
{
|
|
if (sodium_init() < 0) {
|
|
throw std::runtime_error("libsodium init failed");
|
|
}
|
|
|
|
keyReady = false;
|
|
}
|
|
|
|
std::vector<char> EncryptionManager::encrypt(const std::vector<char>& raw)
|
|
{
|
|
std::vector<char> crypt(raw.size());
|
|
|
|
// Generowanie kluczy
|
|
generateKeys();
|
|
|
|
if (crypto_stream_chacha20_ietf_xor_ic(
|
|
reinterpret_cast<unsigned char*>(crypt.data()),
|
|
reinterpret_cast<const unsigned char*>(raw.data()),
|
|
static_cast<unsigned long long>(raw.size()),
|
|
nonce.data(),
|
|
0,
|
|
key.data()) != 0) {
|
|
throw std::runtime_error("crypto_stream_chacha20_ietf_xor_ic failed");
|
|
}
|
|
|
|
return crypt;
|
|
}
|
|
|
|
void EncryptionManager::generateKeys()
|
|
{
|
|
if (keyReady) return;
|
|
|
|
std::cout << "GENEROWANIE KLUCZA" << std::endl;
|
|
|
|
//randombytes_buf(key.data(), key.size());
|
|
crypto_stream_chacha20_ietf_keygen(key.data());
|
|
randombytes_buf(nonce.data(), nonce.size());
|
|
|
|
keyReady = true;
|
|
}
|
|
|
|
void EncryptionManager::saveKey(const std::string& path)
|
|
{
|
|
std::cout << "ZAPISYWANIE KLUCZA" << std::endl;
|
|
|
|
const int sig = SIGNATURE_KEY_FILE;
|
|
const short ver = VERSION;
|
|
|
|
// Wygeneruj time stamp
|
|
std::time_t now = std::time(nullptr);
|
|
const uint32_t time = static_cast<uint32_t>(now);
|
|
|
|
// Wygeneruj crc kluczy
|
|
const uint64_t crcKey = XXH64(key.data(), key.size(), 0);
|
|
const uint64_t crcNonce = XXH64(nonce.data(), nonce.size(), 0);
|
|
|
|
// Zapisz ten œmietnik do pliku KEY
|
|
std::ofstream file(path + ".key", std::ios::binary);
|
|
if (!file) { std::cout << "Dupa nie zapisa³o" << std::endl; }
|
|
|
|
file.write(reinterpret_cast<const char*>(&sig), sizeof(sig));
|
|
file.write(reinterpret_cast<const char*>(&ver), sizeof(ver));
|
|
file.write(reinterpret_cast<const char*>(&time), sizeof(time));
|
|
file.write(reinterpret_cast<const char*>(key.data()), key.size());
|
|
file.write(reinterpret_cast<const char*>(&crcKey), sizeof(crcKey));
|
|
file.write(reinterpret_cast<const char*>(nonce.data()), nonce.size());
|
|
file.write(reinterpret_cast<const char*>(&crcNonce), sizeof(crcNonce));
|
|
|
|
if (!file.good()) { std::cout << "Dupa nie zapisa³o" << std::endl; }
|
|
|
|
file.close();
|
|
|
|
saveCppHeadFile(path);
|
|
}
|
|
|
|
// Generowanie pliku nag³ówkowego CPP z kluczem i nonce
|
|
void EncryptionManager::saveCppHeadFile(const std::string& path)
|
|
{
|
|
std::vector<unsigned char> keyVec(key.begin(), key.end());
|
|
std::vector<unsigned char> nonceVec(nonce.begin(), nonce.end());
|
|
|
|
const std::string headerText =
|
|
"// Plik wygenerowany przy wykorzystaniu exPAK\n\n"
|
|
"// Klucz deszyfruj¹cy\n"
|
|
"const std::array<unsigned char, crypto_stream_chacha20_ietf_KEYBYTES> key{" + toHex(keyVec) + "};\n\n"
|
|
"// Ci¹g nonce\n"
|
|
"const std::array<unsigned char, crypto_stream_chacha20_ietf_NONCEBYTES> nonce{" + toHex(nonceVec) + "}; ";
|
|
|
|
std::ofstream file(path + ".hpp");
|
|
file << headerText;
|
|
file.close();
|
|
}
|
|
|
|
std::string EncryptionManager::toHex(const std::vector<unsigned char>& data)
|
|
{
|
|
std::string bytes;
|
|
int sk = data.size();
|
|
int skp = 1;
|
|
|
|
for (const auto& b : data)
|
|
{
|
|
std::stringstream ss;
|
|
ss << "0x" << std::hex << std::uppercase << std::setw(2) << std::setfill('0')
|
|
<< static_cast<int>(b);
|
|
|
|
bytes += "'";
|
|
bytes += ss.str();
|
|
bytes += "'";
|
|
|
|
if (skp < sk)
|
|
{
|
|
bytes += ", ";
|
|
skp++;
|
|
}
|
|
}
|
|
|
|
return bytes;
|
|
}
|
|
|
|
// Wczytaj klucz
|
|
void EncryptionManager::loadKey(const std::string& path)
|
|
{
|
|
|
|
} |