diff --git a/CreateCargo.cpp b/CreateCargo.cpp index 622f0c5..6feb2f5 100644 --- a/CreateCargo.cpp +++ b/CreateCargo.cpp @@ -175,6 +175,7 @@ uint8_t CreateCargo::CheckFileOnTheList(const std::string& path, std::vector EncryptionManager::encrypt(const std::vector& raw) { - randombytes_buf(key.data(), key.size()); - randombytes_buf(nonce.data(), nonce.size()); - std::vector crypt(raw.size()); + + // Generowanie kluczy + generateKeys(); if (crypto_stream_chacha20_ietf_xor_ic( reinterpret_cast(crypt.data()), @@ -25,4 +28,67 @@ std::vector EncryptionManager::encrypt(const std::vector& raw) } 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(now); + + // Przekonwertuj array z kluczem i nonce na vector char + std::vector keyVec(reinterpret_cast(key.data()), reinterpret_cast(key.data()) + key.size()); + std::vector nonceVec(reinterpret_cast(nonce.data()), reinterpret_cast(nonce.data()) + nonce.size()); + + // Wygeneruj crc kluczy + const uint16_t crcKey = crc16(keyVec); + const uint16_t crcNonce = crc16(nonceVec); + + // 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(&sig), sizeof(sig)); + file.write(reinterpret_cast(&ver), sizeof(ver)); + file.write(reinterpret_cast(&time), sizeof(time)); + file.write(reinterpret_cast(key.data()), key.size()); + file.write(reinterpret_cast(&crcKey), sizeof(crcKey)); + file.write(reinterpret_cast(nonce.data()), nonce.size()); + file.write(reinterpret_cast(&crcNonce), sizeof(crcNonce)); + + if (!file.good()) { std::cout << "Dupa nie zapisało" << std::endl; } + + file.close(); +} + +// Wczytaj klucz +void EncryptionManager::loadKey(const std::string& path) +{ + +} + +// Wygeneruj CRC16 +uint16_t EncryptionManager::crc16(const std::vector& buffer) +{ + boost::crc_16_type crc; + crc.process_bytes(buffer.data(), buffer.size()); + return crc.checksum(); } \ No newline at end of file diff --git a/EncryptionManager.h b/EncryptionManager.h index 79fe7f4..da0fd7b 100644 --- a/EncryptionManager.h +++ b/EncryptionManager.h @@ -4,6 +4,11 @@ #include #include #include +#include +#include +#include +#include +#include "DataStruct.h" class EncryptionManager { @@ -14,7 +19,14 @@ public: std::vector encrypt(const std::vector&); //std::vector decrypt(const std::vector&); + void saveKey(const std::string&); + void loadKey(const std::string&); + private: std::array key{}; std::array nonce{}; + bool keyReady; + + void generateKeys(); + uint16_t crc16(const std::vector&); }; \ No newline at end of file diff --git a/TimeStamp.h b/TimeStamp.h new file mode 100644 index 0000000..b862f6e --- /dev/null +++ b/TimeStamp.h @@ -0,0 +1,47 @@ +#pragma once + +#include +#include + +class TimeStamp +{ +public: + TimeStamp() + :time(std::time(nullptr)) + {} + ~TimeStamp() = default; + + uint32_t get() + { +#if defined(_WIN32) localtime_s(<, &time); +#else localtime_r(<, &time); +#endif + + uint16_t d = dosDate(lt); + uint16_t t = dosTime(lt); + + uint32_t combined = ((uint32_t)d << 16) | t; + return combined; + } + +private: + std::time_t time; + std::tm lt{}; + + uint16_t dosDate(const std::tm& t) + { + int year = t.tm_year + 1900; + int y = (year >= 1980) ? (year - 1980) : 0; + int m = t.tm_mon + 1; + int d = t.tm_mday; + return static_cast((y << 9) | (m << 5) | d); + } + + uint16_t dosTime(const std::tm& t) + { + int h = t.tm_hour; + int min = t.tm_min; + int s2 = t.tm_sec / 2; + return static_cast((h << 11) | (min << 5) | s2); + } +}; \ No newline at end of file diff --git a/license/libsodium/LICENSE.txt b/license/libsodium/LICENSE.txt new file mode 100644 index 0000000..bb85d39 --- /dev/null +++ b/license/libsodium/LICENSE.txt @@ -0,0 +1,19 @@ +/* + * ISC License + * + * Copyright (c) 2013-2025 + * Frank Denis + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + diff --git a/test.key b/test.key new file mode 100644 index 0000000..c0ae0e0 Binary files /dev/null and b/test.key differ